From 0b9f022260a1a21608e2fd4b18fdcafbfd973228 Mon Sep 17 00:00:00 2001 From: Joel-Haeberli Date: Fri, 16 Jun 2023 16:22:46 +0200 Subject: [PATCH 1/2] add kustomize validation service --- momentum-backend/go.mod | 26 +++++ momentum-backend/go.sum | 33 ++++++ .../kustomization-validation-service.go | 101 ++++++++++++++++++ .../momentum-core/momentum-config/config.go | 27 +++-- 4 files changed, 180 insertions(+), 7 deletions(-) create mode 100644 momentum-backend/kustomize-client/kustomization-validation-service.go diff --git a/momentum-backend/go.mod b/momentum-backend/go.mod index 4640414..cc77c36 100644 --- a/momentum-backend/go.mod +++ b/momentum-backend/go.mod @@ -46,39 +46,56 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.19.0 // indirect github.com/aws/smithy-go v1.13.5 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/disintegration/imaging v1.6.2 // indirect github.com/dlclark/regexp2 v1.10.0 // indirect github.com/domodwyer/mailyak/v3 v3.6.0 // indirect github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3 // indirect github.com/dop251/goja_nodejs v0.0.0-20230602164024-804a84515562 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/fatih/color v1.15.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/ganigeorgiev/fexpr v0.3.0 // indirect + github.com/go-errors/errors v1.4.2 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect github.com/google/wire v0.5.0 // indirect github.com/googleapis/gax-go/v2 v2.10.0 // indirect + github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/labstack/echo/v5 v5.0.0-20220201181537-ed2888cfa198 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-sqlite3 v1.14.17 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect + github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/xlab/treeprint v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect + go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect gocloud.dev v0.29.0 // indirect golang.org/x/crypto v0.9.0 // indirect golang.org/x/image v0.7.0 // indirect @@ -96,6 +113,10 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/grpc v1.55.0 // indirect google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/kube-openapi v0.0.0-20230109183929-3758b55a6596 // indirect lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect @@ -106,4 +127,9 @@ require ( modernc.org/sqlite v1.23.0 // indirect modernc.org/strutil v1.1.3 // indirect modernc.org/token v1.1.0 // indirect + sigs.k8s.io/kustomize/api v0.13.4 // indirect + sigs.k8s.io/kustomize/cmd/config v0.11.2 // indirect + sigs.k8s.io/kustomize/kustomize/v5 v5.0.3 // indirect + sigs.k8s.io/kustomize/kyaml v0.14.2 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/momentum-backend/go.sum b/momentum-backend/go.sum index 44cc715..32771c8 100644 --- a/momentum-backend/go.sum +++ b/momentum-backend/go.sum @@ -897,6 +897,7 @@ github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= @@ -939,6 +940,8 @@ github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +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= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -972,12 +975,16 @@ github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+ github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= @@ -997,6 +1004,7 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +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-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= @@ -1119,6 +1127,7 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -1145,6 +1154,7 @@ github.com/google/go-replayers/httpreplay v1.1.1 h1:H91sIMlt1NZzN7R+/ASswyouLJfW github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= @@ -1178,6 +1188,8 @@ github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9S github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1315,6 +1327,7 @@ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -1382,6 +1395,7 @@ github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52Cu github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 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= @@ -1455,6 +1469,7 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= @@ -1542,6 +1557,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= @@ -1880,6 +1897,7 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= @@ -1973,6 +1991,8 @@ go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg go.opentelemetry.io/proto/otlp v0.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -2280,6 +2300,7 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2841,6 +2862,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2941,6 +2963,8 @@ k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2R k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/kube-openapi v0.0.0-20230109183929-3758b55a6596 h1:8cNCQs+WqqnSpZ7y0LMQPKD+RZUHU17VqLPMW3qxnxc= +k8s.io/kube-openapi v0.0.0-20230109183929-3758b55a6596/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -2984,6 +3008,14 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyz sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.13.4 h1:E38Hfx0G9R9v7vRgKshviPotJQETG0S2gD3JdHLCAsI= +sigs.k8s.io/kustomize/api v0.13.4/go.mod h1:Bkaavz5RKK6ZzP0zgPrB7QbpbBJKiHuD3BB0KujY7Ls= +sigs.k8s.io/kustomize/cmd/config v0.11.2 h1:YyoHHbxxsLUts/gWLGgIQkdT82ekp3zautbpcml54vc= +sigs.k8s.io/kustomize/cmd/config v0.11.2/go.mod h1:PCpHxyu10daTnbMfn3xhH1vppn7L8jsS3qpRKXb7Lkc= +sigs.k8s.io/kustomize/kustomize/v5 v5.0.3 h1:3krCsUOkGhECi/uP8eZ2e6nR9i/ht+5xIdXeg12Pso4= +sigs.k8s.io/kustomize/kustomize/v5 v5.0.3/go.mod h1:FuozO28O7PGQkoO8kFLKylg1rlfFkJj0J1CyAUcBdk4= +sigs.k8s.io/kustomize/kyaml v0.14.2 h1:9WSwztbzwGszG1bZTziQUmVMrJccnyrLb5ZMKpJGvXw= +sigs.k8s.io/kustomize/kyaml v0.14.2/go.mod h1:AN1/IpawKilWD7V+YvQwRGUvuUOOWpjsHu6uHwonSF4= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= @@ -2992,4 +3024,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZa sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/momentum-backend/kustomize-client/kustomization-validation-service.go b/momentum-backend/kustomize-client/kustomization-validation-service.go new file mode 100644 index 0000000..3484be7 --- /dev/null +++ b/momentum-backend/kustomize-client/kustomization-validation-service.go @@ -0,0 +1,101 @@ +package kustomizeclient + +import ( + "errors" + "fmt" + config "momentum/momentum-core/momentum-config" + services "momentum/momentum-core/momentum-services" + utils "momentum/momentum-core/momentum-utils" + + "github.com/pocketbase/pocketbase/models" + "github.com/spf13/cobra" + kustomize "sigs.k8s.io/kustomize/kustomize/v5/commands" +) + +const KUSTOMIZE_BUILD_COMMAND_NAME = "build" + +type KustomizationValidationService struct { + config *config.MomentumConfig + repositoryService *services.RepositoryService +} + +func (kustomizationService *KustomizationValidationService) Validate(repo *models.Record) bool { + + if repo.Collection().Name != config.TABLE_REPOSITORIES_NAME { + fmt.Println("cannot validate non repositories collection record") + return false + } + + repoName := repo.GetString(config.TABLE_REPOSITORIES_FIELD_NAME) + path := utils.BuildPath(kustomizationService.config.ValidationTmpDir(), repoName) + src := utils.BuildPath(kustomizationService.config.DataDir(), repoName) + + err := kustomizationService.prepareValidation(path, src) + if err != nil { + fmt.Println("error while validating kustomize structure:", err.Error()) + kustomizationService.validationCleanup(path) + return false + } + err = kustomizationService.check(path) + if err != nil { + fmt.Println("error while validating kustomize structure:", err.Error()) + kustomizationService.validationCleanup(path) + return false + } + + success := kustomizationService.checkSuccessful(path) + + err = kustomizationService.validationCleanup(path) + if err != nil { + fmt.Println("error while validating kustomize structure:", err.Error()) + } + + return success +} + +func (kustomizationService *KustomizationValidationService) prepareValidation(path string, src string) error { + + _, err := utils.DirCopy(src, path) + return err +} + +func (kustomizationService *KustomizationValidationService) check(path string) error { + + var buildCmd *cobra.Command = nil + for _, cmd := range kustomize.NewDefaultCommand().Commands() { + if cmd.Name() == KUSTOMIZE_BUILD_COMMAND_NAME { + buildCmd = cmd + break + } + } + + if buildCmd == nil { + return errors.New("build command was not found") + } + + // TODO: FIND OUT HOW TO SET PATH HERE??? + buildCmd.Args = kustomizationService.kustomizeBuildArgs + + err := buildCmd.Execute() + + return err +} + +func (kustomizationService *KustomizationValidationService) checkSuccessful(path string) bool { + + return true +} + +func (kustomizationService *KustomizationValidationService) validationCleanup(path string) error { + + err := utils.DirDelete(path) + if err != nil { + return err + } + return nil +} + +func (kustomizationService *KustomizationValidationService) kustomizeBuildArgs(cmd *cobra.Command, args []string) error { + + return nil +} diff --git a/momentum-backend/momentum-core/momentum-config/config.go b/momentum-backend/momentum-core/momentum-config/config.go index 42e7ff0..435ca7a 100644 --- a/momentum-backend/momentum-core/momentum-config/config.go +++ b/momentum-backend/momentum-core/momentum-config/config.go @@ -6,13 +6,18 @@ import ( ) type MomentumConfig struct { - dataDir string + dataDir string + validationTmpDir string } func (m *MomentumConfig) DataDir() string { return m.dataDir } +func (m *MomentumConfig) ValidationTmpDir() string { + return m.validationTmpDir +} + func InitializeMomentumCore() (*MomentumConfig, error) { usrHome, err := os.UserHomeDir() @@ -22,16 +27,24 @@ func InitializeMomentumCore() (*MomentumConfig, error) { momentumDir := utils.BuildPath(usrHome, ".momentum") dataDir := utils.BuildPath(momentumDir, "data") + validationTmpDir := utils.BuildPath(momentumDir, "validation") - if !utils.FileExists(dataDir) { - if !utils.FileExists(momentumDir) { - utils.DirCreate(momentumDir) - } - utils.DirCreate(dataDir) - } + createPathIfNotPresent(dataDir, momentumDir) + createPathIfNotPresent(validationTmpDir, momentumDir) config := new(MomentumConfig) config.dataDir = dataDir + config.validationTmpDir = validationTmpDir return config, err } + +func createPathIfNotPresent(path string, momentumDir string) { + + if !utils.FileExists(path) { + if !utils.FileExists(momentumDir) { + utils.DirCreate(momentumDir) + } + utils.DirCreate(path) + } +} From 91549a0c90a4dab61edfabbe14849dd1b6177a69 Mon Sep 17 00:00:00 2001 From: Joel-Haeberli Date: Mon, 19 Jun 2023 10:53:23 +0200 Subject: [PATCH 2/2] add kustomization validation service --- .../kustomization-validation-service.go | 84 ++++++++----------- .../repository-controller.go | 18 +++- .../momentum-core/momentum-dispatcher.go | 16 +++- .../momentum-utils/filehandler.go | 7 +- 4 files changed, 70 insertions(+), 55 deletions(-) diff --git a/momentum-backend/kustomize-client/kustomization-validation-service.go b/momentum-backend/kustomize-client/kustomization-validation-service.go index 3484be7..a7135af 100644 --- a/momentum-backend/kustomize-client/kustomization-validation-service.go +++ b/momentum-backend/kustomize-client/kustomization-validation-service.go @@ -1,56 +1,65 @@ package kustomizeclient import ( - "errors" "fmt" config "momentum/momentum-core/momentum-config" services "momentum/momentum-core/momentum-services" + tree "momentum/momentum-core/momentum-tree" utils "momentum/momentum-core/momentum-utils" - "github.com/pocketbase/pocketbase/models" - "github.com/spf13/cobra" - kustomize "sigs.k8s.io/kustomize/kustomize/v5/commands" + "sigs.k8s.io/kustomize/api/krusty" + "sigs.k8s.io/kustomize/kyaml/filesys" ) -const KUSTOMIZE_BUILD_COMMAND_NAME = "build" - type KustomizationValidationService struct { config *config.MomentumConfig repositoryService *services.RepositoryService } -func (kustomizationService *KustomizationValidationService) Validate(repo *models.Record) bool { +func NewKustomizationValidationService(config *config.MomentumConfig, repositoryService *services.RepositoryService) *KustomizationValidationService { - if repo.Collection().Name != config.TABLE_REPOSITORIES_NAME { - fmt.Println("cannot validate non repositories collection record") - return false - } + validator := new(KustomizationValidationService) + + validator.config = config + validator.repositoryService = repositoryService + + return validator +} + +func (kustomizationService *KustomizationValidationService) Validate(repoName string) (bool, error) { - repoName := repo.GetString(config.TABLE_REPOSITORIES_FIELD_NAME) path := utils.BuildPath(kustomizationService.config.ValidationTmpDir(), repoName) src := utils.BuildPath(kustomizationService.config.DataDir(), repoName) err := kustomizationService.prepareValidation(path, src) if err != nil { - fmt.Println("error while validating kustomize structure:", err.Error()) + fmt.Println("error while validating kustomize structure (prepare):", err.Error()) kustomizationService.validationCleanup(path) - return false + return false, err } - err = kustomizationService.check(path) + + repoTree, err := tree.Parse(path, []string{".git"}) if err != nil { - fmt.Println("error while validating kustomize structure:", err.Error()) - kustomizationService.validationCleanup(path) - return false + fmt.Println("failed parsing validation directory") + return false, err } - success := kustomizationService.checkSuccessful(path) + for _, app := range repoTree.Apps() { + err = kustomizationService.check(app.FullPath()) + if err != nil { + fmt.Println("error while validating kustomize structure (check):", err.Error()) + kustomizationService.validationCleanup(path) + return false, err + } + } err = kustomizationService.validationCleanup(path) if err != nil { - fmt.Println("error while validating kustomize structure:", err.Error()) + fmt.Println("error while validating kustomize structure (cleanup):", err.Error()) + return false, err } - return success + return true, nil } func (kustomizationService *KustomizationValidationService) prepareValidation(path string, src string) error { @@ -61,29 +70,15 @@ func (kustomizationService *KustomizationValidationService) prepareValidation(pa func (kustomizationService *KustomizationValidationService) check(path string) error { - var buildCmd *cobra.Command = nil - for _, cmd := range kustomize.NewDefaultCommand().Commands() { - if cmd.Name() == KUSTOMIZE_BUILD_COMMAND_NAME { - buildCmd = cmd - break - } - } - - if buildCmd == nil { - return errors.New("build command was not found") - } + fs := filesys.MakeFsOnDisk() - // TODO: FIND OUT HOW TO SET PATH HERE??? - buildCmd.Args = kustomizationService.kustomizeBuildArgs + kustomizer := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) - err := buildCmd.Execute() - - return err -} - -func (kustomizationService *KustomizationValidationService) checkSuccessful(path string) bool { - - return true + _, err := kustomizer.Run(fs, path) + if err != nil { + return err + } + return nil } func (kustomizationService *KustomizationValidationService) validationCleanup(path string) error { @@ -94,8 +89,3 @@ func (kustomizationService *KustomizationValidationService) validationCleanup(pa } return nil } - -func (kustomizationService *KustomizationValidationService) kustomizeBuildArgs(cmd *cobra.Command, args []string) error { - - return nil -} diff --git a/momentum-backend/momentum-core/momentum-controllers/repository-controller.go b/momentum-backend/momentum-core/momentum-controllers/repository-controller.go index 6988ea9..b3c9fee 100644 --- a/momentum-backend/momentum-core/momentum-controllers/repository-controller.go +++ b/momentum-backend/momentum-core/momentum-controllers/repository-controller.go @@ -1,10 +1,12 @@ package momentumcontrollers import ( + "errors" "fmt" "strings" gitclient "momentum/git-client" + kustomizeclient "momentum/kustomize-client" config "momentum/momentum-core/momentum-config" services "momentum/momentum-core/momentum-services" tree "momentum/momentum-core/momentum-tree" @@ -24,15 +26,21 @@ type RepositoryController struct { repositoryService *services.RepositoryService deploymentService *services.DeploymentService repositoryAddedEventChannel chan *RepositoryAddedEvent + kustomizeValidation *kustomizeclient.KustomizationValidationService } -func NewRepositoryController(repoService *services.RepositoryService, deploymentService *services.DeploymentService, repositoryAddedEventChannel chan *RepositoryAddedEvent) *RepositoryController { +func NewRepositoryController( + repoService *services.RepositoryService, + deploymentService *services.DeploymentService, + repositoryAddedEventChannel chan *RepositoryAddedEvent, + kustomizeValidator *kustomizeclient.KustomizationValidationService) *RepositoryController { repoController := new(RepositoryController) repoController.repositoryService = repoService repoController.deploymentService = deploymentService repoController.repositoryAddedEventChannel = repositoryAddedEventChannel + repoController.kustomizeValidation = kustomizeValidator return repoController } @@ -56,6 +64,14 @@ func (rc *RepositoryController) AddRepository(record *models.Record, conf *confi return err } + validationSuccessful, err := rc.kustomizeValidation.Validate(repoName) + if !validationSuccessful { + if err != nil { + return err + } + return errors.New("the repository could not be validated with kustomize") + } + repo, err := tree.Parse(path, []string{".git"}) if err != nil { return err diff --git a/momentum-backend/momentum-core/momentum-dispatcher.go b/momentum-backend/momentum-core/momentum-dispatcher.go index 5ccae75..6d73d4b 100644 --- a/momentum-backend/momentum-core/momentum-dispatcher.go +++ b/momentum-backend/momentum-core/momentum-dispatcher.go @@ -1,8 +1,10 @@ package momentumcore import ( + "errors" "fmt" + kustomizeclient "momentum/kustomize-client" conf "momentum/momentum-core/momentum-config" controllers "momentum/momentum-core/momentum-controllers" services "momentum/momentum-core/momentum-services" @@ -31,6 +33,8 @@ type MomentumDispatcher struct { ApplicationsController *controllers.ApplicationController StagesController *controllers.StageController DeploymentController *controllers.DeploymentController + + kustomizeValidator *kustomizeclient.KustomizationValidationService } func NewDispatcher(config *conf.MomentumConfig, pb *pocketbase.PocketBase) *MomentumDispatcher { @@ -45,7 +49,9 @@ func NewDispatcher(config *conf.MomentumConfig, pb *pocketbase.PocketBase) *Mome appService := services.NewApplicationService(pb.Dao(), stageService) repoService := services.NewRepositoryService(pb.Dao(), appService) - dispatcher.RepositoryController = controllers.NewRepositoryController(repoService, deploymentService, REPOSITORY_ADDED_EVENT_CHANNEL) + dispatcher.kustomizeValidator = kustomizeclient.NewKustomizationValidationService(dispatcher.Config, repoService) + + dispatcher.RepositoryController = controllers.NewRepositoryController(repoService, deploymentService, REPOSITORY_ADDED_EVENT_CHANNEL, dispatcher.kustomizeValidator) dispatcher.ApplicationsController = controllers.NewApplicationController(appService, repoService) dispatcher.StagesController = controllers.NewStageController(stageService) dispatcher.DeploymentController = controllers.NewDeploymentController(deploymentService, repoService) @@ -146,6 +152,14 @@ func (d *MomentumDispatcher) setupRepositoryAddedEventChannelObserver() { return err } + validationSuccessful, err := d.kustomizeValidator.Validate(event.RepositoryName) + if !validationSuccessful { + if err != nil { + return nil + } + return errors.New("validation failed for repository on repository added event") + } + return nil }) } diff --git a/momentum-backend/momentum-core/momentum-utils/filehandler.go b/momentum-backend/momentum-core/momentum-utils/filehandler.go index d93f178..3dee930 100644 --- a/momentum-backend/momentum-core/momentum-utils/filehandler.go +++ b/momentum-backend/momentum-core/momentum-utils/filehandler.go @@ -52,12 +52,7 @@ func FileCopy(from string, to string) bool { func DirCopy(from string, to string) (string, error) { if !IsDirectory(from) || FileExists(to) { - return to, errors.New("From-Path must be directory and To-Path must be non existent.") - } - - err := DirCreate(to) - if err != nil { - return to, err + return to, errors.New("from path must be directory and to path must be non existent") } return to, dirCopyRecursive(from, to, "")