diff --git a/cmd/broker/broker_suite_test.go b/cmd/broker/broker_suite_test.go index 6bd6b06f39..fa120e8965 100644 --- a/cmd/broker/broker_suite_test.go +++ b/cmd/broker/broker_suite_test.go @@ -26,7 +26,6 @@ import ( "github.com/kyma-project/kyma-environment-broker/common/gardener" "github.com/kyma-project/kyma-environment-broker/common/orchestration" "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/avs" "github.com/kyma-project/kyma-environment-broker/internal/broker" kebConfig "github.com/kyma-project/kyma-environment-broker/internal/config" "github.com/kyma-project/kyma-environment-broker/internal/edp" @@ -39,7 +38,6 @@ import ( orchestrate "github.com/kyma-project/kyma-environment-broker/internal/orchestration/handlers" "github.com/kyma-project/kyma-environment-broker/internal/process" "github.com/kyma-project/kyma-environment-broker/internal/process/input" - "github.com/kyma-project/kyma-environment-broker/internal/process/provisioning" "github.com/kyma-project/kyma-environment-broker/internal/process/steps" "github.com/kyma-project/kyma-environment-broker/internal/process/upgrade_cluster" "github.com/kyma-project/kyma-environment-broker/internal/provisioner" @@ -197,8 +195,6 @@ func NewBrokerSuiteTestWithConfig(t *testing.T, cfg *Config, version ...string) provisionerClient := provisioner.NewFakeClientWithGardener(gardenerClient, "kcp-system") eventBroker := event.NewPubSub(logs) - avsDel, externalEvalCreator, internalEvalAssistant, externalEvalAssistant := createFakeAvsDelegator(t, db, cfg) - edpClient := edp.NewFakeClient() accountProvider := fixAccountProvider() require.NoError(t, err) @@ -207,7 +203,6 @@ func NewBrokerSuiteTestWithConfig(t *testing.T, cfg *Config, version ...string) k8sClientProvider := kubeconfig.NewFakeK8sClientProvider(fakeK8sSKRClient) provisionManager := process.NewStagedManager(db.Operations(), eventBroker, cfg.OperationTimeout, cfg.Provisioning, logs.WithField("provisioning", "manager")) provisioningQueue := NewProvisioningProcessingQueue(context.Background(), provisionManager, workersAmount, cfg, db, provisionerClient, inputFactory, - avsDel, internalEvalAssistant, externalEvalCreator, edpClient, accountProvider, k8sClientProvider, cli, defaultOIDCValues(), logs) provisioningQueue.SpeedUp(10000) @@ -221,8 +216,7 @@ func NewBrokerSuiteTestWithConfig(t *testing.T, cfg *Config, version ...string) deprovisionManager := process.NewStagedManager(db.Operations(), eventBroker, time.Hour, cfg.Deprovisioning, logs.WithField("deprovisioning", "manager")) deprovisioningQueue := NewDeprovisioningProcessingQueue(ctx, workersAmount, deprovisionManager, cfg, db, eventBroker, - provisionerClient, avsDel, internalEvalAssistant, externalEvalAssistant, - edpClient, accountProvider, k8sClientProvider, cli, configProvider, logs, + provisionerClient, edpClient, accountProvider, k8sClientProvider, cli, configProvider, logs, ) deprovisionManager.SpeedUp(10000) @@ -247,7 +241,6 @@ func NewBrokerSuiteTestWithConfig(t *testing.T, cfg *Config, version ...string) notificationFakeClient := notification.NewFakeClient() notificationBundleBuilder := notification.NewBundleBuilder(notificationFakeClient, cfg.Notification) - upgradeEvaluationManager := avs.NewEvaluationManager(avsDel, avs.Config{}) runtimeLister := kebOrchestration.NewRuntimeLister(db.Instances(), db.Operations(), kebRuntime.NewConverter(defaultRegion), logs) runtimeResolver := orchestration.NewGardenerRuntimeResolver(gardenerClient, fixedGardenerNamespace, runtimeLister, logs) @@ -255,7 +248,7 @@ func NewBrokerSuiteTestWithConfig(t *testing.T, cfg *Config, version ...string) Retry: 10 * time.Millisecond, StatusCheck: 100 * time.Millisecond, UpgradeClusterTimeout: 3 * time.Second, - }, 250*time.Millisecond, runtimeResolver, upgradeEvaluationManager, notificationBundleBuilder, logs, cli, *cfg, 1000) + }, 250*time.Millisecond, runtimeResolver, notificationBundleBuilder, logs, cli, *cfg, 1000) clusterQueue.SpeedUp(1000) @@ -373,23 +366,6 @@ func (s *BrokerSuiteTest) CreateAPI(inputFactory broker.PlanValidator, cfg *Conf s.httpServer = httptest.NewServer(s.router) } -func createFakeAvsDelegator(t *testing.T, db storage.BrokerStorage, cfg *Config) (*avs.Delegator, *provisioning.ExternalEvalCreator, *avs.InternalEvalAssistant, *avs.ExternalEvalAssistant) { - server := avs.NewMockAvsServer(t) - mockServer := avs.FixMockAvsServer(server) - avsConfig := avs.Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - } - client, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - assert.NoError(t, err) - avsDel := avs.NewDelegator(client, avsConfig, db.Operations()) - externalEvalAssistant := avs.NewExternalEvalAssistant(cfg.Avs) - internalEvalAssistant := avs.NewInternalEvalAssistant(cfg.Avs) - externalEvalCreator := provisioning.NewExternalEvalCreator(avsDel, cfg.Avs.Disabled, externalEvalAssistant) - - return avsDel, externalEvalCreator, internalEvalAssistant, externalEvalAssistant -} - func (s *BrokerSuiteTest) CreateProvisionedRuntime(options RuntimeOptions) string { randomInstanceId := uuid.New().String() diff --git a/cmd/broker/deprovisioning.go b/cmd/broker/deprovisioning.go index 351b618b5b..90ff8f535e 100644 --- a/cmd/broker/deprovisioning.go +++ b/cmd/broker/deprovisioning.go @@ -5,7 +5,6 @@ import ( "time" "github.com/kyma-project/kyma-environment-broker/common/hyperscaler" - "github.com/kyma-project/kyma-environment-broker/internal/avs" "github.com/kyma-project/kyma-environment-broker/internal/event" "github.com/kyma-project/kyma-environment-broker/internal/process" "github.com/kyma-project/kyma-environment-broker/internal/process/deprovisioning" @@ -19,8 +18,7 @@ import ( func NewDeprovisioningProcessingQueue(ctx context.Context, workersAmount int, deprovisionManager *process.StagedManager, cfg *Config, db storage.BrokerStorage, pub event.Publisher, - provisionerClient provisioner.Client, avsDel *avs.Delegator, internalEvalAssistant *avs.InternalEvalAssistant, - externalEvalAssistant *avs.ExternalEvalAssistant, + provisionerClient provisioner.Client, edpClient deprovisioning.EDPClient, accountProvider hyperscaler.AccountProvider, k8sClientProvider K8sClientProvider, cli client.Client, configProvider input.ConfigurationProvider, logs logrus.FieldLogger) *process.Queue { @@ -34,9 +32,6 @@ func NewDeprovisioningProcessingQueue(ctx context.Context, workersAmount int, de { step: deprovisioning.NewBTPOperatorCleanupStep(db.Operations(), k8sClientProvider), }, - { - step: deprovisioning.NewAvsEvaluationsRemovalStep(avsDel, db.Operations(), externalEvalAssistant, internalEvalAssistant), - }, { step: deprovisioning.NewEDPDeregistrationStep(db.Operations(), db.Instances(), edpClient, cfg.EDP), disabled: cfg.EDP.Disabled, diff --git a/cmd/broker/main.go b/cmd/broker/main.go index 36cfb07806..079f4bbb48 100644 --- a/cmd/broker/main.go +++ b/cmd/broker/main.go @@ -27,7 +27,6 @@ import ( orchestrationExt "github.com/kyma-project/kyma-environment-broker/common/orchestration" "github.com/kyma-project/kyma-environment-broker/internal" "github.com/kyma-project/kyma-environment-broker/internal/appinfo" - "github.com/kyma-project/kyma-environment-broker/internal/avs" "github.com/kyma-project/kyma-environment-broker/internal/broker" kebConfig "github.com/kyma-project/kyma-environment-broker/internal/config" "github.com/kyma-project/kyma-environment-broker/internal/dashboard" @@ -44,7 +43,6 @@ import ( orchestrate "github.com/kyma-project/kyma-environment-broker/internal/orchestration/handlers" "github.com/kyma-project/kyma-environment-broker/internal/process" "github.com/kyma-project/kyma-environment-broker/internal/process/input" - "github.com/kyma-project/kyma-environment-broker/internal/process/provisioning" "github.com/kyma-project/kyma-environment-broker/internal/provider" "github.com/kyma-project/kyma-environment-broker/internal/provisioner" "github.com/kyma-project/kyma-environment-broker/internal/runtime" @@ -113,7 +111,6 @@ type Config struct { Broker broker.Config CatalogFilePath string - Avs avs.Config EDP edp.Config Notification notification.Config @@ -311,16 +308,6 @@ func main() { edpClient := edp.NewClient(cfg.EDP) - panicOnError(cfg.Avs.ReadMaintenanceModeDuringUpgradeAlwaysDisabledGAIDsFromYaml( - cfg.AvsMaintenanceModeDuringUpgradeAlwaysDisabledGlobalAccountsFilePath)) - avsClient, err := avs.NewClient(ctx, cfg.Avs, logs) - fatalOnError(err, logs) - avsDel := avs.NewDelegator(avsClient, cfg.Avs, db.Operations()) - externalEvalAssistant := avs.NewExternalEvalAssistant(cfg.Avs) - internalEvalAssistant := avs.NewInternalEvalAssistant(cfg.Avs) - externalEvalCreator := provisioning.NewExternalEvalCreator(avsDel, cfg.Avs.ExternalTesterDisabled, externalEvalAssistant) - upgradeEvalManager := avs.NewEvaluationManager(avsDel, cfg.Avs) - // application event broker eventBroker := event.NewPubSub(logs) @@ -330,12 +317,10 @@ func main() { // run queues provisionManager := process.NewStagedManager(db.Operations(), eventBroker, cfg.OperationTimeout, cfg.Provisioning, logs.WithField("provisioning", "manager")) provisionQueue := NewProvisioningProcessingQueue(ctx, provisionManager, cfg.Provisioning.WorkersAmount, &cfg, db, provisionerClient, inputFactory, - avsDel, internalEvalAssistant, externalEvalCreator, edpClient, accountProvider, skrK8sClientProvider, cli, oidcDefaultValues, logs) deprovisionManager := process.NewStagedManager(db.Operations(), eventBroker, cfg.OperationTimeout, cfg.Deprovisioning, logs.WithField("deprovisioning", "manager")) - deprovisionQueue := NewDeprovisioningProcessingQueue(ctx, cfg.Deprovisioning.WorkersAmount, deprovisionManager, &cfg, db, eventBroker, provisionerClient, - avsDel, internalEvalAssistant, externalEvalAssistant, edpClient, accountProvider, + deprovisionQueue := NewDeprovisioningProcessingQueue(ctx, cfg.Deprovisioning.WorkersAmount, deprovisionManager, &cfg, db, eventBroker, provisionerClient, edpClient, accountProvider, skrK8sClientProvider, cli, configProvider, logs) updateManager := process.NewStagedManager(db.Operations(), eventBroker, cfg.OperationTimeout, cfg.Update, logs.WithField("update", "manager")) @@ -363,7 +348,7 @@ func main() { runtimeResolver := orchestrationExt.NewGardenerRuntimeResolver(dynamicGardener, gardenerNamespace, runtimeLister, logs) clusterQueue := NewClusterOrchestrationProcessingQueue(ctx, db, provisionerClient, eventBroker, inputFactory, - nil, time.Minute, runtimeResolver, upgradeEvalManager, notificationBuilder, logs, cli, cfg, 1) + nil, time.Minute, runtimeResolver, notificationBuilder, logs, cli, cfg, 1) // TODO: in case of cluster upgrade the same Azure Zones must be send to the Provisioner orchestrationHandler := orchestrate.NewOrchestrationHandler(db, clusterQueue, cfg.MaxPaginationPage, logs) diff --git a/cmd/broker/provisioning.go b/cmd/broker/provisioning.go index e01c7a0869..86c9377958 100644 --- a/cmd/broker/provisioning.go +++ b/cmd/broker/provisioning.go @@ -7,7 +7,6 @@ import ( "github.com/kyma-project/kyma-environment-broker/internal/provider" "github.com/kyma-project/kyma-environment-broker/common/hyperscaler" - "github.com/kyma-project/kyma-environment-broker/internal/avs" "github.com/kyma-project/kyma-environment-broker/internal/process" "github.com/kyma-project/kyma-environment-broker/internal/process/input" "github.com/kyma-project/kyma-environment-broker/internal/process/provisioning" @@ -19,8 +18,7 @@ import ( ) func NewProvisioningProcessingQueue(ctx context.Context, provisionManager *process.StagedManager, workersAmount int, cfg *Config, - db storage.BrokerStorage, provisionerClient provisioner.Client, inputFactory input.CreatorForPlan, avsDel *avs.Delegator, - internalEvalAssistant *avs.InternalEvalAssistant, externalEvalCreator *provisioning.ExternalEvalCreator, + db storage.BrokerStorage, provisionerClient provisioner.Client, inputFactory input.CreatorForPlan, edpClient provisioning.EDPClient, accountProvider hyperscaler.AccountProvider, k8sClientProvider provisioning.K8sClientProvider, cli client.Client, defaultOIDC internal.OIDCConfigDTO, logs logrus.FieldLogger) *process.Queue { @@ -31,7 +29,7 @@ func NewProvisioningProcessingQueue(ctx context.Context, provisionManager *proce const postActionsStageName = "post_actions" provisionManager.DefineStages([]string{startStageName, createRuntimeStageName, - checkKymaStageName, createKymaResourceStageName, postActionsStageName}) + checkKymaStageName, createKymaResourceStageName}) /* The provisioning process contains the following stages: 1. "start" - changes the state from pending to in progress if no deprovisioning is ongoing. @@ -73,11 +71,6 @@ func NewProvisioningProcessingQueue(ctx context.Context, provisionManager *proce step: provisioning.NewResolveCredentialsStep(db.Operations(), accountProvider), condition: provisioning.SkipForOwnClusterPlan, }, - { - stage: createRuntimeStageName, - step: provisioning.NewInternalEvaluationStep(avsDel, internalEvalAssistant), - disabled: cfg.Avs.Disabled, - }, { stage: createRuntimeStageName, step: provisioning.NewEDPRegistrationStep(db.Operations(), edpClient, cfg.EDP), @@ -144,17 +137,6 @@ func NewProvisioningProcessingQueue(ctx context.Context, provisionManager *proce stage: createKymaResourceStageName, step: provisioning.NewApplyKymaStep(db.Operations(), cli), }, - // post actions - { - stage: postActionsStageName, - step: provisioning.NewExternalEvalStep(externalEvalCreator), - disabled: cfg.Avs.Disabled, - }, - { - stage: postActionsStageName, - step: provisioning.NewInternalEvaluationStep(avsDel, internalEvalAssistant), - disabled: cfg.Avs.Disabled, - }, } for _, step := range provisioningSteps { if !step.disabled { diff --git a/cmd/broker/upgrade_cluster.go b/cmd/broker/upgrade_cluster.go index ba5ab2fdcc..f34af2d96b 100644 --- a/cmd/broker/upgrade_cluster.go +++ b/cmd/broker/upgrade_cluster.go @@ -5,7 +5,6 @@ import ( "time" orchestrationExt "github.com/kyma-project/kyma-environment-broker/common/orchestration" - "github.com/kyma-project/kyma-environment-broker/internal/avs" "github.com/kyma-project/kyma-environment-broker/internal/event" "github.com/kyma-project/kyma-environment-broker/internal/notification" "github.com/kyma-project/kyma-environment-broker/internal/orchestration/manager" @@ -21,11 +20,11 @@ import ( func NewClusterOrchestrationProcessingQueue(ctx context.Context, db storage.BrokerStorage, provisionerClient provisioner.Client, pub event.Publisher, inputFactory input.CreatorForPlan, icfg *upgrade_cluster.TimeSchedule, pollingInterval time.Duration, - runtimeResolver orchestrationExt.RuntimeResolver, upgradeEvalManager *avs.EvaluationManager, notificationBuilder notification.BundleBuilder, logs logrus.FieldLogger, + runtimeResolver orchestrationExt.RuntimeResolver, notificationBuilder notification.BundleBuilder, logs logrus.FieldLogger, cli client.Client, cfg Config, speedFactor int) *process.Queue { upgradeClusterManager := upgrade_cluster.NewManager(db.Operations(), pub, logs.WithField("upgradeCluster", "manager")) - upgradeClusterInit := upgrade_cluster.NewInitialisationStep(db.Operations(), db.Orchestrations(), provisionerClient, inputFactory, upgradeEvalManager, icfg, notificationBuilder) + upgradeClusterInit := upgrade_cluster.NewInitialisationStep(db.Operations(), db.Orchestrations(), provisionerClient, inputFactory, icfg, notificationBuilder) upgradeClusterManager.InitStep(upgradeClusterInit) upgradeClusterSteps := []struct { diff --git a/go.mod b/go.mod index 3810a3e61f..ada8e99582 100644 --- a/go.mod +++ b/go.mod @@ -82,7 +82,7 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/huandu/xstrings v1.5.0 // indirect + github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -131,6 +131,7 @@ require ( google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gotest.tools/v3 v3.1.0 // indirect + honnef.co/go/tools v0.5.1 // indirect k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/utils v0.0.0-20240902221715-702e33fdd3c3 // indirect diff --git a/internal/avs/client.go b/internal/avs/client.go deleted file mode 100644 index 3cd849a4bc..0000000000 --- a/internal/avs/client.go +++ /dev/null @@ -1,303 +0,0 @@ -package avs - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "strconv" - "strings" - - kebError "github.com/kyma-project/kyma-environment-broker/internal/error" - "github.com/sirupsen/logrus" - "golang.org/x/oauth2" -) - -type Client struct { - httpClient *http.Client - avsConfig Config - log logrus.FieldLogger - ctx context.Context -} - -func NewClient(ctx context.Context, avsConfig Config, log logrus.FieldLogger) (*Client, error) { - return &Client{ - avsConfig: avsConfig, - log: log, - ctx: ctx, - }, nil -} - -func (c *Client) CreateEvaluation(evaluationRequest *BasicEvaluationCreateRequest) (*BasicEvaluationCreateResponse, error) { - var responseObject BasicEvaluationCreateResponse - - objAsBytes, err := json.Marshal(evaluationRequest) - if err != nil { - return &responseObject, fmt.Errorf("while marshaling evaluation request: %w", err) - } - - request, err := http.NewRequest(http.MethodPost, c.avsConfig.ApiEndpoint, bytes.NewReader(objAsBytes)) - if err != nil { - return &responseObject, fmt.Errorf("while creating request: %w", err) - } - request.Header.Set("Content-Type", "application/json") - - response, err := c.execute(request, false, true) - if err != nil { - return &responseObject, fmt.Errorf("while executing CreateEvaluation request: %w", err) - } - defer func() { - if closeErr := c.closeResponseBody(response); closeErr != nil { - err = kebError.AsTemporaryError(closeErr, "while closing CreateEvaluation response") - } - }() - - err = json.NewDecoder(response.Body).Decode(&responseObject) - if err != nil { - return nil, fmt.Errorf("while decode create evaluation response: %w", err) - } - - return &responseObject, nil -} - -func (c *Client) GetEvaluation(evaluationID int64) (*BasicEvaluationCreateResponse, error) { - var responseObject BasicEvaluationCreateResponse - absoluteURL := appendId(c.avsConfig.ApiEndpoint, evaluationID) - - request, err := http.NewRequest(http.MethodGet, absoluteURL, nil) - if err != nil { - return &responseObject, fmt.Errorf("while creating request: %w", err) - } - request.Header.Set("Content-Type", "application/json") - - response, err := c.execute(request, false, true) - if err != nil { - return &responseObject, fmt.Errorf("while executing GetEvaluation request: %w", err) - } - defer func() { - if closeErr := c.closeResponseBody(response); closeErr != nil { - err = kebError.AsTemporaryError(closeErr, "while closing GetEvaluation response") - } - }() - - err = json.NewDecoder(response.Body).Decode(&responseObject) - if err != nil { - return nil, fmt.Errorf("while decode create evaluation response: %w", err) - } - - return &responseObject, nil -} - -func (c *Client) AddTag(evaluationID int64, tag *Tag) (*BasicEvaluationCreateResponse, error) { - var responseObject BasicEvaluationCreateResponse - - objAsBytes, err := json.Marshal(tag) - if err != nil { - return &responseObject, fmt.Errorf("while marshaling AddTag request: %w", err) - } - absoluteURL := appendId(c.avsConfig.ApiEndpoint, evaluationID) - - request, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/tag", absoluteURL), bytes.NewReader(objAsBytes)) - if err != nil { - return &responseObject, fmt.Errorf("while creating AddTag request: %w", err) - } - request.Header.Set("Content-Type", "application/json") - - response, err := c.execute(request, false, true) - if err != nil { - return &responseObject, fmt.Errorf("while executing AddTag request: %w", err) - } - defer func() { - if closeErr := c.closeResponseBody(response); closeErr != nil { - err = kebError.AsTemporaryError(closeErr, "while closing AddTag response") - } - }() - - err = json.NewDecoder(response.Body).Decode(&responseObject) - if err != nil { - return nil, fmt.Errorf("while decode AddTag response: %w", err) - } - - return &responseObject, nil -} - -func (c *Client) SetStatus(evaluationID int64, status string) (*BasicEvaluationCreateResponse, error) { - var responseObject BasicEvaluationCreateResponse - - objAsBytes, err := json.Marshal(status) - if err != nil { - return &responseObject, fmt.Errorf("while marshaling SetStatus request: %w", err) - } - absoluteURL := appendId(c.avsConfig.ApiEndpoint, evaluationID) - - request, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/lifecycle", absoluteURL), bytes.NewReader(objAsBytes)) - if err != nil { - return &responseObject, fmt.Errorf("while creating SetStatus request: %w", err) - } - request.Header.Set("Content-Type", "application/json") - - response, err := c.execute(request, true, true) - if err != nil { - return &responseObject, fmt.Errorf("while executing SetStatus request: %w", err) - } - defer func() { - if closeErr := c.closeResponseBody(response); closeErr != nil { - err = kebError.AsTemporaryError(closeErr, "while closing SetStatus response") - } - }() - - err = json.NewDecoder(response.Body).Decode(&responseObject) - if err != nil { - return nil, fmt.Errorf("while decode SetStatus response: %w", err) - } - - return &responseObject, nil -} - -func (c *Client) RemoveReferenceFromParentEval(parentID, evaluationID int64) (err error) { - absoluteURL := fmt.Sprintf("%s/child/%d", appendId(c.avsConfig.ApiEndpoint, parentID), evaluationID) - response, err := c.deleteRequest(absoluteURL) - if err == nil { - return nil - } - - if response != nil && response.StatusCode == http.StatusBadRequest { - defer func() { - if closeErr := c.closeResponseBody(response); closeErr != nil { - err = kebError.AsTemporaryError(closeErr, "while closing body") - } - }() - buff, err := io.ReadAll(response.Body) - if err != nil { - return fmt.Errorf("unable to read the response body: %w", err) - } - var responseObject avsApiErrorResp - err = json.NewDecoder(bytes.NewReader(buff)).Decode(&responseObject) - if err != nil { - return fmt.Errorf("while decoding AvS non success response body for ID: %d, URL: %s, error: %w", - evaluationID, absoluteURL, err) - } - if strings.Contains(strings.ToLower(responseObject.Message), "does not contain subevaluation") { - return nil - } - return fmt.Errorf("unable to delete subevaluation %d reference from the parent evaluation: %s", evaluationID, responseObject.Message) - } - return fmt.Errorf("unexpected response for evaluationId: %d while deleting reference from parent evaluation, error: %w", evaluationID, err) -} - -func (c *Client) DeleteEvaluation(evaluationId int64) (err error) { - absoluteURL := appendId(c.avsConfig.ApiEndpoint, evaluationId) - response, err := c.deleteRequest(absoluteURL) - defer func() { - if closeErr := c.closeResponseBody(response); closeErr != nil { - err = kebError.AsTemporaryError(closeErr, "while closing DeleteEvaluation response body") - } - }() - if err != nil { - return fmt.Errorf("while deleting evaluation: %w", err) - } - - return nil -} - -func appendId(baseUrl string, id int64) string { - if strings.HasSuffix(baseUrl, "/") { - return baseUrl + strconv.FormatInt(id, 10) - } else { - return baseUrl + "/" + strconv.FormatInt(id, 10) - } -} - -func (c *Client) deleteRequest(absoluteURL string) (*http.Response, error) { - req, err := http.NewRequest(http.MethodDelete, absoluteURL, nil) - if err != nil { - return nil, fmt.Errorf("while creating delete request: %w", err) - } - - response, err := c.execute(req, true, true) - if err != nil { - return response, fmt.Errorf("while executing delete request for path: %s: %w", absoluteURL, err) - } - - return response, nil -} - -func (c *Client) execute(request *http.Request, allowNotFound bool, allowResetToken bool) (*http.Response, error) { - httpClient, err := getHttpClient(c.ctx, c.avsConfig) - if err != nil { - return &http.Response{}, fmt.Errorf("while getting http client: %w", err) - } - defer httpClient.CloseIdleConnections() - response, err := httpClient.Do(request) - if err != nil { - return &http.Response{}, kebError.AsTemporaryError(err, "while executing request by http client") - } - - if response.StatusCode >= http.StatusInternalServerError { - return response, kebError.WrapNewTemporaryError(NewAvsError("avs server returned %d status code", response.StatusCode)) - } - - switch response.StatusCode { - case http.StatusOK, http.StatusCreated: - return response, nil - case http.StatusNotFound: - if allowNotFound { - return response, nil - } - return response, NewAvsError("response status code: %d for %s", http.StatusNotFound, request.URL.String()) - case http.StatusUnauthorized: - if allowResetToken { - return c.execute(request, allowNotFound, false) - } - return response, NewAvsError("avs server returned %d status code twice for %s", http.StatusUnauthorized, request.URL.String()) - } - - return response, NewAvsError("unsupported status code: %d for %s.", response.StatusCode, request.URL.String()) -} - -func (c *Client) closeResponseBody(response *http.Response) (error error) { - if response == nil { - return - } - if response.Body == nil { - return - } - defer func() { - if err := response.Body.Close(); err != nil { - error = err - } - }() - // drain the body to let the transport reuse the connection - if _, err := io.Copy(io.Discard, response.Body); err != nil { - return err - } - return -} - -func responseBody(resp *http.Response) string { - bodyBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "" - } - return string(bodyBytes) -} - -func getHttpClient(ctx context.Context, cfg Config) (http.Client, error) { - config := oauth2.Config{ - ClientID: cfg.OauthClientId, - Endpoint: oauth2.Endpoint{ - TokenURL: cfg.OauthTokenEndpoint, - AuthStyle: oauth2.AuthStyleInHeader, - }, - } - - initialToken, err := config.PasswordCredentialsToken(ctx, cfg.OauthUsername, cfg.OauthPassword) - if err != nil { - return http.Client{}, kebError.AsTemporaryError(err, "while fetching initial token") - } - - return *config.Client(ctx, initialToken), nil -} diff --git a/internal/avs/client_test.go b/internal/avs/client_test.go deleted file mode 100644 index afc0debacd..0000000000 --- a/internal/avs/client_test.go +++ /dev/null @@ -1,338 +0,0 @@ -package avs - -import ( - "context" - "fmt" - "testing" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" -) - -const ( - parentEvaluationID = 42 - evaluationName = "test_evaluation" -) - -func TestClient_CreateEvaluation(t *testing.T) { - t.Run("create evaluation the first time", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - }, logrus.New()) - assert.NoError(t, err) - - // When - response, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: evaluationName, - ParentId: parentEvaluationID, - }) - - // Then - assert.NoError(t, err) - assert.Equal(t, evaluationName, response.Name) - assert.NotEmpty(t, server.Evaluations.ParentIDrefs[parentEvaluationID]) - }) - - t.Run("create evaluation with token reset", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - server.TokenExpired = 1 - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - }, logrus.New()) - assert.NoError(t, err) - - // When - response, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: evaluationName, - ParentId: parentEvaluationID, - }) - - // Then - assert.NoError(t, err) - assert.Equal(t, "test_evaluation", response.Name) - assert.NotEmpty(t, server.Evaluations.ParentIDrefs[parentEvaluationID]) - }) - - t.Run("401 error during creating evaluation", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - server.TokenExpired = 2 - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - // When - _, err = client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "test_evaluation", - }) - - // Then - assert.Error(t, err) - assert.Contains(t, err.Error(), "401") - }) -} - -func TestClient_DeleteEvaluation(t *testing.T) { - t.Run("should delete existing evaluation", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - resp, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "test_evaluation", - }) - assert.NoError(t, err) - - // When - err = client.DeleteEvaluation(resp.Id) - - // Then - assert.NoError(t, err) - assert.Empty(t, server.Evaluations.BasicEvals) - }) - - t.Run("should return error when trying to delete not existing evaluation", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - _, err = client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "test_evaluation", - ParentId: parentEvaluationID, - }) - assert.NoError(t, err) - - // When - err = client.DeleteEvaluation(123) - - // Then - assert.NoError(t, err) - assert.Empty(t, server.Evaluations.BasicEvals[123]) - }) -} - -func TestClient_GetEvaluation(t *testing.T) { - t.Run("should get existing evaluation", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - resp, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "test_evaluation_create", - Description: "custom description", - }) - assert.NoError(t, err) - - // When - getResp, err := client.GetEvaluation(resp.Id) - - // Then - assert.NoError(t, err) - assert.Equal(t, getResp, resp) - }) - - t.Run("should return error when trying to get not existing evaluation", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - // When - _, err = client.GetEvaluation(1) - - // Then - assert.Contains(t, err.Error(), "404") - }) -} - -func TestClient_Status(t *testing.T) { - t.Run("should get status", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - resp, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{}) - assert.NoError(t, err) - - // When - getResp, err := client.GetEvaluation(resp.Id) - - // Then - assert.NoError(t, err) - assert.Equal(t, getResp.Status, StatusActive) - }) - - t.Run("should update status", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - resp, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{}) - assert.NoError(t, err) - - // When - resp, err = client.SetStatus(resp.Id, StatusDeleted) - - // Then - assert.NoError(t, err) - assert.Equal(t, resp.Status, StatusDeleted) - }) - - t.Run("should not update invalid status", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - resp, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{}) - assert.NoError(t, err) - - // When - resp, err = client.SetStatus(resp.Id, "") - - // Then - assert.Contains(t, err.Error(), "500") - }) -} - -func TestClient_RemoveReferenceFromParentEval(t *testing.T) { - t.Run("should remove reference from parent eval", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - resp, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "test_evaluation", - ParentId: parentEvaluationID, - }) - assert.NoError(t, err) - - // When - err = client.RemoveReferenceFromParentEval(parentEvaluationID, resp.Id) - - // Then - assert.NoError(t, err) - assert.Empty(t, server.Evaluations.ParentIDrefs[parentEvaluationID]) - }) - t.Run("should return error when wrong api url provided", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", "http://not-existing"), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - // When - err = client.RemoveReferenceFromParentEval(parentEvaluationID, 111) - - // then - assert.Error(t, err) - }) - t.Run("should ignore error when parent evaluation does not contain subevaluation", func(t *testing.T) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - // When - err = client.RemoveReferenceFromParentEval(int64(9999), 111) - - // then - assert.NoError(t, err) - }) - -} - -func TestClient_AddTag(t *testing.T) { - t.Run("should add tag to existing evaluation", func(t *testing.T) { - // given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - client, err := NewClient(context.TODO(), Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - ParentId: parentEvaluationID, - }, logrus.New()) - assert.NoError(t, err) - - response, err := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "test_evaluation", - ParentId: parentEvaluationID, - }) - assert.NoError(t, err) - - fixedTag := FixTag() - - // when - eval, err := client.AddTag(response.Id, fixedTag) - - // then - assert.NoError(t, err) - assert.Equal(t, fixedTag, eval.Tags[0]) - }) -} diff --git a/internal/avs/config.go b/internal/avs/config.go deleted file mode 100644 index 62c84262e0..0000000000 --- a/internal/avs/config.go +++ /dev/null @@ -1,82 +0,0 @@ -package avs - -import ( - "fmt" - "os" - - kebError "github.com/kyma-project/kyma-environment-broker/internal/error" - "gopkg.in/yaml.v3" -) - -type Config struct { - OauthTokenEndpoint string - OauthUsername string - OauthPassword string - OauthClientId string - ApiEndpoint string - DefinitionType string `envconfig:"default=BASIC"` - Disabled bool `envconfig:"default=false"` - InternalTesterAccessId int64 - InternalTesterService string `envconfig:"optional"` - GroupId int64 - ExternalTesterDisabled bool - ExternalTesterAccessId int64 - ExternalTesterService string `envconfig:"optional"` - ParentId int64 - InstanceIdTagClassId int - ShootNameTagClassId int - RegionTagClassId int - GlobalAccountIdTagClassId int - SubAccountIdTagClassId int - LandscapeTagClassId int - ProviderTagClassId int - TrialInternalTesterAccessId int64 `envconfig:"optional"` - TrialParentId int64 `envconfig:"optional"` - TrialGroupId int64 `envconfig:"optional"` - MaintenanceModeDuringUpgradeDisabled bool `envconfig:"default=false"` - MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs []string `envconfig:"-"` -} - -func (c *Config) IsTrialConfigured() bool { - return c.TrialInternalTesterAccessId != 0 && c.TrialParentId != 0 && c.TrialGroupId != 0 -} - -func (c *Config) ReadMaintenanceModeDuringUpgradeAlwaysDisabledGAIDsFromYaml(yamlFilePath string) error { - yamlData, err := os.ReadFile(yamlFilePath) - if err != nil { - return fmt.Errorf("while reading YAML file with GA IDs: %w", err) - } - var gaIDs struct { - MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs []string `yaml:"maintenanceModeDuringUpgradeAlwaysDisabledGAIDs"` - } - err = yaml.Unmarshal(yamlData, &gaIDs) - if err != nil { - return fmt.Errorf("while unmarshalling YAML file with GA IDs: %w", err) - } - - c.MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs = append( - c.MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs, - gaIDs.MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs...) - - return nil -} - -type avsError struct { - message string -} - -func (e avsError) Error() string { - return e.message -} - -func (e avsError) Component() kebError.ErrComponent { - return kebError.ErrAVS -} - -func (e avsError) Reason() kebError.ErrReason { - return kebError.ErrHttpStatusCode -} - -func NewAvsError(format string, args ...interface{}) kebError.ErrorReporter { - return avsError{message: fmt.Sprintf(format, args...)} -} diff --git a/internal/avs/config_test.go b/internal/avs/config_test.go deleted file mode 100644 index 2bab21f496..0000000000 --- a/internal/avs/config_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package avs_test - -import ( - "testing" - - "github.com/kyma-project/kyma-environment-broker/internal/avs" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -const ( - maintenanceModeGAIDsYamlFilePath = "testdata/avs_maintenance_mode_always_disabled_ga_ids.yaml" -) - -func TestConfig_ReadMaintenanceModeDuringUpgradeAlwaysDisabledGAIDsFromYaml(t *testing.T) { - // given - avsConfig := avs.Config{} - expectedGAID1, expectedGAID2 := "test-ga-id-1", "test-ga-id-2" - - // when - err := avsConfig.ReadMaintenanceModeDuringUpgradeAlwaysDisabledGAIDsFromYaml(maintenanceModeGAIDsYamlFilePath) - require.NoError(t, err) - - // then - assert.Contains(t, avsConfig.MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs, expectedGAID1) - assert.Contains(t, avsConfig.MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs, expectedGAID2) -} diff --git a/internal/avs/delegator.go b/internal/avs/delegator.go deleted file mode 100644 index 6c0be070ce..0000000000 --- a/internal/avs/delegator.go +++ /dev/null @@ -1,213 +0,0 @@ -package avs - -import ( - "fmt" - "time" - - "github.com/kyma-project/kyma-environment-broker/internal" - kebError "github.com/kyma-project/kyma-environment-broker/internal/error" - "github.com/kyma-project/kyma-environment-broker/internal/process" - "github.com/kyma-project/kyma-environment-broker/internal/storage" - "github.com/sirupsen/logrus" -) - -type Delegator struct { - operationManager *process.OperationManager - avsConfig Config - client *Client - operationsStorage storage.Operations -} - -type avsApiErrorResp struct { - StatusCode int `json:"statusCode"` - Status string `json:"status"` - Message string `json:"message"` -} - -func NewDelegator(client *Client, avsConfig Config, os storage.Operations) *Delegator { - return &Delegator{ - operationManager: process.NewOperationManager(os), - avsConfig: avsConfig, - client: client, - operationsStorage: os, - } -} - -func (del *Delegator) CreateEvaluation(log logrus.FieldLogger, operation internal.Operation, evalAssistant EvalAssistant, url string) (internal.Operation, time.Duration, error) { - log.Infof("starting the step avs internal id [%d] and avs external id [%d]", operation.Avs.AvsEvaluationInternalId, operation.Avs.AVSEvaluationExternalId) - - var updatedOperation internal.Operation - d := 0 * time.Second - - if evalAssistant.IsValid(operation.Avs) { - log.Infof("step has already been finished previously") - updatedOperation = operation - } else { - log.Infof("making avs calls to create the Evaluation") - evaluationObject, err := evalAssistant.CreateBasicEvaluationRequest(operation, url) - if err != nil { - log.Errorf("step failed with error %v", err) - return operation, 5 * time.Second, nil - } - - evalResp, err := del.client.CreateEvaluation(evaluationObject) - switch { - case err == nil: - case kebError.IsTemporaryError(err): - errMsg := "cannot create AVS evaluation (temporary)" - log.Errorf("%s: %s", errMsg, err) - retryConfig := evalAssistant.provideRetryConfig() - return del.operationManager.RetryOperation(operation, errMsg, err, retryConfig.retryInterval, retryConfig.maxTime, log) - default: - errMsg := "cannot create AVS evaluation" - log.Errorf("%s: %s", errMsg, err) - return del.operationManager.OperationFailed(operation, errMsg, err, log) - } - updatedOperation, d, _ = del.operationManager.UpdateOperation(operation, func(operation *internal.Operation) { - evalAssistant.SetEvalId(&operation.Avs, evalResp.Id) - evalAssistant.SetDeleted(&operation.Avs, false) - }, log) - } - - return updatedOperation, d, nil -} - -func (del *Delegator) AddTags(log logrus.FieldLogger, operation internal.Operation, evalAssistant EvalAssistant, tags []*Tag) (internal.Operation, time.Duration, error) { - log.Infof("starting the AddTag to avs internal id [%d]", operation.Avs.AvsEvaluationInternalId) - var updatedOperation internal.Operation - d := 0 * time.Second - - log.Infof("making avs calls to add tags to the Evaluation") - evalID := evalAssistant.GetEvaluationId(operation.Avs) - - for _, tag := range tags { - _, err := del.client.AddTag(evalID, tag) - switch { - case err == nil: - case kebError.IsTemporaryError(err): - errMsg := "cannot add tags to AVS evaluation (temporary)" - log.Errorf("%s: %s", errMsg, err) - retryConfig := evalAssistant.provideRetryConfig() - op, duration, err := del.operationManager.RetryOperation(operation, errMsg, err, retryConfig.retryInterval, retryConfig.maxTime, log) - return op, duration, err - default: - errMsg := "cannot add tags to AVS evaluation" - log.Errorf("%s: %s", errMsg, err) - op, duration, err := del.operationManager.OperationFailed(operation, errMsg, err, log) - return op, duration, err - } - } - return updatedOperation, d, nil -} - -func (del *Delegator) ResetStatus(log logrus.FieldLogger, lifecycleData *internal.AvsLifecycleData, evalAssistant EvalAssistant) error { - status := evalAssistant.GetOriginalEvalStatus(*lifecycleData) - // For cases when operation is not loaded (properly) from DB, status fields will be rendered - // invalid. This will lead to a failing operation on reset in the following scenario: - // - // Upgrade operation when loaded (for the first time, on init) was InProgress and was later switched to complete. - // When launching post operation logic, SetStatus will be invoked with invalid value, failing the operation. - // One of possible hotfixes is to ensure that for invalid status there is a default value (such as Active). - if !ValidStatus(status) { - log.Errorf("invalid status for ResetStatus: %s", status) - status = StatusActive - } - - return del.SetStatus(log, lifecycleData, evalAssistant, status) -} - -// RefreshStatus ensures that operation AVS lifecycle data is fetched from Avs API -func (del *Delegator) RefreshStatus(log logrus.FieldLogger, lifecycleData *internal.AvsLifecycleData, evalAssistant EvalAssistant) string { - evalID := evalAssistant.GetEvaluationId(*lifecycleData) - currentStatus := evalAssistant.GetEvalStatus(*lifecycleData) - - // obtain status from avs - log.Infof("making avs calls to get evaluation data") - eval, err := del.client.GetEvaluation(evalID) - if err != nil || eval == nil { - log.Errorf("cannot obtain evaluation data on RefreshStatus: %s", err) - } else { - currentStatus = eval.Status - } - - evalAssistant.SetEvalStatus(lifecycleData, currentStatus) - - return currentStatus -} - -func (del *Delegator) SetStatus(log logrus.FieldLogger, lifecycleData *internal.AvsLifecycleData, evalAssistant EvalAssistant, status string) error { - // skip for non-existent or deleted evaluation - if !evalAssistant.IsValid(*lifecycleData) { - return nil - } - - // fail for invalid status request - if !ValidStatus(status) { - errMsg := fmt.Sprintf("avs SetStatus tried invalid status: %s", status) - log.Error(errMsg) - return fmt.Errorf(errMsg) - } - - evalID := evalAssistant.GetEvaluationId(*lifecycleData) - currentStatus := del.RefreshStatus(log, lifecycleData, evalAssistant) - - log.Infof("SetStatus %s to avs id [%d]", status, evalID) - - // do api call iff current and requested status are different - if currentStatus != status { - log.Infof("making avs calls to set status %s to the evaluation", status) - _, err := del.client.SetStatus(evalID, status) - - switch { - case err == nil: - case kebError.IsTemporaryError(err): - errMsg := "cannot set status to AVS evaluation (temporary)" - log.Errorf("%s: %s", errMsg, err) - return err - default: - errMsg := "cannot set status to AVS evaluation" - log.Errorf("%s: %s", errMsg, err) - return err - } - - // update operation with newly configured status - evalAssistant.SetEvalStatus(lifecycleData, status) - } - - return nil -} - -func (del *Delegator) DeleteAvsEvaluation(deProvisioningOperation internal.Operation, logger logrus.FieldLogger, assistant EvalAssistant) (internal.Operation, error) { - if assistant.IsAlreadyDeletedOrEmpty(deProvisioningOperation.Avs) { - logger.Infof("Evaluations have been deleted previously") - return deProvisioningOperation, nil - } - - if err := del.tryDeleting(assistant, deProvisioningOperation, logger); err != nil { - return deProvisioningOperation, err - } - - updatedDeProvisioningOp, _, err := del.operationManager.UpdateOperation(deProvisioningOperation, func(op *internal.Operation) { - assistant.SetDeleted(&op.Avs, true) - }, logger) - if err != nil { - return deProvisioningOperation, err - } - return updatedDeProvisioningOp, nil -} - -func (del *Delegator) tryDeleting(assistant EvalAssistant, deProvisioningOperation internal.Operation, logger logrus.FieldLogger) error { - evaluationID := assistant.GetEvaluationId(deProvisioningOperation.Avs) - parentID := assistant.ProvideParentId(deProvisioningOperation.ProvisioningParameters) - err := del.client.RemoveReferenceFromParentEval(parentID, evaluationID) - if err != nil { - return fmt.Errorf("error while deleting reference for evaluation %v", err) - } - - err = del.client.DeleteEvaluation(evaluationID) - if err != nil { - return fmt.Errorf("error while deleting evaluation %v", err) - } - - return nil -} diff --git a/internal/avs/delegator_test.go b/internal/avs/delegator_test.go deleted file mode 100644 index 1bebe50ef8..0000000000 --- a/internal/avs/delegator_test.go +++ /dev/null @@ -1,437 +0,0 @@ -package avs - -import ( - "context" - "fmt" - "testing" - - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/storage" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" -) - -func newTestParams(t *testing.T) (*Client, *MockAvsServer, Config, *InternalEvalAssistant, *ExternalEvalAssistant, *logrus.Logger) { - // Given - server := NewMockAvsServer(t) - mockServer := FixMockAvsServer(server) - avsCfg := Config{ - OauthTokenEndpoint: fmt.Sprintf("%s/oauth/token", mockServer.URL), - ApiEndpoint: fmt.Sprintf("%s/api/v2/evaluationmetadata", mockServer.URL), - } - client, err := NewClient(context.TODO(), avsCfg, logrus.New()) - assert.NoError(t, err) - iea := NewInternalEvalAssistant(avsCfg) - eea := NewExternalEvalAssistant(avsCfg) - - log := logrus.New() - - return client, server, avsCfg, iea, eea, log -} - -type testParams struct { - t *testing.T - client *Client - avsCfg Config - internalMonitor *BasicEvaluationCreateResponse - externalMonitor *BasicEvaluationCreateResponse -} - -func newDelOpsParams(params testParams) (*Delegator, internal.Operation) { - operation := internal.Operation{} - - *params.internalMonitor, *params.externalMonitor = createMonitors(params.client) - - operation.Avs = internal.AvsLifecycleData{ - AvsEvaluationInternalId: params.internalMonitor.Id, - AVSEvaluationExternalId: params.externalMonitor.Id, - } - - operation.Avs.AvsExternalEvaluationStatus = internal.AvsEvaluationStatus{ - Current: StatusActive, - Original: StatusMaintenance, - } - - operation.Avs.AvsInternalEvaluationStatus = internal.AvsEvaluationStatus{ - Current: StatusActive, - Original: StatusMaintenance, - } - - ops := storage.NewMemoryStorage().Operations() - delegator := NewDelegator(params.client, params.avsCfg, ops) - err := ops.InsertOperation(operation) - assert.NoError(params.t, err) - assert.NotEqual(params.t, params.internalMonitor.Id, params.externalMonitor.Id) - - return delegator, operation -} - -func setOpAvsStatus(op *internal.Operation, current string, original string) (string, string) { - op.Avs.AvsInternalEvaluationStatus.Current = current - op.Avs.AvsInternalEvaluationStatus.Original = original - - return current, original -} - -func createMonitors(client *Client) (BasicEvaluationCreateResponse, BasicEvaluationCreateResponse) { - internalEval, _ := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "internal-monitor", - }) - - externalEval, _ := client.CreateEvaluation(&BasicEvaluationCreateRequest{ - Name: "external-monitor", - }) - - return *internalEval, *externalEval -} - -// Since logic is the same for both internal and external monitors, -// we will only focus on internal monitor (easier to track). -func TestDelegator_SetStatus(t *testing.T) { - // Given - client, server, avsCfg, internalEA, _, logger := newTestParams(t) - params := testParams{ - t: t, - client: client, - avsCfg: avsCfg, - internalMonitor: &BasicEvaluationCreateResponse{}, - externalMonitor: &BasicEvaluationCreateResponse{}, - } - - t.Run("set for valid fields (requested != current)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := StatusInactive - current, _ := setOpAvsStatus(&op, StatusActive, StatusMaintenance) - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NoError(t, err) - assert.Equal(t, requested, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, current, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("set for valid fields (requested == current)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := StatusInactive - current, _ := setOpAvsStatus(&op, requested, StatusMaintenance) - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NoError(t, err) - assert.Equal(t, current, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, StatusActive, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("set for partial fields (requested != current, original empty)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := StatusInactive - current, _ := setOpAvsStatus(&op, StatusActive, "") - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NoError(t, err) - assert.Equal(t, requested, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, current, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("set for partial fields (requested == current, original empty)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := StatusInactive - current, _ := setOpAvsStatus(&op, requested, "") - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NoError(t, err) - assert.Equal(t, current, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, StatusActive, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("set for partial fields (requested != avs current, current empty)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := StatusInactive - setOpAvsStatus(&op, "", StatusMaintenance) - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NoError(t, err) - assert.Equal(t, requested, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, params.internalMonitor.Status, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("set for partial fields (requested == avs current, current empty)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := params.internalMonitor.Status - _, _ = setOpAvsStatus(&op, "", StatusMaintenance) - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NoError(t, err) - assert.Equal(t, params.internalMonitor.Status, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, StatusMaintenance, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("set for empty fields", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := StatusInactive - _, _ = setOpAvsStatus(&op, "", "") - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NoError(t, err) - assert.Equal(t, requested, internalEA.GetEvalStatus(op.Avs)) - // even though the avs Lifecycle data was initially empty, - // during SetStatus call it was reloaded from avs backend api - assert.Equal(t, params.internalMonitor.Status, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("set for invalid request", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - requested := "invalid" - _, _ = setOpAvsStatus(&op, StatusActive, StatusMaintenance) - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, requested) - - // Then - assert.NotNil(t, err) - assert.Contains(t, err.Error(), requested) - }) - - t.Run("disabled monitors", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - op.Avs.AvsEvaluationInternalId = 0 - - version := op.Version - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, StatusActive) - - // Then - assert.NoError(t, err) - assert.Equal(t, version, op.Version) - }) - - t.Run("deleted monitors", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - op.Avs.AVSInternalEvaluationDeleted = true - - version := op.Version - - // When - err := delegator.SetStatus(logger, &op.Avs, internalEA, StatusActive) - - // Then - assert.NoError(t, err) - assert.Equal(t, version, op.Version) - }) - - t.Run("reset for valid fields (current != original)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - current, original := setOpAvsStatus(&op, StatusActive, StatusMaintenance) - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - assert.Equal(t, original, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, current, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("reset for valid fields (current == original)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - current, _ := setOpAvsStatus(&op, StatusInactive, StatusInactive) - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - assert.Equal(t, current, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, StatusActive, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - // Since logic is the same for both internal and external monitors, - // we will only focus on internal monitor (easier to track). - t.Run("reset for empty fields", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - _, _ = setOpAvsStatus(&op, "", "") - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - // restores current status from default - assert.Equal(t, StatusActive, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, "", internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - // Since logic is the same for both internal and external monitors, - // we will only focus on internal monitor (easier to track). - t.Run("reset for partial fields (original empty)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - _, _ = setOpAvsStatus(&op, StatusMaintenance, "") - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - // restores current status from default - assert.Equal(t, StatusActive, internalEA.GetEvalStatus(op.Avs)) - assert.Equal(t, StatusMaintenance, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - // Since logic is the same for both internal and external monitors, - // we will only focus on internal monitor (easier to track). - t.Run("reset for partial fields (current empty)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - instanceStatus := StatusInactive - server.Evaluations.BasicEvals[params.internalMonitor.Id].Status = instanceStatus - - _, original := setOpAvsStatus(&op, "", StatusMaintenance) - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - assert.Equal(t, original, internalEA.GetEvalStatus(op.Avs)) - // restores original status from current, which is restored from Avs - assert.Equal(t, instanceStatus, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("reset from invalid fields (original invalid)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - _, _ = setOpAvsStatus(&op, StatusInactive, "invalid") - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - // restores current status from default - assert.Equal(t, StatusActive, internalEA.GetEvalStatus(op.Avs)) - // restores original status from current, which is restored from Avs - assert.Equal(t, StatusInactive, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("reset from invalid fields (current invalid)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - _, original := setOpAvsStatus(&op, "invalidField", StatusMaintenance) - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - assert.Equal(t, original, internalEA.GetEvalStatus(op.Avs)) - // restores original status from current, which is restored from Avs - assert.Equal(t, params.internalMonitor.Status, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("reset from invalid avs fields (avs != current, original invalid)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - instanceStatus := "invalidField" - server.Evaluations.BasicEvals[params.internalMonitor.Id].Status = instanceStatus - - current, _ := setOpAvsStatus(&op, StatusInactive, "invalid") - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - // restores current status from default - assert.Equal(t, StatusActive, internalEA.GetEvalStatus(op.Avs)) - // restores original status from current, which is restored from Avs - assert.Equal(t, current, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("reset from invalid avs fields (avs == current, original invalid)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - instanceStatus := "invalidField" - server.Evaluations.BasicEvals[params.internalMonitor.Id].Status = instanceStatus - - current, _ := setOpAvsStatus(&op, StatusInactive, instanceStatus) - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - // restores current status from default - assert.Equal(t, StatusActive, internalEA.GetEvalStatus(op.Avs)) - // restores original status from current, which is restored from Avs - assert.Equal(t, current, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("reset from invalid avs fields (avs != current, current invalid)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - instanceStatus := "invalidField" - server.Evaluations.BasicEvals[params.internalMonitor.Id].Status = instanceStatus - - _, original := setOpAvsStatus(&op, "invalid", StatusInactive) - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - assert.Equal(t, original, internalEA.GetEvalStatus(op.Avs)) - // don't push junk data into original, leave as is - assert.Equal(t, original, internalEA.GetOriginalEvalStatus(op.Avs)) - }) - - t.Run("reset from invalid avs fields (avs == current, current invalid)", func(t *testing.T) { - delegator, op := newDelOpsParams(params) - - instanceStatus := "invalidField" - server.Evaluations.BasicEvals[params.internalMonitor.Id].Status = instanceStatus - - _, original := setOpAvsStatus(&op, instanceStatus, StatusInactive) - - // When - err := delegator.ResetStatus(logger, &op.Avs, internalEA) - - // Then - assert.NoError(t, err) - assert.Equal(t, original, internalEA.GetEvalStatus(op.Avs)) - // don't push junk data into original, leave as is - assert.Equal(t, original, internalEA.GetOriginalEvalStatus(op.Avs)) - }) -} diff --git a/internal/avs/eval_assistant.go b/internal/avs/eval_assistant.go deleted file mode 100644 index eaab8d12eb..0000000000 --- a/internal/avs/eval_assistant.go +++ /dev/null @@ -1,28 +0,0 @@ -package avs - -import ( - "time" - - "github.com/kyma-project/kyma-environment-broker/internal" -) - -type EvalAssistant interface { - CreateBasicEvaluationRequest(operations internal.Operation, url string) (*BasicEvaluationCreateRequest, error) - IsAlreadyCreated(lifecycleData internal.AvsLifecycleData) bool - IsValid(lifecycleData internal.AvsLifecycleData) bool - IsInMaintenance(lifecycleData internal.AvsLifecycleData) bool - SetEvalId(lifecycleData *internal.AvsLifecycleData, evalId int64) - SetEvalStatus(lifecycleData *internal.AvsLifecycleData, status string) - GetEvalStatus(lifecycleData internal.AvsLifecycleData) string - GetOriginalEvalStatus(lifecycleData internal.AvsLifecycleData) string - IsAlreadyDeletedOrEmpty(lifecycleData internal.AvsLifecycleData) bool - GetEvaluationId(lifecycleData internal.AvsLifecycleData) int64 - ProvideParentId(pp internal.ProvisioningParameters) int64 - SetDeleted(lifecycleData *internal.AvsLifecycleData, deleted bool) - provideRetryConfig() *RetryConfig -} - -type RetryConfig struct { - retryInterval time.Duration - maxTime time.Duration -} diff --git a/internal/avs/evaluation_manager.go b/internal/avs/evaluation_manager.go deleted file mode 100644 index cdaef0e956..0000000000 --- a/internal/avs/evaluation_manager.go +++ /dev/null @@ -1,95 +0,0 @@ -package avs - -import ( - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/sirupsen/logrus" -) - -type EvaluationManager struct { - avsConfig Config - delegator *Delegator - internalAssistant *InternalEvalAssistant - externalAssistant *ExternalEvalAssistant -} - -func NewEvaluationManager(delegator *Delegator, config Config) *EvaluationManager { - return &EvaluationManager{ - delegator: delegator, - avsConfig: config, - internalAssistant: NewInternalEvalAssistant(config), - externalAssistant: NewExternalEvalAssistant(config), - } -} - -// SetStatus updates evaluation monitors (internal and external) status. -func (em *EvaluationManager) SetStatus(status string, avsData *internal.AvsLifecycleData, logger logrus.FieldLogger) error { - // do internal monitor status update - err := em.delegator.SetStatus(logger, avsData, em.internalAssistant, status) - if err != nil { - return err - } - - // do external monitor status update - err = em.delegator.SetStatus(logger, avsData, em.externalAssistant, status) - if err != nil { - return err - } - - return nil -} - -// RestoreStatus reverts previously set evaluation monitors status. -// On error, parent method should fail the operation progress. -// On delay, parent method should retry. -func (em *EvaluationManager) RestoreStatus(avsData *internal.AvsLifecycleData, logger logrus.FieldLogger) error { - // do internal monitor status reset - err := em.delegator.ResetStatus(logger, avsData, em.internalAssistant) - if err != nil { - return err - } - - // do external monitor status reset - err = em.delegator.ResetStatus(logger, avsData, em.externalAssistant) - if err != nil { - return err - } - - return nil -} - -func (em *EvaluationManager) SetMaintenanceStatus(avsData *internal.AvsLifecycleData, logger logrus.FieldLogger) error { - return em.SetStatus(StatusMaintenance, avsData, logger) -} - -func (em *EvaluationManager) InMaintenance(avsData internal.AvsLifecycleData) bool { - inMaintenance := true - - // check for internal monitor - if em.internalAssistant.IsValid(avsData) { - inMaintenance = inMaintenance && em.internalAssistant.IsInMaintenance(avsData) - } - - // check for external monitor - if em.externalAssistant.IsValid(avsData) { - inMaintenance = inMaintenance && em.externalAssistant.IsInMaintenance(avsData) - } - - return inMaintenance -} - -func (em *EvaluationManager) HasMonitors(avsData internal.AvsLifecycleData) bool { - return em.internalAssistant.IsValid(avsData) || em.externalAssistant.IsValid(avsData) -} - -func (em *EvaluationManager) IsMaintenanceModeDisabled() bool { - return em.avsConfig.MaintenanceModeDuringUpgradeDisabled -} - -func (em *EvaluationManager) IsMaintenanceModeApplicableForGAID(gaID string) bool { - for _, id := range em.avsConfig.MaintenanceModeDuringUpgradeAlwaysDisabledGAIDs { - if id == gaID { - return false - } - } - return true -} diff --git a/internal/avs/external_eval_assistant.go b/internal/avs/external_eval_assistant.go deleted file mode 100644 index 20da9c7444..0000000000 --- a/internal/avs/external_eval_assistant.go +++ /dev/null @@ -1,144 +0,0 @@ -package avs - -import ( - "time" - - "github.com/kyma-project/kyma-environment-broker/internal" -) - -const externalEvalCheckType = "HTTPSGET" - -type ExternalEvalAssistant struct { - avsConfig Config - retryConfig *RetryConfig -} - -func NewExternalEvalAssistant(avsConfig Config) *ExternalEvalAssistant { - return &ExternalEvalAssistant{ - avsConfig: avsConfig, - retryConfig: &RetryConfig{maxTime: 20 * time.Minute, retryInterval: 30 * time.Second}, - } -} - -func (eea *ExternalEvalAssistant) CreateBasicEvaluationRequest(operations internal.Operation, url string) (*BasicEvaluationCreateRequest, error) { - return newBasicEvaluationCreateRequest(operations, eea, url) -} - -func (eea *ExternalEvalAssistant) IsAlreadyCreated(lifecycleData internal.AvsLifecycleData) bool { - return lifecycleData.AVSEvaluationExternalId != 0 -} - -func (eea *ExternalEvalAssistant) IsValid(lifecycleData internal.AvsLifecycleData) bool { - return eea.IsAlreadyCreated(lifecycleData) && !eea.IsAlreadyDeletedOrEmpty(lifecycleData) -} - -func (eea *ExternalEvalAssistant) ProvideSuffix() string { - return "ext" -} - -func (eea *ExternalEvalAssistant) ProvideTesterAccessId(_ internal.ProvisioningParameters) int64 { - return eea.avsConfig.ExternalTesterAccessId -} - -func (eea *ExternalEvalAssistant) ProvideGroupId(_ internal.ProvisioningParameters) int64 { - return eea.avsConfig.GroupId -} - -func (eea *ExternalEvalAssistant) ProvideParentId(_ internal.ProvisioningParameters) int64 { - return eea.avsConfig.ParentId -} - -func (eea *ExternalEvalAssistant) ProvideTags(operation internal.Operation) []*Tag { - - tags := []*Tag{ - { - Content: operation.InstanceID, - TagClassId: eea.avsConfig.InstanceIdTagClassId, - }, - { - Content: operation.ProvisioningParameters.ErsContext.GlobalAccountID, - TagClassId: eea.avsConfig.GlobalAccountIdTagClassId, - }, - { - Content: operation.ProvisioningParameters.ErsContext.SubAccountID, - TagClassId: eea.avsConfig.SubAccountIdTagClassId, - }, - { - Content: operation.ProvisioningParameters.PlatformRegion, - TagClassId: eea.avsConfig.LandscapeTagClassId, - }, - { - Content: convertAZR(providerCodeByPlan(operation.ProvisioningParameters.PlanID)), - TagClassId: eea.avsConfig.ProviderTagClassId, - }, - { - Content: operation.ShootName, - TagClassId: eea.avsConfig.ShootNameTagClassId, - }, - } - - region := "" - if operation.ProvisioningParameters.Parameters.Region != nil { - region = *operation.ProvisioningParameters.Parameters.Region - } else if operation.Region != "" { - region = operation.Region - } - - tags = append(tags, &Tag{ - Content: region, - TagClassId: eea.avsConfig.RegionTagClassId, - }) - - return tags -} - -func (eea *ExternalEvalAssistant) ProvideNewOrDefaultServiceName(defaultServiceName string) string { - if eea.avsConfig.ExternalTesterService == "" { - return defaultServiceName - } - return eea.avsConfig.ExternalTesterService -} - -func (eea *ExternalEvalAssistant) SetEvalId(lifecycleData *internal.AvsLifecycleData, evalId int64) { - lifecycleData.AVSEvaluationExternalId = evalId -} - -func (eea *ExternalEvalAssistant) SetEvalStatus(lifecycleData *internal.AvsLifecycleData, status string) { - current := lifecycleData.AvsExternalEvaluationStatus.Current - if ValidStatus(current) { - lifecycleData.AvsExternalEvaluationStatus.Original = current - } - lifecycleData.AvsExternalEvaluationStatus.Current = status -} - -func (eea *ExternalEvalAssistant) GetEvalStatus(lifecycleData internal.AvsLifecycleData) string { - return lifecycleData.AvsExternalEvaluationStatus.Current -} - -func (eea *ExternalEvalAssistant) GetOriginalEvalStatus(lifecycleData internal.AvsLifecycleData) string { - return lifecycleData.AvsExternalEvaluationStatus.Original -} - -func (eea *ExternalEvalAssistant) IsInMaintenance(lifecycleData internal.AvsLifecycleData) bool { - return lifecycleData.AvsExternalEvaluationStatus.Current == StatusMaintenance -} - -func (eea *ExternalEvalAssistant) ProvideCheckType() string { - return externalEvalCheckType -} - -func (eea *ExternalEvalAssistant) IsAlreadyDeletedOrEmpty(lifecycleData internal.AvsLifecycleData) bool { - return lifecycleData.AVSExternalEvaluationDeleted || lifecycleData.AVSEvaluationExternalId == 0 -} - -func (eea *ExternalEvalAssistant) GetEvaluationId(lifecycleData internal.AvsLifecycleData) int64 { - return lifecycleData.AVSEvaluationExternalId -} - -func (eea *ExternalEvalAssistant) SetDeleted(lifecycleData *internal.AvsLifecycleData, deleted bool) { - lifecycleData.AVSExternalEvaluationDeleted = deleted -} - -func (eea *ExternalEvalAssistant) provideRetryConfig() *RetryConfig { - return eea.retryConfig -} diff --git a/internal/avs/internal_eval_assistant.go b/internal/avs/internal_eval_assistant.go deleted file mode 100644 index c125206c8e..0000000000 --- a/internal/avs/internal_eval_assistant.go +++ /dev/null @@ -1,153 +0,0 @@ -package avs - -import ( - "time" - - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/broker" -) - -type InternalEvalAssistant struct { - avsConfig Config - retryConfig *RetryConfig -} - -func NewInternalEvalAssistant(avsConfig Config) *InternalEvalAssistant { - return &InternalEvalAssistant{ - avsConfig: avsConfig, - retryConfig: &RetryConfig{maxTime: 10 * time.Minute, retryInterval: 30 * time.Second}, - } -} - -func (iec *InternalEvalAssistant) CreateBasicEvaluationRequest(operations internal.Operation, url string) (*BasicEvaluationCreateRequest, error) { - return newBasicEvaluationCreateRequest(operations, iec, url) -} - -func (iec *InternalEvalAssistant) IsAlreadyCreated(lifecycleData internal.AvsLifecycleData) bool { - return lifecycleData.AvsEvaluationInternalId != 0 -} - -func (iec *InternalEvalAssistant) IsValid(lifecycleData internal.AvsLifecycleData) bool { - return iec.IsAlreadyCreated(lifecycleData) && !iec.IsAlreadyDeletedOrEmpty(lifecycleData) -} - -func (iec *InternalEvalAssistant) ProvideSuffix() string { - return "int" -} - -func (iec *InternalEvalAssistant) ProvideTesterAccessId(pp internal.ProvisioningParameters) int64 { - if (broker.IsTrialPlan(pp.PlanID) || broker.IsFreemiumPlan(pp.PlanID)) && iec.avsConfig.IsTrialConfigured() { - return iec.avsConfig.TrialInternalTesterAccessId - } - return iec.avsConfig.InternalTesterAccessId -} - -func (iec *InternalEvalAssistant) ProvideGroupId(pp internal.ProvisioningParameters) int64 { - if (broker.IsTrialPlan(pp.PlanID) || broker.IsFreemiumPlan(pp.PlanID)) && iec.avsConfig.IsTrialConfigured() { - return iec.avsConfig.TrialGroupId - } - return iec.avsConfig.GroupId -} - -func (iec *InternalEvalAssistant) ProvideParentId(pp internal.ProvisioningParameters) int64 { - if (broker.IsTrialPlan(pp.PlanID) || broker.IsFreemiumPlan(pp.PlanID)) && iec.avsConfig.IsTrialConfigured() { - return iec.avsConfig.TrialParentId - } - return iec.avsConfig.ParentId -} - -func (iec *InternalEvalAssistant) ProvideCheckType() string { - return "" -} - -func (iec *InternalEvalAssistant) ProvideTags(operation internal.Operation) []*Tag { - - tags := []*Tag{ - { - Content: operation.InstanceID, - TagClassId: iec.avsConfig.InstanceIdTagClassId, - }, - { - Content: operation.ProvisioningParameters.ErsContext.GlobalAccountID, - TagClassId: iec.avsConfig.GlobalAccountIdTagClassId, - }, - { - Content: operation.ProvisioningParameters.ErsContext.SubAccountID, - TagClassId: iec.avsConfig.SubAccountIdTagClassId, - }, - { - Content: operation.ProvisioningParameters.PlatformRegion, - TagClassId: iec.avsConfig.LandscapeTagClassId, - }, - { - Content: convertAZR(providerCodeByPlan(operation.ProvisioningParameters.PlanID)), - TagClassId: iec.avsConfig.ProviderTagClassId, - }, - { - Content: operation.ShootName, - TagClassId: iec.avsConfig.ShootNameTagClassId, - }, - } - - region := "" - if operation.ProvisioningParameters.Parameters.Region != nil { - region = *operation.ProvisioningParameters.Parameters.Region - } else if operation.Region != "" { - region = operation.Region - } - - tags = append(tags, &Tag{ - Content: region, - TagClassId: iec.avsConfig.RegionTagClassId, - }) - - return tags - -} - -func (iec *InternalEvalAssistant) ProvideNewOrDefaultServiceName(defaultServiceName string) string { - if iec.avsConfig.InternalTesterService == "" { - return defaultServiceName - } - return iec.avsConfig.InternalTesterService -} - -func (iec *InternalEvalAssistant) SetEvalId(lifecycleData *internal.AvsLifecycleData, evalId int64) { - lifecycleData.AvsEvaluationInternalId = evalId -} - -func (iec *InternalEvalAssistant) SetEvalStatus(lifecycleData *internal.AvsLifecycleData, status string) { - current := lifecycleData.AvsInternalEvaluationStatus.Current - if ValidStatus(current) { - lifecycleData.AvsInternalEvaluationStatus.Original = current - } - lifecycleData.AvsInternalEvaluationStatus.Current = status -} - -func (iec *InternalEvalAssistant) GetEvalStatus(lifecycleData internal.AvsLifecycleData) string { - return lifecycleData.AvsInternalEvaluationStatus.Current -} - -func (iec *InternalEvalAssistant) GetOriginalEvalStatus(lifecycleData internal.AvsLifecycleData) string { - return lifecycleData.AvsInternalEvaluationStatus.Original -} - -func (iec *InternalEvalAssistant) IsInMaintenance(lifecycleData internal.AvsLifecycleData) bool { - return lifecycleData.AvsInternalEvaluationStatus.Current == StatusMaintenance -} - -func (iec *InternalEvalAssistant) IsAlreadyDeletedOrEmpty(lifecycleData internal.AvsLifecycleData) bool { - return lifecycleData.AVSInternalEvaluationDeleted || lifecycleData.AvsEvaluationInternalId == 0 -} - -func (iec *InternalEvalAssistant) GetEvaluationId(lifecycleData internal.AvsLifecycleData) int64 { - return lifecycleData.AvsEvaluationInternalId -} - -func (iec *InternalEvalAssistant) SetDeleted(lifecycleData *internal.AvsLifecycleData, deleted bool) { - lifecycleData.AVSInternalEvaluationDeleted = deleted -} - -func (iec *InternalEvalAssistant) provideRetryConfig() *RetryConfig { - return iec.retryConfig -} diff --git a/internal/avs/mock_server.go b/internal/avs/mock_server.go deleted file mode 100644 index d5b07274ec..0000000000 --- a/internal/avs/mock_server.go +++ /dev/null @@ -1,315 +0,0 @@ -package avs - -import ( - "encoding/json" - "fmt" - "math/rand" - "net/http" - "net/http/httptest" - "strconv" - "testing" - "time" - - "github.com/gorilla/mux" - "github.com/stretchr/testify/assert" - "golang.org/x/oauth2" -) - -const ( - accessToken = "1234abcd" - tokenType = "test" -) - -// MockAvsEvaluationRepository represents BasicEvaluations in AVS -// where BasicEvals is mapping BasicEvaluation ID to BasicEvaluation (Subevaluation) definition -// and ParentIDrefs is mapping CompoundEvaluation ID (parentID) to BasicEvaluations (Subevaluations) IDs -type MockAvsEvaluationRepository struct { - BasicEvals map[int64]*BasicEvaluationCreateResponse - EvalSet map[int64]bool - ParentIDrefs map[int64][]int64 -} - -type MockAvsServer struct { - T *testing.T - Evaluations *MockAvsEvaluationRepository - TokenExpired int -} - -func NewMockAvsServer(t *testing.T) *MockAvsServer { - return &MockAvsServer{ - T: t, - Evaluations: &MockAvsEvaluationRepository{ - BasicEvals: make(map[int64]*BasicEvaluationCreateResponse, 0), - EvalSet: make(map[int64]bool, 0), - ParentIDrefs: make(map[int64][]int64, 0), - }, - } -} - -func FixMockAvsServer(srv *MockAvsServer) *httptest.Server { - r := mux.NewRouter() - - r.HandleFunc("/oauth/token", srv.token).Methods(http.MethodPost) - r.HandleFunc("/api/v2/evaluationmetadata", srv.createEvaluation).Methods(http.MethodPost) - r.HandleFunc("/api/v2/evaluationmetadata/{evalId}", srv.deleteEvaluation).Methods(http.MethodDelete) - r.HandleFunc("/api/v2/evaluationmetadata/{evalId}", srv.getEvaluation).Methods(http.MethodGet) - r.HandleFunc("/api/v2/evaluationmetadata/{evalId}/tag", srv.addTagToEvaluation).Methods(http.MethodPost) - r.HandleFunc("/api/v2/evaluationmetadata/{evalId}/lifecycle", srv.setStatus).Methods(http.MethodPut) - r.HandleFunc("/api/v2/evaluationmetadata/{parentId}/child/{evalId}", srv.removeReferenceFromParentEval).Methods(http.MethodDelete) - - return httptest.NewServer(r) -} - -func (s *MockAvsServer) token(w http.ResponseWriter, _ *http.Request) { - token := oauth2.Token{ - AccessToken: accessToken, - TokenType: tokenType, - RefreshToken: "", - Expiry: time.Time{}, - } - - response, err := json.Marshal(token) - assert.NoError(s.T, err) - w.Header().Set("Content-Type", "application/json") - _, err = w.Write(response) - assert.NoError(s.T, err) -} - -func (s *MockAvsServer) hasAccess(token string) bool { - if s.TokenExpired > 0 { - s.TokenExpired-- - return false - } - if token == fmt.Sprintf("%s %s", tokenType, accessToken) { - return true - } - - return false -} - -func (er *MockAvsEvaluationRepository) addEvaluation(parentID int64, eval *BasicEvaluationCreateResponse) { - er.BasicEvals[eval.Id] = eval - er.EvalSet[eval.Id] = true - er.ParentIDrefs[parentID] = append(er.ParentIDrefs[parentID], eval.Id) -} - -func (er *MockAvsEvaluationRepository) removeParentRef(parentID, evalID int64) { - refs := er.ParentIDrefs[parentID] - - for i, evalWithRef := range refs { - if evalID == evalWithRef { - refs[i] = refs[len(refs)-1] - er.ParentIDrefs[parentID] = refs[:len(refs)-1] - } - } -} - -func (s *MockAvsServer) createEvaluation(w http.ResponseWriter, r *http.Request) { - assert.Equal(s.T, r.Header.Get("Content-Type"), "application/json") - if !s.hasAccess(r.Header.Get("Authorization")) { - w.WriteHeader(http.StatusUnauthorized) - return - } - - var requestObj BasicEvaluationCreateRequest - err := json.NewDecoder(r.Body).Decode(&requestObj) - assert.NoError(s.T, err) - - evalCreateResponse := s.createResponseObj(requestObj) - s.Evaluations.addEvaluation(requestObj.ParentId, evalCreateResponse) - - createdEval := s.Evaluations.BasicEvals[evalCreateResponse.Id] - responseObjAsBytes, _ := json.Marshal(createdEval) - _, err = w.Write(responseObjAsBytes) - assert.NoError(s.T, err) - - w.WriteHeader(http.StatusOK) -} - -func (s *MockAvsServer) getEvaluation(w http.ResponseWriter, r *http.Request) { - assert.Equal(s.T, r.Header.Get("Content-Type"), "application/json") - if !s.hasAccess(r.Header.Get("Authorization")) { - w.WriteHeader(http.StatusUnauthorized) - return - } - - vars := mux.Vars(r) - evalId, err := strconv.ParseInt(vars["evalId"], 10, 64) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } - response, exists := s.Evaluations.BasicEvals[evalId] - if !exists { - w.WriteHeader(http.StatusNotFound) - } - - responseObjAsBytes, _ := json.Marshal(response) - _, err = w.Write(responseObjAsBytes) - assert.NoError(s.T, err) -} - -func (s *MockAvsServer) addTagToEvaluation(w http.ResponseWriter, r *http.Request) { - assert.Equal(s.T, r.Header.Get("Content-Type"), "application/json") - if !s.hasAccess(r.Header.Get("Authorization")) { - w.WriteHeader(http.StatusUnauthorized) - return - } - - var requestObj *Tag - err := json.NewDecoder(r.Body).Decode(&requestObj) - assert.NoError(s.T, err) - - vars := mux.Vars(r) - evalId, err := strconv.ParseInt(vars["evalId"], 10, 64) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } - evaluation, exists := s.Evaluations.BasicEvals[evalId] - if !exists { - w.WriteHeader(http.StatusNotFound) - } - - evaluation.Tags = append(evaluation.Tags, requestObj) - - responseObjAsBytes, _ := json.Marshal(evaluation) - _, err = w.Write(responseObjAsBytes) - assert.NoError(s.T, err) -} - -func (s *MockAvsServer) setStatus(w http.ResponseWriter, r *http.Request) { - assert.Equal(s.T, r.Header.Get("Content-Type"), "application/json") - if !s.hasAccess(r.Header.Get("Authorization")) { - w.WriteHeader(http.StatusUnauthorized) - return - } - - var requestObj string - err := json.NewDecoder(r.Body).Decode(&requestObj) - assert.NoError(s.T, err) - - if !ValidStatus(requestObj) { - w.WriteHeader(http.StatusInternalServerError) - } - - vars := mux.Vars(r) - evalId, err := strconv.ParseInt(vars["evalId"], 10, 64) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } - evaluation, exists := s.Evaluations.BasicEvals[evalId] - if !exists { - w.WriteHeader(http.StatusNotFound) - } - - evaluation.Status = requestObj - - responseObjAsBytes, _ := json.Marshal(evaluation) - _, err = w.Write(responseObjAsBytes) - assert.NoError(s.T, err) -} - -func (s *MockAvsServer) deleteEvaluation(w http.ResponseWriter, r *http.Request) { - if !s.hasAccess(r.Header.Get("Authorization")) { - w.WriteHeader(http.StatusUnauthorized) - return - } - - vars := mux.Vars(r) - id, err := strconv.ParseInt(vars["evalId"], 10, 64) - assert.NoError(s.T, err) - - if _, exists := s.Evaluations.BasicEvals[id]; exists { - delete(s.Evaluations.BasicEvals, id) - delete(s.Evaluations.EvalSet, id) - w.WriteHeader(http.StatusOK) - return - } - - w.WriteHeader(http.StatusNotFound) -} - -func (s *MockAvsServer) removeReferenceFromParentEval(w http.ResponseWriter, r *http.Request) { - if !s.hasAccess(r.Header.Get("Authorization")) { - w.WriteHeader(http.StatusUnauthorized) - return - } - - vars := mux.Vars(r) - parentID, err := strconv.ParseInt(vars["parentId"], 10, 64) - assert.NoError(s.T, err) - - evalID, err := strconv.ParseInt(vars["evalId"], 10, 64) - assert.NoError(s.T, err) - - _, exists := s.Evaluations.ParentIDrefs[parentID] - if !exists { - resp := avsApiErrorResp{ - StatusCode: http.StatusBadRequest, - Status: "BAD_REQUEST", - Message: fmt.Sprintf("Evaluation %d does not contain subevaluation %d", parentID, evalID), - } - w.WriteHeader(http.StatusBadRequest) - bytes, _ := json.Marshal(resp) - _, err := w.Write(bytes) - assert.NoError(s.T, err) - } - - s.Evaluations.removeParentRef(parentID, evalID) -} - -func FixTag() *Tag { - return &Tag{ - Content: "test-tag", - TagClassId: 111111, - } -} - -func (s *MockAvsServer) createResponseObj(requestObj BasicEvaluationCreateRequest) *BasicEvaluationCreateResponse { - parsedThreshold, err := strconv.ParseInt(requestObj.Threshold, 10, 64) - if err != nil { - parsedThreshold = int64(1234) - } - - timeUnixEpoch, id := s.generateId() - - evalCreateResponse := &BasicEvaluationCreateResponse{ - DefinitionType: requestObj.DefinitionType, - Name: requestObj.Name, - Description: requestObj.Description, - Service: requestObj.Service, - URL: requestObj.URL, - CheckType: requestObj.CheckType, - Interval: requestObj.Interval, - TesterAccessId: requestObj.TesterAccessId, - Timeout: requestObj.Timeout, - ReadOnly: requestObj.ReadOnly, - ContentCheck: requestObj.ContentCheck, - ContentCheckType: requestObj.ContentCheck, - Threshold: parsedThreshold, - GroupId: requestObj.GroupId, - Visibility: requestObj.Visibility, - DateCreated: timeUnixEpoch, - DateChanged: timeUnixEpoch, - Owner: "abc@xyz.corp", - Status: "ACTIVE", - Alerts: nil, - Tags: requestObj.Tags, - Id: id, - LegacyCheckId: id, - InternalInterval: 60, - AuthType: "AUTH_NONE", - IndividualOutageEventsOnly: false, - IdOnTester: "", - } - return evalCreateResponse -} - -func (s *MockAvsServer) generateId() (int64, int64) { - for { - timeUnixEpoch := time.Now().Unix() - id := rand.Int63() + time.Now().Unix() - if _, exists := s.Evaluations.EvalSet[id]; !exists { - return timeUnixEpoch, id - } - } -} diff --git a/internal/avs/model.go b/internal/avs/model.go deleted file mode 100644 index 4b5a7179f3..0000000000 --- a/internal/avs/model.go +++ /dev/null @@ -1,162 +0,0 @@ -package avs - -import ( - "fmt" - - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/broker" -) - -const ( - DefinitionType = "BASIC" - interval = 60 - timeout = 30000 - contentCheck = "error" - contentCheckType = "NOT_CONTAINS" - threshold = "30000" - visibility = "PUBLIC" -) - -const ( - StatusActive = "ACTIVE" - StatusMaintenance = "MAINTENANCE" - StatusInactive = "INACTIVE" - StatusRetired = "RETIRED" - StatusDeleted = "DELETED" -) - -func ValidStatus(status string) bool { - switch status { - case StatusActive, StatusMaintenance, StatusInactive, StatusRetired, StatusDeleted: - return true - } - - return false -} - -type Tag struct { - Content string `json:"content"` - TagClassId int `json:"tag_class_id"` - TagClassName string `json:"tag_class_name"` -} - -type BasicEvaluationCreateRequest struct { - DefinitionType string `json:"definition_type"` - Name string `json:"name"` - Description string `json:"description"` - Service string `json:"service"` - URL string `json:"url"` - CheckType string `json:"check_type"` - Interval int32 `json:"interval"` - TesterAccessId int64 `json:"tester_access_id"` - Timeout int `json:"timeout"` - ReadOnly bool `json:"read_only"` - ContentCheck string `json:"content_check"` - ContentCheckType string `json:"content_check_type"` - Threshold string `json:"threshold"` - GroupId int64 `json:"group_id"` - Visibility string `json:"visibility"` - ParentId int64 `json:"parent_id"` - Tags []*Tag `json:"tags"` -} - -type BasicEvaluationCreateResponse struct { - DefinitionType string `json:"definition_type"` - Name string `json:"name"` - Description string `json:"description"` - Service string `json:"service"` - URL string `json:"url"` - CheckType string `json:"check_type"` - Interval int32 `json:"interval"` - TesterAccessId int64 `json:"tester_access_id"` - Timeout int `json:"timeout"` - ReadOnly bool `json:"read_only"` - ContentCheck string `json:"content_check"` - ContentCheckType string `json:"content_check_type"` - Threshold int64 `json:"threshold"` - GroupId int64 `json:"group_id"` - Visibility string `json:"visibility"` - - DateCreated int64 `json:"dateCreated"` - DateChanged int64 `json:"dateChanged"` - Owner string `json:"owner"` - Status string `json:"status"` - Alerts []int `json:"alerts"` - Tags []*Tag `json:"tags"` - Id int64 `json:"id"` - LegacyCheckId int64 `json:"legacy_check_id"` - InternalInterval int64 `json:"internal_interval"` - AuthType string `json:"auth_type"` - IndividualOutageEventsOnly bool `json:"individual_outage_events_only"` - IdOnTester string `json:"id_on_tester"` -} - -func newBasicEvaluationCreateRequest(operation internal.Operation, evalTypeSpecificConfig ModelConfigurator, url string) (*BasicEvaluationCreateRequest, error) { - - beName, beDescription := generateNameAndDescription(operation, evalTypeSpecificConfig.ProvideSuffix()) - - return &BasicEvaluationCreateRequest{ - DefinitionType: DefinitionType, - Name: beName, - Description: beDescription, - Service: evalTypeSpecificConfig.ProvideNewOrDefaultServiceName(beName), - URL: url, - CheckType: evalTypeSpecificConfig.ProvideCheckType(), - Interval: interval, - TesterAccessId: evalTypeSpecificConfig.ProvideTesterAccessId(operation.ProvisioningParameters), - Tags: evalTypeSpecificConfig.ProvideTags(operation), - Timeout: timeout, - ReadOnly: false, - ContentCheck: contentCheck, - ContentCheckType: contentCheckType, - Threshold: threshold, - GroupId: evalTypeSpecificConfig.ProvideGroupId(operation.ProvisioningParameters), - Visibility: visibility, - ParentId: evalTypeSpecificConfig.ProvideParentId(operation.ProvisioningParameters), - }, nil -} - -func generateNameAndDescription(operation internal.Operation, beType string) (string, string) { - globalAccountID := operation.ProvisioningParameters.ErsContext.GlobalAccountID - subAccountID := operation.ProvisioningParameters.ErsContext.SubAccountID - instanceID := operation.InstanceID - name := operation.ProvisioningParameters.Parameters.Name - shootName := operation.InstanceDetails.ShootName - beName := fmt.Sprintf("K8S-%s-Kyma-%s-%s-%s", providerCodeByPlan(operation.ProvisioningParameters.PlanID), beType, instanceID, name) - beDescription := fmt.Sprintf("{\"instanceName\": \"%s\", \"globalAccountID\": \"%s\", \"subAccountID\": \"%s\", \"instanceID\": \"%s\", \"shootName\": \"%s\"}", - name, globalAccountID, subAccountID, instanceID, shootName) - - return truncateString(beName, 80), truncateString(beDescription, 255) -} - -func providerCodeByPlan(planID string) string { - switch planID { - case broker.AWSPlanID: - return "AWS" - case broker.GCPPlanID: - return "GCP" - case broker.AzurePlanID, broker.AzureLitePlanID: - return "AZR" - case broker.TrialPlanID, broker.FreemiumPlanID: - return "AZR" - case broker.SapConvergedCloudPlanID: - return "CC" - default: - return "AZR" - } -} - -func convertAZR(code string) string { - if code == "AZR" { - return "Azure" - } - return code -} - -func truncateString(input string, num int) string { - output := input - if len(input) > num { - output = input[0:num] - } - return output -} diff --git a/internal/avs/model_configurator.go b/internal/avs/model_configurator.go deleted file mode 100644 index 6150fdd3b7..0000000000 --- a/internal/avs/model_configurator.go +++ /dev/null @@ -1,13 +0,0 @@ -package avs - -import "github.com/kyma-project/kyma-environment-broker/internal" - -type ModelConfigurator interface { - ProvideSuffix() string - ProvideTesterAccessId(pp internal.ProvisioningParameters) int64 - ProvideGroupId(pp internal.ProvisioningParameters) int64 - ProvideParentId(pp internal.ProvisioningParameters) int64 - ProvideTags(o internal.Operation) []*Tag - ProvideNewOrDefaultServiceName(defaultServiceName string) string - ProvideCheckType() string -} diff --git a/internal/avs/model_test.go b/internal/avs/model_test.go deleted file mode 100644 index 4945db4c99..0000000000 --- a/internal/avs/model_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package avs - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "strconv" - "testing" - - "github.com/gorilla/mux" - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/stretchr/testify/assert" -) - -var evalIdsHolder []int64 -var parentEvalIdHolder map[int64]int64 = make(map[int64]int64) - -const ( - internalEvalId = int64(1234) - externalEvalId = int64(5678) - internalEvalUpdatedId = int64(12340) - externalEvalUpdatedId = int64(56780) -) - -func TestAvsEvaluationConfigs(t *testing.T) { - // given - assert := assert.New(t) - - mockOauthServer := newMockAvsOauthServer() - defer mockOauthServer.Close() - mockAvsServer := newMockAvsServer(t) - defer mockAvsServer.Close() - avsConfig := avsConfig(mockOauthServer, mockAvsServer) - internalEvalAssistant := NewInternalEvalAssistant(avsConfig) - externalEvalAssistant := NewExternalEvalAssistant(avsConfig) - - // verify assistant configs - assert.Equal(internalEvalId, internalEvalAssistant.ProvideTesterAccessId(internal.ProvisioningParameters{})) - assert.Equal(externalEvalId, externalEvalAssistant.ProvideTesterAccessId(internal.ProvisioningParameters{})) - - assert.Equal("int", internalEvalAssistant.ProvideSuffix()) - assert.Equal("ext", externalEvalAssistant.ProvideSuffix()) - - assert.Equal("", internalEvalAssistant.ProvideCheckType()) - assert.Equal("HTTPSGET", externalEvalAssistant.ProvideCheckType()) - - assert.Equal("dummy", internalEvalAssistant.ProvideNewOrDefaultServiceName("dummy")) - assert.Equal("external-dummy", externalEvalAssistant.ProvideNewOrDefaultServiceName("dummy")) - - params := internal.Operation{} - assert.Equal(7, len(internalEvalAssistant.ProvideTags(internal.Operation{}))) - - // verify confg as json - tags, testTag := externalEvalAssistant.ProvideTags(params), Tag{} - err := json.Unmarshal([]byte(`{"content":"","tag_class_id":0,"tag_class_name":""}`), &testTag) - assert.NoError(err) - assert.Equal(testTag, *tags[0]) - -} - -func newMockAvsOauthServer() *httptest.Server { - return httptest.NewServer( - http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { - writer.Header().Set("Content-Type", "application/json") - _, _ = writer.Write([]byte(`{"access_token": "90d64460d14870c08c81352a05dedd3465940a7c", "scope": "user", "token_type": "bearer", "expires_in": 86400}`)) - })) -} - -func newMockAvsServer(t *testing.T) *httptest.Server { - router := mux.NewRouter() - router.HandleFunc("/{evalId}", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - evalIdsHolder = append(evalIdsHolder, extractId(vars, "evalId", t)) - w.WriteHeader(http.StatusOK) - })).Methods(http.MethodDelete) - - router.HandleFunc("/{parentId}/child/{evalId}", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - - parentEval := extractId(vars, "parentId", t) - evalId := extractId(vars, "evalId", t) - parentEvalIdHolder[evalId] = parentEval - - w.WriteHeader(http.StatusOK) - })).Methods(http.MethodDelete) - return httptest.NewServer(router) -} - -func extractId(vars map[string]string, key string, t *testing.T) int64 { - evalIdStr := vars[key] - evalId, err := strconv.ParseInt(evalIdStr, 10, 64) - assert.NoError(t, err) - return evalId -} - -func avsConfig(mockOauthServer *httptest.Server, mockAvsServer *httptest.Server) Config { - return Config{ - OauthTokenEndpoint: mockOauthServer.URL, - OauthUsername: "dummy", - OauthPassword: "dummy", - OauthClientId: "dummy", - ApiEndpoint: mockAvsServer.URL, - DefinitionType: DefinitionType, - InternalTesterAccessId: internalEvalId, - InternalTesterService: "", - ExternalTesterAccessId: externalEvalId, - ExternalTesterService: "external-dummy", - GroupId: 5555, - ParentId: 91011, - } -} diff --git a/internal/avs/testdata/avs_maintenance_mode_always_disabled_ga_ids.yaml b/internal/avs/testdata/avs_maintenance_mode_always_disabled_ga_ids.yaml deleted file mode 100644 index f544d3f59e..0000000000 --- a/internal/avs/testdata/avs_maintenance_mode_always_disabled_ga_ids.yaml +++ /dev/null @@ -1,3 +0,0 @@ -maintenanceModeDuringUpgradeAlwaysDisabledGAIDs: - - test-ga-id-1 - - test-ga-id-2 \ No newline at end of file diff --git a/internal/process/deprovisioning/avs_evaluations.go b/internal/process/deprovisioning/avs_evaluations.go deleted file mode 100644 index 21fb385acb..0000000000 --- a/internal/process/deprovisioning/avs_evaluations.go +++ /dev/null @@ -1,60 +0,0 @@ -package deprovisioning - -import ( - "fmt" - "time" - - "github.com/kyma-project/kyma-environment-broker/internal/broker" - - "github.com/kyma-project/kyma-environment-broker/internal/process" - - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/avs" - "github.com/kyma-project/kyma-environment-broker/internal/storage" - "github.com/sirupsen/logrus" -) - -type AvsEvaluationRemovalStep struct { - delegator *avs.Delegator - externalEvalAssistant avs.EvalAssistant - internalEvalAssistant avs.EvalAssistant - deProvisioningManager *process.OperationManager -} - -func NewAvsEvaluationsRemovalStep(delegator *avs.Delegator, operationsStorage storage.Operations, externalEvalAssistant, internalEvalAssistant avs.EvalAssistant) *AvsEvaluationRemovalStep { - return &AvsEvaluationRemovalStep{ - delegator: delegator, - externalEvalAssistant: externalEvalAssistant, - internalEvalAssistant: internalEvalAssistant, - deProvisioningManager: process.NewOperationManager(operationsStorage), - } -} - -func (ars *AvsEvaluationRemovalStep) Name() string { - return "De-provision_AVS_Evaluations" -} - -func (ars *AvsEvaluationRemovalStep) Run(operation internal.Operation, logger logrus.FieldLogger) (internal.Operation, time.Duration, error) { - logger.Infof("Avs lifecycle %+v", operation.Avs) - - // the delegator saves the operation (update in the storage) - it is executed inside the DeleteAvsEvaluation - - operation, err := ars.delegator.DeleteAvsEvaluation(operation, logger, ars.internalEvalAssistant) - if err != nil { - return ars.deProvisioningManager.RetryOperationWithoutFail(operation, ars.Name(), "error while deleting avs internal evaluation", 10*time.Second, 1*time.Minute, logger, - fmt.Errorf("unable to delete internal evaluation: %s", err.Error())) - } - - if broker.IsTrialPlan(operation.ProvisioningParameters.PlanID) || broker.IsFreemiumPlan(operation.ProvisioningParameters.PlanID) { - logger.Info("skipping AVS external evaluation deletion for trial/freemium plan") - return operation, 0, nil - } - operation, err = ars.delegator.DeleteAvsEvaluation(operation, logger, ars.externalEvalAssistant) - if err != nil { - return ars.deProvisioningManager.RetryOperationWithoutFail(operation, ars.Name(), "error while deleting avs external evaluation", 10*time.Second, 1*time.Minute, logger, - fmt.Errorf("unable to delete external evaluation: %s", err.Error())) - } - - return operation, 0, nil - -} diff --git a/internal/process/deprovisioning/avs_evaluations_test.go b/internal/process/deprovisioning/avs_evaluations_test.go deleted file mode 100644 index f14ee8e8f2..0000000000 --- a/internal/process/deprovisioning/avs_evaluations_test.go +++ /dev/null @@ -1,249 +0,0 @@ -package deprovisioning - -import ( - "context" - "net/http" - "net/http/httptest" - "strconv" - "testing" - "time" - - "github.com/kyma-project/kyma-environment-broker/internal/avs" - "github.com/kyma-project/kyma-environment-broker/internal/broker" - "github.com/kyma-project/kyma-environment-broker/internal/storage" - - "github.com/gorilla/mux" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" -) - -var ( - evalIdsHolder []int64 - parentEvalIdHolder = make(map[int64]int64) -) - -const ( - internalEvalId = int64(1234) - externalEvalId = int64(5678) - parentEvalId = int64(91011) -) - -func TestAvsEvaluationsRemovalStep_Run(t *testing.T) { - // given - logger := logrus.New() - memoryStorage := storage.NewMemoryStorage() - - deProvisioningOperation := fixDeprovisioningOperation().Operation - deProvisioningOperation.Avs.AvsEvaluationInternalId = internalEvalId - deProvisioningOperation.Avs.AVSEvaluationExternalId = externalEvalId - err := memoryStorage.Operations().InsertOperation(deProvisioningOperation) - assert.NoError(t, err) - assert.False(t, deProvisioningOperation.Avs.AVSInternalEvaluationDeleted) - assert.False(t, deProvisioningOperation.Avs.AVSExternalEvaluationDeleted) - - mockOauthServer := newMockAvsOauthServer() - defer mockOauthServer.Close() - mockAvsServer := newMockAvsServer(t) - defer mockAvsServer.Close() - avsConfig := avsConfig(mockOauthServer, mockAvsServer) - avsClient, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - assert.NoError(t, err) - avsDel := avs.NewDelegator(avsClient, avsConfig, memoryStorage.Operations()) - internalEvalAssistant := avs.NewInternalEvalAssistant(avsConfig) - externalEvalAssistant := avs.NewExternalEvalAssistant(avsConfig) - step := NewAvsEvaluationsRemovalStep(avsDel, memoryStorage.Operations(), externalEvalAssistant, internalEvalAssistant) - - assert.Equal(t, 0, len(evalIdsHolder)) - assert.Equal(t, 0, len(parentEvalIdHolder)) - // when - deProvisioningOperation, repeat, err := step.Run(deProvisioningOperation, logger) - - // then - assert.NoError(t, err) - assert.Equal(t, time.Duration(0), repeat) - - assert.Equal(t, 2, len(evalIdsHolder)) - assert.Contains(t, evalIdsHolder, internalEvalId) - assert.Contains(t, evalIdsHolder, externalEvalId) - - assert.Equal(t, 2, len(parentEvalIdHolder)) - assert.Contains(t, parentEvalIdHolder, internalEvalId) - assert.Contains(t, parentEvalIdHolder, externalEvalId) - assert.Equal(t, parentEvalIdHolder[internalEvalId], parentEvalId) - assert.Equal(t, parentEvalIdHolder[externalEvalId], parentEvalId) - - inDB, err := memoryStorage.Operations().GetDeprovisioningOperationByID(deProvisioningOperation.ID) - assert.NoError(t, err) - assert.True(t, inDB.Avs.AVSInternalEvaluationDeleted) - assert.True(t, inDB.Avs.AVSExternalEvaluationDeleted) - assert.Equal(t, internalEvalId, inDB.Avs.AvsEvaluationInternalId) - assert.Equal(t, externalEvalId, inDB.Avs.AVSEvaluationExternalId) -} - -func TestAvsEvaluationsRemovalWhenAlreadyDeleted_Run(t *testing.T) { - // given - logger := logrus.New() - memoryStorage := storage.NewMemoryStorage() - - deProvisioningOperation := fixDeprovisioningOperation().Operation - deProvisioningOperation.Avs.AvsEvaluationInternalId = internalEvalId - deProvisioningOperation.Avs.AVSEvaluationExternalId = externalEvalId - deProvisioningOperation.Avs.AVSExternalEvaluationDeleted = true - deProvisioningOperation.Avs.AVSInternalEvaluationDeleted = true - err := memoryStorage.Operations().InsertOperation(deProvisioningOperation) - assert.NoError(t, err) - assert.True(t, deProvisioningOperation.Avs.AVSInternalEvaluationDeleted) - assert.True(t, deProvisioningOperation.Avs.AVSExternalEvaluationDeleted) - - mockOauthServer := newMockAvsOauthServer() - defer mockOauthServer.Close() - mockAvsServer := newMockAvsServer(t) - defer mockAvsServer.Close() - avsConfig := avsConfig(mockOauthServer, mockAvsServer) - avsClient, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - assert.NoError(t, err) - avsDel := avs.NewDelegator(avsClient, avsConfig, memoryStorage.Operations()) - internalEvalAssistant := avs.NewInternalEvalAssistant(avsConfig) - externalEvalAssistant := avs.NewExternalEvalAssistant(avsConfig) - step := NewAvsEvaluationsRemovalStep(avsDel, memoryStorage.Operations(), externalEvalAssistant, internalEvalAssistant) - - // when - deProvisioningOperation, repeat, err := step.Run(deProvisioningOperation, logger) - - // then - assert.NoError(t, err) - assert.Equal(t, time.Duration(0), repeat) - - inDB, err := memoryStorage.Operations().GetDeprovisioningOperationByID(deProvisioningOperation.ID) - assert.NoError(t, err) - assert.True(t, inDB.Avs.AVSInternalEvaluationDeleted) - assert.True(t, inDB.Avs.AVSExternalEvaluationDeleted) - assert.Equal(t, internalEvalId, inDB.Avs.AvsEvaluationInternalId) - assert.Equal(t, externalEvalId, inDB.Avs.AVSEvaluationExternalId) -} - -func TestExternalAvsEvaluationsRemovalSkipForTrialPlan_Run(t *testing.T) { - // given - logger := logrus.New() - memoryStorage := storage.NewMemoryStorage() - - deProvisioningOperation := fixDeprovisioningOperationWithPlanID(broker.TrialPlanID) - deProvisioningOperation.Avs.AVSEvaluationExternalId = externalEvalId - err := memoryStorage.Operations().InsertOperation(deProvisioningOperation) - assert.NoError(t, err) - assert.False(t, deProvisioningOperation.Avs.AVSInternalEvaluationDeleted) - assert.False(t, deProvisioningOperation.Avs.AVSExternalEvaluationDeleted) - - mockOauthServer := newMockAvsOauthServer() - defer mockOauthServer.Close() - mockAvsServer := newMockAvsServer(t) - defer mockAvsServer.Close() - avsConfig := avsConfig(mockOauthServer, mockAvsServer) - avsClient, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - assert.NoError(t, err) - avsDel := avs.NewDelegator(avsClient, avsConfig, memoryStorage.Operations()) - internalEvalAssistant := avs.NewInternalEvalAssistant(avsConfig) - externalEvalAssistant := avs.NewExternalEvalAssistant(avsConfig) - step := NewAvsEvaluationsRemovalStep(avsDel, memoryStorage.Operations(), externalEvalAssistant, internalEvalAssistant) - - // when - deProvisioningOperation, repeat, err := step.Run(deProvisioningOperation, logger) - - // then - assert.NoError(t, err) - assert.Equal(t, time.Duration(0), repeat) - - inDB, err := memoryStorage.Operations().GetDeprovisioningOperationByID(deProvisioningOperation.ID) - assert.NoError(t, err) - assert.False(t, inDB.Avs.AVSExternalEvaluationDeleted) - assert.Equal(t, externalEvalId, inDB.Avs.AVSEvaluationExternalId) -} - -func TestExternalAvsEvaluationsRemovalSkipForFreemiumPlan_Run(t *testing.T) { - // given - logger := logrus.New() - memoryStorage := storage.NewMemoryStorage() - - deProvisioningOperation := fixDeprovisioningOperationWithPlanID(broker.FreemiumPlanID) - deProvisioningOperation.Avs.AVSEvaluationExternalId = externalEvalId - err := memoryStorage.Operations().InsertOperation(deProvisioningOperation) - assert.NoError(t, err) - assert.False(t, deProvisioningOperation.Avs.AVSInternalEvaluationDeleted) - assert.False(t, deProvisioningOperation.Avs.AVSExternalEvaluationDeleted) - - mockOauthServer := newMockAvsOauthServer() - defer mockOauthServer.Close() - mockAvsServer := newMockAvsServer(t) - defer mockAvsServer.Close() - avsConfig := avsConfig(mockOauthServer, mockAvsServer) - avsClient, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - assert.NoError(t, err) - avsDel := avs.NewDelegator(avsClient, avsConfig, memoryStorage.Operations()) - internalEvalAssistant := avs.NewInternalEvalAssistant(avsConfig) - externalEvalAssistant := avs.NewExternalEvalAssistant(avsConfig) - step := NewAvsEvaluationsRemovalStep(avsDel, memoryStorage.Operations(), externalEvalAssistant, internalEvalAssistant) - - // when - deProvisioningOperation, repeat, err := step.Run(deProvisioningOperation, logger) - - // then - assert.NoError(t, err) - assert.Equal(t, time.Duration(0), repeat) - - inDB, err := memoryStorage.Operations().GetDeprovisioningOperationByID(deProvisioningOperation.ID) - assert.NoError(t, err) - assert.False(t, inDB.Avs.AVSExternalEvaluationDeleted) - assert.Equal(t, externalEvalId, inDB.Avs.AVSEvaluationExternalId) -} - -func newMockAvsOauthServer() *httptest.Server { - return httptest.NewServer( - http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { - writer.Header().Set("Content-Type", "application/json") - _, _ = writer.Write([]byte(`{"access_token": "90d64460d14870c08c81352a05dedd3465940a7c", "scope": "user", "token_type": "bearer", "expires_in": 86400}`)) - })) -} - -func newMockAvsServer(t *testing.T) *httptest.Server { - router := mux.NewRouter() - router.HandleFunc("/{evalId}", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - evalIdsHolder = append(evalIdsHolder, extractId(vars, "evalId", t)) - w.WriteHeader(http.StatusOK) - })).Methods(http.MethodDelete) - - router.HandleFunc("/{parentId}/child/{evalId}", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - - parentEval := extractId(vars, "parentId", t) - evalId := extractId(vars, "evalId", t) - parentEvalIdHolder[evalId] = parentEval - - w.WriteHeader(http.StatusOK) - })).Methods(http.MethodDelete) - return httptest.NewServer(router) -} - -func extractId(vars map[string]string, key string, t *testing.T) int64 { - evalIdStr := vars[key] - evalId, err := strconv.ParseInt(evalIdStr, 10, 64) - assert.NoError(t, err) - return evalId -} - -func avsConfig(mockOauthServer *httptest.Server, mockAvsServer *httptest.Server) avs.Config { - return avs.Config{ - OauthTokenEndpoint: mockOauthServer.URL, - OauthUsername: "dummy", - OauthPassword: "dummy", - OauthClientId: "dummy", - ApiEndpoint: mockAvsServer.URL, - DefinitionType: avs.DefinitionType, - InternalTesterAccessId: 1234, - InternalTesterService: "", - ExternalTesterAccessId: 5678, - ExternalTesterService: "dummy", - GroupId: 5555, - ParentId: parentEvalId, - } -} diff --git a/internal/process/provisioning/external_eval.go b/internal/process/provisioning/external_eval.go deleted file mode 100644 index f0e9f8e5e1..0000000000 --- a/internal/process/provisioning/external_eval.go +++ /dev/null @@ -1,32 +0,0 @@ -package provisioning - -import ( - "time" - - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/avs" - "github.com/sirupsen/logrus" -) - -type ExternalEvalCreator struct { - delegator *avs.Delegator - assistant *avs.ExternalEvalAssistant - disabled bool -} - -func NewExternalEvalCreator(delegator *avs.Delegator, disabled bool, assistant *avs.ExternalEvalAssistant) *ExternalEvalCreator { - return &ExternalEvalCreator{ - delegator: delegator, - assistant: assistant, - disabled: disabled, - } -} - -func (eec *ExternalEvalCreator) createEval(operation internal.Operation, url string, logger logrus.FieldLogger) (internal.Operation, time.Duration, error) { - if eec.disabled { - logger.Infof("creating AVS external evaluation is disabled") - return operation, 0, nil - } else { - return eec.delegator.CreateEvaluation(logger, operation, eec.assistant, url) - } -} diff --git a/internal/process/provisioning/external_eval_step.go b/internal/process/provisioning/external_eval_step.go deleted file mode 100644 index 022cc99a0a..0000000000 --- a/internal/process/provisioning/external_eval_step.go +++ /dev/null @@ -1,44 +0,0 @@ -package provisioning - -import ( - "fmt" - "time" - - "github.com/kyma-project/kyma-environment-broker/internal/process" - - "github.com/kyma-project/kyma-environment-broker/internal/broker" - "github.com/sirupsen/logrus" - - "github.com/kyma-project/kyma-environment-broker/internal" -) - -type ExternalEvalStep struct { - externalEvalCreator *ExternalEvalCreator -} - -// ensure the interface is implemented -var _ process.Step = (*ExternalEvalStep)(nil) - -func NewExternalEvalStep(externalEvalCreator *ExternalEvalCreator) *ExternalEvalStep { - return &ExternalEvalStep{ - externalEvalCreator: externalEvalCreator, - } -} - -func (e ExternalEvalStep) Name() string { - return "AVS_Create_External_Eval_Step" -} - -func (s *ExternalEvalStep) Run(operation internal.Operation, log logrus.FieldLogger) (internal.Operation, time.Duration, error) { - if broker.IsTrialPlan(operation.ProvisioningParameters.PlanID) || broker.IsFreemiumPlan(operation.ProvisioningParameters.PlanID) { - log.Debug("skipping AVS external evaluation creation for trial/freemium plan") - return operation, 0, nil - } - - targetURL := fmt.Sprintf("https://healthz.%s/healthz/ready ", operation.ShootDomain) - op, repeat, err := s.externalEvalCreator.createEval(operation, targetURL, log) - if err != nil || repeat != 0 { - return operation, repeat, err - } - return op, 0, nil -} diff --git a/internal/process/provisioning/external_eval_step_test.go b/internal/process/provisioning/external_eval_step_test.go deleted file mode 100644 index 6f3007cbdb..0000000000 --- a/internal/process/provisioning/external_eval_step_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package provisioning - -import ( - "context" - "net/http/httptest" - "testing" - - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/avs" - "github.com/kyma-project/kyma-environment-broker/internal/broker" - "github.com/kyma-project/kyma-environment-broker/internal/storage" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestExternalEvalStep_Run(t *testing.T) { - memoryStorage := storage.NewMemoryStorage() - externalEvalCreator, mockOauthServer, mockAvsSvc := setupAvs(t, memoryStorage.Operations()) - defer mockAvsSvc.server.Close() - defer mockOauthServer.Close() - - operation := fixOperationRuntimeStatus(broker.GCPPlanID, internal.GCP) - operation.Avs.AvsEvaluationInternalId = fixAvsEvaluationInternalId - err := memoryStorage.Operations().InsertOperation(operation) - assert.NoError(t, err) - step := ExternalEvalStep{ - externalEvalCreator: externalEvalCreator, - } - - // when - _, retry, err := step.Run(operation, logrus.New()) - - // then - assert.Zero(t, retry) - assert.NoError(t, err) - inDB, _ := memoryStorage.Operations().GetOperationByID(operation.ID) - assert.Contains(t, mockAvsSvc.evals, inDB.Avs.AVSEvaluationExternalId) -} - -func setupAvs(t *testing.T, operations storage.Operations) (*ExternalEvalCreator, *httptest.Server, *mockAvsService) { - mockOauthServer := newMockAvsOauthServer() - mockAvsSvc := newMockAvsService(t, false) - mockAvsSvc.startServer() - mockAvsSvc.evals[fixAvsEvaluationInternalId] = fixAvsEvaluation() - avsConfig := avsConfig(mockOauthServer, mockAvsSvc.server) - avsClient, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - require.NoError(t, err) - avsDel := avs.NewDelegator(avsClient, avsConfig, operations) - externalEvalAssistant := avs.NewExternalEvalAssistant(avsConfig) - externalEvalCreator := NewExternalEvalCreator(avsDel, false, externalEvalAssistant) - - return externalEvalCreator, mockOauthServer, mockAvsSvc -} diff --git a/internal/process/provisioning/internal_eval.go b/internal/process/provisioning/internal_eval.go deleted file mode 100644 index cffb8e903e..0000000000 --- a/internal/process/provisioning/internal_eval.go +++ /dev/null @@ -1,30 +0,0 @@ -package provisioning - -import ( - "time" - - "github.com/kyma-project/kyma-environment-broker/internal/avs" - - "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/sirupsen/logrus" -) - -type InternalEvaluationStep struct { - delegator *avs.Delegator - iec *avs.InternalEvalAssistant -} - -func NewInternalEvaluationStep(delegator *avs.Delegator, assistant *avs.InternalEvalAssistant) *InternalEvaluationStep { - return &InternalEvaluationStep{ - delegator: delegator, - iec: assistant, - } -} - -func (ies *InternalEvaluationStep) Name() string { - return "AVS_Create_Internal_Eval_Step" -} - -func (ies *InternalEvaluationStep) Run(operation internal.Operation, logger logrus.FieldLogger) (internal.Operation, time.Duration, error) { - return ies.delegator.CreateEvaluation(logger, operation, ies.iec, "") -} diff --git a/internal/process/provisioning/internal_eval_test.go b/internal/process/provisioning/internal_eval_test.go deleted file mode 100644 index 111e04f054..0000000000 --- a/internal/process/provisioning/internal_eval_test.go +++ /dev/null @@ -1,241 +0,0 @@ -package provisioning - -import ( - "context" - "encoding/json" - "net/http" - "net/http/httptest" - "strconv" - "testing" - "time" - - "github.com/kyma-project/kyma-environment-broker/internal/broker" - - "github.com/gorilla/mux" - - "github.com/kyma-project/kyma-environment-broker/internal/avs" - - "github.com/kyma-project/kyma-environment-broker/internal/storage" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" -) - -type evaluationRepository map[int64]*avs.BasicEvaluationCreateResponse - -type mockAvsService struct { - server *httptest.Server - evals evaluationRepository - isInternal bool - t *testing.T -} - -const dummyStrAvsTest = "dummy" - -func TestInternalEvaluationStep_Run(t *testing.T) { - // given - log := logrus.New() - memoryStorage := storage.NewMemoryStorage() - provisioningOperation := fixOperationCreateRuntime(t, broker.AzurePlanID, "westeurope") - - inputCreator := newInputCreator() - provisioningOperation.InputCreator = inputCreator - - err := memoryStorage.Operations().InsertOperation(provisioningOperation) - assert.NoError(t, err) - - mockOauthServer := newMockAvsOauthServer() - defer mockOauthServer.Close() - mockAvsSvc := newMockAvsService(t, true) - mockAvsSvc.startServer() - defer mockAvsSvc.server.Close() - avsConfig := avsConfig(mockOauthServer, mockAvsSvc.server) - avsClient, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - assert.NoError(t, err) - avsDel := avs.NewDelegator(avsClient, avsConfig, memoryStorage.Operations()) - internalEvalAssistant := avs.NewInternalEvalAssistant(avsConfig) - ies := NewInternalEvaluationStep(avsDel, internalEvalAssistant) - - // when - logger := log.WithFields(logrus.Fields{"step": "TEST"}) - provisioningOperation, repeat, err := ies.Run(provisioningOperation, logger) - - //then - assert.NoError(t, err) - assert.Equal(t, 0*time.Second, repeat) - - inDB, err := memoryStorage.Operations().GetOperationByID(provisioningOperation.ID) - assert.NoError(t, err) - assert.Contains(t, mockAvsSvc.evals, inDB.Avs.AvsEvaluationInternalId) -} - -func TestInternalEvaluationStep_WhenOperationIsRepeatedWithIdPresent(t *testing.T) { - // given - log := logrus.New() - memoryStorage := storage.NewMemoryStorage() - provisioningOperation := fixOperationCreateRuntime(t, broker.AzurePlanID, "westeurope") - _, id := generateId() - provisioningOperation.Avs.AvsEvaluationInternalId = id - - inputCreator := newInputCreator() - provisioningOperation.InputCreator = inputCreator - - err := memoryStorage.Operations().InsertOperation(provisioningOperation) - assert.NoError(t, err) - - mockOauthServer := newMockAvsOauthServer() - defer mockOauthServer.Close() - mockAvsServer := newMockAvsService(t, true) - mockAvsServer.startServer() - defer mockAvsServer.server.Close() - avsConfig := avsConfig(mockOauthServer, mockAvsServer.server) - avsClient, err := avs.NewClient(context.TODO(), avsConfig, logrus.New()) - assert.NoError(t, err) - avsDel := avs.NewDelegator(avsClient, avsConfig, memoryStorage.Operations()) - internalEvalAssistant := avs.NewInternalEvalAssistant(avsConfig) - ies := NewInternalEvaluationStep(avsDel, internalEvalAssistant) - - // when - logger := log.WithFields(logrus.Fields{"step": "TEST"}) - provisioningOperation, repeat, err := ies.Run(provisioningOperation, logger) - - //then - assert.NoError(t, err) - assert.Equal(t, 0*time.Second, repeat) - - inDB, err := memoryStorage.Operations().GetOperationByID(provisioningOperation.ID) - assert.NoError(t, err) - assert.Equal(t, inDB.Avs.AvsEvaluationInternalId, id) -} - -func newMockAvsOauthServer() *httptest.Server { - return httptest.NewServer( - http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { - writer.Header().Set("Content-Type", "application/json") - _, _ = writer.Write([]byte(`{"access_token": "90d64460d14870c08c81352a05dedd3465940a7c", "scope": "user", "token_type": "bearer", "expires_in": 86400}`)) - })) -} - -func newMockAvsService(t *testing.T, isInternal bool) *mockAvsService { - return &mockAvsService{ - evals: make(evaluationRepository, 0), - isInternal: isInternal, - t: t, - } -} - -func (svc *mockAvsService) startServer() { - r := mux.NewRouter() - r.HandleFunc("/", svc.handleCreateEvaluation).Methods(http.MethodPost) - r.HandleFunc("/{id}/tag", svc.handleAddTag).Methods(http.MethodPost) - svc.server = httptest.NewServer(r) -} - -func (svc *mockAvsService) handleCreateEvaluation(w http.ResponseWriter, r *http.Request) { - assert.Equal(svc.t, r.Header.Get("Content-Type"), "application/json") - dec := json.NewDecoder(r.Body) - var requestObj avs.BasicEvaluationCreateRequest - err := dec.Decode(&requestObj) - assert.NoError(svc.t, err) - - if svc.isInternal { - assert.Empty(svc.t, requestObj.URL) - } else { - assert.NotEmpty(svc.t, requestObj.URL) - } - - evalCreateResponse := createResponseObj(requestObj, svc.t) - svc.evals[evalCreateResponse.Id] = evalCreateResponse - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(evalCreateResponse); err != nil { - w.WriteHeader(http.StatusInternalServerError) - } -} - -func (svc *mockAvsService) handleAddTag(w http.ResponseWriter, r *http.Request) { - dec := json.NewDecoder(r.Body) - var requestObj *avs.Tag - err := dec.Decode(&requestObj) - assert.NoError(svc.t, err) - - vars := mux.Vars(r) - evalId, err := strconv.ParseInt(vars["id"], 10, 64) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - } - _, exists := svc.evals[evalId] - if !exists { - w.WriteHeader(http.StatusNotFound) - } - svc.evals[evalId].Tags = append(svc.evals[evalId].Tags, requestObj) - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(svc.evals[evalId]); err != nil { - w.WriteHeader(http.StatusInternalServerError) - } -} - -func avsConfig(mockOauthServer *httptest.Server, mockAvsServer *httptest.Server) avs.Config { - return avs.Config{ - OauthTokenEndpoint: mockOauthServer.URL, - OauthUsername: dummyStrAvsTest, - OauthPassword: dummyStrAvsTest, - OauthClientId: dummyStrAvsTest, - ApiEndpoint: mockAvsServer.URL, - DefinitionType: avs.DefinitionType, - InternalTesterAccessId: 1234, - InternalTesterService: "", - ExternalTesterAccessId: 5678, - ExternalTesterService: dummyStrAvsTest, - - GroupId: 5555, - ParentId: 9101112, - RegionTagClassId: 111113, - } -} - -func createResponseObj(requestObj avs.BasicEvaluationCreateRequest, t *testing.T) *avs.BasicEvaluationCreateResponse { - parseInt, err := strconv.ParseInt(requestObj.Threshold, 10, 64) - assert.NoError(t, err) - - timeUnixEpoch, id := generateId() - - evalCreateResponse := &avs.BasicEvaluationCreateResponse{ - DefinitionType: requestObj.DefinitionType, - Name: requestObj.Name, - Description: requestObj.Description, - Service: requestObj.Service, - URL: requestObj.URL, - CheckType: requestObj.CheckType, - Interval: requestObj.Interval, - TesterAccessId: requestObj.TesterAccessId, - Timeout: requestObj.Timeout, - ReadOnly: requestObj.ReadOnly, - ContentCheck: requestObj.ContentCheck, - ContentCheckType: requestObj.ContentCheck, - Threshold: parseInt, - GroupId: requestObj.GroupId, - Visibility: requestObj.Visibility, - DateCreated: timeUnixEpoch, - DateChanged: timeUnixEpoch, - Owner: "abc@xyz.corp", - Status: "ACTIVE", - Alerts: nil, - Tags: requestObj.Tags, - Id: id, - LegacyCheckId: id, - InternalInterval: 60, - AuthType: "AUTH_NONE", - IndividualOutageEventsOnly: false, - IdOnTester: "", - } - return evalCreateResponse -} - -func generateId() (int64, int64) { - timeUnixEpoch := time.Now().Unix() - id := time.Now().Unix() - return timeUnixEpoch, id -} diff --git a/internal/process/upgrade_cluster/initialisation.go b/internal/process/upgrade_cluster/initialisation.go index 2530391453..9c33c2f801 100644 --- a/internal/process/upgrade_cluster/initialisation.go +++ b/internal/process/upgrade_cluster/initialisation.go @@ -7,7 +7,6 @@ import ( "github.com/kyma-project/control-plane/components/provisioner/pkg/gqlschema" "github.com/kyma-project/kyma-environment-broker/common/orchestration" "github.com/kyma-project/kyma-environment-broker/internal" - "github.com/kyma-project/kyma-environment-broker/internal/avs" kebError "github.com/kyma-project/kyma-environment-broker/internal/error" "github.com/kyma-project/kyma-environment-broker/internal/notification" "github.com/kyma-project/kyma-environment-broker/internal/process" @@ -36,12 +35,11 @@ type InitialisationStep struct { orchestrationStorage storage.Orchestrations provisionerClient provisioner.Client inputBuilder input.CreatorForPlan - evaluationManager *avs.EvaluationManager timeSchedule TimeSchedule bundleBuilder notification.BundleBuilder } -func NewInitialisationStep(os storage.Operations, ors storage.Orchestrations, pc provisioner.Client, b input.CreatorForPlan, em *avs.EvaluationManager, +func NewInitialisationStep(os storage.Operations, ors storage.Orchestrations, pc provisioner.Client, b input.CreatorForPlan, timeSchedule *TimeSchedule, bundleBuilder notification.BundleBuilder) *InitialisationStep { ts := timeSchedule if ts == nil { @@ -57,7 +55,6 @@ func NewInitialisationStep(os storage.Operations, ors storage.Orchestrations, pc orchestrationStorage: ors, provisionerClient: pc, inputBuilder: b, - evaluationManager: em, timeSchedule: *ts, bundleBuilder: bundleBuilder, } @@ -134,63 +131,6 @@ func (s *InitialisationStep) initializeUpgradeShootRequest(operation internal.Up } } -// performRuntimeTasks Ensures that required logic on init and finish is executed. -// Uses internal and external Avs monitor statuses to verify state. -func (s *InitialisationStep) performRuntimeTasks(step int, operation internal.UpgradeClusterOperation, log logrus.FieldLogger) (internal.UpgradeClusterOperation, time.Duration, error) { - hasMonitors := s.evaluationManager.HasMonitors(operation.Avs) - inMaintenance := s.evaluationManager.InMaintenance(operation.Avs) - var err error = nil - var delay time.Duration = 0 - var updateAvsStatus = func(op *internal.UpgradeClusterOperation) { - op.Avs.AvsInternalEvaluationStatus = operation.Avs.AvsInternalEvaluationStatus - op.Avs.AvsExternalEvaluationStatus = operation.Avs.AvsExternalEvaluationStatus - } - - switch step { - case UpgradeInitSteps: - if s.evaluationManager.IsMaintenanceModeDisabled() { - break - } - if hasMonitors && - !inMaintenance && - s.evaluationManager.IsMaintenanceModeApplicableForGAID(operation.ProvisioningParameters.ErsContext.GlobalAccountID) { - log.Infof("executing init upgrade steps") - err = s.evaluationManager.SetMaintenanceStatus(&operation.Avs, log) - operation, delay, _ = s.operationManager.UpdateOperation(operation, updateAvsStatus, log) - } - case UpgradeFinishSteps: - if hasMonitors && inMaintenance { - log.Infof("executing finish upgrade steps") - err = s.evaluationManager.RestoreStatus(&operation.Avs, log) - operation, delay, _ = s.operationManager.UpdateOperation(operation, updateAvsStatus, log) - } - } - - switch { - case err == nil: - return operation, delay, nil - case kebError.IsTemporaryError(err): - return s.operationManager.RetryOperation(operation, "error while performing runtime tasks", err, 10*time.Second, 10*time.Minute, log) - default: - return s.operationManager.OperationFailed(operation, "error while performing runtime tasks", err, log) - } -} - -func (s *InitialisationStep) restoreAvsAndFailOperation(operation internal.UpgradeClusterOperation, description string, log logrus.FieldLogger) (internal.UpgradeClusterOperation, time.Duration, error) { - err := s.evaluationManager.RestoreStatus(&operation.Avs, log) - if err != nil { - return s.operationManager.RetryOperation(operation, "error while restoring AvS state", err, 3*time.Second, time.Minute, log) - } - operation, retry, _ := s.operationManager.UpdateOperation(operation, func(op *internal.UpgradeClusterOperation) { - op.Avs.AvsInternalEvaluationStatus = operation.Avs.AvsInternalEvaluationStatus - op.Avs.AvsExternalEvaluationStatus = operation.Avs.AvsExternalEvaluationStatus - }, log) - if retry > 0 { - return operation, retry, nil - } - return s.operationManager.OperationFailed(operation, description, nil, log) -} - // checkRuntimeStatus will check operation runtime status // It will also trigger performRuntimeTasks upgrade steps to ensure // all the required dependencies have been fulfilled for upgrade operation. @@ -205,7 +145,7 @@ func (s *InitialisationStep) checkRuntimeStatus(operation internal.UpgradeCluste return operation, 5 * time.Second, nil } } - return s.restoreAvsAndFailOperation(operation, fmt.Sprintf("operation has reached the time limit: %s", CheckStatusTimeout), log) + return s.operationManager.OperationFailed(operation, fmt.Sprintf("operation has reached the time limit: %s", CheckStatusTimeout), nil, log) } status, err := s.provisionerClient.RuntimeOperationStatus(operation.RuntimeOperation.GlobalAccountID, operation.ProvisionerOperationID) @@ -219,12 +159,6 @@ func (s *InitialisationStep) checkRuntimeStatus(operation internal.UpgradeCluste msg = *status.Message } - // do required steps on init - operation, delay, err := s.performRuntimeTasks(UpgradeInitSteps, operation, log) - if delay != 0 || err != nil { - return operation, delay, err - } - // wait for operation completion switch status.State { case gqlschema.OperationStateInProgress, gqlschema.OperationStatePending: @@ -240,7 +174,7 @@ func (s *InitialisationStep) checkRuntimeStatus(operation internal.UpgradeCluste } // Set post-upgrade description which also reset UpdatedAt for operation retries to work properly if operation.Description != postUpgradeDescription { - operation, delay, _ = s.operationManager.UpdateOperation(operation, func(operation *internal.UpgradeClusterOperation) { + operation, delay, _ := s.operationManager.UpdateOperation(operation, func(operation *internal.UpgradeClusterOperation) { operation.Description = postUpgradeDescription }, log) if delay != 0 { @@ -249,12 +183,6 @@ func (s *InitialisationStep) checkRuntimeStatus(operation internal.UpgradeCluste } } - // do required steps on finish - operation, delay, err = s.performRuntimeTasks(UpgradeFinishSteps, operation, log) - if delay != 0 || err != nil { - return operation, delay, err - } - // handle operation completion switch status.State { case gqlschema.OperationStateSucceeded: