diff --git a/cmd/pluginator/Makefile b/cmd/pluginator/Makefile new file mode 100644 index 000000000..2804481c1 --- /dev/null +++ b/cmd/pluginator/Makefile @@ -0,0 +1,30 @@ +.PHONY: statik test all clean generate run + +FUNC_WRAPPER_SRC_DIR = funcwrappersrc +FUNC_WRAPPER_DST_DIR = funcwrapper + +all: test build + +statik: + go get github.com/rakyll/statik + +test: generate + go test ./... + +generate: statik + ( \ + cd internal/krmfunction; \ + statik -src=$(FUNC_WRAPPER_SRC_DIR) -f -p $(FUNC_WRAPPER_DST_DIR) -include=main.go,go.mod.src \ + ) + +build: generate + go build -o pluginator main.go + +install: generate + go install . + +run: generate + go run . $(ARGS) + +clean: + rm -f pluginator diff --git a/cmd/pluginator/go.mod b/cmd/pluginator/go.mod index 9149e6043..a667a9e24 100644 --- a/cmd/pluginator/go.mod +++ b/cmd/pluginator/go.mod @@ -2,6 +2,15 @@ module sigs.k8s.io/kustomize/cmd/pluginator/v2 go 1.14 -require sigs.k8s.io/kustomize/api v0.6.5 +require ( + github.com/rakyll/statik v0.1.7 + github.com/spf13/cobra v1.0.0 + github.com/stretchr/testify v1.4.0 + sigs.k8s.io/kustomize/api v0.6.5 + sigs.k8s.io/kustomize/kyaml v0.9.4 + sigs.k8s.io/yaml v1.2.0 +) replace sigs.k8s.io/kustomize/api v0.6.5 => ../../api + +replace sigs.k8s.io/kustomize/kyaml v0.9.4 => ../../kyaml diff --git a/cmd/pluginator/go.sum b/cmd/pluginator/go.sum index e3cd7a391..e95954f2c 100644 --- a/cmd/pluginator/go.sum +++ b/cmd/pluginator/go.sum @@ -32,6 +32,7 @@ github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -59,10 +60,13 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/dustmop/soup v1.1.2-0.20190516214245-38228baa104e/go.mod h1:CgNC6SGbT+Xb8wGGvzilttZL1mc5sQ/5KkcxsZttMIk= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -144,6 +148,7 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJA github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -153,6 +158,7 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= @@ -172,16 +178,20 @@ github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg 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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/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= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -190,19 +200,27 @@ github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:Fecb github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= +github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -238,16 +256,21 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +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/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -257,8 +280,10 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96d github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/paulmach/orb v0.1.3/go.mod h1:VFlX/8C+IQ1p6FTRRKzKoOPJnvEtA5G0Veuqwbu//Vk= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= @@ -279,14 +304,18 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d h1:K6eOUihrFLdZjZnA4XlRp864fmWXv9YTIk7VPLhRacA= github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d/go.mod h1:7DPO4domFU579Ga6E61sB9VFNaniPVwJP5C4bBCu3wA= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= @@ -302,6 +331,7 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -312,6 +342,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -324,6 +355,7 @@ github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiff 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/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok= github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= @@ -334,8 +366,10 @@ github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOV github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yujunz/go-getter v1.4.1-lite h1:FhvNc94AXMZkfqUwfMKhnQEC9phkphSGdPTL7tIdhOM= github.com/yujunz/go-getter v1.4.1-lite/go.mod h1:sbmqxXjyLunH1PkF3n7zSlnVeMvmYUuIl9ZVs/7NyCc= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -343,6 +377,7 @@ go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= +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.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -408,6 +443,7 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c h1:Vco5b+cuG5NNfORVxZy6bYZQ7rsigisU1WQFkvQ0L5E= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -455,9 +491,12 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -472,20 +511,23 @@ gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.17.0 h1:H9d/lw+VkZKEVIUc8F3wgiQ+FUXTTr21M87jXLU7yqM= k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= +k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo= k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/client-go v0.17.0 h1:8QOGvUGdqDMFrm9sD6IUFl256BcffynGoe80sxgTEDg= k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= -sigs.k8s.io/kustomize/kyaml v0.9.4 h1:DDuzZtjIzFqp2IPy4DTyCI69Cl3bDgcJODjI6sjF9NY= -sigs.k8s.io/kustomize/kyaml v0.9.4/go.mod h1:UTm64bSWVdBUA8EQoYCxVOaBQxUdIOr5LKWxA4GNbkw= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/cmd/pluginator/internal/builtinplugin/builtinplugin.go b/cmd/pluginator/internal/builtinplugin/builtinplugin.go new file mode 100644 index 000000000..db2ae7e63 --- /dev/null +++ b/cmd/pluginator/internal/builtinplugin/builtinplugin.go @@ -0,0 +1,176 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinplugin + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "strings" + + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/provenance" +) + +//go:generate stringer -type=pluginType +type pluginType int + +const packageForGeneratedCode = "builtins" + +const ( + unknown pluginType = iota + Transformer + Generator +) + +// ConvertToBuiltInPlugin converts the input plugin file to +// kustomize builtin plugin and writes it to proper directory +func ConvertToBuiltInPlugin() error { + root, err := inputFileRoot() + if err != nil { + return err + } + file, err := os.Open(root + ".go") + if err != nil { + return err + } + defer file.Close() + scanner := bufio.NewScanner(file) + err = readToPackageMain(scanner, file.Name()) + if err != nil { + return err + } + + w, err := newWriter(root) + if err != nil { + return err + } + defer w.close() + + // This particular phrasing is required. + w.write( + fmt.Sprintf( + "// Code generated by pluginator on %s; DO NOT EDIT.", + root)) + w.write( + fmt.Sprintf( + "// pluginator %s\n", provenance.GetProvenance().Short())) + w.write("\n") + w.write("package " + packageForGeneratedCode) + + pType := unknown + + for scanner.Scan() { + l := scanner.Text() + if strings.HasPrefix(l, "//go:generate") { + continue + } + if strings.HasPrefix(l, "//noinspection") { + continue + } + if l == "var "+konfig.PluginSymbol+" plugin" { + continue + } + if strings.Contains(l, " Transform(") { + if pType != unknown { + return fmt.Errorf("unexpected Transform(") + } + pType = Transformer + } else if strings.Contains(l, " Generate(") { + if pType != unknown { + return fmt.Errorf("unexpected Generate(") + } + pType = Generator + } + w.write(l) + } + if err := scanner.Err(); err != nil { + return err + } + w.write("") + w.write("func New" + root + "Plugin() resmap." + pType.String() + "Plugin {") + w.write(" return &" + root + "Plugin{}") + w.write("}") + + return nil +} + +func inputFileRoot() (string, error) { + n := os.Getenv("GOFILE") + if !strings.HasSuffix(n, ".go") { + return "", fmt.Errorf("%+v, expecting .go suffix on %s", provenance.GetProvenance(), n) + } + return n[:len(n)-len(".go")], nil +} + +func readToPackageMain(s *bufio.Scanner, f string) error { + gotMain := false + for !gotMain && s.Scan() { + gotMain = strings.HasPrefix(s.Text(), "package main") + } + if !gotMain { + return fmt.Errorf("%s missing package main", f) + } + return nil +} + +type writer struct { + root string + f *os.File +} + +func newWriter(r string) (*writer, error) { + n := makeOutputFileName(r) + f, err := os.Create(n) + if err != nil { + return nil, fmt.Errorf("unable to create `%s`; %v", n, err) + } + return &writer{root: r, f: f}, nil +} + +// Assume that this command is running with a $PWD of +// $HOME/kustomize/plugin/builtin/secretGenerator +// (for example). Then we want to write to +// $HOME/kustomize/api/builtins +func makeOutputFileName(root string) string { + return filepath.Join( + "..", "..", "..", "api", packageForGeneratedCode, root+".go") +} + +func (w *writer) close() { + // Do this for debugging. + // fmt.Println("Generated " + makeOutputFileName(w.root)) + w.f.Close() +} + +func (w *writer) write(line string) { + _, err := w.f.WriteString(w.filter(line) + "\n") + if err != nil { + fmt.Printf("Trouble writing: %s", line) + fmt.Printf("Error: %s", err) + os.Exit(1) + } +} + +func (w *writer) filter(in string) string { + if ok, newer := w.replace(in, "type plugin struct"); ok { + return newer + } + if ok, newer := w.replace(in, "*plugin)"); ok { + return newer + } + return in +} + +// replace 'plugin' with 'FooPlugin' in context +// sensitive manner. +func (w *writer) replace(in, target string) (bool, string) { + if !strings.Contains(in, target) { + return false, "" + } + newer := strings.Replace( + target, "plugin", w.root+"Plugin", 1) + return true, strings.Replace(in, target, newer, 1) +} diff --git a/cmd/pluginator/plugintype_string.go b/cmd/pluginator/internal/builtinplugin/plugintype_string.go similarity index 96% rename from cmd/pluginator/plugintype_string.go rename to cmd/pluginator/internal/builtinplugin/plugintype_string.go index e65fb5af8..394cae0dc 100644 --- a/cmd/pluginator/plugintype_string.go +++ b/cmd/pluginator/internal/builtinplugin/plugintype_string.go @@ -1,6 +1,6 @@ // Code generated by "stringer -type=pluginType"; DO NOT EDIT. -package main +package builtinplugin import "strconv" diff --git a/cmd/pluginator/internal/krmfunction/cmd.go b/cmd/pluginator/internal/krmfunction/cmd.go new file mode 100644 index 000000000..6c65b280f --- /dev/null +++ b/cmd/pluginator/internal/krmfunction/cmd.go @@ -0,0 +1,30 @@ +package krmfunction + +import ( + "github.com/spf13/cobra" +) + +// NewKrmFunctionCmd returns a pointer to a command +func NewKrmFunctionCmd() *cobra.Command { + var outputDir string + var inputFile string + + cmd := &cobra.Command{ + Use: "krm -i FILE -o DIR", + Short: "Convert the plugin to KRM function instead of builtin function", + RunE: func(cmd *cobra.Command, args []string) error { + c := NewConverter(outputDir, inputFile) + return c.Convert() + }, + } + + cmd.Flags().StringVarP(&outputDir, "output", "o", "", + "Path to the directory which will contain the KRM function") + cmd.Flags().StringVarP(&inputFile, "input", "i", "", + "Path to the input file") + + cmd.MarkFlagRequired("output") + cmd.MarkFlagRequired("input") + + return cmd +} diff --git a/cmd/pluginator/internal/krmfunction/converter.go b/cmd/pluginator/internal/krmfunction/converter.go new file mode 100644 index 000000000..4798e92d8 --- /dev/null +++ b/cmd/pluginator/internal/krmfunction/converter.go @@ -0,0 +1,165 @@ +package krmfunction + +import ( + "bufio" + "bytes" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/rakyll/statik/fs" + // load embedded func wrapper + _ "sigs.k8s.io/kustomize/cmd/pluginator/v2/internal/krmfunction/funcwrapper" +) + +// Converter is a converter to convert the +// plugin file to KRM function +type Converter struct { + // Path to the output directory + outputDir string + // Path to the input file + inputFile string + wrapperFileName string + pluginFileName string + goModFileName string + dockerFileName string +} + +// NewConverter return a pointer to a new converter +func NewConverter(outputDir, inputFile string) *Converter { + return &Converter{ + outputDir: outputDir, + inputFile: inputFile, + wrapperFileName: "main.go", + pluginFileName: "plugin.go", + goModFileName: "go.mod", + dockerFileName: "Dockerfile", + } +} + +// Convert converts the input file to a executable +// KRM function and writes to destination directory +func (c *Converter) Convert() error { + // read and process executable wrapper + wrapper, err := c.readEmbeddedFile(c.wrapperFileName) + if err != nil { + return err + } + wrapper = c.prepareWrapper(wrapper) + + if !strings.HasSuffix(c.inputFile, ".go") { + return fmt.Errorf("input file %s is not a Go file", c.inputFile) + } + + // read and process plugin code + pluginCode, err := c.readDiskFile(c.inputFile) + if err != nil { + return err + } + _, c.pluginFileName = filepath.Split(c.inputFile) + + // go.mod file + goMod, err := c.readEmbeddedFile(c.goModFileName + ".src") + if err != nil { + return err + } + + // prepare destination directory + err = c.mkDstDir() + if err != nil { + return err + } + + // write + return c.write(map[string]string{ + c.wrapperFileName: wrapper, + c.pluginFileName: pluginCode, + c.goModFileName: goMod, + c.dockerFileName: c.getDockerfile(), + }) +} + +func (c *Converter) getDockerfile() string { + return `FROM golang:1.13-stretch +ENV CGO_ENABLED=0 +WORKDIR /go/src/ +COPY . . +RUN go build -v -o /usr/local/bin/function ./ +FROM alpine:latest +COPY --from=0 /usr/local/bin/function /usr/local/bin/function +CMD ["function"] +` +} + +func (c *Converter) prepareWrapper(content string) string { + b := bytes.NewBufferString(content) + o := &bytes.Buffer{} + scanner := bufio.NewScanner(b) + for scanner.Scan() { + line := scanner.Text() + // Set the package name to main + if strings.TrimSpace(line) == "package funcwrappersrc" { + line = "package main" + } + // assign to plugin variable + if strings.TrimSpace(line) == "var plugin resmap.Configurable" { + line = line + ` + // KustomizePlugin is a global variable defined in every plugin + plugin = &KustomizePlugin +` + } + o.WriteString(line + "\n") + } + return o.String() +} + +// readEmbeddedFile read the file from embedded files with filename +// name. Return the file content if it's successful. +func (c *Converter) readEmbeddedFile(name string) (string, error) { + statikFS, err := fs.New() + if err != nil { + return "", err + } + r, err := statikFS.Open("/" + name) + if err != nil { + return "", err + } + defer r.Close() + contents, err := ioutil.ReadAll(r) + if err != nil { + return "", err + } + + return string(contents), nil +} + +func (c *Converter) readDiskFile(path string) (string, error) { + f, err := ioutil.ReadFile(path) + if err != nil { + return "", err + } + return string(f), nil +} + +func (c *Converter) mkDstDir() error { + p := c.outputDir + f, err := os.Open(p) + if err == nil || f != nil { + return fmt.Errorf("directory %s has already existed", p) + } + + return os.MkdirAll(p, 0755) +} + +func (c *Converter) write(m map[string]string) error { + for k, v := range m { + p := filepath.Join(c.outputDir, k) + err := ioutil.WriteFile(p, []byte(v), 0644) + if err != nil { + return err + } + } + return nil +} diff --git a/cmd/pluginator/internal/krmfunction/converter_test.go b/cmd/pluginator/internal/krmfunction/converter_test.go new file mode 100644 index 000000000..efb4c87e5 --- /dev/null +++ b/cmd/pluginator/internal/krmfunction/converter_test.go @@ -0,0 +1,234 @@ +package krmfunction + +import ( + "bytes" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func makeTempDir(t *testing.T) string { + s, err := ioutil.TempDir("", "pluginator-*") + assert.NoError(t, err) + return s +} + +func getTransformerCode() []byte { + // a simple namespace transformer + return []byte(` +package main + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/yaml" + "sigs.k8s.io/kustomize/api/filters/namespace" + "sigs.k8s.io/kustomize/kyaml/filtersutil" + "sigs.k8s.io/kustomize/api/types" +) + +type plugin struct{ + Namespace string ` + "`json:\"namespace,omitempty\" yaml:\"namespace,omitempty\"`" + ` + FieldSpecs []types.FieldSpec ` + "`json:\"fieldSpecs,omitempty\" yaml:\"fieldSpecs,omitempty\"`" + ` +} + +//noinspection GoUnusedGlobalVariable +var KustomizePlugin plugin + +func (p *plugin) Config( + _ *resmap.PluginHelpers, config []byte) (err error) { + return yaml.Unmarshal(config, p) +} + +func (p *plugin) Transform(rm resmap.ResMap) error { + if len(p.Namespace) == 0 { + return nil + } + for _, r := range rm.Resources() { + if r.IsEmpty() { + // Don't mutate empty objects? + continue + } + err := filtersutil.ApplyToJSON(namespace.Filter{ + Namespace: p.Namespace, + FsSlice: p.FieldSpecs, + }, r) + if err != nil { + return err + } + matches := rm.GetMatchingResourcesByCurrentId(r.CurId().Equals) + if len(matches) != 1 { + return fmt.Errorf( + "namespace transformation produces ID conflict: %+v", matches) + } + } + return nil +} +`) +} + +func getTransformerInputResource() []byte { + return []byte(` +apiVersion: config.kubernetes.io/v1beta1 +kind: ResourceList +functionConfig: + apiVersion: foo-corp.com/v1 + kind: FulfillmentCenter + metadata: + name: staging + metadata: + annotations: + config.kubernetes.io/function: | + container: + image: gcr.io/example/foo:v1.0.0 + namespace: foo + fieldSpecs: + - path: metadata/namespace + create: true +items: + - apiVersion: apps/v1 + kind: foobar + metadata: + name: whatever +`) +} + +func runKrmFunction(t *testing.T, input []byte, dir string) []byte { + cmd := exec.Command("go", "run", ".") + ib := bytes.NewReader(input) + cmd.Stdin = ib + ob := bytes.NewBuffer([]byte{}) + cmd.Stdout = ob + eb := bytes.NewBuffer([]byte{}) + cmd.Stderr = eb + cmd.Dir = dir + err := cmd.Run() + assert.NoErrorf(t, err, "Stdout:\n%s\nStderr:\n%s\n", ob.String(), eb.String()) + return ob.Bytes() +} + +func TestTransformerConverter(t *testing.T) { + dir := makeTempDir(t) + defer os.RemoveAll(dir) + + ioutil.WriteFile(filepath.Join(dir, "Plugin.go"), + getTransformerCode(), 0644) + + c := NewConverter(filepath.Join(dir, "output"), + filepath.Join(dir, "Plugin.go")) + + err := c.Convert() + assert.NoError(t, err) + + output := runKrmFunction(t, getTransformerInputResource(), filepath.Join(dir, "output")) + assert.Equal(t, `apiVersion: config.kubernetes.io/v1beta1 +kind: ResourceList +items: +- {"apiVersion": "apps/v1", "kind": "foobar", "metadata": {"name": "whatever", "namespace": "foo"}} +functionConfig: + apiVersion: foo-corp.com/v1 + kind: FulfillmentCenter + metadata: + name: staging + metadata: + annotations: + config.kubernetes.io/function: | + container: + image: gcr.io/example/foo:v1.0.0 + namespace: foo + fieldSpecs: + - path: metadata/namespace + create: true +`, string(output)) +} + +func getGeneratorCode() []byte { + return []byte(`package main + +import ( + "sigs.k8s.io/kustomize/api/kv" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +type plugin struct { + h *resmap.PluginHelpers + types.ObjectMeta ` + "`json:\"metadata,omitempty\" yaml:\"metadata,omitempty\"`" + ` + types.ConfigMapArgs +} + +//noinspection GoUnusedGlobalVariable +var KustomizePlugin plugin + +func (p *plugin) Config(h *resmap.PluginHelpers, config []byte) (err error) { + p.ConfigMapArgs = types.ConfigMapArgs{} + err = yaml.Unmarshal(config, p) + if p.ConfigMapArgs.Name == "" { + p.ConfigMapArgs.Name = p.Name + } + if p.ConfigMapArgs.Namespace == "" { + p.ConfigMapArgs.Namespace = p.Namespace + } + p.h = h + return +} + +func (p *plugin) Generate() (resmap.ResMap, error) { + return p.h.ResmapFactory().FromConfigMapArgs( + kv.NewLoader(p.h.Loader(), p.h.Validator()), p.ConfigMapArgs) +}`) +} + +func getGeneratorInputResource() []byte { + return []byte(` +apiVersion: config.kubernetes.io/v1beta1 +kind: ResourceList +functionConfig: + apiVersion: foo-corp.com/v1 + kind: FulfillmentCenter + metadata: + name: staging + metadata: + annotations: + config.kubernetes.io/function: | + container: + image: gcr.io/example/foo:v1.0.0 +items: [] +`) +} + +func TestGeneratorConverter(t *testing.T) { + dir := makeTempDir(t) + defer os.RemoveAll(dir) + + ioutil.WriteFile(filepath.Join(dir, "Plugin.go"), + getGeneratorCode(), 0644) + + c := NewConverter(filepath.Join(dir, "output"), + filepath.Join(dir, "Plugin.go")) + + err := c.Convert() + assert.NoError(t, err) + output := runKrmFunction(t, getGeneratorInputResource(), filepath.Join(dir, "output")) + assert.Equal(t, `apiVersion: config.kubernetes.io/v1beta1 +kind: ResourceList +items: +- {"apiVersion": "v1", "kind": "ConfigMap", "metadata": {"name": "staging"}} +functionConfig: + apiVersion: foo-corp.com/v1 + kind: FulfillmentCenter + metadata: + name: staging + metadata: + annotations: + config.kubernetes.io/function: | + container: + image: gcr.io/example/foo:v1.0.0 +`, string(output)) +} diff --git a/cmd/pluginator/internal/krmfunction/funcwrapper/statik.go b/cmd/pluginator/internal/krmfunction/funcwrapper/statik.go new file mode 100644 index 000000000..9e7bd5b82 --- /dev/null +++ b/cmd/pluginator/internal/krmfunction/funcwrapper/statik.go @@ -0,0 +1,14 @@ +// Code generated by statik. DO NOT EDIT. + +package funcwrapper + +import ( + "github.com/rakyll/statik/fs" +) + + +func init() { + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x98\xa0rQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00go.mod.srcUT\x05\x00\x01a~\xb5_\x84\xce\xc1\xae\x820\x10\x85\xe15\xf3\x14]\xde\xbb`:3T\"\x0b}\x97\x82\x15\x1b\xa8EJI\xf4\xe9\x0dq\xe5B]\x9f/9\x7f\x88\xa7<:\x15\xac\xbf\x02\xf4Q1\xb2\x01\x98\xdd-\xfb\xd9\xa9?(z\xbf\\r\x8b]\x0c:Mg\xaet\x17\xdb\xd9\xaa\x95\x91\x90\xa0H\xbeO8\xec\x13\xfa\xa8\x87\x9c\x96\x18\xfc\xc3i;y\xb5\x12\xd6h>\x89\xe1n\xc3\xb8\x99\x06\xabw\xf3\x1a\x18\x05 \xfe\xb7\x94i\xb4\x9dS\xbf\x8e\xd4\xe1\xf8\xdd\x10R)$\xc4\xcc57\"\xc4\xa5\x95\x9d\x91\xc6\xba\xaa\x15\x03\xcf\x00\x00\x00\xff\xffPK\x07\x08\xb1\xe0\xcew\x9c\x00\x00\x00\n\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x98\xa0rQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00 \x00main.goUT\x05\x00\x01a~\xb5_\x94TMo\xdb8\x10=\x93\xbfb\xd6\x87\x85\xb40$\xec-H\xe0S\x90\xec\x06m\x82 \xf5\xad\xe8\x81\xa6F\x0e!~\x08C\xaaN\x1a\xe8\xbf\x17\xd4\x87#\xa9N\x9a^\x0cx\xf4\xe6\xbd73\x9c\xc9s\xd8>*\x0f\xa5\xd2\x08\x07\xa55\xec\x10jr\x12\xbd\xc7\x02\x84-\x00\xcd\x0e\x8b\x02\x0b\x08\x0ej\xdd\xec\x95\x15\xc1Q\xc6y-d%\xf6\x08ec\xe5\x81D]#y\x92\x9c+S;\n\x90p\xb6*MXq\xb6r~\xc59[y\xb5\xf7Yu\xe63\xe5\xf2\xaa\xf1\xc1\x19\xf5\x03sQ\xab\xbc:\xf3\x05\xd6>\xaf\x1a\xeb\x035\xb2\xcbz\x1bN\xe8\x8d\xa8\x7f\x8bq\x0dI|\x1bU=\x0b\xa3\xf3\xd2\xe6% \x83\x07G\xd5\x12\x1b\x01+\x9er\x9e\xe7\xd6ie\x03\x8f\xb5\x82\x11\xca&)\xbcp\xf6]\xd0\xd0\x13\xe8=e\x97\xce\x96j\xdf\x90\xd8i\xe4\xac\x0f^\x0b\x19\x1c=\xc3\xf9\x06,\x1e\x1e\xd0\xdf\x1ecI\xca9\xeb\x19\xfeG\x1d;8\xa0\xee\xa7\xb1d\xc6\x13S\xc6\xea>+\x1fb\xc6\xdf\xc7\x1a\xb2\x87\xc9\xa7\x97\x96s&M\x11!\xaf\x88Kg\x8c\xb0E2%YwcLR@\"G\xb1\xb6\xa8q+\xeau\x8c\xc4\xfc\x99\x87\xec\xeeX\x089\xf3p\xe7\n\xfc\xa2\x95\xc4\x19gv\x13\xd0\xf8\x943\xa6\xca\x8e\xe5\xaf\x0dX\xa5;rF\x18\x1a\xb21\xcc\x19k9\x1b\xba\xd0\xf7\xef(\x1aM\x05\xe5\x86\xf0\xd6\xddO@s\xad\xeb\x19\xf2c\xa2\x9c\xb1\x88\xd8\x0c3\x1c\x86\x97\xcc\xe6\xb1\x86\xa9\xb1\x8f\xf1v\x98\xb0\x06W\xc5\x1a\x06\xf2a\x88\xd9\x96\x84\xf5\xa5#\x83\xd4W\x93^D`\xc7\xd3\xbb \xaf\x98\xa4\x1fB\x94=\xa5;\x17\xee\x94[@\xed\x11T \xfb7\x0c\xfc\x87\x16)\xee\xf0/\xf2\xd3\x89o`?\"1\xf9\x13}\xde?\x9d\xc5+\x18I{\x89l\xeb&o\xe6\xa3M\x1d\x02Vi\xce\xda\x94\x8f9\xe7\x1b\x90\xa6\xc8\xae\x9eP6\xd1\xeb\xc5\x92\xa94!\xbb'e\x83\xb6 \x12E9\xe7\xb3\xab'\x15\x92\x7fS\xceZ\xde.7\xfc\xfd\x05\x84\x7f\x86N\x8e\x0by\x0c\xcc\x92\xa2\xf6`y\xf8|\xb7\xa4\xb5J\xaf\xa1\xfbYl\xf8)G\x8b\xc3\xb1t\xd1\xcb\xf5}\x9f\\\x9c1\x14\xc5\xc7\xdc\xe3\x99\x8d\xc1O\xe3\x9f\x86\xb0\x18\x107\xa6\xd6I\x9a\x9e\xf0?R,\x94\xba*N\xd8~w\x7fK \xca\x06\xa4RH|iSH\xbe~\xdb=\x07\\\xf77(\x9d\xf4/\x1e\xe2\xecV\x90\x7f\x14:)e\x14\xfa\x19\x00\x00\xff\xffPK\x07\x08\xd7\xcf\xa4\xce}\x02\x00\x00\xba\x06\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x98\xa0rQ\xb1\xe0\xcew\x9c\x00\x00\x00\n\x01\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x81\x00\x00\x00\x00go.mod.srcUT\x05\x00\x01a~\xb5_PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x98\xa0rQ\xd7\xcf\xa4\xce}\x02\x00\x00\xba\x06\x00\x00\x07\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x81\xdd\x00\x00\x00main.goUT\x05\x00\x01a~\xb5_PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x7f\x00\x00\x00\x98\x03\x00\x00\x00\x00" + fs.Register(data) + } + \ No newline at end of file diff --git a/cmd/pluginator/internal/krmfunction/funcwrappersrc/fakeplugin.go b/cmd/pluginator/internal/krmfunction/funcwrappersrc/fakeplugin.go new file mode 100644 index 000000000..b5a5426d8 --- /dev/null +++ b/cmd/pluginator/internal/krmfunction/funcwrappersrc/fakeplugin.go @@ -0,0 +1,20 @@ +//nolint +package funcwrappersrc + +import ( + "sigs.k8s.io/kustomize/api/resmap" +) + +type plugin struct{} + +//noinspection GoUnusedGlobalVariable +var KustomizePlugin plugin + +func (p *plugin) Config( + _ *resmap.PluginHelpers, _ []byte) (err error) { + return nil +} + +func (p *plugin) Transform(_ resmap.ResMap) error { + return nil +} diff --git a/cmd/pluginator/internal/krmfunction/funcwrappersrc/go.mod.src b/cmd/pluginator/internal/krmfunction/funcwrappersrc/go.mod.src new file mode 100644 index 000000000..491dc6be4 --- /dev/null +++ b/cmd/pluginator/internal/krmfunction/funcwrappersrc/go.mod.src @@ -0,0 +1,12 @@ +module main + +go 1.14 + +require ( + github.com/spf13/cobra v1.0.0 + sigs.k8s.io/kustomize/api v0.6.4 + sigs.k8s.io/kustomize/kyaml v0.9.3 + sigs.k8s.io/yaml v1.2.0 +) + +replace sigs.k8s.io/kustomize/api v0.6.4 => sigs.k8s.io/kustomize/api v0.0.0-20201116192201-a25429ae3b24 diff --git a/cmd/pluginator/internal/krmfunction/funcwrappersrc/main.go b/cmd/pluginator/internal/krmfunction/funcwrappersrc/main.go new file mode 100644 index 000000000..d01e72cd7 --- /dev/null +++ b/cmd/pluginator/internal/krmfunction/funcwrappersrc/main.go @@ -0,0 +1,77 @@ +// This file will be processed and embedded to pluginator. + +package funcwrappersrc + +import ( + "fmt" + "os" + + "sigs.k8s.io/kustomize/api/k8sdeps/kunstruct" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/kyaml/fn/framework" + "sigs.k8s.io/yaml" +) + +//nolint +func main() { + var plugin resmap.Configurable + resmapFactory := newResMapFactory() + + pluginHelpers := newPluginHelpers(resmapFactory) + + resourceList := &framework.ResourceList{} + + cmd := framework.Command(resourceList, func() error { + resMap, err := resmapFactory.NewResMapFromRNodeSlice(resourceList.Items) + if err != nil { + return err + } + pluginConfig, err := functionConfigToPluginConfig(resourceList.FunctionConfig) + if err != nil { + return err + } + + err = plugin.Config(pluginHelpers, pluginConfig) + if err != nil { + return err + } + if t, ok := plugin.(resmap.TransformerPlugin); ok { + err = t.Transform(resMap) + if err != nil { + return err + } + } else if g, ok := plugin.(resmap.GeneratorPlugin); ok { + resMap, err = g.Generate() + if err != nil { + return err + } + } + + resourceList.Items, err = resMap.ToRNodeSlice() + if err != nil { + return err + } + return nil + }) + if err := cmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +//nolint +func newPluginHelpers(resmapFactory *resmap.Factory) *resmap.PluginHelpers { + return resmap.NewPluginHelpers(nil, nil, resmapFactory) +} + +//nolint +func newResMapFactory() *resmap.Factory { + resourceFactory := resource.NewFactory(kunstruct.NewKunstructuredFactoryImpl()) + return resmap.NewFactory(resourceFactory, nil) +} + +//nolint +func functionConfigToPluginConfig(fc interface{}) ([]byte, error) { + return yaml.Marshal(fc) +} diff --git a/cmd/pluginator/main.go b/cmd/pluginator/main.go index 4981e7b80..1bc4315ce 100644 --- a/cmd/pluginator/main.go +++ b/cmd/pluginator/main.go @@ -5,160 +5,27 @@ package main import ( - "bufio" "fmt" - "log" "os" - "path/filepath" - "strings" - "sigs.k8s.io/kustomize/api/konfig" - "sigs.k8s.io/kustomize/api/provenance" + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/cmd/pluginator/v2/internal/builtinplugin" + "sigs.k8s.io/kustomize/cmd/pluginator/v2/internal/krmfunction" ) -//go:generate stringer -type=pluginType -type pluginType int - -const ( - unknown pluginType = iota - Transformer - Generator -) - -const packageForGeneratedCode = "builtins" - func main() { - root := inputFileRoot() - file, err := os.Open(root + ".go") - if err != nil { - log.Fatal(err) + cmd := cobra.Command{ + Use: "pluginator", + Short: "pluginator is used to convert a kustomize Go plugin", + RunE: func(cmd *cobra.Command, args []string) error { + return builtinplugin.ConvertToBuiltInPlugin() + }, } - defer file.Close() - scanner := bufio.NewScanner(file) - readToPackageMain(scanner, file.Name()) - w := NewWriter(root) - defer w.close() + cmd.AddCommand(krmfunction.NewKrmFunctionCmd()) - // This particular phrasing is required. - w.write( - fmt.Sprintf( - "// Code generated by pluginator on %s; DO NOT EDIT.", - root)) - w.write( - fmt.Sprintf( - "// pluginator %s\n", provenance.GetProvenance().Short())) - w.write("\n") - w.write("package " + packageForGeneratedCode) - - pType := unknown - - for scanner.Scan() { - l := scanner.Text() - if strings.HasPrefix(l, "//go:generate") { - continue - } - if strings.HasPrefix(l, "//noinspection") { - continue - } - if l == "var "+konfig.PluginSymbol+" plugin" { - continue - } - if strings.Contains(l, " Transform(") { - if pType != unknown { - log.Fatal("unexpected Transform(") - } - pType = Transformer - } else if strings.Contains(l, " Generate(") { - if pType != unknown { - log.Fatal("unexpected Generate(") - } - pType = Generator - } - w.write(l) - } - if err := scanner.Err(); err != nil { - log.Fatal(err) - } - w.write("") - w.write("func New" + root + "Plugin() resmap." + pType.String() + "Plugin {") - w.write(" return &" + root + "Plugin{}") - w.write("}") -} - -func inputFileRoot() string { - n := os.Getenv("GOFILE") - if !strings.HasSuffix(n, ".go") { - log.Printf("%+v\n", provenance.GetProvenance()) - log.Fatalf("expecting .go suffix on %s", n) - } - return n[:len(n)-len(".go")] -} - -func readToPackageMain(s *bufio.Scanner, f string) { - gotMain := false - for !gotMain && s.Scan() { - gotMain = strings.HasPrefix(s.Text(), "package main") - } - if !gotMain { - log.Fatalf("%s missing package main", f) + if err := cmd.Execute(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } } - -type writer struct { - root string - f *os.File -} - -func NewWriter(r string) *writer { - n := makeOutputFileName(r) - f, err := os.Create(n) - if err != nil { - log.Fatalf("unable to create `%s`; %v", n, err) - } - return &writer{root: r, f: f} -} - -// Assume that this command is running with a $PWD of -// $HOME/kustomize/plugin/builtin/secretgenerator -// (for example). Then we want to write to -// $HOME/kustomize/api/builtins -func makeOutputFileName(root string) string { - return filepath.Join( - "..", "..", "..", "api", packageForGeneratedCode, root+".go") -} - -func (w *writer) close() { - // Do this for debugging. - // fmt.Println("Generated " + makeOutputFileName(w.root)) - w.f.Close() -} - -func (w *writer) write(line string) { - _, err := w.f.WriteString(w.filter(line) + "\n") - if err != nil { - log.Printf("Trouble writing: %s", line) - log.Fatal(err) - } -} - -func (w *writer) filter(in string) string { - if ok, newer := w.replace(in, "type plugin struct"); ok { - return newer - } - if ok, newer := w.replace(in, "*plugin)"); ok { - return newer - } - return in -} - -// replace 'plugin' with 'FooPlugin' in context -// sensitive manner. -func (w *writer) replace(in, target string) (bool, string) { - if !strings.Contains(in, target) { - return false, "" - } - newer := strings.Replace( - target, "plugin", w.root+"Plugin", 1) - return true, strings.Replace(in, target, newer, 1) -} diff --git a/hack/generateBuiltinKrmFunctions.sh b/hack/generateBuiltinKrmFunctions.sh new file mode 100755 index 000000000..baad8585b --- /dev/null +++ b/hack/generateBuiltinKrmFunctions.sh @@ -0,0 +1,38 @@ +#! /usr/bin/env bash + +builtinPlugins=(AnnotationsTransformer \ + ConfigMapGenerator \ + HashTransformer \ + ImageTagTransformer \ + LabelTransformer \ + LegacyOrderTransformer \ + NamespaceTransformer \ + PatchJson6902Transformer \ + PatchStrategicMergeTransformer \ + PatchTransformer \ + PrefixSuffixTransformer \ + ReplicaCountTransformer \ + SecretGenerator \ + ValueAddTransformer \ + HelmChartInflationGenerator) + +builtinPluginDir=../plugin/builtin + +if [[ -z $KRM_FUNCTION_DIR ]]; then + echo "Must specify output directory by \$KRM_FUNCTION_DIR" + exit 1 +fi + + +# Install pluginator +pushd ../cmd/pluginator +make install +popd + + +for pluginName in ${builtinPlugins[@]}; do + dirName=$(echo $pluginName | tr '[:upper:]' '[:lower:]') + srcPath="$builtinPluginDir/$dirName/$pluginName.go" + dstPath="$KRM_FUNCTION_DIR/$dirName" + pluginator krm -i $srcPath -o $dstPath +done