diff --git a/README.md b/README.md index 7b822f3b..210e279a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -prod ![prod](https://api.radix.equinor.com/api/v1/applications/radix-api//environments/prod/buildstatus) -qa ![qa](https://api.radix.equinor.com/api/v1/applications/radix-api//environments/qa/buildstatus) + +**PROD** ![prod](https://api.radix.equinor.com/api/v1/applications/radix-api/environments/prod/buildstatus) **QA** ![qa](https://api.radix.equinor.com/api/v1/applications/radix-api/environments/qa/buildstatus) [![SCM Compliance](https://scm-compliance-api.radix.equinor.com/repos/equinor/radix-api/badge)](https://developer.equinor.com/governance/scm-policy/) # Radix API The Radix API is an HTTP server for accessing functionality on the [Radix](https://www.radix.equinor.com) platform. This document is for Radix developers, or anyone interested in poking around. diff --git a/api/alerting/handler.go b/api/alerting/handler.go index 62d9c6e5..cc611ce2 100644 --- a/api/alerting/handler.go +++ b/api/alerting/handler.go @@ -138,11 +138,11 @@ func (h *handler) updateRadixAlertFromAlertingConfig(ctx context.Context, radixA } if len(config.ReceiverSecrets) > 0 { - configSecret, err := h.getConfigSecret(ctx, radixAlert.Name) + current, err := h.getConfigSecret(ctx, radixAlert.Name) if err != nil { return nil, err } - if err := h.updateConfigSecret(ctx, *configSecret, &config); err != nil { + if err := h.updateConfigSecret(ctx, *current, &config); err != nil { return nil, err } } @@ -153,18 +153,19 @@ func (h *handler) updateRadixAlertFromAlertingConfig(ctx context.Context, radixA } func (h *handler) updateConfigSecret(ctx context.Context, secret corev1.Secret, config *alertModels.UpdateAlertingConfig) error { - if secret.Data == nil { - secret.Data = make(map[string][]byte) + desired := secret.DeepCopy() + if desired.Data == nil { + desired.Data = make(map[string][]byte) } for receiverName, receiverSecret := range config.ReceiverSecrets { if receiverSecret.SlackConfig != nil { - h.setSlackConfigSecret(*receiverSecret.SlackConfig, receiverName, &secret) + h.setSlackConfigSecret(*receiverSecret.SlackConfig, receiverName, desired) } } kubeUtil, _ := kube.New(h.accounts.UserAccount.Client, h.accounts.UserAccount.RadixClient, h.accounts.UserAccount.KedaClient, h.accounts.UserAccount.SecretProviderClient) - _, err := kubeUtil.ApplySecret(ctx, h.namespace, &secret) + _, err := kubeUtil.UpdateSecret(ctx, &secret, desired) return err } diff --git a/api/environmentvariables/env_vars_controller_test.go b/api/environmentvariables/env_vars_controller_test.go index 09464018..428b2ce3 100644 --- a/api/environmentvariables/env_vars_controller_test.go +++ b/api/environmentvariables/env_vars_controller_test.go @@ -5,11 +5,13 @@ import ( "fmt" "testing" + certclient "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned" certclientfake "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned/fake" envvarsmodels "github.com/equinor/radix-api/api/environmentvariables/models" controllertest "github.com/equinor/radix-api/api/test" + "github.com/equinor/radix-operator/pkg/apis/config" + "github.com/equinor/radix-operator/pkg/apis/deployment" "github.com/equinor/radix-operator/pkg/apis/kube" - radixv1 "github.com/equinor/radix-operator/pkg/apis/radix/v1" commontest "github.com/equinor/radix-operator/pkg/apis/test" builders "github.com/equinor/radix-operator/pkg/apis/utils" radixclient "github.com/equinor/radix-operator/pkg/client/clientset/versioned" @@ -20,6 +22,7 @@ import ( prometheusfake "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned/fake" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" kubefake "k8s.io/client-go/kubernetes/fake" secretproviderfake "sigs.k8s.io/secrets-store-csi-driver/pkg/client/clientset/versioned/fake" @@ -34,7 +37,7 @@ const ( subscriptionId = "12347718-c8f8-4995-bfbb-02655ff1f89c" ) -func setupTestWithMockHandler(t *testing.T, mockCtrl *gomock.Controller) (*commontest.Utils, *controllertest.Utils, kubernetes.Interface, radixclient.Interface, prometheusclient.Interface, *MockEnvVarsHandler) { +func setupTestWithMockHandler(t *testing.T, mockCtrl *gomock.Controller) (*commontest.Utils, *controllertest.Utils, kubernetes.Interface, radixclient.Interface, prometheusclient.Interface, certclient.Interface, *MockEnvVarsHandler) { kubeclient, radixclient, kedaClient, prometheusclient, commonTestUtils, _, secretproviderclient, certClient := setupTest(t) handler := NewMockEnvVarsHandler(mockCtrl) @@ -44,7 +47,7 @@ func setupTestWithMockHandler(t *testing.T, mockCtrl *gomock.Controller) (*commo // controllerTestUtils is used for issuing HTTP request and processing responses controllerTestUtils := controllertest.NewTestUtils(kubeclient, radixclient, kedaClient, secretproviderclient, certClient, controller) - return &commonTestUtils, &controllerTestUtils, kubeclient, radixclient, prometheusclient, handler + return &commonTestUtils, &controllerTestUtils, kubeclient, radixclient, prometheusclient, certClient, handler } func setupTest(t *testing.T) (*kubefake.Clientset, *radixfake.Clientset, *kedafake.Clientset, *prometheusfake.Clientset, commontest.Utils, *kube.Kube, *secretproviderfake.Clientset, *certclientfake.Clientset) { @@ -70,8 +73,9 @@ func Test_GetComponentEnvVars(t *testing.T) { url := fmt.Sprintf("/api/v1/applications/%s/environments/%s/components/%s/envvars", appName, environmentName, componentName) t.Run("Return env-vars", func(t *testing.T) { - commonTestUtils, controllerTestUtils, _, _, _, handler := setupTestWithMockHandler(t, mockCtrl) - _, err := setupDeployment(commonTestUtils, appName, environmentName, componentName, nil) + commonTestUtils, controllerTestUtils, kubeClient, radixClient, promClient, certClient, handler := setupTestWithMockHandler(t, mockCtrl) + + err := setupDeployment(commonTestUtils, kubeClient, radixClient, promClient, certClient, appName, environmentName, componentName, nil) require.NoError(t, err) handler.EXPECT().GetComponentEnvVars(gomock.Any(), appName, environmentName, componentName). Return([]envvarsmodels.EnvVar{ @@ -113,8 +117,8 @@ func Test_GetComponentEnvVars(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() - commonTestUtils, controllerTestUtils, _, _, _, handler := setupTestWithMockHandler(t, mockCtrl) - _, err := setupDeployment(commonTestUtils, appName, environmentName, componentName, nil) + commonTestUtils, controllerTestUtils, kubeClient, radixClient, promClient, certClient, handler := setupTestWithMockHandler(t, mockCtrl) + err := setupDeployment(commonTestUtils, kubeClient, radixClient, promClient, certClient, appName, environmentName, componentName, nil) require.NoError(t, err) handler.EXPECT().GetComponentEnvVars(gomock.Any(), appName, environmentName, componentName). Return(nil, fmt.Errorf("some-err")) @@ -154,8 +158,8 @@ func Test_ChangeEnvVar(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() - commonTestUtils, controllerTestUtils, _, _, _, handler := setupTestWithMockHandler(t, mockCtrl) - _, err := setupDeployment(commonTestUtils, appName, environmentName, componentName, nil) + commonTestUtils, controllerTestUtils, kubeClient, radixClient, promClient, certClient, handler := setupTestWithMockHandler(t, mockCtrl) + err := setupDeployment(commonTestUtils, kubeClient, radixClient, promClient, certClient, appName, environmentName, componentName, nil) require.NoError(t, err) handler.EXPECT().ChangeEnvVar(gomock.Any(), appName, environmentName, componentName, envVarsParams). @@ -172,8 +176,8 @@ func Test_ChangeEnvVar(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() - commonTestUtils, controllerTestUtils, _, _, _, handler := setupTestWithMockHandler(t, mockCtrl) - _, err := setupDeployment(commonTestUtils, appName, environmentName, componentName, nil) + commonTestUtils, controllerTestUtils, kubeClient, radixClient, promClient, certClient, handler := setupTestWithMockHandler(t, mockCtrl) + err := setupDeployment(commonTestUtils, kubeClient, radixClient, promClient, certClient, appName, environmentName, componentName, nil) require.NoError(t, err) handler.EXPECT().ChangeEnvVar(gomock.Any(), appName, environmentName, componentName, envVarsParams). @@ -189,12 +193,12 @@ func Test_ChangeEnvVar(t *testing.T) { }) } -func setupDeployment(commonTestUtils *commontest.Utils, appName, environmentName, componentName string, modifyComponentBuilder func(builders.DeployComponentBuilder)) (*radixv1.RadixDeployment, error) { +func setupDeployment(commonTestUtils *commontest.Utils, kubeClient kubernetes.Interface, radixClient radixclient.Interface, promClient prometheusclient.Interface, certClient certclient.Interface, appName, environmentName, componentName string, modifyComponentBuilder func(builders.DeployComponentBuilder)) error { componentBuilder := builders.NewDeployComponentBuilder().WithName(componentName) if modifyComponentBuilder != nil { modifyComponentBuilder(componentBuilder) } - return commonTestUtils.ApplyDeployment( + rd, err := commonTestUtils.ApplyDeployment( context.Background(), builders. ARadixDeployment(). @@ -203,4 +207,16 @@ func setupDeployment(commonTestUtils *commontest.Utils, appName, environmentName WithEnvironment(environmentName). WithComponent(componentBuilder). WithImageTag("1234")) + if err != nil { + return err + } + + radixRegistration, err := radixClient.RadixV1().RadixRegistrations().Get(context.Background(), rd.Spec.AppName, metav1.GetOptions{}) + if err != nil { + return err + } + + deploymentSyncer := deployment.NewDeploymentSyncer(kubeClient, commonTestUtils.GetKubeUtil(), radixClient, promClient, certClient, radixRegistration, rd, nil, nil, &config.Config{}) + + return deploymentSyncer.OnSync(context.Background()) } diff --git a/api/environmentvariables/env_vars_handler_test.go b/api/environmentvariables/env_vars_handler_test.go index 0bba9a14..bd70b7fe 100644 --- a/api/environmentvariables/env_vars_handler_test.go +++ b/api/environmentvariables/env_vars_handler_test.go @@ -16,13 +16,13 @@ func Test_GetEnvVars(t *testing.T) { namespace := operatorutils.GetEnvironmentNamespace(appName, environmentName) t.Run("Get existing env vars", func(t *testing.T) { t.Parallel() - _, _, _, _, commonTestUtils, kubeUtil, _, _ := setupTest(t) + kubeClient, radixClient, _, promClient, commonTestUtils, kubeUtil, _, certClient := setupTest(t) envVarsMap := map[string]string{ "VAR1": "val1", "VAR2": "val2", } - _, err := setupDeployment(&commonTestUtils, appName, environmentName, componentName, func(builder operatorutils.DeployComponentBuilder) { + err := setupDeployment(&commonTestUtils, kubeClient, radixClient, promClient, certClient, appName, environmentName, componentName, func(builder operatorutils.DeployComponentBuilder) { builder.WithEnvironmentVariables(envVarsMap). WithSecrets([]string{"SECRET1", "SECRET2"}) }) @@ -55,14 +55,14 @@ func Test_ChangeGetEnvVars(t *testing.T) { namespace := operatorutils.GetEnvironmentNamespace(appName, environmentName) t.Run("Change existing env var", func(t *testing.T) { t.Parallel() - _, _, _, _, commonTestUtils, kubeUtil, _, _ := setupTest(t) + kubeClient, radixClient, _, promClient, commonTestUtils, kubeUtil, _, certClient := setupTest(t) envVarsMap := map[string]string{ "VAR1": "val1", "VAR2": "val2", "VAR3": "val3", } - _, err := setupDeployment(&commonTestUtils, appName, environmentName, componentName, func(builder operatorutils.DeployComponentBuilder) { + err := setupDeployment(&commonTestUtils, kubeClient, radixClient, promClient, certClient, appName, environmentName, componentName, func(builder operatorutils.DeployComponentBuilder) { builder.WithEnvironmentVariables(envVarsMap) }) require.NoError(t, err) @@ -105,13 +105,13 @@ func Test_ChangeGetEnvVars(t *testing.T) { }) t.Run("Skipped changing not-existing env vars", func(t *testing.T) { t.Parallel() - _, _, _, _, commonTestUtils, kubeUtil, _, _ := setupTest(t) + kubeClient, radixClient, _, promClient, commonTestUtils, kubeUtil, _, certClient := setupTest(t) envVarsMap := map[string]string{ "VAR1": "val1", "VAR2": "val2", } - _, err := setupDeployment(&commonTestUtils, appName, environmentName, componentName, func(builder operatorutils.DeployComponentBuilder) { + err := setupDeployment(&commonTestUtils, kubeClient, radixClient, promClient, certClient, appName, environmentName, componentName, func(builder operatorutils.DeployComponentBuilder) { builder.WithEnvironmentVariables(envVarsMap) }) require.NoError(t, err) diff --git a/go.mod b/go.mod index f335c80f..0f058f90 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/cert-manager/cert-manager v1.15.0 github.com/equinor/radix-common v1.9.3 github.com/equinor/radix-job-scheduler v1.10.2 - github.com/equinor/radix-operator v1.57.8 + github.com/equinor/radix-operator v1.57.16 github.com/evanphx/json-patch/v5 v5.9.0 github.com/felixge/httpsnoop v1.0.4 github.com/golang-jwt/jwt/v5 v5.2.1 diff --git a/go.sum b/go.sum index e037401a..f0cbbb61 100644 --- a/go.sum +++ b/go.sum @@ -89,6 +89,8 @@ github.com/equinor/radix-job-scheduler v1.10.2 h1:Ea/gmSQjVdomC3XzkqJdR1TGQ9Bvq8 github.com/equinor/radix-job-scheduler v1.10.2/go.mod h1:cnVXZ09D0rAPTZrcgWynL/txMQnpYmPSPyzfKfTYlec= github.com/equinor/radix-operator v1.57.8 h1:fvXky2aZmKcre2X54R9hL5sl9gK19RGfFY9Q2Gn3IQg= github.com/equinor/radix-operator v1.57.8/go.mod h1:zCdAiP/wxyvlUO4qGoJuLW3O+ZSt9kTyHMnjmsR3fCU= +github.com/equinor/radix-operator v1.57.16 h1:kDuPbKrb/r3Iu6BtCoq50IETspvynl55X+RGug9CSqw= +github.com/equinor/radix-operator v1.57.16/go.mod h1:zCdAiP/wxyvlUO4qGoJuLW3O+ZSt9kTyHMnjmsR3fCU= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=