Use eventfilterinformer

Signed-off-by: Jian Qiu <jqiu@redhat.com>
This commit is contained in:
Jian Qiu
2020-11-02 10:47:13 +08:00
parent 7a90dd44e2
commit efc2acdfb2
65 changed files with 1648 additions and 753 deletions

18
go.mod
View File

@@ -9,20 +9,20 @@ require (
github.com/onsi/ginkgo v1.14.0
github.com/onsi/gomega v1.10.1
github.com/open-cluster-management/api v0.0.0-20201126023000-353dd8370f4d
github.com/openshift/api v0.0.0-20200827090112-c05698d102cf
github.com/openshift/build-machinery-go v0.0.0-20200819073603-48aa266c95f7
github.com/openshift/api v0.0.0-20201019163320-c6a5ec25f267
github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab
github.com/openshift/generic-admission-server v1.14.1-0.20200903115324-4ddcdd976480
github.com/openshift/library-go v0.0.0-20200902171820-35f48b6ef30c
github.com/openshift/library-go v0.0.0-20201207213115-a0cd28f38065
github.com/spf13/cobra v1.0.0
github.com/spf13/pflag v1.0.5
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
k8s.io/api v0.19.0
k8s.io/apimachinery v0.19.0
k8s.io/apiserver v0.19.0
k8s.io/client-go v0.19.0
k8s.io/component-base v0.19.0
k8s.io/api v0.19.2
k8s.io/apimachinery v0.19.2
k8s.io/apiserver v0.19.2
k8s.io/client-go v0.19.2
k8s.io/component-base v0.19.2
k8s.io/klog/v2 v2.3.0
k8s.io/kube-aggregator v0.19.0
k8s.io/kube-aggregator v0.19.2
k8s.io/utils v0.0.0-20200729134348-d5654de09c73
sigs.k8s.io/controller-runtime v0.6.1-0.20200829232221-efc74d056b24
)

101
go.sum
View File

@@ -84,6 +84,7 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.7 h1:6pwm8kMQKCmgUg0ZHTm5+/YvRK0s3THD/28+T6/kk4A=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -103,12 +104,14 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
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/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
@@ -190,8 +193,10 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
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/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
@@ -205,6 +210,7 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
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=
@@ -235,6 +241,7 @@ github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -250,6 +257,7 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
github.com/gorilla/mux v0.0.0-20191024121256-f395758b854c/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
@@ -281,8 +289,10 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
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.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@@ -304,7 +314,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kubernetes-sigs/kube-storage-version-migrator v0.0.0-20191127225502-51849bc15f17/go.mod h1:enH0BVV+4+DAgWdwSlMefG8bBzTfVMTr1lApzdLZ/cc=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -314,7 +323,9 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN
github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -326,6 +337,7 @@ github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/f
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=
@@ -342,6 +354,7 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
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/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw=
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
@@ -357,15 +370,18 @@ github.com/open-cluster-management/api v0.0.0-20201126023000-353dd8370f4d/go.mod
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/runc v0.0.0-20191031171055-b133feaeeb2e/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/openshift/api v0.0.0-20200827090112-c05698d102cf h1:s/d912Y7MW7bD/6XNL0gMe6lC0zPiDjq5w8u0OyCSpc=
github.com/openshift/api v0.0.0-20200827090112-c05698d102cf/go.mod h1:M3xexPhgM8DISzzRpuFUy+jfPjQPIcs9yqEYj17mXV8=
github.com/openshift/api v0.0.0-20201019163320-c6a5ec25f267 h1:d6qOoblJz8DjQ44PRT0hYt3qLqJ/Lnvipk1vXr0gpfo=
github.com/openshift/api v0.0.0-20201019163320-c6a5ec25f267/go.mod h1:RDvBcRQMGLa3aNuDuejVBbTEQj/2i14NXdpOLqbNBvM=
github.com/openshift/build-machinery-go v0.0.0-20200819073603-48aa266c95f7 h1:mOq7Mg1Q9d7nIDxe1SJ6pluMBQsbVxa6olyAGmfYWTg=
github.com/openshift/build-machinery-go v0.0.0-20200819073603-48aa266c95f7/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
github.com/openshift/client-go v0.0.0-20200827190008-3062137373b5/go.mod h1:5rGmrkQ8DJEUXA+AR3rEjfH+HFyg4/apY9iCQFgvPfE=
github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab h1:lBrojddP6C9C2p67EMs2vcdpC8eF+H0DDom+fgI2IF0=
github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
github.com/openshift/client-go v0.0.0-20201020074620-f8fd44879f7c h1:NB9g4Y/aegId7fyNqYyGxEfyNOytYFT5dxWJtfOJFQs=
github.com/openshift/client-go v0.0.0-20201020074620-f8fd44879f7c/go.mod h1:yZ3u8vgWC19I9gbDMRk8//9JwG/0Sth6v7C+m6R8HXs=
github.com/openshift/generic-admission-server v1.14.1-0.20200903115324-4ddcdd976480 h1:y47BAJFepK8Xls1c+quIOyc46OXiT9LRiqGVjIaMlSA=
github.com/openshift/generic-admission-server v1.14.1-0.20200903115324-4ddcdd976480/go.mod h1:OAHL5WnZphlhVEf5fTdeGLvNwMu1B2zCWpmxJpCA35o=
github.com/openshift/library-go v0.0.0-20200902171820-35f48b6ef30c h1:5UtF2LrF1yd+Q3Sdgg3pU0GIC4vVgqBN9Rm6BkDbIbI=
github.com/openshift/library-go v0.0.0-20200902171820-35f48b6ef30c/go.mod h1:6vwp+YhYOIlj8MpkQKkebTTSn2TuYyvgiAFQ206jIEQ=
github.com/openshift/library-go v0.0.0-20201207213115-a0cd28f38065 h1:prjNPoqziW9B0a3htVZP558+o3jE5cR7f8dRbrncIXw=
github.com/openshift/library-go v0.0.0-20201207213115-a0cd28f38065/go.mod h1:1xYaYQcQsn+AyCRsvOU+Qn5z6GGiCmcblXkT/RZLVfo=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
@@ -376,6 +392,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.3.0 h1:OQIvuDgm00gWVWGTf4m4mCt6W1/0YqU7Ntg0mySWgaI=
github.com/pkg/profile v1.3.0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
@@ -406,6 +423,7 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa
github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
@@ -444,6 +462,7 @@ github.com/staebler/apiserver v0.19.1-0.20201005174924-a3ef0d1e45df/go.mod h1:Xv
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/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=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
@@ -469,6 +488,7 @@ go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0=
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5 h1:Gqga3zA9tdAcfqobUGjSoCob5L3f8Dt5EuOp3ihNZko=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8=
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
@@ -497,18 +517,23 @@ go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
@@ -531,6 +556,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
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=
@@ -550,6 +576,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
@@ -570,13 +597,16 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -590,6 +620,7 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -602,6 +633,7 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/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=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
@@ -622,6 +654,7 @@ golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -637,6 +670,7 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -653,6 +687,9 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k=
gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -684,6 +721,7 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
@@ -727,6 +765,7 @@ gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -735,35 +774,81 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI=
k8s.io/api v0.18.0-beta.2/go.mod h1:2oeNnWEqcSmaM/ibSh3t7xcIqbkGXhzZdn4ezV9T4m0=
k8s.io/api v0.19.0 h1:XyrFIJqTYZJ2DU7FBE/bSPz7b1HvbVBuBf07oeo6eTc=
k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw=
k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms=
k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI=
k8s.io/apiextensions-apiserver v0.17.0/go.mod h1:XiIFUakZywkUl54fVXa7QTEHcqQz9HG55nHd1DCoHj8=
k8s.io/apiextensions-apiserver v0.18.0-beta.2/go.mod h1:Hnrg5jx8/PbxRbUoqDGxtQkULjwx8FDW4WYJaKNK+fk=
k8s.io/apiextensions-apiserver v0.19.0 h1:jlY13lvZp+0p9fRX2khHFdiT9PYzT7zUrANz6R1NKtY=
k8s.io/apiextensions-apiserver v0.19.0/go.mod h1:znfQxNpjqz/ZehvbfMg5N6fvBJW5Lqu5HVLTJQdP4Fs=
k8s.io/apiextensions-apiserver v0.19.2 h1:oG84UwiDsVDu7dlsGQs5GySmQHCzMhknfhFExJMz9tA=
k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg=
k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
k8s.io/apimachinery v0.18.0-beta.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
k8s.io/apimachinery v0.19.0 h1:gjKnAda/HZp5k4xQYjL0K/Yb66IvNqjthCb03QlKpaQ=
k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/apimachinery v0.19.2 h1:5Gy9vQpAGTKHPVOh5c4plE274X8D/6cuEiTO2zve7tc=
k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k=
k8s.io/client-go v0.18.0-beta.2/go.mod h1:UvuVxHjKWIcgy0iMvF+bwNDW7l0mskTNOaOW1Qv5BMA=
k8s.io/client-go v0.19.0 h1:1+0E0zfWFIWeyRhQYWzimJOyAk2UT7TiARaLNwJCf7k=
k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU=
k8s.io/client-go v0.19.2 h1:gMJuU3xJZs86L1oQ99R4EViAADUPMHHtS9jFshasHSc=
k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA=
k8s.io/code-generator v0.17.0/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s=
k8s.io/code-generator v0.18.0-beta.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc=
k8s.io/component-base v0.18.0-beta.2/go.mod h1:HVk5FpRnyzQ/MjBr9//e/yEBjTVa2qjGXCTuUzcD7ks=
k8s.io/component-base v0.19.0 h1:OueXf1q3RW7NlLlUCj2Dimwt7E1ys6ZqRnq53l2YuoE=
k8s.io/component-base v0.19.0/go.mod h1:dKsY8BxkA+9dZIAh2aWJLL/UdASFDNtGYTCItL4LM7Y=
k8s.io/component-base v0.19.2 h1:jW5Y9RcZTb79liEhW3XDVTW7MuvEGP0tQZnfSX6/+gs=
k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo=
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/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/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.3.0 h1:WmkrnW7fdrm0/DMClc+HIxtftvxVIPAhlVwMQo5yLco=
k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/kube-aggregator v0.19.0 h1:rL4fsftMaqkKjaibArYDaBeqN41CHaJzgRJjUB9IrIg=
k8s.io/kube-aggregator v0.19.0/go.mod h1:1Ln45PQggFAG8xOqWPIYMxUq8WNtpPnYsbUJ39DpF/A=
k8s.io/kube-aggregator v0.18.0-beta.2/go.mod h1:O3Td9mheraINbLHH4pzoFP2gRzG0Wk1COqzdSL4rBPk=
k8s.io/kube-aggregator v0.19.2 h1:iDJILLwIKjojE0bjZHKMGp8Ry5U1ugsJzrb/A9lD+00=
k8s.io/kube-aggregator v0.19.2/go.mod h1:wVsjy6OTeUrWkgG9WVsGftnjpm8JIY0vJV7LH2j4nhM=
k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
k8s.io/utils v0.0.0-20200229041039-0a110f9eb7ab/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg=
k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9 h1:rusRLrDhjBp6aYtl9sGEvQJr6faoHoDLd0YcUBTZguI=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0=
sigs.k8s.io/controller-runtime v0.6.1-0.20200829232221-efc74d056b24 h1:X8MP3ikt7leHqbSGyhcTV90nOx4aKU8Q/29PU7SIJOY=
sigs.k8s.io/controller-runtime v0.6.1-0.20200829232221-efc74d056b24/go.mod h1:KbYIf6EpZz2+osbp4K0KGKhr5SyMJ8ZOBhjcv7MNqxI=
sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE=
sigs.k8s.io/kube-storage-version-migrator v0.0.3/go.mod h1:mXfSLkx9xbJHQsgNDDUZK/iQTs2tMbx/hsJlWe6Fthw=
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ=
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA=
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=

View File

@@ -103,17 +103,23 @@ func NewClientCertForHubController(
}
return factory.New().
WithInformersQueueKeyFunc(func(obj runtime.Object) string {
accessor, err := meta.Accessor(obj)
if err != nil {
return irrelevantSecretKey
}
// we want to only care about the hub kubeconfig secret, others are irrelevant
if accessor.GetNamespace() == hubKubeconfigSecretNamespace && accessor.GetName() == kubeconfigSecretName {
WithFilteredEventsInformersQueueKeyFunc(
func(obj runtime.Object) string {
accessor, _ := meta.Accessor(obj)
return accessor.GetName()
}
return irrelevantSecretKey
}, spokeSecretInformer.Informer()).
},
func(obj interface{}) bool {
accessor, err := meta.Accessor(obj)
if err != nil {
return false
}
// only enqueue when hub kubeconfig secret is changed
if accessor.GetNamespace() == hubKubeconfigSecretNamespace && accessor.GetName() == kubeconfigSecretName {
return true
}
return false
},
spokeSecretInformer.Informer()).
WithInformers(hubCSRInformer.Informer()).
WithSync(c.sync).
ResyncEvery(ControllerSyncInterval).
@@ -121,16 +127,6 @@ func NewClientCertForHubController(
}
func (c *ClientCertForHubController) sync(ctx context.Context, syncCtx factory.SyncContext) error {
// there are three cases for the quequeKey
// 1. queueKey equals irrelevantSecretKey, this key is the result of other secret changes on managed cluster, ignore it
// 2. queueKey equals hub kubeconfig secret name, this key is the result of the hub kubeconfig secret changes on managed
// cluster, reconcile the secret
// 3. queueKey equals defautl queue key value ("key"), this key is the result of the csr changes on hub, we need
// reconcile the hub kubeconfig secret
queueKey := syncCtx.QueueKey()
if queueKey == irrelevantSecretKey {
return nil
}
// get hubKubeconfigSecret
secret, err := c.spokeCoreClient.Secrets(c.hubKubeconfigSecretNamespace).Get(ctx, c.hubKubeconfigSecretName, metav1.GetOptions{})
switch {

View File

@@ -47,16 +47,21 @@ func NewHubKubeconfigSecretController(
}
return factory.New().
WithInformersQueueKeyFunc(
WithFilteredEventsInformersQueueKeyFunc(
func(obj runtime.Object) string {
accessor, _ := meta.Accessor(obj)
return accessor.GetName()
},
func(obj interface{}) bool {
accessor, err := meta.Accessor(obj)
if err != nil {
return ""
return false
}
// only enqueue when hub kubeconfig secret is changed
if accessor.GetNamespace() == hubKubeconfigSecretNamespace && accessor.GetName() == hubKubeconfigSecretName {
return accessor.GetName()
return true
}
return ""
return false
}, spokeSecretInformer.Informer()).
WithSync(s.sync).
ResyncEvery(5*time.Minute).
@@ -64,10 +69,6 @@ func NewHubKubeconfigSecretController(
}
func (s *hubKubeconfigSecretController) sync(ctx context.Context, syncCtx factory.SyncContext) error {
queueKey := syncCtx.QueueKey()
if queueKey == "" {
return nil
}
klog.V(4).Infof("Reconciling Hub KubeConfig secret %q", s.hubKubeconfigSecretName)
secret, err := s.spokeCoreClient.Secrets(s.hubKubeconfigSecretNamespace).Get(ctx, s.hubKubeconfigSecretName, metav1.GetOptions{})
if errors.IsNotFound(err) {

View File

@@ -30,6 +30,7 @@ $(call add-crd-gen,operatoringress,./operatoringress/v1,./operatoringress/v1,./o
$(call add-crd-gen,quota,./quota/v1,./quota/v1,./quota/v1)
$(call add-crd-gen,samples,./samples/v1,./samples/v1,./samples/v1)
$(call add-crd-gen,security,./security/v1,./security/v1,./security/v1)
$(call add-crd-gen,securityinternal,./securityinternal/v1,./securityinternal/v1,./securityinternal/v1)
$(call add-crd-gen,network,./network/v1,./network/v1,./network/v1)
$(call add-crd-gen,operatorcontrolplane,./operatorcontrolplane/v1alpha1,./operatorcontrolplane/v1alpha1,./operatorcontrolplane/v1alpha1)

View File

@@ -92,7 +92,9 @@ spec:
format: date-time
message:
description: message provides additional information about the
current condition. This is only to be consumed by humans.
current condition. This is only to be consumed by humans. It
may contain Line Feed characters (U+000A), which should be rendered
as new lines.
type: string
reason:
description: reason is the CamelCase reason for the condition's

View File

@@ -218,7 +218,9 @@ spec:
format: date-time
message:
description: message provides additional information about the
current condition. This is only to be consumed by humans.
current condition. This is only to be consumed by humans. It
may contain Line Feed characters (U+000A), which should be rendered
as new lines.
type: string
reason:
description: reason is the CamelCase reason for the condition's

View File

@@ -112,6 +112,10 @@ spec:
description: IBMCloud contains settings specific to the IBMCloud
infrastructure provider.
type: object
kubevirt:
description: Kubevirt contains settings specific to the kubevirt
infrastructure provider.
type: object
openstack:
description: OpenStack contains settings specific to the OpenStack
infrastructure provider.
@@ -127,8 +131,8 @@ spec:
creation and deletion, and other integrations are enabled. If
None, no infrastructure automation is enabled. Allowed values
are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", "OpenStack",
"VSphere", "oVirt", and "None". Individual components may not
support all platforms, and must handle unrecognized platforms
"VSphere", "oVirt", "KubeVirt" and "None". Individual components
may not support all platforms, and must handle unrecognized platforms
as None if they do not support that platform.
type: string
enum:
@@ -143,6 +147,7 @@ spec:
- VSphere
- oVirt
- IBMCloud
- KubeVirt
vsphere:
description: VSphere contains settings specific to the VSphere infrastructure
provider.
@@ -190,6 +195,7 @@ spec:
- VSphere
- oVirt
- IBMCloud
- KubeVirt
platformStatus:
description: platformStatus holds status information specific to the
underlying infrastructure provider.
@@ -307,6 +313,24 @@ spec:
description: ResourceGroupName is the Resource Group for new
IBMCloud resources created for the cluster.
type: string
kubevirt:
description: Kubevirt contains settings specific to the kubevirt
infrastructure provider.
type: object
properties:
apiServerInternalIP:
description: apiServerInternalIP is an IP address to contact
the Kubernetes API server that can be used by components inside
the cluster, like kubelets using the infrastructure rather
than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI
points to. It is the IP for a self-hosted load balancer in
front of the API servers.
type: string
ingressIP:
description: ingressIP is an external IP which routes to the
default ingress controller. The IP is a suitable target of
a wildcard DNS record used to resolve default route host names.
type: string
openstack:
description: OpenStack contains settings specific to the OpenStack
infrastructure provider.
@@ -385,6 +409,7 @@ spec:
- VSphere
- oVirt
- IBMCloud
- KubeVirt
vsphere:
description: VSphere contains settings specific to the VSphere infrastructure
provider.

View File

@@ -130,7 +130,8 @@ type ClusterOperatorStatusCondition struct {
Reason string `json:"reason,omitempty"`
// message provides additional information about the current condition.
// This is only to be consumed by humans.
// This is only to be consumed by humans. It may contain Line Feed
// characters (U+000A), which should be rendered as new lines.
// +optional
Message string `json:"message,omitempty"`
}

View File

@@ -79,7 +79,7 @@ type InfrastructureStatus struct {
}
// PlatformType is a specific supported infrastructure provider.
// +kubebuilder:validation:Enum="";AWS;Azure;BareMetal;GCP;Libvirt;OpenStack;None;VSphere;oVirt;IBMCloud
// +kubebuilder:validation:Enum="";AWS;Azure;BareMetal;GCP;Libvirt;OpenStack;None;VSphere;oVirt;IBMCloud;KubeVirt
type PlatformType string
const (
@@ -112,6 +112,9 @@ const (
// IBMCloudPlatformType represents IBM Cloud infrastructure.
IBMCloudPlatformType PlatformType = "IBMCloud"
// KubevirtPlatformType represents KubeVirt/Openshift Virtualization infrastructure.
KubevirtPlatformType PlatformType = "KubeVirt"
)
// IBMCloudProviderType is a specific supported IBM Cloud provider cluster type
@@ -134,7 +137,7 @@ type PlatformSpec struct {
// balancers, dynamic volume provisioning, machine creation and deletion, and
// other integrations are enabled. If None, no infrastructure automation is
// enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt",
// "OpenStack", "VSphere", "oVirt", and "None". Individual components may not support
// "OpenStack", "VSphere", "oVirt", "KubeVirt" and "None". Individual components may not support
// all platforms, and must handle unrecognized platforms as None if they do
// not support that platform.
//
@@ -172,6 +175,10 @@ type PlatformSpec struct {
// IBMCloud contains settings specific to the IBMCloud infrastructure provider.
// +optional
IBMCloud *IBMCloudPlatformSpec `json:"ibmcloud,omitempty"`
// Kubevirt contains settings specific to the kubevirt infrastructure provider.
// +optional
Kubevirt *KubevirtPlatformSpec `json:"kubevirt,omitempty"`
}
// PlatformStatus holds the current status specific to the underlying infrastructure provider
@@ -222,6 +229,10 @@ type PlatformStatus struct {
// IBMCloud contains settings specific to the IBMCloud infrastructure provider.
// +optional
IBMCloud *IBMCloudPlatformStatus `json:"ibmcloud,omitempty"`
// Kubevirt contains settings specific to the kubevirt infrastructure provider.
// +optional
Kubevirt *KubevirtPlatformStatus `json:"kubevirt,omitempty"`
}
// AWSServiceEndpoint store the configuration of a custom url to
@@ -433,6 +444,23 @@ type IBMCloudPlatformStatus struct {
ProviderType IBMCloudProviderType `json:"providerType,omitempty"`
}
// KubevirtPlatformSpec holds the desired state of the kubevirt infrastructure provider.
// This only includes fields that can be modified in the cluster.
type KubevirtPlatformSpec struct{}
// KubevirtPlatformStatus holds the current status of the kubevirt infrastructure provider.
type KubevirtPlatformStatus struct {
// apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used
// by components inside the cluster, like kubelets using the infrastructure rather
// than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI
// points to. It is the IP for a self-hosted load balancer in front of the API servers.
APIServerInternalIP string `json:"apiServerInternalIP,omitempty"`
// ingressIP is an external IP which routes to the default ingress controller.
// The IP is a suitable target of a wildcard DNS record used to resolve default route host names.
IngressIP string `json:"ingressIP,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// InfrastructureList is

View File

@@ -2259,6 +2259,38 @@ func (in *KubeClientConfig) DeepCopy() *KubeClientConfig {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *KubevirtPlatformSpec) DeepCopyInto(out *KubevirtPlatformSpec) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformSpec.
func (in *KubevirtPlatformSpec) DeepCopy() *KubevirtPlatformSpec {
if in == nil {
return nil
}
out := new(KubevirtPlatformSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *KubevirtPlatformStatus) DeepCopyInto(out *KubevirtPlatformStatus) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformStatus.
func (in *KubevirtPlatformStatus) DeepCopy() *KubevirtPlatformStatus {
if in == nil {
return nil
}
out := new(KubevirtPlatformStatus)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LDAPAttributeMapping) DeepCopyInto(out *LDAPAttributeMapping) {
*out = *in
@@ -2949,6 +2981,11 @@ func (in *PlatformSpec) DeepCopyInto(out *PlatformSpec) {
*out = new(IBMCloudPlatformSpec)
**out = **in
}
if in.Kubevirt != nil {
in, out := &in.Kubevirt, &out.Kubevirt
*out = new(KubevirtPlatformSpec)
**out = **in
}
return
}
@@ -3005,6 +3042,11 @@ func (in *PlatformStatus) DeepCopyInto(out *PlatformStatus) {
*out = new(IBMCloudPlatformStatus)
**out = **in
}
if in.Kubevirt != nil {
in, out := &in.Kubevirt, &out.Kubevirt
*out = new(KubevirtPlatformStatus)
**out = **in
}
return
}

View File

@@ -443,7 +443,7 @@ var map_ClusterOperatorStatusCondition = map[string]string{
"status": "status of the condition, one of True, False, Unknown.",
"lastTransitionTime": "lastTransitionTime is the time of the last update to the current status property.",
"reason": "reason is the CamelCase reason for the condition's current status.",
"message": "message provides additional information about the current condition. This is only to be consumed by humans.",
"message": "message provides additional information about the current condition. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines.",
}
func (ClusterOperatorStatusCondition) SwaggerDoc() map[string]string {
@@ -857,6 +857,24 @@ func (InfrastructureStatus) SwaggerDoc() map[string]string {
return map_InfrastructureStatus
}
var map_KubevirtPlatformSpec = map[string]string{
"": "KubevirtPlatformSpec holds the desired state of the kubevirt infrastructure provider. This only includes fields that can be modified in the cluster.",
}
func (KubevirtPlatformSpec) SwaggerDoc() map[string]string {
return map_KubevirtPlatformSpec
}
var map_KubevirtPlatformStatus = map[string]string{
"": "KubevirtPlatformStatus holds the current status of the kubevirt infrastructure provider.",
"apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.",
"ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.",
}
func (KubevirtPlatformStatus) SwaggerDoc() map[string]string {
return map_KubevirtPlatformStatus
}
var map_OpenStackPlatformSpec = map[string]string{
"": "OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. This only includes fields that can be modified in the cluster.",
}
@@ -898,7 +916,7 @@ func (OvirtPlatformStatus) SwaggerDoc() map[string]string {
var map_PlatformSpec = map[string]string{
"": "PlatformSpec holds the desired state specific to the underlying infrastructure provider of the current cluster. Since these are used at spec-level for the underlying cluster, it is supposed that only one of the spec structs is set.",
"type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.",
"type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.",
"aws": "AWS contains settings specific to the Amazon Web Services infrastructure provider.",
"azure": "Azure contains settings specific to the Azure infrastructure provider.",
"gcp": "GCP contains settings specific to the Google Cloud Platform infrastructure provider.",
@@ -907,6 +925,7 @@ var map_PlatformSpec = map[string]string{
"ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.",
"vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.",
"ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.",
"kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.",
}
func (PlatformSpec) SwaggerDoc() map[string]string {
@@ -924,6 +943,7 @@ var map_PlatformStatus = map[string]string{
"ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.",
"vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.",
"ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.",
"kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.",
}
func (PlatformStatus) SwaggerDoc() map[string]string {

View File

@@ -1,14 +1,14 @@
module github.com/openshift/api
go 1.13
go 1.15
require (
github.com/gogo/protobuf v1.3.1
github.com/openshift/build-machinery-go v0.0.0-20200819073603-48aa266c95f7
github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab
github.com/spf13/pflag v1.0.5
golang.org/x/tools v0.0.0-20200616133436-c1934b75d054
k8s.io/api v0.19.0
k8s.io/apimachinery v0.19.0
k8s.io/code-generator v0.19.0
k8s.io/api v0.19.2
k8s.io/apimachinery v0.19.2
k8s.io/code-generator v0.19.2
k8s.io/klog/v2 v2.2.0
)

View File

@@ -104,8 +104,8 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
github.com/onsi/ginkgo v1.11.0/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/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/openshift/build-machinery-go v0.0.0-20200819073603-48aa266c95f7 h1:mOq7Mg1Q9d7nIDxe1SJ6pluMBQsbVxa6olyAGmfYWTg=
github.com/openshift/build-machinery-go v0.0.0-20200819073603-48aa266c95f7/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab h1:lBrojddP6C9C2p67EMs2vcdpC8eF+H0DDom+fgI2IF0=
github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -214,12 +214,12 @@ gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
k8s.io/api v0.19.0 h1:XyrFIJqTYZJ2DU7FBE/bSPz7b1HvbVBuBf07oeo6eTc=
k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw=
k8s.io/apimachinery v0.19.0 h1:gjKnAda/HZp5k4xQYjL0K/Yb66IvNqjthCb03QlKpaQ=
k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/code-generator v0.19.0 h1:r0BxYnttP/r8uyKd4+Njg0B57kKi8wLvwEzaaVy3iZ8=
k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms=
k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI=
k8s.io/apimachinery v0.19.2 h1:5Gy9vQpAGTKHPVOh5c4plE274X8D/6cuEiTO2zve7tc=
k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
k8s.io/code-generator v0.19.2 h1:7uaWJll6fyCPj2j3sfNN1AiY2gZU1VFN2dFR2uoxGWI=
k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14 h1:t4L10Qfx/p7ASH3gXCdIUtPbbIuegCoUJf3TMSFekjw=
k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=

View File

@@ -36,7 +36,6 @@ spec:
description: ImageRegistrySpec defines the specs for the running registry.
type: object
required:
- logging
- managementState
- replicas
properties:
@@ -652,6 +651,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
logging:
description: logging is deprecated, use logLevel instead.
type: integer
@@ -675,11 +680,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
proxy:
description: proxy defines the proxy to be used when calling master
api, upstream registries, etc.

View File

@@ -656,6 +656,18 @@ spec:
pruning. Defaults to 60m (60 minutes).
type: string
format: duration
logLevel:
description: "logLevel sets the level of log output for the pruner
job. \n Valid values are: \"Normal\", \"Debug\", \"Trace\", \"TraceAll\".
Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
nodeSelector:
description: nodeSelector defines the node selection constraints for
the image pruner pod.

View File

@@ -81,7 +81,8 @@ type ImageRegistrySpec struct {
// replicas determines the number of registry instances to run.
Replicas int32 `json:"replicas"`
// logging is deprecated, use logLevel instead.
Logging int64 `json:"logging"`
// +optional
Logging int64 `json:"logging,omitempty"`
// resources defines the resource requests+limits for the registry pod.
// +optional
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`

View File

@@ -80,6 +80,13 @@ type ImagePrunerSpec struct {
// errors while parsing image references.
// +optional
IgnoreInvalidImageReferences bool `json:"ignoreInvalidImageReferences,omitempty"`
// logLevel sets the level of log output for the pruner job.
//
// Valid values are: "Normal", "Debug", "Trace", "TraceAll".
// Defaults to "Normal".
// +optional
// +kubebuilder:default=Normal
LogLevel operatorv1.LogLevel `json:"logLevel,omitempty"`
}
// ImagePrunerStatus reports image pruner operational status.

View File

@@ -232,6 +232,7 @@ var map_ImagePrunerSpec = map[string]string{
"successfulJobsHistoryLimit": "successfulJobsHistoryLimit specifies how many successful image pruner jobs to retain. Defaults to 3 if not set.",
"failedJobsHistoryLimit": "failedJobsHistoryLimit specifies how many failed image pruner jobs to retain. Defaults to 3 if not set.",
"ignoreInvalidImageReferences": "ignoreInvalidImageReferences indicates whether the pruner can ignore errors while parsing image references.",
"logLevel": "logLevel sets the level of log output for the pruner job.\n\nValid values are: \"Normal\", \"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\".",
}
func (ImagePrunerSpec) SwaggerDoc() map[string]string {

View File

@@ -1,7 +1,6 @@
apiVersion: apiextensions.k8s.io/v1beta1
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
creationTimestamp: null
name: clusternetworks.network.openshift.io
spec:
group: network.openshift.io
@@ -11,103 +10,6 @@ spec:
plural: clusternetworks
singular: clusternetwork
scope: Cluster
validation:
# As compared to ValidateClusterNetwork, this does not validate that:
# - the hostSubnetLengths are valid for their CIDRs
# - the cluster/service networks do not overlap
# - .network and .hostsubnetlength are set if name == 'default'
# - .network and .hostsubnetlength are either unset, or equal to
# .clusterNetworks[0].CIDR and .clusterNetworks[0].hostSubnetLength
openAPIV3Schema:
description: ClusterNetwork describes the cluster network. There is normally
only one object of this type, named "default", which is created by the SDN
network plugin based on the master configuration when the cluster is brought
up for the first time.
type: object
required:
- clusterNetworks
- serviceNetwork
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
clusterNetworks:
description: ClusterNetworks is a list of ClusterNetwork objects that defines
the global overlay network's L3 space by specifying a set of CIDR and
netmasks that the SDN can allocate addresses from.
type: array
items:
description: ClusterNetworkEntry defines an individual cluster network.
The CIDRs cannot overlap with other cluster network CIDRs, CIDRs reserved
for external ips, CIDRs reserved for service networks, and CIDRs reserved
for ingress ips.
type: object
required:
- CIDR
- hostSubnetLength
properties:
CIDR:
description: CIDR defines the total range of a cluster networks address
space.
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
hostSubnetLength:
description: HostSubnetLength is the number of bits of the accompanying
CIDR address to allocate to each node. eg, 8 would mean that each
node would have a /24 slice of the overlay network for its pods.
type: integer
format: int32
maximum: 30
minimum: 2
hostsubnetlength:
description: HostSubnetLength is the number of bits of network to allocate
to each node. eg, 8 would mean that each node would have a /24 slice of
the overlay network for its pods
type: integer
format: int32
maximum: 30
minimum: 2
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
mtu:
description: MTU is the MTU for the overlay network. This should be 50 less
than the MTU of the network connecting the nodes. It is normally autodetected
by the cluster network operator.
type: integer
format: int32
maximum: 65536
minimum: 576
network:
description: Network is a CIDR string specifying the global overlay network's
L3 space
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
pluginName:
description: PluginName is the name of the network plugin being used
type: string
serviceNetwork:
description: ServiceNetwork is the CIDR range that Service IP addresses
are allocated from
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
vxlanPort:
description: VXLANPort sets the VXLAN destination port used by the cluster.
It is set by the master configuration file on startup and cannot be edited
manually. Valid values for VXLANPort are integers 1-65535 inclusive and
if unset defaults to 4789. Changing VXLANPort allows users to resolve
issues between openshift SDN and other software trying to use the same
VXLAN destination port.
type: integer
format: int32
maximum: 65535
minimum: 1
additionalPrinterColumns:
- name: Cluster Network
type: string
@@ -126,6 +28,97 @@ spec:
- name: v1
served: true
storage: true
"schema":
"openAPIV3Schema":
description: ClusterNetwork describes the cluster network. There is normally
only one object of this type, named "default", which is created by the SDN
network plugin based on the master configuration when the cluster is brought
up for the first time.
type: object
required:
- clusterNetworks
- serviceNetwork
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
clusterNetworks:
description: ClusterNetworks is a list of ClusterNetwork objects that
defines the global overlay network's L3 space by specifying a set of
CIDR and netmasks that the SDN can allocate addresses from.
type: array
items:
description: ClusterNetworkEntry defines an individual cluster network.
The CIDRs cannot overlap with other cluster network CIDRs, CIDRs reserved
for external ips, CIDRs reserved for service networks, and CIDRs reserved
for ingress ips.
type: object
required:
- CIDR
- hostSubnetLength
properties:
CIDR:
description: CIDR defines the total range of a cluster networks
address space.
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
hostSubnetLength:
description: HostSubnetLength is the number of bits of the accompanying
CIDR address to allocate to each node. eg, 8 would mean that each
node would have a /24 slice of the overlay network for its pods.
type: integer
format: int32
maximum: 30
minimum: 2
hostsubnetlength:
description: HostSubnetLength is the number of bits of network to allocate
to each node. eg, 8 would mean that each node would have a /24 slice
of the overlay network for its pods
type: integer
format: int32
maximum: 30
minimum: 2
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
mtu:
description: MTU is the MTU for the overlay network. This should be 50
less than the MTU of the network connecting the nodes. It is normally
autodetected by the cluster network operator.
type: integer
format: int32
maximum: 65536
minimum: 576
network:
description: Network is a CIDR string specifying the global overlay network's
L3 space
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
pluginName:
description: PluginName is the name of the network plugin being used
type: string
serviceNetwork:
description: ServiceNetwork is the CIDR range that Service IP addresses
are allocated from
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
vxlanPort:
description: VXLANPort sets the VXLAN destination port used by the cluster.
It is set by the master configuration file on startup and cannot be
edited manually. Valid values for VXLANPort are integers 1-65535 inclusive
and if unset defaults to 4789. Changing VXLANPort allows users to resolve
issues between openshift SDN and other software trying to use the same
VXLAN destination port.
type: integer
format: int32
maximum: 65535
minimum: 1
status:
acceptedNames:
kind: ""

View File

@@ -1,7 +1,6 @@
apiVersion: apiextensions.k8s.io/v1beta1
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
creationTimestamp: null
name: hostsubnets.network.openshift.io
spec:
group: network.openshift.io
@@ -11,70 +10,6 @@ spec:
plural: hostsubnets
singular: hostsubnet
scope: Cluster
validation:
# As compared to ValidateHostSubnet, this does not validate that:
# - .host == .name
# - either .subnet is set or the assign-subnet annotation is present
# As compared to ValidateHostSubnetUpdate, this does not validate that:
# - .subnet is not changed on an existing object
openAPIV3Schema:
description: HostSubnet describes the container subnet network on a node. The
HostSubnet object must have the same name as the Node object it corresponds
to.
type: object
required:
- host
- hostIP
- subnet
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
egressCIDRs:
description: EgressCIDRs is the list of CIDR ranges available for automatically
assigning egress IPs to this node from. If this field is set then EgressIPs
should be treated as read-only.
type: array
items:
description: HostSubnetEgressCIDR represents one egress CIDR from which
to assign IP addresses for this node represented by the HostSubnet
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
egressIPs:
description: EgressIPs is the list of automatic egress IP addresses currently
hosted by this node. If EgressCIDRs is empty, this can be set by hand;
if EgressCIDRs is set then the master will overwrite the value here with
its own allocation of egress IPs.
type: array
items:
description: HostSubnetEgressIP represents one egress IP address currently
hosted on the node represented by HostSubnet
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
host:
description: Host is the name of the node. (This is the same as the object's
name, but both fields must be set.)
type: string
pattern: ^[a-z0-9.-]+$
hostIP:
description: HostIP is the IP address to be used as a VTEP by other nodes
in the overlay network
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
subnet:
description: Subnet is the CIDR range of the overlay network assigned to
the node for its pods
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
additionalPrinterColumns:
- name: Host
type: string
@@ -103,6 +38,65 @@ spec:
- name: v1
served: true
storage: true
"schema":
"openAPIV3Schema":
description: HostSubnet describes the container subnet network on a node.
The HostSubnet object must have the same name as the Node object it corresponds
to.
type: object
required:
- host
- hostIP
- subnet
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
egressCIDRs:
description: EgressCIDRs is the list of CIDR ranges available for automatically
assigning egress IPs to this node from. If this field is set then EgressIPs
should be treated as read-only.
type: array
items:
description: HostSubnetEgressCIDR represents one egress CIDR from which
to assign IP addresses for this node represented by the HostSubnet
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
egressIPs:
description: EgressIPs is the list of automatic egress IP addresses currently
hosted by this node. If EgressCIDRs is empty, this can be set by hand;
if EgressCIDRs is set then the master will overwrite the value here
with its own allocation of egress IPs.
type: array
items:
description: HostSubnetEgressIP represents one egress IP address currently
hosted on the node represented by HostSubnet
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
host:
description: Host is the name of the node. (This is the same as the object's
name, but both fields must be set.)
type: string
pattern: ^[a-z0-9.-]+$
hostIP:
description: HostIP is the IP address to be used as a VTEP by other nodes
in the overlay network
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
subnet:
description: Subnet is the CIDR range of the overlay network assigned
to the node for its pods
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
status:
acceptedNames:
kind: ""

View File

@@ -1,7 +1,6 @@
apiVersion: apiextensions.k8s.io/v1beta1
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
creationTimestamp: null
name: netnamespaces.network.openshift.io
spec:
group: network.openshift.io
@@ -11,56 +10,6 @@ spec:
plural: netnamespaces
singular: netnamespace
scope: Cluster
validation:
# As compared to ValidateNetNamespace, this does not validate that:
# - .netname == .name
# - .netid is not 1-9
openAPIV3Schema:
description: NetNamespace describes a single isolated network. When using the
redhat/openshift-ovs-multitenant plugin, every Namespace will have a corresponding
NetNamespace object with the same name. (When using redhat/openshift-ovs-subnet,
NetNamespaces are not used.)
type: object
required:
- netid
- netname
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
egressIPs:
description: EgressIPs is a list of reserved IPs that will be used as the
source for external traffic coming from pods in this namespace. (If empty,
external traffic will be masqueraded to Node IPs.)
type: array
items:
description: NetNamespaceEgressIP is a single egress IP out of a list
of reserved IPs used as source of external traffic coming from pods
in this namespace
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
netid:
description: NetID is the network identifier of the network namespace assigned
to each overlay network packet. This can be manipulated with the "oc adm
pod-network" commands.
type: integer
format: int32
maximum: 16777215
minimum: 0
netname:
description: NetName is the name of the network namespace. (This is the
same as the object's name, but both fields must be set.)
type: string
pattern: ^[a-z0-9.-]+$
additionalPrinterColumns:
- name: NetID
type: integer
@@ -75,6 +24,53 @@ spec:
- name: v1
served: true
storage: true
"schema":
"openAPIV3Schema":
description: NetNamespace describes a single isolated network. When using
the redhat/openshift-ovs-multitenant plugin, every Namespace will have a
corresponding NetNamespace object with the same name. (When using redhat/openshift-ovs-subnet,
NetNamespaces are not used.)
type: object
required:
- netid
- netname
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
egressIPs:
description: EgressIPs is a list of reserved IPs that will be used as
the source for external traffic coming from pods in this namespace.
(If empty, external traffic will be masqueraded to Node IPs.)
type: array
items:
description: NetNamespaceEgressIP is a single egress IP out of a list
of reserved IPs used as source of external traffic coming from pods
in this namespace
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
netid:
description: NetID is the network identifier of the network namespace
assigned to each overlay network packet. This can be manipulated with
the "oc adm pod-network" commands.
type: integer
format: int32
maximum: 16777215
minimum: 0
netname:
description: NetName is the name of the network namespace. (This is the
same as the object's name, but both fields must be set.)
type: string
pattern: ^[a-z0-9.-]+$
status:
acceptedNames:
kind: ""

View File

@@ -1,7 +1,6 @@
apiVersion: apiextensions.k8s.io/v1beta1
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
creationTimestamp: null
name: egressnetworkpolicies.network.openshift.io
spec:
group: network.openshift.io
@@ -11,75 +10,75 @@ spec:
plural: egressnetworkpolicies
singular: egressnetworkpolicy
scope: Namespaced
validation:
# This should be mostly equivalent to ValidateEgressNetworkPolicy
openAPIV3Schema:
description: EgressNetworkPolicy describes the current egress network policy
for a Namespace. When using the 'redhat/openshift-ovs-multitenant' network
plugin, traffic from a pod to an IP address outside the cluster will be checked
against each EgressNetworkPolicyRule in the pod's namespace's EgressNetworkPolicy,
in order. If no rule matches (or no EgressNetworkPolicy is present) then the
traffic will be allowed by default.
type: object
required:
- spec
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: spec is the specification of the current egress network policy
type: object
required:
- egress
properties:
egress:
description: egress contains the list of egress policy rules
type: array
items:
description: EgressNetworkPolicyRule contains a single egress network
policy rule
type: object
required:
- to
- type
properties:
to:
description: to is the target that traffic is allowed/denied to
type: object
properties:
cidrSelector:
description: CIDRSelector is the CIDR range to allow/deny
traffic to. If this is set, dnsName must be unset Ideally
we would have liked to use the cidr openapi format for this
property. But openshift-sdn only supports v4 while specifying
the cidr format allows both v4 and v6 cidrs We are therefore
using a regex pattern to validate instead.
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
dnsName:
description: DNSName is the domain name to allow/deny traffic
to. If this is set, cidrSelector must be unset
type: string
pattern: ^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$
type:
description: type marks this as an "Allow" or "Deny" rule
type: string
pattern: ^Allow|Deny$
version: v1
versions:
- name: v1
served: true
storage: true
"schema":
"openAPIV3Schema":
description: EgressNetworkPolicy describes the current egress network policy
for a Namespace. When using the 'redhat/openshift-ovs-multitenant' network
plugin, traffic from a pod to an IP address outside the cluster will be
checked against each EgressNetworkPolicyRule in the pod's namespace's EgressNetworkPolicy,
in order. If no rule matches (or no EgressNetworkPolicy is present) then
the traffic will be allowed by default.
type: object
required:
- spec
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: spec is the specification of the current egress network policy
type: object
required:
- egress
properties:
egress:
description: egress contains the list of egress policy rules
type: array
items:
description: EgressNetworkPolicyRule contains a single egress network
policy rule
type: object
required:
- to
- type
properties:
to:
description: to is the target that traffic is allowed/denied
to
type: object
properties:
cidrSelector:
description: CIDRSelector is the CIDR range to allow/deny
traffic to. If this is set, dnsName must be unset Ideally
we would have liked to use the cidr openapi format for
this property. But openshift-sdn only supports v4 while
specifying the cidr format allows both v4 and v6 cidrs
We are therefore using a regex pattern to validate instead.
type: string
pattern: ^(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/([0-9]|[12][0-9]|3[0-2])$
dnsName:
description: DNSName is the domain name to allow/deny traffic
to. If this is set, cidrSelector must be unset
type: string
pattern: ^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$
type:
description: type marks this as an "Allow" or "Deny" rule
type: string
pattern: ^Allow|Deny$
status:
acceptedNames:
kind: ""

View File

@@ -51,6 +51,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -64,11 +70,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -63,6 +63,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -76,11 +82,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
succeededRevisionLimit:
description: succeededRevisionLimit is the number of successful static
pod installer revisions to keep on disk and in the api -1 = unlimited,

View File

@@ -54,6 +54,12 @@ spec:
to manage coarse grained logging choices that operators have to
interpret for their operands. \n Valid values are: \"Normal\", \"Debug\",
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
managementState:
description: managementState indicates whether and how the operator
@@ -68,10 +74,18 @@ spec:
type: object
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
default: Normal
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
succeededRevisionLimit:
description: succeededRevisionLimit is the number of successful static

View File

@@ -56,6 +56,12 @@ spec:
to manage coarse grained logging choices that operators have to
interpret for their operands. \n Valid values are: \"Normal\", \"Debug\",
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
managementState:
description: managementState indicates whether and how the operator
@@ -70,10 +76,18 @@ spec:
type: object
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
default: Normal
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
succeededRevisionLimit:
description: succeededRevisionLimit is the number of successful static

View File

@@ -56,6 +56,12 @@ spec:
to manage coarse grained logging choices that operators have to
interpret for their operands. \n Valid values are: \"Normal\", \"Debug\",
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
managementState:
description: managementState indicates whether and how the operator
@@ -70,10 +76,18 @@ spec:
type: object
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
default: Normal
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
succeededRevisionLimit:
description: succeededRevisionLimit is the number of successful static

View File

@@ -52,6 +52,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -65,11 +71,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -62,6 +62,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -75,11 +81,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -49,6 +49,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -62,11 +68,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -48,6 +48,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -61,11 +67,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -50,6 +50,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -63,11 +69,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -49,6 +49,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -62,11 +68,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -11,7 +11,7 @@ spec:
listKind: IngressControllerList
plural: ingresscontrollers
singular: ingresscontroller
scope: Cluster
scope: Namespaced
versions:
- name: v1
schema:
@@ -1031,4 +1031,8 @@ spec:
served: true
storage: true
subresources:
scale:
labelSelectorPath: .status.selector
specReplicasPath: .spec.replicas
statusReplicasPath: .status.availableReplicas
status: {}

View File

@@ -7,6 +7,11 @@ metadata:
spec:
scope: Cluster
group: operator.openshift.io
names:
kind: ServiceCA
listKind: ServiceCAList
plural: servicecas
singular: serviceca
versions:
- name: v1
served: true
@@ -38,11 +43,19 @@ spec:
type: object
properties:
logLevel:
description: logLevel is an intent based logging for an overall component. It
does not give fine grained control, but it is a simple way to manage
coarse grained logging choices that operators have to interpret
for their operands.
description: "logLevel is an intent based logging for an overall component.
\ It does not give fine grained control, but it is a simple way
to manage coarse grained logging choices that operators have to
interpret for their operands. \n Valid values are: \"Normal\", \"Debug\",
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -56,11 +69,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -353,7 +353,10 @@ spec:
description: The address to "bind" on Defaults to 0.0.0.0
type: string
iptablesSyncPeriod:
description: 'The period that iptables rules are refreshed. Default:
description: 'An internal kube-proxy parameter. In older releases
of OCP, this sometimes needed to be adjusted in large clusters
for performance reasons, but this is no longer necessary, and
there is no reason to change this from the default value. Default:
30s'
type: string
proxyArguments:
@@ -367,11 +370,20 @@ spec:
items:
type: string
logLevel:
description: logLevel allows configuring the logging level of the
description: "logLevel allows configuring the logging level of the
components deployed by the operator. Currently only Kuryr SDN is
affected by this setting. Please note that turning on extensive
logging may affect performance. The default value is "Normal".
logging may affect performance. The default value is \"Normal\".
\n Valid values are: \"Normal\", \"Debug\", \"Trace\", \"TraceAll\".
Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
serviceNetwork:
description: serviceNetwork is the ip address pool to use for Service
IPs Currently, all existing network providers only support a single

View File

@@ -95,6 +95,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -108,11 +114,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
providers:
description: providers contains configuration for using specific service
providers.

View File

@@ -49,6 +49,12 @@ spec:
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
managementState:
description: managementState indicates whether and how the operator
should manage the component
@@ -62,11 +68,19 @@ spec:
nullable: true
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
type: string
default: Normal
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that
will override any previously set options. It only needs to be the

View File

@@ -35,6 +35,7 @@ spec:
name:
enum:
- ebs.csi.aws.com
- cinder.csi.openstack.org
- manila.csi.openstack.org
- csi.ovirt.org
type: string
@@ -49,6 +50,12 @@ spec:
to manage coarse grained logging choices that operators have to
interpret for their operands. \n Valid values are: \"Normal\", \"Debug\",
\"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
managementState:
description: managementState indicates whether and how the operator
@@ -63,10 +70,18 @@ spec:
type: object
x-kubernetes-preserve-unknown-fields: true
operatorLogLevel:
description: operatorLogLevel is an intent based logging for the operator
itself. It does not give fine grained control, but it is a simple
way to manage coarse grained logging choices that operators have
to interpret for themselves.
default: Normal
description: "operatorLogLevel is an intent based logging for the
operator itself. It does not give fine grained control, but it
is a simple way to manage coarse grained logging choices that operators
have to interpret for themselves. \n Valid values are: \"Normal\",
\"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\"."
enum:
- ""
- Normal
- Debug
- Trace
- TraceAll
type: string
unsupportedConfigOverrides:
description: 'unsupportedConfigOverrides holds a sparse config that

View File

@@ -5,5 +5,6 @@
type: string
enum:
- ebs.csi.aws.com
- cinder.csi.openstack.org
- manila.csi.openstack.org
- csi.ovirt.org

View File

@@ -56,12 +56,16 @@ type OperatorSpec struct {
// Defaults to "Normal".
// +optional
// +kubebuilder:default=Normal
LogLevel LogLevel `json:"logLevel"`
LogLevel LogLevel `json:"logLevel,omitempty"`
// operatorLogLevel is an intent based logging for the operator itself. It does not give fine grained control, but it is a
// simple way to manage coarse grained logging choices that operators have to interpret for themselves.
//
// Valid values are: "Normal", "Debug", "Trace", "TraceAll".
// Defaults to "Normal".
// +optional
OperatorLogLevel LogLevel `json:"operatorLogLevel"`
// +kubebuilder:default=Normal
OperatorLogLevel LogLevel `json:"operatorLogLevel,omitempty"`
// unsupportedConfigOverrides holds a sparse config that will override any previously set options. It only needs to be the fields to override
// it will end up overlaying in the following order:
@@ -81,6 +85,7 @@ type OperatorSpec struct {
ObservedConfig runtime.RawExtension `json:"observedConfig"`
}
// +kubebuilder:validation:Enum="";Normal;Debug;Trace;TraceAll
type LogLevel string
var (

View File

@@ -41,6 +41,7 @@ type CSIDriverName string
// and 0000_90_cluster_csi_driver_01_config.crd.yaml-merge-patch file is also updated with new driver name.
const (
AWSEBSCSIDriver CSIDriverName = "ebs.csi.aws.com"
CinderCSIDriver CSIDriverName = "cinder.csi.openstack.org"
ManilaCSIDriver CSIDriverName = "manila.csi.openstack.org"
OvirtCSIDriver CSIDriverName = "csi.ovirt.org"
)

View File

@@ -74,8 +74,12 @@ type NetworkSpec struct {
// by the operator. Currently only Kuryr SDN is affected by this setting.
// Please note that turning on extensive logging may affect performance.
// The default value is "Normal".
//
// Valid values are: "Normal", "Debug", "Trace", "TraceAll".
// Defaults to "Normal".
// +optional
LogLevel LogLevel `json:"logLevel"`
// +kubebuilder:default=Normal
LogLevel LogLevel `json:"logLevel,omitempty"`
}
// ClusterNetworkEntry is a subnet from which to allocate PodIPs. A network of size
@@ -337,7 +341,9 @@ type ProxyArgumentList []string
// ProxyConfig defines the configuration knobs for kubeproxy
// All of these are optional and have sensible defaults
type ProxyConfig struct {
// The period that iptables rules are refreshed.
// An internal kube-proxy parameter. In older releases of OCP, this sometimes needed to be adjusted
// in large clusters for performance reasons, but this is no longer necessary, and there is no reason
// to change this from the default value.
// Default: 30s
IptablesSyncPeriod string `json:"iptablesSyncPeriod,omitempty"`

View File

@@ -58,7 +58,7 @@ var map_OperatorSpec = map[string]string{
"": "OperatorSpec contains common fields operators need. It is intended to be anonymous included inside of the Spec struct for your particular operator.",
"managementState": "managementState indicates whether and how the operator should manage the component",
"logLevel": "logLevel is an intent based logging for an overall component. It does not give fine grained control, but it is a simple way to manage coarse grained logging choices that operators have to interpret for their operands.\n\nValid values are: \"Normal\", \"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\".",
"operatorLogLevel": "operatorLogLevel is an intent based logging for the operator itself. It does not give fine grained control, but it is a simple way to manage coarse grained logging choices that operators have to interpret for themselves.",
"operatorLogLevel": "operatorLogLevel is an intent based logging for the operator itself. It does not give fine grained control, but it is a simple way to manage coarse grained logging choices that operators have to interpret for themselves.\n\nValid values are: \"Normal\", \"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\".",
"unsupportedConfigOverrides": "unsupportedConfigOverrides holds a sparse config that will override any previously set options. It only needs to be the fields to override it will end up overlaying in the following order: 1. hardcoded defaults 2. observedConfig 3. unsupportedConfigOverrides",
"observedConfig": "observedConfig holds a sparse config that controller has observed from the cluster state. It exists in spec because it is an input to the level for the operator",
}
@@ -794,7 +794,7 @@ var map_NetworkSpec = map[string]string{
"disableMultiNetwork": "disableMultiNetwork specifies whether or not multiple pod network support should be disabled. If unset, this property defaults to 'false' and multiple network support is enabled.",
"deployKubeProxy": "deployKubeProxy specifies whether or not a standalone kube-proxy should be deployed by the operator. Some network providers include kube-proxy or similar functionality. If unset, the plugin will attempt to select the correct value, which is false when OpenShift SDN and ovn-kubernetes are used and true otherwise.",
"kubeProxyConfig": "kubeProxyConfig lets us configure desired proxy configuration. If not specified, sensible defaults will be chosen by OpenShift directly. Not consumed by all network providers - currently only openshift-sdn.",
"logLevel": "logLevel allows configuring the logging level of the components deployed by the operator. Currently only Kuryr SDN is affected by this setting. Please note that turning on extensive logging may affect performance. The default value is \"Normal\".",
"logLevel": "logLevel allows configuring the logging level of the components deployed by the operator. Currently only Kuryr SDN is affected by this setting. Please note that turning on extensive logging may affect performance. The default value is \"Normal\".\n\nValid values are: \"Normal\", \"Debug\", \"Trace\", \"TraceAll\". Defaults to \"Normal\".",
}
func (NetworkSpec) SwaggerDoc() map[string]string {
@@ -835,7 +835,7 @@ func (OpenShiftSDNConfig) SwaggerDoc() map[string]string {
var map_ProxyConfig = map[string]string{
"": "ProxyConfig defines the configuration knobs for kubeproxy All of these are optional and have sensible defaults",
"iptablesSyncPeriod": "The period that iptables rules are refreshed. Default: 30s",
"iptablesSyncPeriod": "An internal kube-proxy parameter. In older releases of OCP, this sometimes needed to be adjusted in large clusters for performance reasons, but this is no longer necessary, and there is no reason to change this from the default value. Default: 30s",
"bindAddress": "The address to \"bind\" on Defaults to 0.0.0.0",
"proxyArguments": "Any additional arguments to pass to the kubeproxy process",
}

View File

@@ -1,9 +1,8 @@
apiVersion: apiextensions.k8s.io/v1beta1
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
include.release.openshift.io/self-managed-high-availability: "true"
creationTimestamp: null
name: podnetworkconnectivitychecks.controlplane.operator.openshift.io
spec:
group: controlplane.operator.openshift.io
@@ -12,255 +11,248 @@ spec:
listKind: PodNetworkConnectivityCheckList
plural: podnetworkconnectivitychecks
singular: podnetworkconnectivitycheck
scope: ""
subresources:
status: {}
validation:
openAPIV3Schema:
description: PodNetworkConnectivityCheck
type: object
required:
- spec
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: Spec defines the source and target of the connectivity check
type: object
required:
- sourcePod
- targetEndpoint
properties:
sourcePod:
description: SourcePod names the pod from which the condition will be
checked
type: string
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
targetEndpoint:
description: EndpointAddress to check. A TCP address of the form host:port.
Note that if host is a DNS name, then the check would fail if the
DNS name cannot be resolved. Specify an IP address for host to bypass
DNS name lookup.
type: string
pattern: ^\S+:\d*$
tlsClientCert:
description: TLSClientCert, if specified, references a kubernetes.io/tls
type secret with 'tls.crt' and 'tls.key' entries containing an optional
TLS client certificate and key to be used when checking endpoints
that require a client certificate in order to gracefully preform the
scan without causing excessive logging in the endpoint process. The
secret must exist in the same namespace as this resource.
type: object
required:
- name
properties:
name:
description: name is the metadata.name of the referenced secret
type: string
status:
description: Status contains the observed status of the connectivity check
type: object
properties:
conditions:
description: Conditions summarize the status of the check
type: array
items:
description: PodNetworkConnectivityCheckCondition represents the overall
status of the pod network connectivity.
type: object
required:
- lastTransitionTime
- status
- type
properties:
lastTransitionTime:
description: Last time the condition transitioned from one status
to another.
type: string
format: date-time
nullable: true
message:
description: Message indicating details about last transition
in a human readable format.
type: string
reason:
description: Reason for the condition's last status transition
in a machine readable format.
type: string
status:
description: Status of the condition
type: string
type:
description: Type of the condition
type: string
failures:
description: Failures contains logs of unsuccessful check actions
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned in
the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates a success
or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true
outages:
description: Outages contains logs of time periods of outages
type: array
items:
description: OutageEntry records time period of an outage
type: object
required:
- start
properties:
end:
description: End of outage detected
type: string
format: date-time
nullable: true
endLogs:
description: EndLogs contains log entries related to the end of
this outage. Should contain the success entry that resolved
the outage and possibly a few of the failure log entries that
preceded it.
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned
in the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable
format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates
a success or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true
message:
description: Message summarizes outage details in a human readable
format.
type: string
start:
description: Start of outage detected
type: string
format: date-time
nullable: true
startLogs:
description: StartLogs contains log entries related to the start
of this outage. Should contain the original failure, any entries
where the failure mode changed.
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned
in the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable
format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates
a success or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true
successes:
description: Successes contains logs successful check actions
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned in
the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates a success
or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true
version: v1alpha1
scope: Namespaced
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
subresources:
status: {}
schema:
openAPIV3Schema:
description: PodNetworkConnectivityCheck
type: object
required:
- spec
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: Spec defines the source and target of the connectivity check
type: object
required:
- sourcePod
- targetEndpoint
properties:
sourcePod:
description: SourcePod names the pod from which the condition will
be checked
type: string
pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
targetEndpoint:
description: EndpointAddress to check. A TCP address of the form host:port.
Note that if host is a DNS name, then the check would fail if the
DNS name cannot be resolved. Specify an IP address for host to bypass
DNS name lookup.
type: string
pattern: ^\S+:\d*$
tlsClientCert:
description: TLSClientCert, if specified, references a kubernetes.io/tls
type secret with 'tls.crt' and 'tls.key' entries containing an optional
TLS client certificate and key to be used when checking endpoints
that require a client certificate in order to gracefully preform
the scan without causing excessive logging in the endpoint process.
The secret must exist in the same namespace as this resource.
type: object
required:
- name
properties:
name:
description: name is the metadata.name of the referenced secret
type: string
status:
description: Status contains the observed status of the connectivity check
type: object
properties:
conditions:
description: Conditions summarize the status of the check
type: array
items:
description: PodNetworkConnectivityCheckCondition represents the
overall status of the pod network connectivity.
type: object
required:
- lastTransitionTime
- status
- type
properties:
lastTransitionTime:
description: Last time the condition transitioned from one status
to another.
type: string
format: date-time
nullable: true
message:
description: Message indicating details about last transition
in a human readable format.
type: string
reason:
description: Reason for the condition's last status transition
in a machine readable format.
type: string
status:
description: Status of the condition
type: string
type:
description: Type of the condition
type: string
failures:
description: Failures contains logs of unsuccessful check actions
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned in
the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates a
success or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true
outages:
description: Outages contains logs of time periods of outages
type: array
items:
description: OutageEntry records time period of an outage
type: object
required:
- start
properties:
end:
description: End of outage detected
type: string
format: date-time
nullable: true
endLogs:
description: EndLogs contains log entries related to the end
of this outage. Should contain the success entry that resolved
the outage and possibly a few of the failure log entries that
preceded it.
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned
in the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable
format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates
a success or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true
message:
description: Message summarizes outage details in a human readable
format.
type: string
start:
description: Start of outage detected
type: string
format: date-time
nullable: true
startLogs:
description: StartLogs contains log entries related to the start
of this outage. Should contain the original failure, any entries
where the failure mode changed.
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned
in the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable
format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates
a success or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true
successes:
description: Successes contains logs successful check actions
type: array
items:
description: LogEntry records events
type: object
required:
- success
- time
properties:
latency:
description: Latency records how long the action mentioned in
the entry took.
type: string
nullable: true
message:
description: Message explaining status in a human readable format.
type: string
reason:
description: Reason for status in a machine readable format.
type: string
success:
description: Success indicates if the log entry indicates a
success or failure.
type: boolean
time:
description: Start time of check action.
type: string
format: date-time
nullable: true

View File

@@ -212,6 +212,10 @@ message RouterShard {
// TLSConfig defines config used to secure a route and provide termination
message TLSConfig {
// termination indicates termination type.
//
// * edge - TLS termination is done by the router and http is used to communicate with the backend (default)
// * passthrough - Traffic is sent straight to the destination without the router providing TLS termination
// * reencrypt - TLS termination is done by the router and https is used to communicate with the backend
optional string termination = 1;
// certificate provides certificate contents

View File

@@ -212,6 +212,10 @@ type RouterShard struct {
// TLSConfig defines config used to secure a route and provide termination
type TLSConfig struct {
// termination indicates termination type.
//
// * edge - TLS termination is done by the router and http is used to communicate with the backend (default)
// * passthrough - Traffic is sent straight to the destination without the router providing TLS termination
// * reencrypt - TLS termination is done by the router and https is used to communicate with the backend
Termination TLSTerminationType `json:"termination" protobuf:"bytes,1,opt,name=termination,casttype=TLSTerminationType"`
// certificate provides certificate contents

View File

@@ -113,7 +113,7 @@ func (RouterShard) SwaggerDoc() map[string]string {
var map_TLSConfig = map[string]string{
"": "TLSConfig defines config used to secure a route and provide termination",
"termination": "termination indicates termination type.",
"termination": "termination indicates termination type.\n\n* edge - TLS termination is done by the router and http is used to communicate with the backend (default) * passthrough - Traffic is sent straight to the destination without the router providing TLS termination * reencrypt - TLS termination is done by the router and https is used to communicate with the backend",
"certificate": "certificate provides certificate contents",
"key": "key provides key file contents",
"caCertificate": "caCertificate provides the cert authority certificate contents",

View File

@@ -51,7 +51,7 @@ update-codegen-crds: update-codegen-crds-$(1)
verify-codegen-crds-$(1): VERIFY_CODEGEN_CRD_TMP_DIR:=$$(shell mktemp -d)
verify-codegen-crds-$(1): ensure-controller-gen ensure-yq ensure-yaml-patch
$(call run-crd-gen,$(2),$(3),$$(VERIFY_CODEGEN_CRD_TMP_DIR))
$$(foreach p,$$(wildcard $(3)/*crd.yaml),$$(call diff-file,$$(p),$$(subst $(3),$$(VERIFY_CODEGEN_CRD_TMP_DIR),$$(p))))
$$(foreach p,$$(wildcard $(4)/*crd.yaml),$$(call diff-file,$$(p),$$(subst $(4),$$(VERIFY_CODEGEN_CRD_TMP_DIR),$$(p))))
.PHONY: verify-codegen-crds-$(1)
verify-codegen-crds: verify-codegen-crds-$(1)

View File

@@ -2,14 +2,12 @@ package client
import (
"io/ioutil"
"net"
"net/http"
"time"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"net/http"
configv1 "github.com/openshift/api/config/v1"
"github.com/openshift/library-go/pkg/network"
)
// GetKubeConfigOrInClusterConfig loads in-cluster config if kubeConfigFile is empty or the file if not,
@@ -101,10 +99,7 @@ func (c ClientTransportOverrides) DefaultClientTransport(rt http.RoundTripper) h
return rt
}
transport.DialContext = (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext
transport.DialContext = network.DefaultClientDialContext()
// Hold open more internal idle connections
transport.MaxIdleConnsPerHost = 100

View File

@@ -62,6 +62,18 @@ func (s *scheduledJob) Run() {
s.queue.Add(DefaultQueueKey)
}
func waitForNamedCacheSync(controllerName string, stopCh <-chan struct{}, cacheSyncs ...cache.InformerSynced) error {
klog.Infof("Waiting for caches to sync for %s", controllerName)
if !cache.WaitForCacheSync(stopCh, cacheSyncs...) {
return fmt.Errorf("unable to sync caches for %s", controllerName)
}
klog.Infof("Caches are synced for %s ", controllerName)
return nil
}
func (c *baseController) Run(ctx context.Context, workers int) {
// HandleCrash recovers panics
defer utilruntime.HandleCrash()
@@ -69,12 +81,19 @@ func (c *baseController) Run(ctx context.Context, workers int) {
// give caches 10 minutes to sync
cacheSyncCtx, cacheSyncCancel := context.WithTimeout(ctx, c.cacheSyncTimeout)
defer cacheSyncCancel()
if !cache.WaitForNamedCacheSync(c.name, cacheSyncCtx.Done(), c.cachesToSync...) {
// the parent context is closed, it means we are shutting down, do not call panic()
if ctx.Err() != nil {
err := waitForNamedCacheSync(c.name, cacheSyncCtx.Done(), c.cachesToSync...)
if err != nil {
select {
case <-ctx.Done():
// Exit gracefully because the controller was requested to stop.
return
default:
// If caches did not sync after 10 minutes, it has taken oddly long and
// we should provide feedback. Since the control loops will never start,
// it is safer to exit with a good message than to continue with a dead loop.
// TODO: Consider making this behavior configurable.
klog.Exit(err)
}
panic("failed to wait for cache to sync")
}
var workerWg sync.WaitGroup

View File

@@ -44,62 +44,66 @@ func (c syncContext) Recorder() events.Recorder {
return c.eventRecorder
}
func (c syncContext) isInterestingNamespace(obj interface{}, interestingNamespaces sets.String) (bool, bool) {
ns, ok := obj.(*corev1.Namespace)
if !ok {
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
if ok {
if ns, ok := tombstone.Obj.(*corev1.Namespace); ok {
return true, interestingNamespaces.Has(ns.Name)
}
}
return false, false
}
return true, interestingNamespaces.Has(ns.Name)
}
// eventHandler provides default event handler that is added to an informers passed to controller factory.
func (c syncContext) eventHandler(queueKeyFunc ObjectQueueKeyFunc, interestingNamespaces sets.String) cache.ResourceEventHandler {
return cache.ResourceEventHandlerFuncs{
func (c syncContext) eventHandler(queueKeyFunc ObjectQueueKeyFunc, filter EventFilterFunc) cache.ResourceEventHandler {
resourceEventHandler := cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
isNamespace, isInteresting := c.isInterestingNamespace(obj, interestingNamespaces)
runtimeObj, ok := obj.(runtime.Object)
if !ok {
utilruntime.HandleError(fmt.Errorf("added object %+v is not runtime Object", obj))
return
}
if !isNamespace || (isNamespace && isInteresting) {
c.Queue().Add(queueKeyFunc(runtimeObj))
}
c.Queue().Add(queueKeyFunc(runtimeObj))
},
UpdateFunc: func(old, new interface{}) {
isNamespace, isInteresting := c.isInterestingNamespace(new, interestingNamespaces)
runtimeObj, ok := new.(runtime.Object)
if !ok {
utilruntime.HandleError(fmt.Errorf("updated object %+v is not runtime Object", runtimeObj))
return
}
if !isNamespace || (isNamespace && isInteresting) {
c.Queue().Add(queueKeyFunc(runtimeObj))
}
c.Queue().Add(queueKeyFunc(runtimeObj))
},
DeleteFunc: func(obj interface{}) {
isNamespace, isInteresting := c.isInterestingNamespace(obj, interestingNamespaces)
runtimeObj, ok := obj.(runtime.Object)
if !ok {
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
if ok {
if !isNamespace || (isNamespace && isInteresting) {
c.Queue().Add(queueKeyFunc(tombstone.Obj.(runtime.Object)))
}
if tombstone, ok := obj.(cache.DeletedFinalStateUnknown); ok {
c.Queue().Add(queueKeyFunc(tombstone.Obj.(runtime.Object)))
return
}
utilruntime.HandleError(fmt.Errorf("updated object %+v is not runtime Object", runtimeObj))
return
}
if !isNamespace || (isNamespace && isInteresting) {
c.Queue().Add(queueKeyFunc(runtimeObj))
}
c.Queue().Add(queueKeyFunc(runtimeObj))
},
}
if filter == nil {
return resourceEventHandler
}
return cache.FilteringResourceEventHandler{
FilterFunc: filter,
Handler: resourceEventHandler,
}
}
// namespaceChecker returns a function which returns true if an inpuut obj
// (or its tombstone) is a namespace and it matches a name of any namespaces
// that we are interested in
func namespaceChecker(interestingNamespaces []string) func(obj interface{}) bool {
interestingNamespacesSet := sets.NewString(interestingNamespaces...)
return func(obj interface{}) bool {
ns, ok := obj.(*corev1.Namespace)
if ok {
return interestingNamespacesSet.Has(ns.Name)
}
// the object might be getting deleted
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
if ok {
if ns, ok := tombstone.Obj.(*corev1.Namespace); ok {
return interestingNamespacesSet.Has(ns.Name)
}
}
return false
}
}

View File

@@ -26,7 +26,7 @@ type Factory struct {
syncDegradedClient operatorv1helpers.OperatorClient
resyncInterval time.Duration
resyncSchedules []string
informers []Informer
informers []filteredInformers
informerQueueKeys []informersWithQueueKey
bareInformers []Informer
postStartHooks []PostStartHook
@@ -43,15 +43,21 @@ type Informer interface {
}
type namespaceInformer struct {
informer Informer
namespaces sets.String
informer Informer
nsFilter EventFilterFunc
}
type informersWithQueueKey struct {
informers []Informer
filter EventFilterFunc
queueKeyFn ObjectQueueKeyFunc
}
type filteredInformers struct {
informers []Informer
filter EventFilterFunc
}
// PostStartHook specify a function that will run after controller is started.
// The context is cancelled when the controller is asked to shutdown and the post start hook should terminate as well.
// The syncContext allow access to controller queue and event recorder.
@@ -62,6 +68,9 @@ type PostStartHook func(ctx context.Context, syncContext SyncContext) error
// triggers.
type ObjectQueueKeyFunc func(runtime.Object) string
// EventFilterFunc is used to filter informer events to prevent Sync() from being called
type EventFilterFunc func(obj interface{}) bool
// New return new factory instance.
func New() *Factory {
return &Factory{}
@@ -78,7 +87,19 @@ func (f *Factory) WithSync(syncFn SyncFunc) *Factory {
// Pass informers you want to use to react to changes on resources. If informer event is observed, then the Sync() function
// is called.
func (f *Factory) WithInformers(informers ...Informer) *Factory {
f.informers = append(f.informers, informers...)
f.WithFilteredEventsInformers(nil, informers...)
return f
}
// WithFilteredEventsInformers is used to register event handlers and get the caches synchronized functions.
// Pass the informers you want to use to react to changes on resources. If informer event is observed, then the Sync() function
// is called.
// Pass filter to filter out events that should not trigger Sync() call.
func (f *Factory) WithFilteredEventsInformers(filter EventFilterFunc, informers ...Informer) *Factory {
f.informers = append(f.informers, filteredInformers{
informers: informers,
filter: filter,
})
return f
}
@@ -104,6 +125,20 @@ func (f *Factory) WithInformersQueueKeyFunc(queueKeyFn ObjectQueueKeyFunc, infor
return f
}
// WithFilteredEventsInformersQueueKeyFunc is used to register event handlers and get the caches synchronized functions.
// Pass informers you want to use to react to changes on resources. If informer event is observed, then the Sync() function
// is called.
// Pass the queueKeyFn you want to use to transform the informer runtime.Object into string key used by work queue.
// Pass filter to filter out events that should not trigger Sync() call.
func (f *Factory) WithFilteredEventsInformersQueueKeyFunc(queueKeyFn ObjectQueueKeyFunc, filter EventFilterFunc, informers ...Informer) *Factory {
f.informerQueueKeys = append(f.informerQueueKeys, informersWithQueueKey{
informers: informers,
filter: filter,
queueKeyFn: queueKeyFn,
})
return f
}
// WithPostStartHooks allows to register functions that will run asynchronously after the controller is started via Run command.
func (f *Factory) WithPostStartHooks(hooks ...PostStartHook) *Factory {
f.postStartHooks = append(f.postStartHooks, hooks...)
@@ -115,8 +150,8 @@ func (f *Factory) WithPostStartHooks(hooks ...PostStartHook) *Factory {
// Do not use this to register non-namespace informers.
func (f *Factory) WithNamespaceInformer(informer Informer, interestingNamespaces ...string) *Factory {
f.namespaceInformers = append(f.namespaceInformers, &namespaceInformer{
informer: informer,
namespaces: sets.NewString(interestingNamespaces...),
informer: informer,
nsFilter: namespaceChecker(interestingNamespaces),
})
return f
}
@@ -205,16 +240,19 @@ func (f *Factory) ToController(name string, eventRecorder events.Recorder) Contr
for d := range f.informerQueueKeys[i].informers {
informer := f.informerQueueKeys[i].informers[d]
queueKeyFn := f.informerQueueKeys[i].queueKeyFn
informer.AddEventHandler(c.syncContext.(syncContext).eventHandler(queueKeyFn, sets.NewString()))
informer.AddEventHandler(c.syncContext.(syncContext).eventHandler(queueKeyFn, f.informerQueueKeys[i].filter))
c.cachesToSync = append(c.cachesToSync, informer.HasSynced)
}
}
for i := range f.informers {
f.informers[i].AddEventHandler(c.syncContext.(syncContext).eventHandler(func(runtime.Object) string {
return DefaultQueueKey
}, sets.NewString()))
c.cachesToSync = append(c.cachesToSync, f.informers[i].HasSynced)
for d := range f.informers[i].informers {
informer := f.informers[i].informers[d]
informer.AddEventHandler(c.syncContext.(syncContext).eventHandler(func(runtime.Object) string {
return DefaultQueueKey
}, f.informers[i].filter))
c.cachesToSync = append(c.cachesToSync, informer.HasSynced)
}
}
for i := range f.bareInformers {
@@ -224,7 +262,7 @@ func (f *Factory) ToController(name string, eventRecorder events.Recorder) Contr
for i := range f.namespaceInformers {
f.namespaceInformers[i].informer.AddEventHandler(c.syncContext.(syncContext).eventHandler(func(runtime.Object) string {
return DefaultQueueKey
}, f.namespaceInformers[i].namespaces))
}, f.namespaceInformers[i].nsFilter))
c.cachesToSync = append(c.cachesToSync, f.namespaceInformers[i].informer.HasSynced)
}

View File

@@ -0,0 +1,13 @@
package network
import (
"context"
"net"
)
type DialContext func(ctx context.Context, network, address string) (net.Conn, error)
// DefaultDialContext returns a DialContext function from a network dialer with default options sets.
func DefaultClientDialContext() DialContext {
return dialerWithDefaultOptions()
}

View File

@@ -0,0 +1,93 @@
// +build linux
package network
import (
"net"
"os"
"syscall"
"time"
"golang.org/x/sys/unix"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
)
func dialerWithDefaultOptions() DialContext {
nd := &net.Dialer{
// TCP_USER_TIMEOUT does affect the behaviour of connect() which is controlled by this field so we set it to the same value
Timeout: 25 * time.Second,
// KeepAlive must to be set to a negative value to stop std library from applying the default values
// by doing so we ensure that the options we are interested in won't be overwritten
KeepAlive: time.Duration(-1),
Control: func(network, address string, con syscall.RawConn) error {
var errs []error
err := con.Control(func(fd uintptr) {
optionsErr := setDefaultSocketOptions(int(fd))
if optionsErr != nil {
errs = append(errs, optionsErr)
}
})
if err != nil {
errs = append(errs, err)
}
return utilerrors.NewAggregate(errs)
},
}
return nd.DialContext
}
// setDefaultSocketOptions sets custom socket options so that we can detect connections to an unhealthy (dead) peer quickly.
// In particular we set TCP_USER_TIMEOUT that specifies the maximum amount of time that transmitted data may remain
// unacknowledged before TCP will forcibly close the connection.
//
// Note
// TCP_USER_TIMEOUT can't be too low because a single dropped packet might drop the entire connection.
// Ideally it should be set to: TCP_KEEPIDLE + TCP_KEEPINTVL * TCP_KEEPCNT
func setDefaultSocketOptions(fd int) error {
// specifies the maximum amount of time in milliseconds that transmitted data may remain
// unacknowledged before TCP will forcibly close the corresponding connection and return ETIMEDOUT to the application
tcpUserTimeoutInMilliSeconds := int(25 * time.Second / time.Millisecond)
// specifies the interval at which probes are sent in seconds
tcpKeepIntvl := int(roundDuration(5*time.Second, time.Second))
// specifies the threshold for sending the first KEEP ALIVE probe in seconds
tcpKeepIdle := int(roundDuration(2*time.Second, time.Second))
// enable keep-alive probes
if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, 1); err != nil {
return wrapSyscallError("setsockopt", err)
}
if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_USER_TIMEOUT, tcpUserTimeoutInMilliSeconds); err != nil {
return wrapSyscallError("setsockopt", err)
}
if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, tcpKeepIntvl); err != nil {
return wrapSyscallError("setsockopt", err)
}
if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, tcpKeepIdle); err != nil {
return wrapSyscallError("setsockopt", err)
}
return nil
}
// roundDurationUp rounds d to the next multiple of to.
//
// note that it was copied from the std library
func roundDuration(d time.Duration, to time.Duration) time.Duration {
return (d + to - 1) / to
}
// wrapSyscallError takes an error and a syscall name. If the error is
// a syscall.Errno, it wraps it in a os.SyscallError using the syscall name.
//
// note that it was copied from the std library
func wrapSyscallError(name string, err error) error {
if _, ok := err.(syscall.Errno); ok {
err = os.NewSyscallError(name, err)
}
return err
}

View File

@@ -0,0 +1,19 @@
// +build !linux
package network
import (
"net"
"time"
"k8s.io/klog/v2"
)
func dialerWithDefaultOptions() DialContext {
klog.V(2).Info("Creating the default network Dialer (unsupported platform). It may take up to 15 minutes to detect broken connections and establish a new one")
nd := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}
return nd.DialContext
}

View File

@@ -0,0 +1,140 @@
package resourceapply
import (
"context"
"fmt"
"github.com/openshift/library-go/pkg/operator/events"
"github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
admissionregistrationclientv1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1"
"k8s.io/klog/v2"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// ApplyMutatingWebhookConfiguration ensures the form of the specified
// mutatingwebhookconfiguration is present in the API. If it does not exist,
// it will be created. If it does exist, the metadata of the required
// mutatingwebhookconfiguration will be merged with the existing mutatingwebhookconfiguration
// and an update performed if the mutatingwebhookconfiguration spec and metadata differ from
// the previously required spec and metadata based on generation change.
func ApplyMutatingWebhookConfiguration(client admissionregistrationclientv1.MutatingWebhookConfigurationsGetter, recorder events.Recorder,
requiredOriginal *admissionregistrationv1.MutatingWebhookConfiguration, expectedGeneration int64) (*admissionregistrationv1.MutatingWebhookConfiguration, bool, error) {
if requiredOriginal == nil {
return nil, false, fmt.Errorf("Unexpected nil instead of an object")
}
required := requiredOriginal.DeepCopy()
existing, err := client.MutatingWebhookConfigurations().Get(context.TODO(), required.GetName(), metav1.GetOptions{})
if apierrors.IsNotFound(err) {
actual, err := client.MutatingWebhookConfigurations().Create(context.TODO(), required, metav1.CreateOptions{})
reportCreateEvent(recorder, required, err)
if err != nil {
return nil, false, err
}
return actual, true, nil
} else if err != nil {
return nil, false, err
}
modified := resourcemerge.BoolPtr(false)
existingCopy := existing.DeepCopy()
resourcemerge.EnsureObjectMeta(modified, &existingCopy.ObjectMeta, required.ObjectMeta)
if !*modified && existingCopy.GetGeneration() == expectedGeneration {
return existingCopy, false, nil
}
// at this point we know that we're going to perform a write. We're just trying to get the object correct
toWrite := existingCopy // shallow copy so the code reads easier
copyMutatingWebhookCABundle(existing, required)
toWrite.Webhooks = required.Webhooks
klog.V(4).Infof("MutatingWebhookConfiguration %q changes: %v", required.GetNamespace()+"/"+required.GetName(), JSONPatchNoError(existing, toWrite))
actual, err := client.MutatingWebhookConfigurations().Update(context.TODO(), toWrite, metav1.UpdateOptions{})
reportUpdateEvent(recorder, required, err)
if err != nil {
return nil, false, err
}
return actual, *modified || actual.GetGeneration() > existingCopy.GetGeneration(), nil
}
// copyMutatingWebhookCABundle populates webhooks[].clientConfig.caBundle fields from existing resource if it was set before
// and is not set in present. This provides upgrade compatibility with service-ca-bundle operator.
func copyMutatingWebhookCABundle(from, to *admissionregistrationv1.MutatingWebhookConfiguration) {
fromMap := make(map[string]admissionregistrationv1.MutatingWebhook, len(from.Webhooks))
for _, webhook := range from.Webhooks {
fromMap[webhook.Name] = webhook
}
for i, wh := range to.Webhooks {
if existing, ok := fromMap[wh.Name]; ok && wh.ClientConfig.CABundle == nil {
to.Webhooks[i].ClientConfig.CABundle = existing.ClientConfig.CABundle
}
}
}
// ApplyValidatingWebhookConfiguration ensures the form of the specified
// validatingwebhookconfiguration is present in the API. If it does not exist,
// it will be created. If it does exist, the metadata of the required
// validatingwebhookconfiguration will be merged with the existing validatingwebhookconfiguration
// and an update performed if the validatingwebhookconfiguration spec and metadata differ from
// the previously required spec and metadata based on generation change.
func ApplyValidatingWebhookConfiguration(client admissionregistrationclientv1.ValidatingWebhookConfigurationsGetter, recorder events.Recorder,
requiredOriginal *admissionregistrationv1.ValidatingWebhookConfiguration, expectedGeneration int64) (*admissionregistrationv1.ValidatingWebhookConfiguration, bool, error) {
if requiredOriginal == nil {
return nil, false, fmt.Errorf("Unexpected nil instead of an object")
}
required := requiredOriginal.DeepCopy()
existing, err := client.ValidatingWebhookConfigurations().Get(context.TODO(), required.GetName(), metav1.GetOptions{})
if apierrors.IsNotFound(err) {
actual, err := client.ValidatingWebhookConfigurations().Create(context.TODO(), required, metav1.CreateOptions{})
reportCreateEvent(recorder, required, err)
if err != nil {
return nil, false, err
}
return actual, true, nil
} else if err != nil {
return nil, false, err
}
modified := resourcemerge.BoolPtr(false)
existingCopy := existing.DeepCopy()
resourcemerge.EnsureObjectMeta(modified, &existingCopy.ObjectMeta, required.ObjectMeta)
if !*modified && existingCopy.GetGeneration() == expectedGeneration {
return existingCopy, false, nil
}
// at this point we know that we're going to perform a write. We're just trying to get the object correct
toWrite := existingCopy // shallow copy so the code reads easier
copyValidatingWebhookCABundle(existing, required)
toWrite.Webhooks = required.Webhooks
klog.V(4).Infof("ValidatingWebhookConfiguration %q changes: %v", required.GetNamespace()+"/"+required.GetName(), JSONPatchNoError(existing, toWrite))
actual, err := client.ValidatingWebhookConfigurations().Update(context.TODO(), toWrite, metav1.UpdateOptions{})
reportUpdateEvent(recorder, required, err)
if err != nil {
return nil, false, err
}
return actual, *modified || actual.GetGeneration() > existingCopy.GetGeneration(), nil
}
// copyValidatingWebhookCABundle populates webhooks[].clientConfig.caBundle fields from existing resource if it was set before
// and is not set in present. This provides upgrade compatibility with service-ca-bundle operator.
func copyValidatingWebhookCABundle(from, to *admissionregistrationv1.ValidatingWebhookConfiguration) {
fromMap := make(map[string]admissionregistrationv1.ValidatingWebhook, len(from.Webhooks))
for _, webhook := range from.Webhooks {
fromMap[webhook.Name] = webhook
}
for i, wh := range to.Webhooks {
if existing, ok := fromMap[wh.Name]; ok && wh.ClientConfig.CABundle == nil {
to.Webhooks[i].ClientConfig.CABundle = existing.ClientConfig.CABundle
}
}
}

View File

@@ -76,6 +76,9 @@ func ApplyServiceMonitor(client dynamic.Interface, recorder events.Recorder, ser
recorder.Eventf("ServiceMonitorCreated", "Created ServiceMonitor.monitoring.coreos.com/v1 because it was missing")
return true, nil
}
if err != nil {
return false, err
}
existingCopy := existing.DeepCopy()

View File

@@ -0,0 +1,51 @@
package resourcemerge
import (
operatorsv1 "github.com/openshift/api/operator/v1"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
)
// ExpectedMutatingWebhooksConfiguration returns last applied generation for MutatingWebhookConfiguration resource registered in operator
func ExpectedMutatingWebhooksConfiguration(name string, previousGenerations []operatorsv1.GenerationStatus) int64 {
generation := GenerationFor(previousGenerations, schema.GroupResource{Group: admissionregistrationv1.SchemeGroupVersion.Group, Resource: "mutatingwebhookconfigurations"}, "", name)
if generation != nil {
return generation.LastGeneration
}
return -1
}
// SetMutatingWebhooksConfigurationGeneration updates operator generation status list with last applied generation for provided MutatingWebhookConfiguration resource
func SetMutatingWebhooksConfigurationGeneration(generations *[]operatorsv1.GenerationStatus, actual *admissionregistrationv1.MutatingWebhookConfiguration) {
if actual == nil {
return
}
SetGeneration(generations, operatorsv1.GenerationStatus{
Group: admissionregistrationv1.SchemeGroupVersion.Group,
Resource: "mutatingwebhookconfigurations",
Name: actual.Name,
LastGeneration: actual.ObjectMeta.Generation,
})
}
// ExpectedValidatingWebhooksConfiguration returns last applied generation for ValidatingWebhookConfiguration resource registered in operator
func ExpectedValidatingWebhooksConfiguration(name string, previousGenerations []operatorsv1.GenerationStatus) int64 {
generation := GenerationFor(previousGenerations, schema.GroupResource{Group: admissionregistrationv1.SchemeGroupVersion.Group, Resource: "validatingwebhookconfigurations"}, "", name)
if generation != nil {
return generation.LastGeneration
}
return -1
}
// SetValidatingWebhooksConfigurationGeneration updates operator generation status list with last applied generation for provided ValidatingWebhookConfiguration resource
func SetValidatingWebhooksConfigurationGeneration(generations *[]operatorsv1.GenerationStatus, actual *admissionregistrationv1.ValidatingWebhookConfiguration) {
if actual == nil {
return
}
SetGeneration(generations, operatorsv1.GenerationStatus{
Group: admissionregistrationv1.SchemeGroupVersion.Group,
Resource: "validatingwebhookconfigurations",
Name: actual.Name,
LastGeneration: actual.ObjectMeta.Generation,
})
}

View File

@@ -20,8 +20,13 @@ type KubeInformersForNamespaces interface {
ConfigMapLister() corev1listers.ConfigMapLister
SecretLister() corev1listers.SecretLister
// Used in by workloads controller and controllers that report deployment pods status
PodLister() corev1listers.PodLister
}
var _ KubeInformersForNamespaces = kubeInformersForNamespaces{}
func NewKubeInformersForNamespaces(kubeClient kubernetes.Interface, namespaces ...string) KubeInformersForNamespaces {
ret := kubeInformersForNamespaces{}
for _, namespace := range namespaces {
@@ -103,3 +108,28 @@ func (l secretLister) Secrets(namespace string) corev1listers.SecretNamespaceLis
return informer.Core().V1().Secrets().Lister().Secrets(namespace)
}
type podLister kubeInformersForNamespaces
func (i kubeInformersForNamespaces) PodLister() corev1listers.PodLister {
return podLister(i)
}
func (l podLister) List(selector labels.Selector) (ret []*corev1.Pod, err error) {
globalInformer, ok := l[""]
if !ok {
return nil, fmt.Errorf("combinedLister does not support cross namespace list")
}
return globalInformer.Core().V1().Pods().Lister().List(selector)
}
func (l podLister) Pods(namespace string) corev1listers.PodNamespaceLister {
informer, ok := l[namespace]
if !ok {
// coding error
panic(fmt.Sprintf("namespace %q is missing", namespace))
}
return informer.Core().V1().Pods().Lister().Pods(namespace)
}

View File

@@ -144,11 +144,11 @@ func (c *controller) Run(stopCh <-chan struct{}) {
c.reflectorMutex.Unlock()
var wg wait.Group
defer wg.Wait()
wg.StartWithChannel(stopCh, r.Run)
wait.Until(c.processLoop, time.Second, stopCh)
wg.Wait()
}
// Returns true once this controller has completed an initial resource listing

View File

@@ -570,5 +570,26 @@ func isExpiredError(err error) bool {
}
func isTooLargeResourceVersionError(err error) bool {
return apierrors.HasStatusCause(err, metav1.CauseTypeResourceVersionTooLarge)
if apierrors.HasStatusCause(err, metav1.CauseTypeResourceVersionTooLarge) {
return true
}
// In Kubernetes 1.17.0-1.18.5, the api server doesn't set the error status cause to
// metav1.CauseTypeResourceVersionTooLarge to indicate that the requested minimum resource
// version is larger than the largest currently available resource version. To ensure backward
// compatibility with these server versions we also need to detect the error based on the content
// of the error message field.
if !apierrors.IsTimeout(err) {
return false
}
apierr, ok := err.(apierrors.APIStatus)
if !ok || apierr == nil || apierr.Status().Details == nil {
return false
}
for _, cause := range apierr.Status().Details.Causes {
// Matches the message returned by api server 1.17.0-1.18.5 for this error condition
if cause.Message == "Too large resource version" {
return true
}
}
return false
}

View File

@@ -18,6 +18,7 @@ package logs
import (
"fmt"
"sort"
"github.com/go-logr/logr"
json "k8s.io/component-base/logs/json"
@@ -84,12 +85,13 @@ func (lfr *LogFormatRegistry) Delete(name string) error {
return nil
}
// List names of registered log formats
// List names of registered log formats (sorted)
func (lfr *LogFormatRegistry) List() []string {
formats := make([]string, 0, len(lfr.registry))
for f := range lfr.registry {
formats = append(formats, f)
}
sort.Strings(formats)
return formats
}

21
vendor/modules.txt vendored
View File

@@ -172,7 +172,7 @@ github.com/open-cluster-management/api/client/work/listers/work/v1
github.com/open-cluster-management/api/cluster/v1
github.com/open-cluster-management/api/cluster/v1alpha1
github.com/open-cluster-management/api/work/v1
# github.com/openshift/api v0.0.0-20200827090112-c05698d102cf
# github.com/openshift/api v0.0.0-20201019163320-c6a5ec25f267
## explicit
github.com/openshift/api
github.com/openshift/api/apps
@@ -224,7 +224,7 @@ github.com/openshift/api/template
github.com/openshift/api/template/v1
github.com/openshift/api/user
github.com/openshift/api/user/v1
# github.com/openshift/build-machinery-go v0.0.0-20200819073603-48aa266c95f7
# github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab
## explicit
github.com/openshift/build-machinery-go
github.com/openshift/build-machinery-go/make
@@ -239,7 +239,7 @@ github.com/openshift/build-machinery-go/scripts
github.com/openshift/generic-admission-server/pkg/apiserver
github.com/openshift/generic-admission-server/pkg/cmd/server
github.com/openshift/generic-admission-server/pkg/registry/admissionreview
# github.com/openshift/library-go v0.0.0-20200902171820-35f48b6ef30c
# github.com/openshift/library-go v0.0.0-20201207213115-a0cd28f38065
## explicit
github.com/openshift/library-go/pkg/assets
github.com/openshift/library-go/pkg/config/client
@@ -251,6 +251,7 @@ github.com/openshift/library-go/pkg/controller/factory
github.com/openshift/library-go/pkg/controller/fileobserver
github.com/openshift/library-go/pkg/controller/metrics
github.com/openshift/library-go/pkg/crypto
github.com/openshift/library-go/pkg/network
github.com/openshift/library-go/pkg/operator/events
github.com/openshift/library-go/pkg/operator/events/eventstesting
github.com/openshift/library-go/pkg/operator/resource/resourceapply
@@ -469,7 +470,7 @@ gopkg.in/natefinch/lumberjack.v2
gopkg.in/tomb.v1
# gopkg.in/yaml.v2 v2.3.0
gopkg.in/yaml.v2
# k8s.io/api v0.19.0
# k8s.io/api v0.19.2
## explicit
k8s.io/api/admission/v1
k8s.io/api/admission/v1beta1
@@ -515,7 +516,7 @@ k8s.io/api/settings/v1alpha1
k8s.io/api/storage/v1
k8s.io/api/storage/v1alpha1
k8s.io/api/storage/v1beta1
# k8s.io/apiextensions-apiserver v0.19.0
# k8s.io/apiextensions-apiserver v0.19.2
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1
@@ -523,7 +524,7 @@ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1
k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1
# k8s.io/apimachinery v0.19.0
# k8s.io/apimachinery v0.19.2
## explicit
k8s.io/apimachinery/pkg/api/equality
k8s.io/apimachinery/pkg/api/errors
@@ -578,7 +579,7 @@ k8s.io/apimachinery/pkg/version
k8s.io/apimachinery/pkg/watch
k8s.io/apimachinery/third_party/forked/golang/json
k8s.io/apimachinery/third_party/forked/golang/reflect
# k8s.io/apiserver v0.19.0 => github.com/staebler/apiserver v0.19.1-0.20201005174924-a3ef0d1e45df
# k8s.io/apiserver v0.19.2 => github.com/staebler/apiserver v0.19.1-0.20201005174924-a3ef0d1e45df
## explicit
k8s.io/apiserver/pkg/admission
k8s.io/apiserver/pkg/admission/configuration
@@ -700,7 +701,7 @@ k8s.io/apiserver/plugin/pkg/audit/truncate
k8s.io/apiserver/plugin/pkg/audit/webhook
k8s.io/apiserver/plugin/pkg/authenticator/token/webhook
k8s.io/apiserver/plugin/pkg/authorizer/webhook
# k8s.io/client-go v0.19.0
# k8s.io/client-go v0.19.2
## explicit
k8s.io/client-go/discovery
k8s.io/client-go/discovery/fake
@@ -916,7 +917,7 @@ k8s.io/client-go/util/homedir
k8s.io/client-go/util/keyutil
k8s.io/client-go/util/retry
k8s.io/client-go/util/workqueue
# k8s.io/component-base v0.19.0
# k8s.io/component-base v0.19.2
## explicit
k8s.io/component-base/cli/flag
k8s.io/component-base/featuregate
@@ -929,7 +930,7 @@ k8s.io/component-base/version
# k8s.io/klog/v2 v2.3.0
## explicit
k8s.io/klog/v2
# k8s.io/kube-aggregator v0.19.0
# k8s.io/kube-aggregator v0.19.2
## explicit
k8s.io/kube-aggregator/pkg/apis/apiregistration
k8s.io/kube-aggregator/pkg/apis/apiregistration/v1