diff --git a/go.mod b/go.mod index 54e5d3ff..7dde1a37 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/Masterminds/sprig/v3 v3.2.3 github.com/evanphx/json-patch v5.6.0+incompatible github.com/fluxcd/flagger v1.35.0 + github.com/gin-gonic/gin v1.7.7 github.com/gofrs/flock v0.8.1 github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.27.10 @@ -65,6 +66,7 @@ require ( github.com/fatih/color v1.13.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fvbommel/sortorder v1.0.1 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-gorp/gorp/v3 v3.0.5 // indirect github.com/go-logr/logr v1.3.0 // indirect @@ -72,6 +74,9 @@ require ( github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-playground/locales v0.13.0 // indirect + github.com/go-playground/universal-translator v0.17.0 // indirect + github.com/go-playground/validator/v10 v10.4.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -104,6 +109,7 @@ require ( github.com/klauspost/compress v1.11.13 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect + github.com/leodido/go-urn v1.2.0 // indirect github.com/lib/pq v1.10.7 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -149,6 +155,7 @@ require ( github.com/spf13/viper v1.15.0 // indirect github.com/spyzhov/ajson v0.7.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect + github.com/ugorji/go/codec v1.1.7 // indirect github.com/vektah/gqlparser/v2 v2.5.1 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect diff --git a/go.sum b/go.sum index 9c0ca6cf..9602a029 100644 --- a/go.sum +++ b/go.sum @@ -200,6 +200,10 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -221,6 +225,14 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -403,6 +415,7 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -440,6 +453,8 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -684,6 +699,9 @@ github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8 github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/vektah/gqlparser/v2 v2.5.1 h1:ZGu+bquAY23jsxDRcYpWjttRZrUz07LbiY77gUOHcr4= github.com/vektah/gqlparser/v2 v2.5.1/go.mod h1:mPgqFBu/woKTVYWyNk8cO3kh4S/f4aRFZrvOnp3hmCs= github.com/vektra/mockery/v2 v2.39.0 h1:AUyq9PQ/VkjrqmKedxoulg83G7uouk4o7hBs1uUMeog= diff --git a/pkg/manifests/template/helm_test.go b/pkg/manifests/template/helm_test.go new file mode 100644 index 00000000..182f68d8 --- /dev/null +++ b/pkg/manifests/template/helm_test.go @@ -0,0 +1,67 @@ +package template + +import ( + "context" + "log" + "net/http" + "path/filepath" + "time" + + "github.com/gin-gonic/gin" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + console "github.com/pluralsh/console-client-go" +) + +var _ = Describe("Helm template", func() { + + dir := filepath.Join("..", "..", "..", "charts", "deployment-operator") + svc := &console.ServiceDeploymentExtended{ + Namespace: "default", + Name: "test", + } + + r := gin.Default() + r.GET("/version", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "major": "1", + "minor": "21", + }) + }) + + srv := &http.Server{ + Addr: ":8080", + Handler: r, + } + + BeforeEach(func() { + // Initializing the server in a goroutine so that + // it won't block the graceful shutdown handling below + go func() { + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + Expect(err).NotTo(HaveOccurred()) + } + }() + }) + AfterEach(func() { + + // The context is used to inform the server it has 5 seconds to finish + // the request it is currently handling + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + log.Fatal("Server forced to shutdown: ", err) + } + + log.Println("Server exiting") + }) + + Context("Render helm template", func() { + It("should successfully render the helm template", func() { + resp, err := NewHelm(dir).Render(svc, utilFactory) + Expect(err).NotTo(HaveOccurred()) + Expect(len(resp)).To(Equal(6)) + }) + + }) +}) diff --git a/pkg/manifests/template/kustomize_test.go b/pkg/manifests/template/kustomize_test.go new file mode 100644 index 00000000..455c805d --- /dev/null +++ b/pkg/manifests/template/kustomize_test.go @@ -0,0 +1,39 @@ +package template + +import ( + "path/filepath" + "sort" + "strings" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + console "github.com/pluralsh/console-client-go" +) + +var _ = Describe("Kustomize template", func() { + + dir := filepath.Join("..", "..", "..", "test", "kustomize", "overlays") + svc := &console.ServiceDeploymentExtended{ + Namespace: "default", + Kustomize: &console.KustomizeFragment{ + Path: "", + }, + } + Context("Render kustomize template", func() { + It("should successfully render the dev template", func() { + svc.Kustomize.Path = "dev" + resp, err := NewKustomize(dir).Render(svc, utilFactory) + Expect(err).NotTo(HaveOccurred()) + Expect(len(resp)).To(Equal(3)) + sort.Slice(resp, func(i, j int) bool { + return resp[i].GetKind() < resp[j].GetKind() + }) + Expect(resp[0].GetKind()).To(Equal("ConfigMap")) + Expect(strings.HasPrefix(resp[0].GetName(), "app-config")).Should(BeTrue()) + Expect(resp[1].GetKind()).To(Equal("Deployment")) + Expect(resp[2].GetKind()).To(Equal("Secret")) + Expect(strings.HasPrefix(resp[2].GetName(), "credentials")).Should(BeTrue()) + }) + + }) +}) diff --git a/pkg/manifests/template/suite_test.go b/pkg/manifests/template/suite_test.go index ca826774..43a9f4a3 100644 --- a/pkg/manifests/template/suite_test.go +++ b/pkg/manifests/template/suite_test.go @@ -18,11 +18,12 @@ package template import ( "fmt" - cmdtesting "k8s.io/kubectl/pkg/cmd/testing" "path/filepath" "runtime" "testing" + cmdtesting "k8s.io/kubectl/pkg/cmd/testing" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "k8s.io/client-go/kubernetes/scheme" diff --git a/test/kustomize/base/deployment.yaml b/test/kustomize/base/deployment.yaml new file mode 100644 index 00000000..a59f693c --- /dev/null +++ b/test/kustomize/base/deployment.yaml @@ -0,0 +1,26 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-app +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - name: my-app + image: alpine:3.10 + tty: true + stdin: true + env: + - name: foo + value: bar + resources: + limits: + memory: "64Mi" + cpu: "100m" diff --git a/test/kustomize/base/kustomization.yaml b/test/kustomize/base/kustomization.yaml new file mode 100644 index 00000000..f8849596 --- /dev/null +++ b/test/kustomize/base/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - deployment.yaml \ No newline at end of file diff --git a/test/kustomize/overlays/dev/deployment_env.yaml b/test/kustomize/overlays/dev/deployment_env.yaml new file mode 100644 index 00000000..6f716e3b --- /dev/null +++ b/test/kustomize/overlays/dev/deployment_env.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-app +spec: + template: + spec: + containers: + - name: my-app + env: + - name: foo + value: we-are-in-dev + envFrom: + - configMapRef: + name: app-config + - secretRef: + name: credentials \ No newline at end of file diff --git a/test/kustomize/overlays/dev/kustomization.yaml b/test/kustomize/overlays/dev/kustomization.yaml new file mode 100644 index 00000000..01ca70be --- /dev/null +++ b/test/kustomize/overlays/dev/kustomization.yaml @@ -0,0 +1,24 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +bases: +- ../../base + +namespace: my-app-dev + +nameSuffix: -dev + +patchesStrategicMerge: +- deployment_env.yaml + + +configMapGenerator: + - name: app-config + literals: + - username=demo-user + +secretGenerator: + - name: credentials + type: Opaque + literals: + - password=demo \ No newline at end of file