diff --git a/go.mod b/go.mod index a5660d7a405..ae36fae0a29 100644 --- a/go.mod +++ b/go.mod @@ -11,8 +11,8 @@ require ( github.com/kr/text v0.2.0 github.com/markbates/inflect v1.0.4 github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 - github.com/onsi/ginkgo/v2 v2.7.0 - github.com/onsi/gomega v1.24.2 + github.com/onsi/ginkgo/v2 v2.9.1 + github.com/onsi/gomega v1.27.4 github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42 github.com/operator-framework/helm-operator-plugins v0.0.12-0.20230307164205-6e30bde28688 github.com/operator-framework/java-operator-plugins v0.7.1-0.20230306190439-0eed476d2b75 @@ -29,9 +29,9 @@ require ( github.com/spf13/viper v1.10.0 github.com/stretchr/testify v1.8.1 github.com/thoas/go-funk v0.8.0 - golang.org/x/mod v0.7.0 - golang.org/x/text v0.7.0 - golang.org/x/tools v0.5.0 + golang.org/x/mod v0.9.0 + golang.org/x/text v0.8.0 + golang.org/x/tools v0.7.0 gomodules.xyz/jsonpatch/v3 v3.0.1 helm.sh/helm/v3 v3.10.3 k8s.io/api v0.26.2 @@ -47,6 +47,10 @@ require ( sigs.k8s.io/yaml v1.3.0 ) +replace sigs.k8s.io/controller-runtime => github.com/joelanford/controller-runtime v0.9.0-alpha.1.0.20230323180808-db28b048d3c7 + +replace github.com/operator-framework/operator-lib => github.com/joelanford/operator-lib v0.0.0-20230324012840-ba59012976f8 + require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/BurntSushi/toml v1.2.0 // indirect @@ -111,7 +115,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-migrate/migrate/v4 v4.6.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/gomodule/redigo v1.8.2 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.12.6 // indirect @@ -119,6 +123,7 @@ require ( github.com/google/go-cmp v0.5.9 // indirect github.com/google/go-containerregistry v0.8.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -207,11 +212,11 @@ require ( go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.1.0 // indirect - golang.org/x/net v0.7.0 // indirect + golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect golang.org/x/time v0.3.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect gomodules.xyz/orderedmap v0.1.0 // indirect @@ -226,7 +231,7 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/apiserver v0.26.2 // indirect k8s.io/component-base v0.26.2 // indirect - k8s.io/klog/v2 v2.80.1 // indirect + k8s.io/klog/v2 v2.90.1 // indirect k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect oras.land/oras-go v1.2.0 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35 // indirect diff --git a/go.sum b/go.sum index 88cae94217d..b687ae6afb1 100644 --- a/go.sum +++ b/go.sum @@ -445,8 +445,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -502,6 +503,7 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -610,8 +612,12 @@ github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joefitzgerald/rainbow-reporter v0.1.0 h1:AuMG652zjdzI0YCCnXAqATtRBpGXMcAnrajcaTrSeuo= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joelanford/controller-runtime v0.9.0-alpha.1.0.20230323180808-db28b048d3c7 h1:SvLqM99lEbTeEqu1ffy6PRurIXZTGUiZATxC+aiOiu8= +github.com/joelanford/controller-runtime v0.9.0-alpha.1.0.20230323180808-db28b048d3c7/go.mod h1:Qox07m8Gh7skSeOfppEWllPxNMhA7+b93D8Qjj6rBlQ= github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d h1:A2/B900ip/Z20TzkLeGRNy1s6J2HmH9AmGt+dHyqb4I= github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d/go.mod h1:7HQupe4vyNxMKXmM5DFuwXHsqwMyglcYmZBtlDPIcZ8= +github.com/joelanford/operator-lib v0.0.0-20230324012840-ba59012976f8 h1:w0Jr+CXjjLWc+05WGK08I0aJ42kAbm9eEQ55ACs8jgE= +github.com/joelanford/operator-lib v0.0.0-20230324012840-ba59012976f8/go.mod h1:iVtticDeVwd+VCY4dB1AEUtAPZ/AyH/GpZA1/HaG7ws= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -781,15 +787,15 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow= -github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.24.2 h1:J/tulyYK6JwBldPViHJReihxxZ+22FHs0piGjQAvoUE= -github.com/onsi/gomega v1.24.2/go.mod h1:gs3J10IS7Z7r7eXRoNJIrNqU4ToQukCJhFtKrWgHWnk= +github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -811,8 +817,6 @@ github.com/operator-framework/helm-operator-plugins v0.0.12-0.20230307164205-6e3 github.com/operator-framework/helm-operator-plugins v0.0.12-0.20230307164205-6e30bde28688/go.mod h1:QpVyiSOKGbWADyNRl7LvMlRuuMGrWXJQdEYyHPQWMUg= github.com/operator-framework/java-operator-plugins v0.7.1-0.20230306190439-0eed476d2b75 h1:mjMid39qs1lEXpIldVmj7sa1wtuZvYge8oHkT0qOY0Y= github.com/operator-framework/java-operator-plugins v0.7.1-0.20230306190439-0eed476d2b75/go.mod h1:oQTt35EEUrDY8ca/kRWYz5omWsVhk9Sj78vKlHFqxjM= -github.com/operator-framework/operator-lib v0.11.1-0.20230306195046-28cadc6b6055 h1:G9N8wEf9qDZ/4Fj5cbIejKUoFOYta0v72Yg8tPAdvc0= -github.com/operator-framework/operator-lib v0.11.1-0.20230306195046-28cadc6b6055/go.mod h1:A7xcxZPfdepC14FA5YyA+jpbAeD7q4awtT7mSAZntuU= github.com/operator-framework/operator-manifest-tools v0.2.3-0.20230227155221-caa8b9e1ab12 h1:PXejNY6ZFU6CutIkowf/ECsuT/xcLAIgmXQxG43SHnY= github.com/operator-framework/operator-manifest-tools v0.2.3-0.20230227155221-caa8b9e1ab12/go.mod h1:5OAMYmIkFCiiHfS1r3HcIYu3F/sum38pofSoLZy7Cbw= github.com/operator-framework/operator-registry v1.26.5-0.20230307160312-3bfcb23fa7d0 h1:TMYB8U+0F5MJJ6x6CGnri0bH/ea/wvJZ9dZzT5salfo= @@ -1080,7 +1084,7 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= @@ -1148,8 +1152,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1209,8 +1213,8 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1349,13 +1353,13 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1365,8 +1369,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1445,8 +1449,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1694,8 +1698,8 @@ k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= @@ -1710,8 +1714,6 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35 h1:+xBL5uTc+BkPBwmMi3vYfUJjq+N3K+H6PXeETwf5cPI= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo= -sigs.k8s.io/controller-runtime v0.14.5 h1:6xaWFqzT5KuAQ9ufgUaj1G/+C4Y1GRkhrxl+BJ9i+5s= -sigs.k8s.io/controller-runtime v0.14.5/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= sigs.k8s.io/controller-tools v0.11.3 h1:T1xzLkog9saiyQSLz1XOImu4OcbdXWytc5cmYsBeBiE= sigs.k8s.io/controller-tools v0.11.3/go.mod h1:qcfX7jfcfYD/b7lAhvqAyTbt/px4GpvN88WKLFFv7p8= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= diff --git a/internal/ansible/controller/controller.go b/internal/ansible/controller/controller.go index 8fcc4d582a8..254bfa26435 100644 --- a/internal/ansible/controller/controller.go +++ b/internal/ansible/controller/controller.go @@ -35,6 +35,7 @@ import ( "github.com/operator-framework/operator-sdk/internal/ansible/events" "github.com/operator-framework/operator-sdk/internal/ansible/handler" "github.com/operator-framework/operator-sdk/internal/ansible/runner" + "sigs.k8s.io/controller-runtime/pkg/config" ) var log = logf.Log.WithName("ansible-controller") @@ -93,8 +94,10 @@ func Add(mgr manager.Manager, options Options) *controller.Controller { //Create new controller runtime controller and set the controller to watch GVK. c, err := controller.New(fmt.Sprintf("%v-controller", strings.ToLower(options.GVK.Kind)), mgr, controller.Options{ - Reconciler: aor, - MaxConcurrentReconciles: options.MaxConcurrentReconciles, + Reconciler: aor, + Controller: config.Controller{ + MaxConcurrentReconciles: options.MaxConcurrentReconciles, + }, }) if err != nil { log.Error(err, "") @@ -125,7 +128,7 @@ func Add(mgr manager.Manager, options Options) *controller.Controller { u := &unstructured.Unstructured{} u.SetGroupVersionKind(options.GVK) - err = c.Watch(&source.Kind{Type: u}, &handler.LoggingEnqueueRequestForObject{}, predicates...) + err = c.Watch(source.Kind(mgr.GetCache(), u), &handler.LoggingEnqueueRequestForObject{}, predicates...) if err != nil { log.Error(err, "") os.Exit(1) diff --git a/internal/ansible/handler/logging_enqueue_annotation.go b/internal/ansible/handler/logging_enqueue_annotation.go index 5728119a746..2cafccc2330 100644 --- a/internal/ansible/handler/logging_enqueue_annotation.go +++ b/internal/ansible/handler/logging_enqueue_annotation.go @@ -16,6 +16,7 @@ package handler import ( "strings" + "context" "github.com/operator-framework/operator-lib/handler" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" @@ -34,27 +35,27 @@ type LoggingEnqueueRequestForAnnotation struct { } // Create implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForAnnotation) Create(e event.CreateEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForAnnotation) Create(ctx context.Context, e event.CreateEvent, q workqueue.RateLimitingInterface) { h.logEvent("Create", e.Object, nil) - h.EnqueueRequestForAnnotation.Create(e, q) + h.EnqueueRequestForAnnotation.Create(ctx, e, q) } // Update implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForAnnotation) Update(e event.UpdateEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForAnnotation) Update(ctx context.Context, e event.UpdateEvent, q workqueue.RateLimitingInterface) { h.logEvent("Update", e.ObjectOld, e.ObjectNew) - h.EnqueueRequestForAnnotation.Update(e, q) + h.EnqueueRequestForAnnotation.Update(ctx, e, q) } // Delete implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForAnnotation) Delete(e event.DeleteEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForAnnotation) Delete(ctx context.Context, e event.DeleteEvent, q workqueue.RateLimitingInterface) { h.logEvent("Delete", e.Object, nil) - h.EnqueueRequestForAnnotation.Delete(e, q) + h.EnqueueRequestForAnnotation.Delete(ctx, e, q) } // Generic implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForAnnotation) Generic(e event.GenericEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForAnnotation) Generic(ctx context.Context, e event.GenericEvent, q workqueue.RateLimitingInterface) { h.logEvent("Generic", e.Object, nil) - h.EnqueueRequestForAnnotation.Generic(e, q) + h.EnqueueRequestForAnnotation.Generic(ctx, e, q) } func (h LoggingEnqueueRequestForAnnotation) logEvent(eventType string, object, newObject client.Object) { diff --git a/internal/ansible/handler/logging_enqueue_object.go b/internal/ansible/handler/logging_enqueue_object.go index 0aeb8b4f69a..90ae0076d0f 100644 --- a/internal/ansible/handler/logging_enqueue_object.go +++ b/internal/ansible/handler/logging_enqueue_object.go @@ -14,6 +14,7 @@ package handler import ( + "context" "github.com/operator-framework/operator-lib/handler" "k8s.io/client-go/util/workqueue" "sigs.k8s.io/controller-runtime/pkg/client" @@ -32,27 +33,27 @@ type LoggingEnqueueRequestForObject struct { } // Create implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForObject) Create(e event.CreateEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForObject) Create(ctx context.Context, e event.CreateEvent, q workqueue.RateLimitingInterface) { h.logEvent("Create", e.Object) - h.InstrumentedEnqueueRequestForObject.Create(e, q) + h.InstrumentedEnqueueRequestForObject.Create(ctx, e, q) } // Update implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForObject) Update(e event.UpdateEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForObject) Update(ctx context.Context, e event.UpdateEvent, q workqueue.RateLimitingInterface) { h.logEvent("Update", e.ObjectOld) - h.InstrumentedEnqueueRequestForObject.Update(e, q) + h.InstrumentedEnqueueRequestForObject.Update(ctx, e, q) } // Delete implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForObject) Delete(e event.DeleteEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForObject) Delete(ctx context.Context, e event.DeleteEvent, q workqueue.RateLimitingInterface) { h.logEvent("Delete", e.Object) - h.InstrumentedEnqueueRequestForObject.Delete(e, q) + h.InstrumentedEnqueueRequestForObject.Delete(ctx, e, q) } // Generic implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForObject) Generic(e event.GenericEvent, q workqueue.RateLimitingInterface) { +func (h LoggingEnqueueRequestForObject) Generic(ctx context.Context, e event.GenericEvent, q workqueue.RateLimitingInterface) { h.logEvent("Generic", e.Object) - h.EnqueueRequestForObject.Generic(e, q) + h.EnqueueRequestForObject.Generic(ctx, e, q) } func (h LoggingEnqueueRequestForObject) logEvent(eventType string, object client.Object) { diff --git a/internal/ansible/handler/logging_enqueue_owner.go b/internal/ansible/handler/logging_enqueue_owner.go index 8331a102c31..d7481921549 100644 --- a/internal/ansible/handler/logging_enqueue_owner.go +++ b/internal/ansible/handler/logging_enqueue_owner.go @@ -14,7 +14,10 @@ package handler import ( + "context" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/util/workqueue" "sigs.k8s.io/controller-runtime/pkg/client" @@ -22,42 +25,50 @@ import ( crHandler "sigs.k8s.io/controller-runtime/pkg/handler" ) -// LoggingEnqueueRequestForOwner wraps operator-lib handler for +// loggingEnqueueRequestForOwner wraps operator-lib handler for // "InstrumentedEnqueueRequestForObject", and logs the events as they occur // // &handler.LoggingEnqueueRequestForOwner{} -type LoggingEnqueueRequestForOwner struct { - crHandler.EnqueueRequestForOwner +type loggingEnqueueRequestForOwner struct { + crHandler.EventHandler + ownerType client.Object +} + +func LoggingEnqueueRequestForOwner(sch *runtime.Scheme, mapper meta.RESTMapper, ownerType client.Object, opts ...crHandler.OwnerOption) crHandler.EventHandler { + return loggingEnqueueRequestForOwner{ + EventHandler: crHandler.EnqueueRequestForOwner(sch, mapper, ownerType, opts...), + ownerType: ownerType, + } } // Create implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForOwner) Create(e event.CreateEvent, q workqueue.RateLimitingInterface) { +func (h loggingEnqueueRequestForOwner) Create(ctx context.Context, e event.CreateEvent, q workqueue.RateLimitingInterface) { h.logEvent("Create", e.Object, nil) - h.EnqueueRequestForOwner.Create(e, q) + h.EventHandler.Create(ctx, e, q) } // Update implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForOwner) Update(e event.UpdateEvent, q workqueue.RateLimitingInterface) { +func (h loggingEnqueueRequestForOwner) Update(ctx context.Context, e event.UpdateEvent, q workqueue.RateLimitingInterface) { h.logEvent("Update", e.ObjectOld, e.ObjectNew) - h.EnqueueRequestForOwner.Update(e, q) + h.EventHandler.Update(ctx, e, q) } // Delete implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForOwner) Delete(e event.DeleteEvent, q workqueue.RateLimitingInterface) { +func (h loggingEnqueueRequestForOwner) Delete(ctx context.Context, e event.DeleteEvent, q workqueue.RateLimitingInterface) { h.logEvent("Delete", e.Object, nil) - h.EnqueueRequestForOwner.Delete(e, q) + h.EventHandler.Delete(ctx, e, q) } // Generic implements EventHandler, and emits a log message. -func (h LoggingEnqueueRequestForOwner) Generic(e event.GenericEvent, q workqueue.RateLimitingInterface) { +func (h loggingEnqueueRequestForOwner) Generic(ctx context.Context, e event.GenericEvent, q workqueue.RateLimitingInterface) { h.logEvent("Generic", e.Object, nil) - h.EnqueueRequestForOwner.Generic(e, q) + h.EventHandler.Generic(ctx, e, q) } -func (h LoggingEnqueueRequestForOwner) logEvent(eventType string, object, newObject client.Object) { - ownerReference := extractTypedOwnerReference(h.EnqueueRequestForOwner.OwnerType.GetObjectKind().GroupVersionKind(), object.GetOwnerReferences()) +func (h loggingEnqueueRequestForOwner) logEvent(eventType string, object, newObject client.Object) { + ownerReference := extractTypedOwnerReference(h.ownerType.GetObjectKind().GroupVersionKind(), object.GetOwnerReferences()) if ownerReference == nil && newObject != nil { - ownerReference = extractTypedOwnerReference(h.EnqueueRequestForOwner.OwnerType.GetObjectKind().GroupVersionKind(), newObject.GetOwnerReferences()) + ownerReference = extractTypedOwnerReference(h.ownerType.GetObjectKind().GroupVersionKind(), newObject.GetOwnerReferences()) } // If no ownerReference was found then it's probably not an event we care about diff --git a/internal/ansible/proxy/cache_response.go b/internal/ansible/proxy/cache_response.go index 0e24eba7b6e..1d7d0cd5a7c 100644 --- a/internal/ansible/proxy/cache_response.go +++ b/internal/ansible/proxy/cache_response.go @@ -37,6 +37,7 @@ import ( "github.com/operator-framework/operator-sdk/internal/ansible/proxy/controllermap" k8sRequest "github.com/operator-framework/operator-sdk/internal/ansible/proxy/requestfactory" + "k8s.io/apimachinery/pkg/runtime" ) type marshaler interface { @@ -46,6 +47,7 @@ type marshaler interface { type cacheResponseHandler struct { next http.Handler informerCache cache.Cache + sch *runtime.Scheme restMapper meta.RESTMapper watchedNamespaces map[string]interface{} cMap *controllermap.ControllerMap @@ -216,7 +218,7 @@ func (c *cacheResponseHandler) recoverDependentWatches(req *http.Request, un *un for _, oRef := range un.GetOwnerReferences() { if oRef.APIVersion == ownerRef.APIVersion && oRef.Kind == ownerRef.Kind { - err := addWatchToController(*ownerRef, c.cMap, un, c.restMapper, true) + err := addWatchToController(*ownerRef, c.cMap, un, c.informerCache, c.sch, c.restMapper, true) if err != nil { log.Error(err, "Could not recover dependent resource watch", "owner", ownerRef) return @@ -231,7 +233,7 @@ func (c *cacheResponseHandler) recoverDependentWatches(req *http.Request, un *un return } if typeString == fmt.Sprintf("%v.%v", ownerRef.Kind, ownerGV.Group) { - err := addWatchToController(*ownerRef, c.cMap, un, c.restMapper, false) + err := addWatchToController(*ownerRef, c.cMap, un, c.informerCache, c.sch, c.restMapper, false) if err != nil { log.Error(err, "Could not recover dependent resource watch", "owner", ownerRef) return diff --git a/internal/ansible/proxy/inject_owner.go b/internal/ansible/proxy/inject_owner.go index 43886252f5e..e8d594d99fb 100644 --- a/internal/ansible/proxy/inject_owner.go +++ b/internal/ansible/proxy/inject_owner.go @@ -32,6 +32,8 @@ import ( "github.com/operator-framework/operator-sdk/internal/ansible/proxy/controllermap" k8sRequest "github.com/operator-framework/operator-sdk/internal/ansible/proxy/requestfactory" "github.com/operator-framework/operator-sdk/internal/util/k8sutil" + "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" ) // injectOwnerReferenceHandler will handle proxied requests and inject the @@ -40,6 +42,8 @@ import ( type injectOwnerReferenceHandler struct { next http.Handler cMap *controllermap.ControllerMap + cache cache.Cache + sch *runtime.Scheme restMapper meta.RESTMapper watchedNamespaces map[string]interface{} apiResources *apiResources @@ -174,7 +178,7 @@ func (i *injectOwnerReferenceHandler) ServeHTTP(w http.ResponseWriter, req *http _, allNsPresent := i.watchedNamespaces[metav1.NamespaceAll] _, reqNsPresent := i.watchedNamespaces[r.Namespace] if allNsPresent || reqNsPresent { - err = addWatchToController(*owner, i.cMap, data, i.restMapper, addOwnerRef) + err = addWatchToController(*owner, i.cMap, data, i.cache, i.sch, i.restMapper, addOwnerRef) if err != nil { m := "could not add watch to controller" log.Error(err, m) diff --git a/internal/ansible/proxy/proxy.go b/internal/ansible/proxy/proxy.go index f6865c0cd57..3b35a671b49 100644 --- a/internal/ansible/proxy/proxy.go +++ b/internal/ansible/proxy/proxy.go @@ -36,13 +36,13 @@ import ( "k8s.io/client-go/discovery" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/cache" - crHandler "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/source" "github.com/operator-framework/operator-sdk/internal/ansible/handler" "github.com/operator-framework/operator-sdk/internal/ansible/proxy/controllermap" "github.com/operator-framework/operator-sdk/internal/ansible/proxy/kubeconfig" k8sRequest "github.com/operator-framework/operator-sdk/internal/ansible/proxy/requestfactory" + "k8s.io/apimachinery/pkg/runtime" ) // This is the default timeout to wait for the cache to respond @@ -80,6 +80,7 @@ type Options struct { Handler HandlerChain KubeConfig *rest.Config Cache cache.Cache + Scheme *runtime.Scheme RESTMapper meta.RESTMapper ControllerMap *controllermap.ControllerMap WatchedNamespaces []string @@ -153,6 +154,8 @@ func Run(done chan error, o Options) error { server.Handler = &injectOwnerReferenceHandler{ next: server.Handler, cMap: o.ControllerMap, + cache: o.Cache, + sch: o.Scheme, restMapper: o.RESTMapper, watchedNamespaces: watchedNamespaceMap, apiResources: resources, @@ -171,6 +174,7 @@ func Run(done chan error, o Options) error { server.Handler = &cacheResponseHandler{ next: server.Handler, informerCache: o.Cache, + sch: o.Scheme, restMapper: o.RESTMapper, watchedNamespaces: watchedNamespaceMap, cMap: o.ControllerMap, @@ -193,7 +197,7 @@ func Run(done chan error, o Options) error { // Helper function used by cache response and owner injection func addWatchToController(owner kubeconfig.NamespacedOwnerReference, cMap *controllermap.ControllerMap, - resource *unstructured.Unstructured, restMapper meta.RESTMapper, useOwnerRef bool) error { + resource *unstructured.Unstructured, cache cache.Cache, sch *runtime.Scheme, restMapper meta.RESTMapper, useOwnerRef bool) error { dataMapping, err := restMapper.RESTMapping(resource.GroupVersionKind().GroupKind(), resource.GroupVersionKind().Version) if err != nil { @@ -241,10 +245,9 @@ func addWatchToController(owner kubeconfig.NamespacedOwnerReference, cMap *contr owMap.Store(resource.GroupVersionKind()) log.Info("Watching child resource", "kind", resource.GroupVersionKind(), "enqueue_kind", u.GroupVersionKind()) - err := contents.Controller.Watch(&source.Kind{Type: resource}, - &handler.LoggingEnqueueRequestForOwner{ - EnqueueRequestForOwner: crHandler.EnqueueRequestForOwner{OwnerType: u}, - }, predicate.DependentPredicate{}) + err := contents.Controller.Watch(source.Kind(cache, resource), + handler.LoggingEnqueueRequestForOwner(sch, restMapper, u), + predicate.DependentPredicate{}) // Store watch in map if err != nil { log.Error(err, "Failed to watch child resource", @@ -264,7 +267,7 @@ func addWatchToController(owner kubeconfig.NamespacedOwnerReference, cMap *contr } log.Info("Watching child resource", "kind", resource.GroupVersionKind(), "enqueue_annotation_type", ownerGK.String()) - err = contents.Controller.Watch(&source.Kind{Type: resource}, + err = contents.Controller.Watch(source.Kind(cache, resource), &handler.LoggingEnqueueRequestForAnnotation{ EnqueueRequestForAnnotation: libhandler.EnqueueRequestForAnnotation{Type: ownerGK}, }, predicate.DependentPredicate{}) diff --git a/internal/cmd/ansible-operator/run/cmd.go b/internal/cmd/ansible-operator/run/cmd.go index c4482010a38..572e8e93a2a 100644 --- a/internal/cmd/ansible-operator/run/cmd.go +++ b/internal/cmd/ansible-operator/run/cmd.go @@ -26,10 +26,8 @@ import ( "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/healthz" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -140,22 +138,6 @@ func run(cmd *cobra.Command, f *flags.Flags) { // Set default manager options // TODO: probably should expose the host & port as an environment variables options = f.ToManagerOptions(options) - if options.NewClient == nil { - options.NewClient = func(cache cache.Cache, config *rest.Config, options client.Options, uncachedObjects ...client.Object) (client.Client, error) { - // Create the Client for Write operations. - c, err := client.New(config, options) - if err != nil { - return nil, err - } - return client.NewDelegatingClient(client.NewDelegatingClientInput{ - CacheReader: cache, - Client: c, - UncachedObjects: uncachedObjects, - CacheUnstructured: true, - }) - } - } - namespace, found := os.LookupEnv(k8sutil.WatchNamespaceEnvVar) log = log.WithValues("Namespace", namespace) if found { @@ -184,6 +166,7 @@ func run(cmd *cobra.Command, f *flags.Flags) { os.Exit(1) } + options.Client.Cache.Unstructured = true // Create a new manager to provide shared dependencies and start components mgr, err := manager.New(cfg, options) if err != nil { diff --git a/internal/cmd/helm-operator/run/cmd.go b/internal/cmd/helm-operator/run/cmd.go index 0c22658fa4d..4d3e4d3249b 100644 --- a/internal/cmd/helm-operator/run/cmd.go +++ b/internal/cmd/helm-operator/run/cmd.go @@ -18,6 +18,8 @@ import ( "errors" "flag" "fmt" + "helm.sh/helm/v3/pkg/chart/loader" + "k8s.io/apimachinery/pkg/selection" "os" "runtime" "strings" @@ -25,10 +27,9 @@ import ( "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/rest" + apimachruntime "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/healthz" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -45,6 +46,9 @@ import ( "github.com/operator-framework/operator-sdk/internal/helm/watches" "github.com/operator-framework/operator-sdk/internal/util/k8sutil" sdkVersion "github.com/operator-framework/operator-sdk/internal/version" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/labels" + "sigs.k8s.io/controller-runtime/pkg/client" ) var log = logf.Log.WithName("cmd") @@ -135,23 +139,6 @@ func run(cmd *cobra.Command, f *flags.Flags) { // Set default manager options options = f.ToManagerOptions(options) - - if options.NewClient == nil { - options.NewClient = func(cache cache.Cache, config *rest.Config, options client.Options, uncachedObjects ...client.Object) (client.Client, error) { - // Create the Client for Write operations. - c, err := client.New(config, options) - if err != nil { - return nil, err - } - - return client.NewDelegatingClient(client.NewDelegatingClientInput{ - CacheReader: cache, - Client: c, - UncachedObjects: uncachedObjects, - CacheUnstructured: true, - }) - } - } namespace, found := os.LookupEnv(k8sutil.WatchNamespaceEnvVar) log = log.WithValues("Namespace", namespace) if found { @@ -174,6 +161,47 @@ func run(cmd *cobra.Command, f *flags.Flags) { options.Namespace = metav1.NamespaceAll } + ws, err := watches.Load(f.WatchesFile) + if err != nil { + log.Error(err, "Failed to create new manager factories.") + os.Exit(1) + } + + sch := apimachruntime.NewScheme() + byObject := map[client.Object]cache.ByObject{} + chartNames := []string{} + for _, w := range ws { + // Register the GVK with the scheme + sch.AddKnownTypeWithName(w.GroupVersionKind, &unstructured.Unstructured{}) + + // Add the watched GVK to the selectorsByObject map + crObj := &unstructured.Unstructured{} + crObj.SetGroupVersionKind(w.GroupVersionKind) + sel, err := metav1.LabelSelectorAsSelector(&w.Selector) + if err != nil { + log.Error(err, "Unable to parse label selector") + os.Exit(1) + } + byObject[crObj] = cache.ByObject{Label: sel} + + chrt, err := loader.LoadDir(w.ChartDir) + if err != nil { + log.Error(err, "Unable to load chart", "directory", w.ChartDir) + os.Exit(1) + } + chartNames = append(chartNames, chrt.Name()) + } + + req, err := labels.NewRequirement("helm.sdk.operatorframework.io/chart", selection.In, chartNames) + defaultSelector := labels.NewSelector().Add(*req) + fmt.Println(defaultSelector.String()) + options.NewCache = cache.BuilderWithOptions(cache.Options{ + ByObject: byObject, + DefaultLabelSelector: defaultSelector, + }) + + options.Scheme = sch + options.Client.Cache = &client.CacheOptions{Unstructured: true} mgr, err := manager.New(cfg, options) if err != nil { log.Error(err, "Failed to create a new manager.") @@ -189,11 +217,6 @@ func run(cmd *cobra.Command, f *flags.Flags) { os.Exit(1) } - ws, err := watches.Load(f.WatchesFile) - if err != nil { - log.Error(err, "Failed to create new manager factories.") - os.Exit(1) - } acg, err := helmClient.NewActionConfigGetter(mgr.GetConfig(), mgr.GetRESTMapper(), mgr.GetLogger()) if err != nil { log.Error(err, "Failed to create Helm action config getter") diff --git a/internal/helm/client/client.go b/internal/helm/client/client.go index 62e18f541a9..069e7fa74d1 100644 --- a/internal/helm/client/client.go +++ b/internal/helm/client/client.go @@ -70,6 +70,7 @@ func (c *ownerRefInjectingClient) Build(reader io.Reader, validate bool) (kube.R return err } u := &unstructured.Unstructured{Object: objMap} + useOwnerRef, err := k8sutil.SupportsOwnerReference(c.restMapper, c.owner, u, "") if err != nil { return err @@ -105,3 +106,45 @@ func containsResourcePolicyKeep(annotations map[string]string) bool { resourcePolicyType = strings.ToLower(strings.TrimSpace(resourcePolicyType)) return resourcePolicyType == kube.KeepPolicy } + +type labelInjectingClient struct { + kube.Interface + labels map[string]string +} + +func NewLabelInjectingClient(base kube.Interface, labels map[string]string) kube.Interface { + return &labelInjectingClient{ + Interface: base, + labels: labels, + } +} + +func (c *labelInjectingClient) Build(reader io.Reader, validate bool) (kube.ResourceList, error) { + resourceList, err := c.Interface.Build(reader, validate) + if err != nil { + return resourceList, err + } + err = resourceList.Visit(func(r *resource.Info, err error) error { + if err != nil { + return err + } + objMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(r.Object) + if err != nil { + return err + } + u := &unstructured.Unstructured{Object: objMap} + labels := u.GetLabels() + if labels == nil { + labels = map[string]string{} + } + for k, v := range c.labels { + labels[k] = v + } + u.SetLabels(labels) + return nil + }) + if err != nil { + return nil, err + } + return resourceList, nil +} diff --git a/internal/helm/controller/controller.go b/internal/helm/controller/controller.go index 7b4e44ba303..0bb8de57753 100644 --- a/internal/helm/controller/controller.go +++ b/internal/helm/controller/controller.go @@ -16,7 +16,6 @@ package controller import ( "fmt" - "reflect" "strings" "sync" "time" @@ -31,7 +30,6 @@ import ( crthandler "sigs.k8s.io/controller-runtime/pkg/handler" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" - ctrlpredicate "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/source" "sigs.k8s.io/yaml" @@ -39,6 +37,7 @@ import ( "github.com/operator-framework/operator-lib/predicate" "github.com/operator-framework/operator-sdk/internal/helm/release" "github.com/operator-framework/operator-sdk/internal/util/k8sutil" + "sigs.k8s.io/controller-runtime/pkg/config" ) var log = logf.Log.WithName("helm.controller") @@ -69,13 +68,11 @@ func Add(mgr manager.Manager, options WatchOptions) error { OverrideValues: options.OverrideValues, } - // Register the GVK with the schema - mgr.GetScheme().AddKnownTypeWithName(options.GVK, &unstructured.Unstructured{}) - metav1.AddToGroupVersion(mgr.GetScheme(), options.GVK.GroupVersion()) - c, err := controller.New(controllerName, mgr, controller.Options{ - Reconciler: r, - MaxConcurrentReconciles: options.MaxConcurrentReconciles, + Reconciler: r, + Controller: config.Controller{ + MaxConcurrentReconciles: options.MaxConcurrentReconciles, + }, }) if err != nil { return err @@ -84,18 +81,7 @@ func Add(mgr manager.Manager, options WatchOptions) error { o := &unstructured.Unstructured{} o.SetGroupVersionKind(options.GVK) - var preds []ctrlpredicate.Predicate - p, err := parsePredicateSelector(options.Selector) - - if err != nil { - return err - } - - if p != nil { - preds = append(preds, p) - } - - if err := c.Watch(&source.Kind{Type: o}, &libhandler.InstrumentedEnqueueRequestForObject{}, preds...); err != nil { + if err := c.Watch(source.Kind(mgr.GetCache(), o), &libhandler.InstrumentedEnqueueRequestForObject{}); err != nil { return err } @@ -108,29 +94,15 @@ func Add(mgr manager.Manager, options WatchOptions) error { return nil } -// parsePredicateSelector parses the selector in the WatchOptions and creates a predicate -// that is used to filter resources based on the specified selector -func parsePredicateSelector(selector metav1.LabelSelector) (ctrlpredicate.Predicate, error) { - // If a selector has been specified in watches.yaml, add it to the watch's predicates. - if !reflect.ValueOf(selector).IsZero() { - p, err := ctrlpredicate.LabelSelectorPredicate(selector) - if err != nil { - return nil, fmt.Errorf("error constructing predicate from watches selector: %v", err) - } - return p, nil - } - return nil, nil -} - // watchDependentResources adds a release hook function to the HelmOperatorReconciler // that adds watches for resources in released Helm charts. func watchDependentResources(mgr manager.Manager, r *HelmOperatorReconciler, c controller.Controller) { - owner := &unstructured.Unstructured{} - owner.SetGroupVersionKind(r.GVK) - var m sync.RWMutex watches := map[schema.GroupVersionKind]struct{}{} releaseHook := func(release *rpb.Release) error { + owner := &unstructured.Unstructured{} + owner.SetGroupVersionKind(r.GVK) + owner.SetNamespace(release.Namespace) resources := releaseutil.SplitManifests(release.Manifest) for _, resource := range resources { var u unstructured.Unstructured @@ -164,13 +136,13 @@ func watchDependentResources(mgr manager.Manager, r *HelmOperatorReconciler, c c } if useOwnerRef { // Setup watch using owner references. - err = c.Watch(&source.Kind{Type: unstructuredObj}, &crthandler.EnqueueRequestForOwner{OwnerType: owner}, + err = c.Watch(source.Kind(mgr.GetCache(), unstructuredObj), crthandler.EnqueueRequestForOwner(mgr.GetScheme(), mgr.GetRESTMapper(), owner), predicate.DependentPredicate{}) if err != nil { return err } } else { // Setup watch using annotations. - err = c.Watch(&source.Kind{Type: unstructuredObj}, &libhandler.EnqueueRequestForAnnotation{Type: gvkDependent.GroupKind()}, + err = c.Watch(source.Kind(mgr.GetCache(), unstructuredObj), &libhandler.EnqueueRequestForAnnotation{Type: gvkDependent.GroupKind()}, predicate.DependentPredicate{}) if err != nil { return err diff --git a/internal/helm/release/manager_factory.go b/internal/helm/release/manager_factory.go index cb1857fd0b7..d0eeb4704ff 100644 --- a/internal/helm/release/manager_factory.go +++ b/internal/helm/release/manager_factory.go @@ -58,6 +58,10 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured, overrideValues return nil, fmt.Errorf("failed to load chart dir: %w", err) } + actionConfig.KubeClient = client.NewLabelInjectingClient(actionConfig.KubeClient, map[string]string{ + "helm.sdk.operatorframework.io/chart": crChart.Name(), + }) + releaseName, err := getReleaseName(actionConfig.Releases, crChart.Name(), cr) if err != nil { return nil, fmt.Errorf("failed to get helm release name: %w", err) diff --git a/internal/olm/client/client.go b/internal/olm/client/client.go index dbd23c3a4c1..9e67d7199fe 100644 --- a/internal/olm/client/client.go +++ b/internal/olm/client/client.go @@ -90,7 +90,11 @@ type Client struct { } func NewClientForConfig(cfg *rest.Config) (*Client, error) { - rm, err := apiutil.NewDynamicRESTMapper(cfg) + httpClient, err := rest.HTTPClientFor(cfg) + if err != nil { + return nil, fmt.Errorf("failed to create HTTP client: %v", err) + } + rm, err := apiutil.NewDynamicRESTMapper(cfg, httpClient) if err != nil { return nil, fmt.Errorf("failed to create dynamic rest mapper: %v", err) }