From 58b3db3f52691d1fd11cd35d2e212e8b727e63bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Wiesmu=CC=88ller?= Date: Mon, 14 May 2018 21:50:10 +0200 Subject: [PATCH] start fixing #28 by using patch --- Gopkg.lock | 46 +++++++++++++++++++++++++++-------------- Makefile | 6 +++--- apply/change_applier.go | 27 +++++++++++++++++++++--- cmd/dimios/dimios.go | 2 +- 4 files changed, 58 insertions(+), 23 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 17e2ed2..42d6cc2 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -4,8 +4,8 @@ [[projects]] name = "cloud.google.com/go" packages = ["compute/metadata"] - revision = "29f476ffa9c4cd4fd14336b6043090ac1ad76733" - version = "v0.21.0" + revision = "056a55f54a6cc77b440b31a56a5e7c3982d32811" + version = "v0.22.0" [[projects]] branch = "master" @@ -51,8 +51,14 @@ "model", "parser" ] - revision = "2622a796a7ed1395104c05b328ffcb2c842fff62" - version = "2.0.0" + revision = "e251734c5970a6fdf182dca865afc89944f26943" + version = "2.1.0" + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" [[projects]] branch = "master" @@ -131,7 +137,7 @@ branch = "master" name = "github.com/kolide/kit" packages = ["version"] - revision = "36eb8dc4391633d1cf91b600b999c7583439f37f" + revision = "efbc10368270cec76483472fd8c02ecc54e15a0d" [[projects]] name = "github.com/modern-go/concurrent" @@ -167,8 +173,8 @@ "reporters/stenographer/support/go-isatty", "types" ] - revision = "9eda700730cba42af70d53180f9dcce9266bc2bc" - version = "v1.4.0" + revision = "fa5fabab2a1bfbd924faf4c067d07ae414e2aedf" + version = "v1.5.0" [[projects]] name = "github.com/onsi/gomega" @@ -188,8 +194,8 @@ "matchers/support/goraph/util", "types" ] - revision = "003f63b7f4cff3fc95357005358af2de0f5fe152" - version = "v1.3.0" + revision = "62bff4df71bdbc266561a0caee19f0594b17c240" + version = "v1.4.0" [[projects]] name = "github.com/pkg/errors" @@ -211,7 +217,7 @@ "blowfish", "ssh/terminal" ] - revision = "2c241ca3045ddc354463c376a9515d9f1f1390a4" + revision = "2fc4c88bf43f0ea5ea305eae2b7af24b2cc93287" [[projects]] branch = "master" @@ -225,10 +231,9 @@ "http/httpguts", "http2", "http2/hpack", - "idna", - "lex/httplex" + "idna" ] - revision = "5f9ae10d9af5b1c89ae6904293b14b064d4ada23" + revision = "2491c5de3490fced2f6cff376127c667efeed857" [[projects]] branch = "master" @@ -240,7 +245,7 @@ "jws", "jwt" ] - revision = "6881fee410a5daf86371371f9ad451b95e168b71" + revision = "cdc340f7c179dbbfa4afd43b7614e8fcadde4269" [[projects]] branch = "master" @@ -249,7 +254,7 @@ "unix", "windows" ] - revision = "78d5f264b493f125018180c204871ecf58a2dce1" + revision = "7c87d13f8e835d2fb3a70a2912c811ed0c1d241b" [[projects]] name = "golang.org/x/text" @@ -382,15 +387,18 @@ "pkg/util/framer", "pkg/util/intstr", "pkg/util/json", + "pkg/util/mergepatch", "pkg/util/net", "pkg/util/runtime", "pkg/util/sets", + "pkg/util/strategicpatch", "pkg/util/validation", "pkg/util/validation/field", "pkg/util/wait", "pkg/util/yaml", "pkg/version", "pkg/watch", + "third_party/forked/golang/json", "third_party/forked/golang/reflect" ] revision = "302974c03f7e50f16561ba237db776ab93594ef6" @@ -426,9 +434,15 @@ revision = "23781f4d6632d88e869066eaebb743857aa1ef9b" version = "v7.0.0" +[[projects]] + branch = "master" + name = "k8s.io/kube-openapi" + packages = ["pkg/util/proto"] + revision = "b3f03f55328800731ce03a164b80973014ecd455" + [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "45c54f7511853d7ab5298e053163212dfc20eb11f19899f4fda8cffc08a764d1" + inputs-digest = "846127155ce3f35ae4509999ea6fb6c6344689b64c2f573ed296cbcaa30daf10" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Makefile b/Makefile index 7fa9ee6..1266d8f 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ deps: go get -u github.com/golang/lint/golint go get -u github.com/kisielk/errcheck go get -u github.com/golang/dep/cmd/dep - go get -u github.com/bborbe/docker_utils/bin/docker_remote_tag_exists + go get -u github.com/bborbe/docker-utils/cmd/docker-remote-tag-exists go get -u github.com/haya14busa/goverage go get -u github.com/schrej/godacov go get -u github.com/maxbrunsfeld/counterfeiter @@ -90,7 +90,7 @@ build: # run specified tool from code dev: - @go run -ldflags $(KIT_VERSION) cmd/$(NAME)/*.go \ + @go run -ldflags $(KIT_VERSION) cmd/$(NAME)/$(NAME).go \ -dir=$(MANIFEST_DIR) \ -namespaces=$(NAMESPACES) \ -teamvault-config=~/.teamvault-sm.json \ @@ -115,7 +115,7 @@ version: # install docker tag check docker_remote_tag_exists: - @go get github.com/bborbe/docker_utils/bin/docker_remote_tag_exists + @go get github.com/bborbe/docker-utils/cmd/docker-remote-tag-exists # trigger only if docker tag not present trigger: docker_remote_tag_exists diff --git a/apply/change_applier.go b/apply/change_applier.go index e7c293c..833b58a 100644 --- a/apply/change_applier.go +++ b/apply/change_applier.go @@ -6,8 +6,10 @@ package apply import ( "context" + "encoding/json" "fmt" + jsonpatch "github.com/evanphx/json-patch" "github.com/golang/glog" "github.com/pkg/errors" "github.com/seibert-media/dimios/change" @@ -15,6 +17,7 @@ import ( k8s_unstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" k8s_runtime "k8s.io/apimachinery/pkg/runtime" k8s_schema "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" k8s_discovery "k8s.io/client-go/discovery" k8s_dynamic "k8s.io/client-go/dynamic" ) @@ -91,7 +94,7 @@ func (c *Applier) apply(ctx context.Context, change change.Change) error { return nil } var result *k8s_unstructured.Unstructured - if _, err := resource.Get(obj.GetName(), k8s_metav1.GetOptions{}); err != nil { + if original, err := resource.Get(obj.GetName(), k8s_metav1.GetOptions{}); err != nil { glog.V(3).Infoln("object not present, creating") result, err = resource.Create(obj) if err != nil { @@ -99,9 +102,27 @@ func (c *Applier) apply(ctx context.Context, change change.Change) error { } } else { glog.V(3).Infoln("object already present, updating") - result, err = resource.Update(obj) + + originalBytes, err := json.Marshal(original.Object) + if err != nil { + return errors.Wrap(err, "unable to marshal original") + } + + updatedBytes, err := json.Marshal(obj.Object) + if err != nil { + return errors.Wrap(err, "unable to marshal original") + } + + patchBytes, err := jsonpatch.CreateMergePatch(originalBytes, updatedBytes) + if err != nil { + return errors.Wrap(err, "unable to decode patch") + } + fmt.Println("ORIG: ", string(originalBytes)) + fmt.Println("NEW: ", string(updatedBytes)) + fmt.Println("PATCH: ", string(patchBytes)) + result, err = resource.Patch(original.GetName(), types.MergePatchType, patchBytes) if err != nil { - return errors.Wrap(err, "update object failed") + return errors.Wrap(err, "unable to patch object") } } diff --git a/cmd/dimios/dimios.go b/cmd/dimios/dimios.go index 31a1423..9a0c349 100644 --- a/cmd/dimios/dimios.go +++ b/cmd/dimios/dimios.go @@ -17,7 +17,7 @@ import ( ) var ( - kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") + kubeconfig = flag.String("kubeconfig", "~/.kube/config", "absolute path to the kubeconfig file") namespaces = flag.String("namespaces", "", "list of kubernetes namespace separated by comma") port = flag.Int("port", 8080, "port listen on if webhook is activated") staging = flag.Bool("staging", false, "staging status")