diff --git a/Dockerfile b/Dockerfile index d8d5b6e68fa003ea0f01e0baa28486b83a10cbc2..f1a033346e0cff841c9cfcdc8d6cda9f434669a5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ FROM golang:1.14.3-stretch as builder WORKDIR / RUN apt-get update && apt-get install unzip -RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip -RUN unzip protoc-3.6.1-linux-x86_64.zip -d / +RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.13.0/protoc-3.13.0-linux-x86_64.zip +RUN unzip protoc-3.13.0-linux-x86_64.zip -d / WORKDIR /build COPY api/ api COPY pkg/ pkg diff --git a/go.mod b/go.mod index d51f33ace14dba56a58398e886a1a301adab56c5..15e4ab28faf2e56a45edd122214afb5425f4ec71 100644 --- a/go.mod +++ b/go.mod @@ -1,34 +1,24 @@ module code.geant.net/stash/scm/nmaas/nmaas-janitor require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/gogo/protobuf v1.2.0 // indirect - github.com/golang/protobuf v1.3.2 - github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c // indirect - github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf // indirect - github.com/googleapis/gnostic v0.2.0 // indirect - github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f // indirect - github.com/johnaoss/htpasswd v0.0.0-20190120213328-a0cc59f788da - github.com/json-iterator/go v1.1.5 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect - github.com/onsi/ginkgo v1.8.0 // indirect - github.com/onsi/gomega v1.5.0 // indirect - github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/stretchr/testify v1.3.0 // indirect - github.com/xanzy/go-gitlab v0.12.0 - golang.org/x/net v0.0.0-20181108082009-03003ca0c849 - golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect - google.golang.org/grpc v1.27.0 - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.2.2 // indirect - k8s.io/api v0.0.0-20181130031204-d04500c8c3dd - k8s.io/apimachinery v0.0.0-20181215012845-4d029f033399 - k8s.io/client-go v9.0.0+incompatible - k8s.io/klog v0.1.0 // indirect - k8s.io/kube-openapi v0.0.0-20190401085232-94e1e7b7574c // indirect - sigs.k8s.io/yaml v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/golang/protobuf v1.4.2 + github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f // indirect + github.com/johnaoss/htpasswd v0.0.0-20190120213328-a0cc59f788da + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/peterbourgon/diskv v2.0.1+incompatible // indirect + github.com/xanzy/go-gitlab v0.37.0 + golang.org/x/net v0.0.0-20200707034311-ab3426394381 + google.golang.org/grpc v1.27.0 + google.golang.org/protobuf v1.24.0 + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.3.0 + k8s.io/api v0.19.0 + k8s.io/apimachinery v0.19.0 + k8s.io/client-go v0.19.0 + k8s.io/klog v0.1.0 // indirect ) go 1.13 diff --git a/pkg/api/cmd/server.go b/pkg/api/cmd/server.go index 439f727ee9fbb605a21dc6340d583391c12202af..3171b567907d206642885db2eea1719c9adbbc4a 100644 --- a/pkg/api/cmd/server.go +++ b/pkg/api/cmd/server.go @@ -37,18 +37,19 @@ func RunServer() error { //Initialize kubernetes API config, err := rest.InClusterConfig() - if err != nil { - log.Fatal(err) + if err != nil { + log.Fatal(err) } + clientset, err := kubernetes.NewForConfig(config) - if err != nil { - log.Fatal(err) - } + if err != nil { + log.Fatal(err) + } + kubeAPI := clientset //Initialize Gitlab API - gitAPI := gitlab.NewClient(nil, cfg.GitlabToken) - err = gitAPI.SetBaseURL(cfg.GitlabURL) + gitAPI, err := gitlab.NewClient(cfg.GitlabToken, gitlab.WithBaseURL(cfg.GitlabURL)) if err != nil { log.Fatal(err) } diff --git a/pkg/service/v1/config-service.go b/pkg/service/v1/config-service.go index d4030bde2d765f889ffb86cac65b4fa26d3878a0..b534161d3bedaeddd9edf0a745ab33a09a0004ba 100644 --- a/pkg/service/v1/config-service.go +++ b/pkg/service/v1/config-service.go @@ -215,11 +215,11 @@ func (s *configServiceServer) CreateOrReplace(ctx context.Context, req *v1.Insta } //check if given k8s namespace exists - _, err = s.kubeAPI.CoreV1().Namespaces().Get(depl.Namespace, metav1.GetOptions{}) + _, err = s.kubeAPI.CoreV1().Namespaces().Get(ctx, depl.Namespace, metav1.GetOptions{}) if err != nil { ns := apiv1.Namespace{} ns.Name = depl.Namespace - _, err = s.kubeAPI.CoreV1().Namespaces().Create(&ns) + _, err = s.kubeAPI.CoreV1().Namespaces().Create(ctx, &ns, metav1.CreateOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, namespaceNotFound), err } @@ -245,18 +245,18 @@ func (s *configServiceServer) CreateOrReplace(ctx context.Context, req *v1.Insta cm.Data = files //check if configmap already exists - _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Get(cm.Name, metav1.GetOptions{}) + _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Get(ctx, cm.Name, metav1.GetOptions{}) if err != nil { //Not exists, we create new - _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Create(&cm) + _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Create(ctx, &cm, metav1.CreateOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, "Failed to create ConfigMap"), err } } else { //Already exists, we update it - _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Update(&cm) + _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Update(ctx, &cm, metav1.UpdateOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, "Error while updating configmap!"), err } @@ -276,13 +276,13 @@ func (s *configServiceServer) DeleteIfExists(ctx context.Context, req *v1.Instan depl := req.Deployment //check if given k8s namespace exists - _, err := s.kubeAPI.CoreV1().Namespaces().Get(depl.Namespace, metav1.GetOptions{}) + _, err := s.kubeAPI.CoreV1().Namespaces().Get(ctx, depl.Namespace, metav1.GetOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, namespaceNotFound), err } //retrieve list of configmaps in namespace - configMaps, err := s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).List(metav1.ListOptions{}) + configMaps, err := s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).List(ctx, metav1.ListOptions{}) if err != nil { return prepareResponse(v1.Status_OK, "Could not retrieve list of ConfigMaps in namespace"), nil } @@ -292,7 +292,7 @@ func (s *configServiceServer) DeleteIfExists(ctx context.Context, req *v1.Instan if configmap.Name == depl.Uid || strings.Contains(configmap.Name, depl.Uid + "-") { //delete configmap log.Printf("Deleting ConfigMap named %s", configmap.Name) - err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Delete(configmap.Name, &metav1.DeleteOptions{}) + err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Delete(ctx, configmap.Name, metav1.DeleteOptions{}) if err != nil { log.Printf("Error occured while deleting ConfigMap %s", configmap.Name) } @@ -359,11 +359,11 @@ func (s *basicAuthServiceServer) CreateOrReplace(ctx context.Context, req *v1.In depl := req.Instance //check if given k8s namespace exists - _, err := s.kubeAPI.CoreV1().Namespaces().Get(depl.Namespace, metav1.GetOptions{}) + _, err := s.kubeAPI.CoreV1().Namespaces().Get(ctx, depl.Namespace, metav1.GetOptions{}) if err != nil{ ns := apiv1.Namespace{} ns.Name = depl.Namespace - _, err = s.kubeAPI.CoreV1().Namespaces().Create(&ns) + _, err = s.kubeAPI.CoreV1().Namespaces().Create(ctx, &ns, metav1.CreateOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, namespaceNotFound), err } @@ -371,7 +371,7 @@ func (s *basicAuthServiceServer) CreateOrReplace(ctx context.Context, req *v1.In secretName := getAuthSecretName(depl.Uid) - _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Get(secretName, metav1.GetOptions{}) + _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Get(ctx, secretName, metav1.GetOptions{}) //Secret does not exist, we have to create it if err != nil { //create secret @@ -384,7 +384,7 @@ func (s *basicAuthServiceServer) CreateOrReplace(ctx context.Context, req *v1.In } //commit secret - _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Create(&secret) + _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Create(ctx, &secret, metav1.CreateOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, "Error while creating secret!"), err } @@ -397,7 +397,7 @@ func (s *basicAuthServiceServer) CreateOrReplace(ctx context.Context, req *v1.In } //patch secret - _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Patch(secretName, types.MergePatchType, patch) + _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Patch(ctx, secretName, types.MergePatchType, patch, metav1.PatchOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, "Error while patching secret!"), err } @@ -415,7 +415,7 @@ func (s *basicAuthServiceServer) DeleteIfExists(ctx context.Context, req *v1.Ins depl := req.Deployment //check if given k8s namespace exists - _, err := s.kubeAPI.CoreV1().Namespaces().Get(depl.Namespace, metav1.GetOptions{}) + _, err := s.kubeAPI.CoreV1().Namespaces().Get(ctx, depl.Namespace, metav1.GetOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, namespaceNotFound), err } @@ -423,13 +423,13 @@ func (s *basicAuthServiceServer) DeleteIfExists(ctx context.Context, req *v1.Ins secretName := getAuthSecretName(depl.Uid) //check if secret exist - _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Get(secretName, metav1.GetOptions{}) + _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Get(ctx, secretName, metav1.GetOptions{}) if err != nil { return prepareResponse(v1.Status_OK,"Secret does not exist"), nil } //delete secret - err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Delete(secretName, &metav1.DeleteOptions{}) + err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Delete(ctx, secretName, metav1.DeleteOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, "Error while removing secret!"), err } @@ -446,7 +446,7 @@ func (s *certManagerServiceServer) DeleteIfExists(ctx context.Context, req *v1.I depl := req.Deployment //check if given k8s namespace exists - _, err := s.kubeAPI.CoreV1().Namespaces().Get(depl.Namespace, metav1.GetOptions{}) + _, err := s.kubeAPI.CoreV1().Namespaces().Get(ctx, depl.Namespace, metav1.GetOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, namespaceNotFound), err } @@ -454,13 +454,13 @@ func (s *certManagerServiceServer) DeleteIfExists(ctx context.Context, req *v1.I secretName := depl.Uid + "-tls" //check if secret exist - _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Get(secretName, metav1.GetOptions{}) + _, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Get(ctx, secretName, metav1.GetOptions{}) if err != nil { return prepareResponse(v1.Status_OK,"Secret does not exist"), nil } //delete secret - err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Delete(secretName, &metav1.DeleteOptions{}) + err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Delete(ctx, secretName, metav1.DeleteOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, "Error while removing secret!"), err } @@ -477,16 +477,16 @@ func (s *readinessServiceServer) CheckIfReady(ctx context.Context, req *v1.Insta depl := req.Deployment //check if given k8s namespace exists - _, err := s.kubeAPI.CoreV1().Namespaces().Get(depl.Namespace, metav1.GetOptions{}) + _, err := s.kubeAPI.CoreV1().Namespaces().Get(ctx, depl.Namespace, metav1.GetOptions{}) if err != nil { return prepareResponse(v1.Status_FAILED, namespaceNotFound), err } log.Print("looking for deployment and checking its status") - dep, err := s.kubeAPI.AppsV1().Deployments(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) + dep, err := s.kubeAPI.AppsV1().Deployments(depl.Namespace).Get(ctx, depl.Uid, metav1.GetOptions{}) if err != nil { log.Print("deployment not found, looking for statefulset and checking its status") - sts, err2 := s.kubeAPI.AppsV1().StatefulSets(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) + sts, err2 := s.kubeAPI.AppsV1().StatefulSets(depl.Namespace).Get(ctx, depl.Uid, metav1.GetOptions{}) if err2 != nil { log.Print("statefulset not found as well") return prepareResponse(v1.Status_FAILED, "Neither Deployment nor StatefulSet found!"), err2 @@ -519,14 +519,14 @@ func (s *informationServiceServer) RetrieveServiceIp(ctx context.Context, req *v depl := req.Deployment //check if given k8s namespace exists - _, err := s.kubeAPI.CoreV1().Namespaces().Get(depl.Namespace, metav1.GetOptions{}) + _, err := s.kubeAPI.CoreV1().Namespaces().Get(ctx, depl.Namespace, metav1.GetOptions{}) if err != nil { return prepareInfoResponse(v1.Status_FAILED, namespaceNotFound, ""), err } log.Printf("About to read service %s details from namespace %s", depl.Uid, depl.Namespace) - app, err := s.kubeAPI.CoreV1().Services(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) + app, err := s.kubeAPI.CoreV1().Services(depl.Namespace).Get(ctx, depl.Uid, metav1.GetOptions{}) if err != nil { return prepareInfoResponse(v1.Status_FAILED, "Service not found!", ""), err } diff --git a/pkg/service/v1/config-service_test.go b/pkg/service/v1/config-service_test.go index 1d1a6414e53928bc897f923ee56d02e87803a7e4..5b9df9a681dcb12216ea444464a2a693030899ba 100644 --- a/pkg/service/v1/config-service_test.go +++ b/pkg/service/v1/config-service_test.go @@ -52,7 +52,7 @@ func TestReadinessServiceServer_CheckIfReady(t *testing.T) { //create mock namespace ns := corev1.Namespace{} ns.Name = "test-namespace" - _, _ = client.CoreV1().Namespaces().Create(&ns) + _, _ = client.CoreV1().Namespaces().Create(context.Background(), &ns, metav1.CreateOptions{}) //Fail on deployment res, err = server.CheckIfReady(context.Background(), &req) @@ -66,7 +66,7 @@ func TestReadinessServiceServer_CheckIfReady(t *testing.T) { q := int32(5) depl.Spec.Replicas = &q depl.Status.ReadyReplicas = q - _, _ = client.AppsV1().Deployments("test-namespace").Create(&depl) + _, _ = client.AppsV1().Deployments("test-namespace").Create(context.Background(), &depl, metav1.CreateOptions{}) res, err = server.CheckIfReady(context.Background(), &req) if err != nil || res.Status != v1.Status_OK { @@ -76,7 +76,7 @@ func TestReadinessServiceServer_CheckIfReady(t *testing.T) { //modify mock deployment to be partially deployed p := int32(3) depl.Status.ReadyReplicas = p - _, _ = client.AppsV1().Deployments("test-namespace").Update(&depl) + _, _ = client.AppsV1().Deployments("test-namespace").Update(context.Background(), &depl, metav1.UpdateOptions{}) res, err = server.CheckIfReady(context.Background(), &req) if err != nil || res.Status != v1.Status_PENDING { @@ -104,7 +104,7 @@ func TestReadinessServiceServer_CheckIfReadyWithStatefulSet(t *testing.T) { //create mock namespace ns := corev1.Namespace{} ns.Name = "test-namespace" - _, _ = client.CoreV1().Namespaces().Create(&ns) + _, _ = client.CoreV1().Namespaces().Create(context.Background(), &ns, metav1.CreateOptions{}) //Fail on missing deployment res, err = server.CheckIfReady(context.Background(), &req) @@ -118,7 +118,7 @@ func TestReadinessServiceServer_CheckIfReadyWithStatefulSet(t *testing.T) { q := int32(5) sts.Spec.Replicas = &q sts.Status.ReadyReplicas = q - _, _ = client.AppsV1().StatefulSets("test-namespace").Create(&sts) + _, _ = client.AppsV1().StatefulSets("test-namespace").Create(context.Background(), &sts, metav1.CreateOptions{}) res, err = server.CheckIfReady(context.Background(), &req) if err != nil || res.Status != v1.Status_OK { @@ -146,7 +146,7 @@ func TestInformationServiceServer_RetrieveServiceIp(t *testing.T) { //create mock namespace ns := corev1.Namespace{} ns.Name = "test-namespace" - _, _ = client.CoreV1().Namespaces().Create(&ns) + _, _ = client.CoreV1().Namespaces().Create(context.Background(), &ns, metav1.CreateOptions{}) //Fail on loading services res, err = server.RetrieveServiceIp(context.Background(), &req) @@ -157,7 +157,7 @@ func TestInformationServiceServer_RetrieveServiceIp(t *testing.T) { //create mock service without ingress s1 := corev1.Service{} s1.Name = "test-uid" - _, _ = client.CoreV1().Services("test-namespace").Create(&s1) + _, _ = client.CoreV1().Services("test-namespace").Create(context.Background(), &s1, metav1.CreateOptions{}) //Fail on missing service ingress res, err = server.RetrieveServiceIp(context.Background(), &req) @@ -171,8 +171,8 @@ func TestInformationServiceServer_RetrieveServiceIp(t *testing.T) { i1 := corev1.LoadBalancerIngress{} ing := []corev1.LoadBalancerIngress{i1} s2.Status.LoadBalancer.Ingress = ing - client.CoreV1().Services("test-namespace").Delete("test-uid", &metav1.DeleteOptions{}) - _, _ = client.CoreV1().Services("test-namespace").Create(&s2) + client.CoreV1().Services("test-namespace").Delete(context.Background(), "test-uid", metav1.DeleteOptions{}) + _, _ = client.CoreV1().Services("test-namespace").Create(context.Background(), &s2, metav1.CreateOptions{}) //Fail on missing service ingress IP res, err = server.RetrieveServiceIp(context.Background(), &req) @@ -187,8 +187,8 @@ func TestInformationServiceServer_RetrieveServiceIp(t *testing.T) { i2.IP = "10.10.1.1" ing2 := []corev1.LoadBalancerIngress{i2} s3.Status.LoadBalancer.Ingress = ing2 - client.CoreV1().Services("test-namespace").Delete("test-uid", &metav1.DeleteOptions{}) - _, _ = client.CoreV1().Services("test-namespace").Create(&s3) + client.CoreV1().Services("test-namespace").Delete(context.Background(), "test-uid", metav1.DeleteOptions{}) + _, _ = client.CoreV1().Services("test-namespace").Create(context.Background(), &s3, metav1.CreateOptions{}) //Pass res, err = server.RetrieveServiceIp(context.Background(), &req) @@ -217,7 +217,7 @@ func TestCertManagerServiceServer_DeleteIfExists(t *testing.T) { //create mock namespace ns := corev1.Namespace{} ns.Name = "test-namespace" - _, _ = client.CoreV1().Namespaces().Create(&ns) + _, _ = client.CoreV1().Namespaces().Create(context.Background(), &ns, metav1.CreateOptions{}) //Pass if already nonexistent res, err = server.DeleteIfExists(context.Background(), &req) @@ -228,7 +228,7 @@ func TestCertManagerServiceServer_DeleteIfExists(t *testing.T) { //Create mock secret sec := corev1.Secret{} sec.Name = "test-uid-tls" - _, _ = client.CoreV1().Secrets("test-namespace").Create(&sec) + _, _ = client.CoreV1().Secrets("test-namespace").Create(context.Background(), &sec, metav1.CreateOptions{}) //Pass res, err = server.DeleteIfExists(context.Background(), &req) @@ -253,7 +253,7 @@ func TestBasicAuthServiceServer_DeleteIfExists(t *testing.T) { //create mock namespace ns := corev1.Namespace{} ns.Name = "test-namespace" - _, _ = client.CoreV1().Namespaces().Create(&ns) + _, _ = client.CoreV1().Namespaces().Create(context.Background(), &ns, metav1.CreateOptions{}) //Pass if already nonexistent res, err = server.DeleteIfExists(context.Background(), &req) @@ -264,7 +264,7 @@ func TestBasicAuthServiceServer_DeleteIfExists(t *testing.T) { //Create mock secret sec := corev1.Secret{} sec.Name = getAuthSecretName("test-uid") - _, _ = client.CoreV1().Secrets("test-namespace").Create(&sec) + _, _ = client.CoreV1().Secrets("test-namespace").Create(context.Background() ,&sec, metav1.CreateOptions{}) //Pass res, err = server.DeleteIfExists(context.Background(), &req) @@ -290,7 +290,7 @@ func TestBasicAuthServiceServer_CreateOrReplace(t *testing.T) { t.Fail() } - sec, err := client.CoreV1().Secrets("test-namespace").Get(getAuthSecretName("test-uid"), metav1.GetOptions{}) + sec, err := client.CoreV1().Secrets("test-namespace").Get(context.Background(), getAuthSecretName("test-uid"), metav1.GetOptions{}) if err != nil || sec == nil { t.Fail() } @@ -322,7 +322,7 @@ func TestConfigServiceServer_DeleteIfExists(t *testing.T) { //create mock namespace ns := corev1.Namespace{} ns.Name = "test-namespace" - _, _ = client.CoreV1().Namespaces().Create(&ns) + _, _ = client.CoreV1().Namespaces().Create(context.Background(), &ns, metav1.CreateOptions{}) //Should return ok on configmap check if missing res, err = server.DeleteIfExists(context.Background(), &req) @@ -333,7 +333,7 @@ func TestConfigServiceServer_DeleteIfExists(t *testing.T) { //create mock configmap cm := corev1.ConfigMap{} cm.Name = "test-uid" - _, _ = client.CoreV1().ConfigMaps("test-namespace").Create(&cm) + _, _ = client.CoreV1().ConfigMaps("test-namespace").Create(context.Background(), &cm, metav1.CreateOptions{}) //should pass on deleting existing configmap res, err = server.DeleteIfExists(context.Background(), &req)