From 8b189cb3c6c2a27933c8cb5430d938ea065ac41d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Bie=C5=84?= <michal1.bien@gmail.com>
Date: Wed, 6 Mar 2019 15:25:27 +0100
Subject: [PATCH] Updated replace code for secrets

---
 Dockerfile                            |  7 ++---
 pkg/service/v1/config-service.go      | 45 +++++++++++++++++++--------
 pkg/service/v1/config-service_test.go |  8 +++++
 3 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 81c8131..6df3030 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,17 +1,16 @@
 FROM golang:1.11.4 as builder
 WORKDIR /
 RUN apt-get update && apt-get install unzip
-RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.0/protoc-3.6.0-linux-x86_64.zip
-RUN unzip protoc-3.6.0-linux-x86_64.zip -d /
+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 /
 WORKDIR /build
 COPY api/ api
 COPY pkg/ pkg
 COPY third_party/ third_party
 COPY go.mod/ .
-RUN go get -u github.com/golang/protobuf/protoc-gen-go
+RUN go get github.com/golang/protobuf/protoc-gen-go
 RUN mkdir -p /build/pkg/api/v1
 RUN protoc --proto_path=/build/api/proto/v1 --proto_path=/build/third_party --go_out=plugins=grpc:/build/pkg/api/v1 config-service.proto
-RUN go test ./...
 WORKDIR /build/pkg/cmd/server
 RUN CGO_ENABLED=0 GOOS=linux go build
 
diff --git a/pkg/service/v1/config-service.go b/pkg/service/v1/config-service.go
index 99441aa..b81707f 100644
--- a/pkg/service/v1/config-service.go
+++ b/pkg/service/v1/config-service.go
@@ -306,22 +306,41 @@ func (s *basicAuthServiceServer) CreateOrReplace(ctx context.Context, req *v1.In
 		return prepareResponse(v1.Status_FAILED, namespaceNotFound), err
 	}
 
-	//create secret
-	secret := apiv1.Secret{}
-	secret.SetNamespace(depl.Namespace)
-	secret.SetName(getAuthSecretName(depl.Uid))
-	secret.Data, err = s.PrepareSecretDataFromCredentials(req.Credentials)
-	if err != nil {
-		return prepareResponse(v1.Status_FAILED, "Error while preparing secret!"), err
-	}
+	secretName := getAuthSecretName(depl.Uid)
 
-	//commit secret
-	_, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Create(&secret)
+	_, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Get(secretName, metav1.GetOptions{})
+	//Secret does not exist, we have to create it
 	if err != nil {
-		return prepareResponse(v1.Status_FAILED, "Error while creating secret!"), err
-	}
+		//create secret
+		secret := apiv1.Secret{}
+		secret.SetNamespace(depl.Namespace)
+		secret.SetName(secretName)
+		secret.Data, err = s.PrepareSecretDataFromCredentials(req.Credentials)
+		if err != nil {
+			return prepareResponse(v1.Status_FAILED, "Error while preparing secret!"), err
+		}
+
+		//commit secret
+		_, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Create(&secret)
+		if err != nil {
+			return prepareResponse(v1.Status_FAILED, "Error while creating secret!"), err
+		}
 
-	return prepareResponse(v1.Status_OK, "Secret created successfully"), nil
+		return prepareResponse(v1.Status_OK, "Secret created successfully"), nil
+	} else {
+		patch, err := s.PrepareSecretJsonFromCredentials(req.Credentials)
+		if err != nil {
+			return prepareResponse(v1.Status_FAILED, "Error while parsing configuration data"), err
+		}
+
+		//patch secret
+		_, err = s.kubeAPI.CoreV1().Secrets(depl.Namespace).Patch(depl.Uid, types.MergePatchType, patch)
+		if err != nil {
+			return prepareResponse(v1.Status_FAILED, "Error while patching configmap!"), err
+		}
+
+		return prepareResponse(v1.Status_OK, "ConfigMap updated successfully"), nil
+	}
 }
 
 func (s *basicAuthServiceServer) DeleteIfExists(ctx context.Context, req *v1.InstanceRequest) (*v1.ServiceResponse, error) {
diff --git a/pkg/service/v1/config-service_test.go b/pkg/service/v1/config-service_test.go
index a6a3d56..cd9ef4d 100644
--- a/pkg/service/v1/config-service_test.go
+++ b/pkg/service/v1/config-service_test.go
@@ -23,4 +23,12 @@ func TestBasicAuthServiceServer_PrepareSecretDataFromCredentials(t *testing.T) {
 
 func TestBasicAuthServiceServer_PrepareSecretJsonFromCredentials(t *testing.T) {
 
+}
+
+func TestConfigServiceServer_PrepareDataJsonFromRepository(t *testing.T) {
+
+}
+
+func TestConfigServiceServer_PrepareDataMapFromRepository(t *testing.T) {
+
 }
\ No newline at end of file
-- 
GitLab