diff --git a/go.mod b/go.mod
index 89688343523ff7dcee3c65f0f09b0577313f2770..68d8085ba022fc8c991aaf489dcdc563e7792c4f 100644
--- a/go.mod
+++ b/go.mod
@@ -3,14 +3,13 @@ module github.com/openshift/machine-api-operator
 go 1.13
 
 require (
-	github.com/MakeNowJust/heredoc v1.0.0 // indirect
 	github.com/blang/semver v3.5.1+incompatible
 	github.com/go-logr/logr v0.4.0
 	github.com/google/gofuzz v1.1.0
 	github.com/google/uuid v1.1.2
 	github.com/onsi/ginkgo v1.16.4
 	github.com/onsi/gomega v1.14.0
-	github.com/openshift/api v0.0.0-20210412212256-79bd8cfbbd59
+	github.com/openshift/api v0.0.0-20210416115537-a60c0dc032fd
 	github.com/openshift/client-go v0.0.0-20210409155308-a8e62c60e930
 	github.com/openshift/cluster-api-provider-gcp v0.0.1-0.20201201000827-1117a4fc438c
 	github.com/openshift/library-go v0.0.0-20210408164723-7a65fdb398e2
@@ -39,4 +38,4 @@ require (
 
 replace sigs.k8s.io/cluster-api-provider-aws => github.com/openshift/cluster-api-provider-aws v0.2.1-0.20201125052318-b85a18cbf338
 
-replace sigs.k8s.io/cluster-api-provider-azure => github.com/openshift/cluster-api-provider-azure v0.0.0-20210209143830-3442c7a36c1e
+replace sigs.k8s.io/cluster-api-provider-azure => github.com/openshift/cluster-api-provider-azure v0.1.0-alpha.3.0.20211213001529-73596b5c3b6a
diff --git a/go.sum b/go.sum
index ae71755e368954893e98bff73cf8aeed5466641c..94268ca6dd1a630da64521500dabc9606c672c66 100644
--- a/go.sum
+++ b/go.sum
@@ -45,11 +45,9 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX
 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
 github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
 github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
-github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
 github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
 github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
 github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
-github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
 github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
 github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
 github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
@@ -57,10 +55,8 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY
 github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
 github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
 github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
-github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
 github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
-github.com/Azure/go-autorest/autorest/validation v0.3.0/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E=
 github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
 github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
 github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
@@ -237,11 +233,9 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/logr v0.2.1/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
-github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
 github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
-github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU=
 github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM=
 github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
 github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
@@ -298,6 +292,7 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
+github.com/gobuffalo/flect v0.2.2/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
 github.com/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY=
 github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
 github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM=
@@ -403,7 +398,6 @@ github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTV
 github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
-github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 github.com/googleapis/gnostic v0.5.4 h1:ynbQIWjLw7iv6HAFdixb30U7Uvcmx+f4KlLJpmhkTK0=
 github.com/googleapis/gnostic v0.5.4/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ=
 github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
@@ -456,7 +450,6 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
 github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA=
 github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
@@ -584,7 +577,6 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
 github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
 github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
@@ -594,7 +586,6 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
 github.com/onsi/gomega v1.14.0 h1:ep6kpPVwmr/nTbklSx2nrLNSIO62DoYAhnPNIMhK8gI=
 github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
@@ -607,28 +598,25 @@ github.com/openshift/api v0.0.0-20200326152221-912866ddb162/go.mod h1:RKMJ5CBnlj
 github.com/openshift/api v0.0.0-20200424083944-0422dc17083e/go.mod h1:VnbEzX8SAaRj7Yfl836NykdQIlbEjfL6/CD+AaJQg5Q=
 github.com/openshift/api v0.0.0-20200827090112-c05698d102cf/go.mod h1:M3xexPhgM8DISzzRpuFUy+jfPjQPIcs9yqEYj17mXV8=
 github.com/openshift/api v0.0.0-20200901182017-7ac89ba6b971/go.mod h1:M3xexPhgM8DISzzRpuFUy+jfPjQPIcs9yqEYj17mXV8=
-github.com/openshift/api v0.0.0-20201214114959-164a2fb63b5f/go.mod h1:aqU5Cq+kqKKPbDMqxo9FojgDeSpNJI7iuskjXjtojDg=
-github.com/openshift/api v0.0.0-20201216151826-78a19e96f9eb/go.mod h1:aqU5Cq+kqKKPbDMqxo9FojgDeSpNJI7iuskjXjtojDg=
 github.com/openshift/api v0.0.0-20210331162552-3e31249e6a55/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio=
 github.com/openshift/api v0.0.0-20210331193751-3acddb19d360/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio=
 github.com/openshift/api v0.0.0-20210409143810-a99ffa1cac67/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio=
-github.com/openshift/api v0.0.0-20210412212256-79bd8cfbbd59 h1:HpDbTNsLmSyQ0xy8f13UUbQOYClvNWpSfFrKLIge5G0=
 github.com/openshift/api v0.0.0-20210412212256-79bd8cfbbd59/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio=
+github.com/openshift/api v0.0.0-20210416115537-a60c0dc032fd h1:sVq/ry3UcDUrKphFarBvTPEFuWBXuGewzXraItYh9eg=
+github.com/openshift/api v0.0.0-20210416115537-a60c0dc032fd/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio=
 github.com/openshift/build-machinery-go v0.0.0-20200211121458-5e3d6e570160/go.mod h1:1CkcsT3aVebzRBzVTSbiKSkJMsC/CASqxesfqEMfJEc=
 github.com/openshift/build-machinery-go v0.0.0-20200424080330-082bf86082cc/go.mod h1:1CkcsT3aVebzRBzVTSbiKSkJMsC/CASqxesfqEMfJEc=
 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/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
 github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
 github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0/go.mod h1:uUQ4LClRO+fg5MF/P6QxjMCb1C9f7Oh4RKepftDnEJE=
 github.com/openshift/client-go v0.0.0-20200827190008-3062137373b5/go.mod h1:5rGmrkQ8DJEUXA+AR3rEjfH+HFyg4/apY9iCQFgvPfE=
-github.com/openshift/client-go v0.0.0-20201214125552-e615e336eb49/go.mod h1:9/jG4I6sh+5QublJpZZ4Zs/P4/QCXMsQQ/K/058bSB8=
 github.com/openshift/client-go v0.0.0-20210331195552-cf6c2669e01f/go.mod h1:hHaRJ6vp2MRd/CpuZ1oJkqnMGy5eEnoAkQmKPZKcUPI=
 github.com/openshift/client-go v0.0.0-20210409155308-a8e62c60e930 h1:t04P0kxrsqAx5Ks75MRHK+mscdy+DD9X/qBPC4yCMUg=
 github.com/openshift/client-go v0.0.0-20210409155308-a8e62c60e930/go.mod h1:uBPbAyIbjMuhPQy4NgF8q1alNGX2qA8bXIkAycsSDc0=
 github.com/openshift/cluster-api-provider-aws v0.2.1-0.20201125052318-b85a18cbf338 h1:BMH3oDL+Yk+4K5G7jxr+jMQbJ7GLgnPM5/k99mfNUMM=
 github.com/openshift/cluster-api-provider-aws v0.2.1-0.20201125052318-b85a18cbf338/go.mod h1:5XOJ+v/n/hivGNeZAMBz9W7FeE+JB311fB9dSfp6WlY=
-github.com/openshift/cluster-api-provider-azure v0.0.0-20210209143830-3442c7a36c1e h1:4AXtifr5MKs3xrNCxAIg1cVE1nlPizD0CvDVlk3Hsfo=
-github.com/openshift/cluster-api-provider-azure v0.0.0-20210209143830-3442c7a36c1e/go.mod h1:9sNMP9s/axIL/iGLt87ZmTcrc1+P6gB6I2llyPnEWbg=
+github.com/openshift/cluster-api-provider-azure v0.1.0-alpha.3.0.20211213001529-73596b5c3b6a h1:aerAWBtdzDIbrB9tXI/CWrNS+9KJAM/sLVD2nYK4Lhc=
+github.com/openshift/cluster-api-provider-azure v0.1.0-alpha.3.0.20211213001529-73596b5c3b6a/go.mod h1:GR+ocB8I+Z7JTSBdO+DMu/diBfH66lRlRpnc1KWysUM=
 github.com/openshift/cluster-api-provider-gcp v0.0.1-0.20200701112720-3a7d727c9a10/go.mod h1:wgkZrOlcIMWTzo8khB4Js2PoDJDlIUUdzCBm7BuDdqw=
 github.com/openshift/cluster-api-provider-gcp v0.0.1-0.20200713133651-5c8a640669ac/go.mod h1:XVYX9JE339nKbDDa/W481XD+1GTeqeaBm8bDPr7WE7I=
 github.com/openshift/cluster-api-provider-gcp v0.0.1-0.20200901173901-9056dbc8c9b9/go.mod h1:rcwAydGZX+z4l91wtOdbq+fqDwuo6iu0YuFik3UUc+8=
@@ -637,7 +625,6 @@ github.com/openshift/cluster-api-provider-gcp v0.0.1-0.20201201000827-1117a4fc43
 github.com/openshift/cluster-api-provider-gcp v0.0.1-0.20201201000827-1117a4fc438c/go.mod h1:21N0wWjiTQypZ7WosEYhcGJHr9JoDR1RBFztE0NvdYM=
 github.com/openshift/library-go v0.0.0-20200512120242-21a1ff978534/go.mod h1:2kWwXTkpoQJUN3jZ3QW88EIY1hdRMqxgRs2hheEW/pg=
 github.com/openshift/library-go v0.0.0-20200909173121-1d055d971916/go.mod h1:6vwp+YhYOIlj8MpkQKkebTTSn2TuYyvgiAFQ206jIEQ=
-github.com/openshift/library-go v0.0.0-20201215165635-4ee79b1caed5/go.mod h1:udseDnqxn5ON8i+NBjDp00fBTK0JRu1/6Y6tf6EivDE=
 github.com/openshift/library-go v0.0.0-20210408164723-7a65fdb398e2 h1:eYdrmOSwRqHhfuPK8bhCSkBRUmCNYkgkOLgnImnz3Rs=
 github.com/openshift/library-go v0.0.0-20210408164723-7a65fdb398e2/go.mod h1:pnz961veImKsbn7pQcuFbcVpCQosYiC1fUOjzEDeOLU=
 github.com/openshift/machine-api-operator v0.2.1-0.20200611014855-9a69f85c32dd/go.mod h1:6vMi+R3xqznBdq5rgeal9N3ak3sOpy50t0fdRCcQXjE=
@@ -645,7 +632,7 @@ github.com/openshift/machine-api-operator v0.2.1-0.20200701225707-950912b03628/g
 github.com/openshift/machine-api-operator v0.2.1-0.20200722104429-f4f9b84df9b7/go.mod h1:XDsNRAVEJtkI00e51SAZ/PnqNJl1zv0rHXSdl9L1oOY=
 github.com/openshift/machine-api-operator v0.2.1-0.20200926044412-b7d860f8074c/go.mod h1:cp/wPVzxHZeLUjOLkNPNqrk4wyyW6HuHd3Kz9+hl5xw=
 github.com/openshift/machine-api-operator v0.2.1-0.20201002104344-6abfb5440597/go.mod h1:+oAfoCl+TUd2TM79/6NdqLpFUHIJpmqkKdmiHe2O7mw=
-github.com/openshift/machine-api-operator v0.2.1-0.20210104142355-8e6ae0acdfcf/go.mod h1:U5eAHChde1XvtQy3s1Zcr7ll4X7heb0SzYpaiAwxmQc=
+github.com/openshift/machine-api-operator v0.2.1-0.20210504014029-a132ec00f7dd/go.mod h1:DFZBMPtC2TYZH5NE9+2JQIpbZAnruqc9F26QmbOm9pw=
 github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
 github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
 github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
@@ -841,10 +828,8 @@ go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKY
 go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
 go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
 go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
 go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
@@ -865,7 +850,6 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 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=
@@ -1033,7 +1017,6 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1043,7 +1026,6 @@ golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1081,7 +1063,6 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1342,8 +1323,6 @@ k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8=
 k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
 k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI=
 k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw=
-k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI=
-k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg=
 k8s.io/api v0.21.0-rc.0/go.mod h1:Dkc/ZauWJrgZhjOjeBgW89xZQiTBJA2RaBKYHXPsi2Y=
 k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU=
 k8s.io/api v0.21.3 h1:cblWILbLO8ar+Fj6xdDGr603HRsf8Wu9E9rngJeprZQ=
@@ -1353,8 +1332,6 @@ k8s.io/apiextensions-apiserver v0.18.0-beta.2/go.mod h1:Hnrg5jx8/PbxRbUoqDGxtQkU
 k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
 k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M=
 k8s.io/apiextensions-apiserver v0.19.0/go.mod h1:znfQxNpjqz/ZehvbfMg5N6fvBJW5Lqu5HVLTJQdP4Fs=
-k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg=
-k8s.io/apiextensions-apiserver v0.20.0/go.mod h1:ZH+C33L2Bh1LY1+HphoRmN1IQVLTShVcTojivK3N9xg=
 k8s.io/apiextensions-apiserver v0.21.0-rc.0/go.mod h1:ItIoMBJU1gy93Qwr/B2699r4b0VmZqAOU+15BvozxMY=
 k8s.io/apiextensions-apiserver v0.21.0/go.mod h1:gsQGNtGkc/YoDG9loKI0V+oLZM4ljRPjc/sql5tmvzc=
 k8s.io/apiextensions-apiserver v0.21.3 h1:+B6biyUWpqt41kz5x6peIsljlsuwvNAp/oFax/j2/aY=
@@ -1366,8 +1343,6 @@ k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftc
 k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
 k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
-k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
-k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
 k8s.io/apimachinery v0.21.0-rc.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
 k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
 k8s.io/apimachinery v0.21.3 h1:3Ju4nvjCngxxMYby0BimUk+pQHPOQp3eCGChk5kfVII=
@@ -1377,15 +1352,12 @@ k8s.io/apiserver v0.18.0-beta.2/go.mod h1:bnblMkMoCFnIfVnVftd0SXJPzyvrk3RtaqSbbl
 k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
 k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg=
 k8s.io/apiserver v0.19.0/go.mod h1:XvzqavYj73931x7FLtyagh8WibHpePJ1QwWrSJs2CLk=
-k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA=
-k8s.io/apiserver v0.20.0/go.mod h1:6gRIWiOkvGvQt12WTYmsiYoUyYW0FXSiMdNl4m+sxY8=
 k8s.io/apiserver v0.21.0-rc.0/go.mod h1:QlW7+1CZTZtAcKvJ34/n4DIb8sC93FeQpkd1KSU+Sok=
 k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg=
 k8s.io/apiserver v0.21.3 h1:QxAgE1ZPQG5cPlHScHTnLxP9H/kU3zjH1Vnd8G+n5OI=
 k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU=
 k8s.io/cli-runtime v0.18.0-rc.1/go.mod h1:yuKZYDG8raONmwjwIkT77lCfIuPwX+Bsp88MKYf1TlU=
 k8s.io/cli-runtime v0.19.0/go.mod h1:tun9l0eUklT8IHIM0jors17KmUjcrAxn0myoBYwuNuo=
-k8s.io/cli-runtime v0.20.0/go.mod h1:C5tewU1SC1t09D7pmkk83FT4lMAw+bvMDuRxA7f0t2s=
 k8s.io/cli-runtime v0.21.0 h1:/V2Kkxtf6x5NI2z+Sd/mIrq4FQyQ8jzZAUD6N5RnN7Y=
 k8s.io/cli-runtime v0.21.0/go.mod h1:XoaHP93mGPF37MkLbjGVYqg3S1MnsFdKtiA/RZzzxOo=
 k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k=
@@ -1395,8 +1367,6 @@ k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8=
 k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
 k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q=
 k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU=
-k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA=
-k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY=
 k8s.io/client-go v0.21.0-rc.0/go.mod h1:zU5HY/bSOKH3YOqoge9nFvICgrpeSdJu8DQ4fkjKIZk=
 k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA=
 k8s.io/client-go v0.21.3 h1:J9nxZTOmvkInRDCzcSNQmPJbDYN/PjlxXT9Mos3HcLg=
@@ -1408,8 +1378,6 @@ k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRV
 k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
 k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
 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/code-generator v0.20.0/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg=
 k8s.io/code-generator v0.21.0-rc.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
 k8s.io/code-generator v0.21.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
 k8s.io/code-generator v0.21.3 h1:K2Onrjuve/31D4Y5DpR9ngWM2BiiKUxrGaCxSEJS/Y8=
@@ -1420,20 +1388,16 @@ k8s.io/component-base v0.18.0-rc.1/go.mod h1:NNlRaxZEdLqTs2+6yXiU2SHl8gKsbcy19Ii
 k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
 k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14=
 k8s.io/component-base v0.19.0/go.mod h1:dKsY8BxkA+9dZIAh2aWJLL/UdASFDNtGYTCItL4LM7Y=
-k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo=
-k8s.io/component-base v0.20.0/go.mod h1:wKPj+RHnAr8LW2EIBIK7AxOHPde4gme2lzXwVSoRXeA=
 k8s.io/component-base v0.21.0-rc.0/go.mod h1:XlP0bM7QJFWRGZYPc5NmphkvsYQ+o7804HWH3GTGjDY=
 k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw=
 k8s.io/component-base v0.21.3 h1:4WuuXY3Npa+iFfi2aDRiOz+anhNvRfye0859ZgfC5Og=
 k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ=
-k8s.io/component-helpers v0.20.0/go.mod h1:nx6NOtfSfGOxnSZsDJxpGbnsVuUA1UXpwDvZIrtigNk=
 k8s.io/component-helpers v0.21.0/go.mod h1:tezqefP7lxfvJyR+0a+6QtVrkZ/wIkyMLK4WcQ3Cj8U=
 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/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 h1:Uusb3oh8XcdzDF/ndlI4ToKTYVlkCSJP39SRY2mfRAw=
 k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
@@ -1443,30 +1407,25 @@ 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/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
-k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts=
 k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/kube-aggregator v0.18.0-beta.2/go.mod h1:O3Td9mheraINbLHH4pzoFP2gRzG0Wk1COqzdSL4rBPk=
 k8s.io/kube-aggregator v0.18.2/go.mod h1:ijq6FnNUoKinA6kKbkN6svdTacSoQVNtKqmQ1+XJEYQ=
 k8s.io/kube-aggregator v0.19.0/go.mod h1:1Ln45PQggFAG8xOqWPIYMxUq8WNtpPnYsbUJ39DpF/A=
-k8s.io/kube-aggregator v0.20.0/go.mod h1:3Is/gzzWmhhG/rA3CpA1+eVye87lreBQDFGcAGT7gzo=
 k8s.io/kube-aggregator v0.21.0-rc.0 h1:PxnBqTgEQHCOhWl3J6EX2OKbfx0epwgKF4phlhgNyFA=
 k8s.io/kube-aggregator v0.21.0-rc.0/go.mod h1:M+whOmsAeQf8ObJ0/eO9Af1Dz2UQEB9OW9BWmt9b2sU=
 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-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
 k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
-k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0=
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
 k8s.io/kubectl v0.18.0-rc.1/go.mod h1:UpG1w7klD633nyMS73/29cNl2tMdEbXU0nWupttyha4=
 k8s.io/kubectl v0.19.0/go.mod h1:gPCjjsmE6unJzgaUNXIFGZGafiUp5jh0If3F/x7/rRg=
-k8s.io/kubectl v0.20.0/go.mod h1:8x5GzQkgikz7M2eFGGuu6yOfrenwnw5g4RXOUgbjR1M=
 k8s.io/kubectl v0.21.0 h1:WZXlnG/yjcE4LWO2g6ULjFxtzK6H1TKzsfaBFuVIhNg=
 k8s.io/kubectl v0.21.0/go.mod h1:EU37NukZRXn1TpAkMUoy8Z/B2u6wjHDS4aInsDzVvks=
 k8s.io/metrics v0.18.0-rc.1/go.mod h1:ME3EkXCyiZ7mVFEiAYKBfuo3JkpgggeATG+DBUQby5o=
 k8s.io/metrics v0.19.0/go.mod h1:WykpW8B60OeAJx1imdwUgyOID2kDljr/Q+1zrPJ98Wo=
-k8s.io/metrics v0.20.0/go.mod h1:9yiRhfr8K8sjdj2EthQQE9WvpYDvsXIV3CjN4Ruq4Jw=
 k8s.io/metrics v0.21.0/go.mod h1:L3Ji9EGPP1YBbfm9sPfEXSpnj8i24bfQbAFAsW0NueQ=
 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=
@@ -1474,7 +1433,6 @@ k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl
 k8s.io/utils v0.0.0-20200327001022-6496210b90e8/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20210722164352-7f3ee0f31471 h1:DnzUXII7sVg1FJ/4JX6YDRJfLNAC7idRatPwe07suiI=
@@ -1489,12 +1447,11 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
 sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo=
 sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E=
-sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU=
+sigs.k8s.io/controller-runtime v0.9.0-alpha.1.0.20210413130450-7ef2da0bc161/go.mod h1:ufPDuvefw2Y1KnBgHQrLdOjueYlj+XJV2AszbT+WTxs=
 sigs.k8s.io/controller-runtime v0.9.0-beta.1.0.20210512131817-ce2f0c92d77e h1:sBd50AyUA/YEhWNtkIB16ep1scbkeOa2Om52t1wk/vo=
 sigs.k8s.io/controller-runtime v0.9.0-beta.1.0.20210512131817-ce2f0c92d77e/go.mod h1:ufPDuvefw2Y1KnBgHQrLdOjueYlj+XJV2AszbT+WTxs=
 sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE=
@@ -1518,6 +1475,7 @@ sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnM
 sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
+sigs.k8s.io/structured-merge-diff/v4 v4.1.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno=
 sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
diff --git a/vendor/github.com/openshift/api/Makefile b/vendor/github.com/openshift/api/Makefile
index 0fb3c431a4e1223a2cdff4166d8dd131a34b39a6..8a25ed492e700bf2ce20244da3a98a5df4b89b69 100644
--- a/vendor/github.com/openshift/api/Makefile
+++ b/vendor/github.com/openshift/api/Makefile
@@ -47,6 +47,7 @@ verify-scripts:
 	bash -x hack/verify-swagger-docs.sh
 	hack/verify-crds.sh
 	bash -x hack/verify-types.sh
+	hack/verify-crds-version-upgrade.sh
 .PHONY: verify-scripts
 verify: verify-scripts verify-codegen-crds
 
diff --git a/vendor/github.com/openshift/api/apiserver/v1/apiserver.openshift.io_apirequestcount.yaml b/vendor/github.com/openshift/api/apiserver/v1/apiserver.openshift.io_apirequestcount.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a49b528d104ca98d7e27b850581c09ad7e655837
--- /dev/null
+++ b/vendor/github.com/openshift/api/apiserver/v1/apiserver.openshift.io_apirequestcount.yaml
@@ -0,0 +1,325 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    include.release.openshift.io/self-managed-high-availability: "true"
+    include.release.openshift.io/single-node-developer: "true"
+  name: apirequestcounts.apiserver.openshift.io
+spec:
+  group: apiserver.openshift.io
+  names:
+    kind: APIRequestCount
+    listKind: APIRequestCountList
+    plural: apirequestcounts
+    singular: apirequestcount
+  scope: Cluster
+  versions:
+  - name: v1
+    served: true
+    storage: true
+    subresources:
+      status: {}
+    additionalPrinterColumns:
+    - name: RemovedInRelease
+      type: string
+      description: Release in which an API will be removed.
+      jsonPath: .status.removedInRelease
+    - name: RequestsInCurrentHour
+      type: integer
+      description: Number of requests in the last hour.
+      jsonPath: .status.requestsInTheCurrentHour.requestCount
+    - name: RequestsInLast24h
+      type: integer
+      description: Number of requests in the last 24h.
+      jsonPath: .status.requestCount
+    "schema":
+      "openAPIV3Schema":
+        description: APIRequestCount tracks requests made to an API. The instance
+          name must be of the form `resource.version.group`, matching the resource.
+        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 characteristics of the resource.
+            type: object
+            properties:
+              numberOfUsersToReport:
+                description: numberOfUsersToReport is the number of users to include
+                  in the report. If unspecified or zero, the default is ten.  This
+                  is default is subject to change.
+                type: integer
+                format: int64
+                default: 10
+                maximum: 100
+                minimum: 0
+          status:
+            description: status contains the observed state of the resource.
+            type: object
+            properties:
+              conditions:
+                description: conditions contains details of the current status of
+                  this API Resource.
+                type: array
+                items:
+                  description: "Condition contains details for one aspect of the current
+                    state of this API Resource. --- This struct is intended for direct
+                    use as an array at the field path .status.conditions.  For example,
+                    type FooStatus struct{     // Represents the observations of a
+                    foo's current state.     // Known .status.conditions.type are:
+                    \"Available\", \"Progressing\", and \"Degraded\"     // +patchMergeKey=type
+                    \    // +patchStrategy=merge     // +listType=map     // +listMapKey=type
+                    \    Conditions []metav1.Condition `json:\"conditions,omitempty\"
+                    patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
+                    \n     // other fields }"
+                  type: object
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  properties:
+                    lastTransitionTime:
+                      description: lastTransitionTime is the last time the condition
+                        transitioned from one status to another. This should be when
+                        the underlying condition changed.  If that is not known, then
+                        using the time when the API field changed is acceptable.
+                      type: string
+                      format: date-time
+                    message:
+                      description: message is a human readable message indicating
+                        details about the transition. This may be an empty string.
+                      type: string
+                      maxLength: 32768
+                    observedGeneration:
+                      description: observedGeneration represents the .metadata.generation
+                        that the condition was set based upon. For instance, if .metadata.generation
+                        is currently 12, but the .status.conditions[x].observedGeneration
+                        is 9, the condition is out of date with respect to the current
+                        state of the instance.
+                      type: integer
+                      format: int64
+                      minimum: 0
+                    reason:
+                      description: reason contains a programmatic identifier indicating
+                        the reason for the condition's last transition. Producers
+                        of specific condition types may define expected values and
+                        meanings for this field, and whether the values are considered
+                        a guaranteed API. The value should be a CamelCase string.
+                        This field may not be empty.
+                      type: string
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      type: string
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                        --- Many .condition.type values are consistent across resources
+                        like Available, but because arbitrary conditions can be useful
+                        (see .node.status.conditions), the ability to deconflict is
+                        important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
+                      type: string
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+              currentHour:
+                description: currentHour contains request history for the current
+                  hour. This is porcelain to make the API easier to read by humans
+                  seeing if they addressed a problem. This field is reset on the hour.
+                type: object
+                properties:
+                  byNode:
+                    description: byNode contains logs of requests per node.
+                    type: array
+                    maxItems: 512
+                    items:
+                      description: PerNodeAPIRequestLog contains logs of requests
+                        to a certain node.
+                      type: object
+                      properties:
+                        byUser:
+                          description: byUser contains request details by top .spec.numberOfUsersToReport
+                            users. Note that because in the case of an apiserver,
+                            restart the list of top users is determined on a best-effort
+                            basis, the list might be imprecise. In addition, some
+                            system users may be explicitly included in the list.
+                          type: array
+                          maxItems: 500
+                          items:
+                            description: PerUserAPIRequestCount contains logs of a
+                              user's requests.
+                            type: object
+                            properties:
+                              byVerb:
+                                description: byVerb details by verb.
+                                type: array
+                                maxItems: 10
+                                items:
+                                  description: PerVerbAPIRequestCount requestCounts
+                                    requests by API request verb.
+                                  type: object
+                                  properties:
+                                    requestCount:
+                                      description: requestCount of requests for verb.
+                                      type: integer
+                                      format: int64
+                                      minimum: 0
+                                    verb:
+                                      description: verb of API request (get, list,
+                                        create, etc...)
+                                      type: string
+                                      maxLength: 20
+                              requestCount:
+                                description: requestCount of requests by the user
+                                  across all verbs.
+                                type: integer
+                                format: int64
+                                minimum: 0
+                              userAgent:
+                                description: userAgent that made the request. The
+                                  same user often has multiple binaries which connect
+                                  (pods with many containers).  The different binaries
+                                  will have different userAgents, but the same user.  In
+                                  addition, we have userAgents with version information
+                                  embedded and the userName isn't likely to change.
+                                type: string
+                                maxLength: 1024
+                              username:
+                                description: userName that made the request.
+                                type: string
+                                maxLength: 512
+                        nodeName:
+                          description: nodeName where the request are being handled.
+                          type: string
+                          maxLength: 512
+                          minLength: 1
+                        requestCount:
+                          description: requestCount is a sum of all requestCounts
+                            across all users, even those outside of the top 10 users.
+                          type: integer
+                          format: int64
+                          minimum: 0
+                  requestCount:
+                    description: requestCount is a sum of all requestCounts across
+                      nodes.
+                    type: integer
+                    format: int64
+                    minimum: 0
+              last24h:
+                description: last24h contains request history for the last 24 hours,
+                  indexed by the hour, so 12:00AM-12:59 is in index 0, 6am-6:59am
+                  is index 6, etc. The index of the current hour is updated live and
+                  then duplicated into the requestsLastHour field.
+                type: array
+                maxItems: 24
+                items:
+                  description: PerResourceAPIRequestLog logs request for various nodes.
+                  type: object
+                  properties:
+                    byNode:
+                      description: byNode contains logs of requests per node.
+                      type: array
+                      maxItems: 512
+                      items:
+                        description: PerNodeAPIRequestLog contains logs of requests
+                          to a certain node.
+                        type: object
+                        properties:
+                          byUser:
+                            description: byUser contains request details by top .spec.numberOfUsersToReport
+                              users. Note that because in the case of an apiserver,
+                              restart the list of top users is determined on a best-effort
+                              basis, the list might be imprecise. In addition, some
+                              system users may be explicitly included in the list.
+                            type: array
+                            maxItems: 500
+                            items:
+                              description: PerUserAPIRequestCount contains logs of
+                                a user's requests.
+                              type: object
+                              properties:
+                                byVerb:
+                                  description: byVerb details by verb.
+                                  type: array
+                                  maxItems: 10
+                                  items:
+                                    description: PerVerbAPIRequestCount requestCounts
+                                      requests by API request verb.
+                                    type: object
+                                    properties:
+                                      requestCount:
+                                        description: requestCount of requests for
+                                          verb.
+                                        type: integer
+                                        format: int64
+                                        minimum: 0
+                                      verb:
+                                        description: verb of API request (get, list,
+                                          create, etc...)
+                                        type: string
+                                        maxLength: 20
+                                requestCount:
+                                  description: requestCount of requests by the user
+                                    across all verbs.
+                                  type: integer
+                                  format: int64
+                                  minimum: 0
+                                userAgent:
+                                  description: userAgent that made the request. The
+                                    same user often has multiple binaries which connect
+                                    (pods with many containers).  The different binaries
+                                    will have different userAgents, but the same user.  In
+                                    addition, we have userAgents with version information
+                                    embedded and the userName isn't likely to change.
+                                  type: string
+                                  maxLength: 1024
+                                username:
+                                  description: userName that made the request.
+                                  type: string
+                                  maxLength: 512
+                          nodeName:
+                            description: nodeName where the request are being handled.
+                            type: string
+                            maxLength: 512
+                            minLength: 1
+                          requestCount:
+                            description: requestCount is a sum of all requestCounts
+                              across all users, even those outside of the top 10 users.
+                            type: integer
+                            format: int64
+                            minimum: 0
+                    requestCount:
+                      description: requestCount is a sum of all requestCounts across
+                        nodes.
+                      type: integer
+                      format: int64
+                      minimum: 0
+              removedInRelease:
+                description: removedInRelease is when the API will be removed.
+                type: string
+                maxLength: 64
+                pattern: ^[0-9][0-9]*\.[0-9][0-9]*$
+              requestCount:
+                description: requestCount is a sum of all requestCounts across all
+                  current hours, nodes, and users.
+                type: integer
+                format: int64
+                minimum: 0
diff --git a/vendor/github.com/openshift/api/apiserver/v1/register.go b/vendor/github.com/openshift/api/apiserver/v1/register.go
index 82d3584c41eff09e0a55c96ca806c534f9fbb7bd..0155194719d5146ccdd7fd11c101ee43703a540b 100644
--- a/vendor/github.com/openshift/api/apiserver/v1/register.go
+++ b/vendor/github.com/openshift/api/apiserver/v1/register.go
@@ -30,6 +30,8 @@ func Resource(resource string) schema.GroupResource {
 // Adds the list of known types to api.Scheme.
 func addKnownTypes(scheme *runtime.Scheme) error {
 	scheme.AddKnownTypes(GroupVersion,
+		&APIRequestCount{},
+		&APIRequestCountList{},
 		&DeprecatedAPIRequest{},
 		&DeprecatedAPIRequestList{},
 	)
diff --git a/vendor/github.com/openshift/api/apiserver/v1/types_apirequestcount.go b/vendor/github.com/openshift/api/apiserver/v1/types_apirequestcount.go
new file mode 100644
index 0000000000000000000000000000000000000000..564eca09fb1216170e6722f5df27e64eec5f9f01
--- /dev/null
+++ b/vendor/github.com/openshift/api/apiserver/v1/types_apirequestcount.go
@@ -0,0 +1,158 @@
+// Package v1 is an api version in the apiserver.openshift.io group
+package v1
+
+import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+const (
+	// RemovedInReleaseLabel is a label which can be used to select APIRequestCounts based on the release
+	// in which they are removed.  The value is equivalent to .status.removedInRelease.
+	RemovedInReleaseLabel = "apirequestcounts.apiserver.openshift.io/removedInRelease"
+)
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+// +kubebuilder:resource:scope="Cluster"
+// +kubebuilder:subresource:status
+// +genclient:nonNamespaced
+
+// APIRequestCount tracks requests made to an API. The instance name must
+// be of the form `resource.version.group`, matching the resource.
+type APIRequestCount struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// spec defines the characteristics of the resource.
+	// +kubebuilder:validation:Required
+	// +required
+	Spec APIRequestCountSpec `json:"spec"`
+
+	// status contains the observed state of the resource.
+	Status APIRequestCountStatus `json:"status,omitempty"`
+}
+
+type APIRequestCountSpec struct {
+
+	// numberOfUsersToReport is the number of users to include in the report.
+	// If unspecified or zero, the default is ten.  This is default is subject to change.
+	// +kubebuilder:default:=10
+	// +kubebuilder:validation:Minimum=0
+	// +kubebuilder:validation:Maximum=100
+	// +optional
+	NumberOfUsersToReport int64 `json:"numberOfUsersToReport"`
+}
+
+// +k8s:deepcopy-gen=true
+type APIRequestCountStatus struct {
+
+	// conditions contains details of the current status of this API Resource.
+	// +patchMergeKey=type
+	// +patchStrategy=merge
+	Conditions []metav1.Condition `json:"conditions"`
+
+	// removedInRelease is when the API will be removed.
+	// +kubebuilder:validation:Pattern=^[0-9][0-9]*\.[0-9][0-9]*$
+	// +kubebuilder:validation:MaxLength=64
+	// +optional
+	RemovedInRelease string `json:"removedInRelease"`
+
+	// requestCount is a sum of all requestCounts across all current hours, nodes, and users.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	RequestCount int64 `json:"requestCount"`
+
+	// currentHour contains request history for the current hour. This is porcelain to make the API
+	// easier to read by humans seeing if they addressed a problem. This field is reset on the hour.
+	// +optional
+	CurrentHour PerResourceAPIRequestLog `json:"currentHour"`
+
+	// last24h contains request history for the last 24 hours, indexed by the hour, so
+	// 12:00AM-12:59 is in index 0, 6am-6:59am is index 6, etc. The index of the current hour
+	// is updated live and then duplicated into the requestsLastHour field.
+	// +kubebuilder:validation:MaxItems=24
+	// +optional
+	Last24h []PerResourceAPIRequestLog `json:"last24h"`
+}
+
+// PerResourceAPIRequestLog logs request for various nodes.
+type PerResourceAPIRequestLog struct {
+
+	// byNode contains logs of requests per node.
+	// +kubebuilder:validation:MaxItems=512
+	// +optional
+	ByNode []PerNodeAPIRequestLog `json:"byNode"`
+
+	// requestCount is a sum of all requestCounts across nodes.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	RequestCount int64 `json:"requestCount"`
+}
+
+// PerNodeAPIRequestLog contains logs of requests to a certain node.
+type PerNodeAPIRequestLog struct {
+
+	// nodeName where the request are being handled.
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MaxLength=512
+	// +required
+	NodeName string `json:"nodeName"`
+
+	// requestCount is a sum of all requestCounts across all users, even those outside of the top 10 users.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	RequestCount int64 `json:"requestCount"`
+
+	// byUser contains request details by top .spec.numberOfUsersToReport users.
+	// Note that because in the case of an apiserver, restart the list of top users is determined on a best-effort basis,
+	// the list might be imprecise.
+	// In addition, some system users may be explicitly included in the list.
+	// +kubebuilder:validation:MaxItems=500
+	ByUser []PerUserAPIRequestCount `json:"byUser"`
+}
+
+// PerUserAPIRequestCount contains logs of a user's requests.
+type PerUserAPIRequestCount struct {
+
+	// userName that made the request.
+	// +kubebuilder:validation:MaxLength=512
+	UserName string `json:"username"`
+
+	// userAgent that made the request.
+	// The same user often has multiple binaries which connect (pods with many containers).  The different binaries
+	// will have different userAgents, but the same user.  In addition, we have userAgents with version information
+	// embedded and the userName isn't likely to change.
+	// +kubebuilder:validation:MaxLength=1024
+	UserAgent string `json:"userAgent"`
+
+	// requestCount of requests by the user across all verbs.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	RequestCount int64 `json:"requestCount"`
+
+	// byVerb details by verb.
+	// +kubebuilder:validation:MaxItems=10
+	ByVerb []PerVerbAPIRequestCount `json:"byVerb"`
+}
+
+// PerVerbAPIRequestCount requestCounts requests by API request verb.
+type PerVerbAPIRequestCount struct {
+
+	// verb of API request (get, list, create, etc...)
+	// +kubebuilder:validation:MaxLength=20
+	// +required
+	Verb string `json:"verb"`
+
+	// requestCount of requests for verb.
+	// +kubebuilder:validation:Minimum=0
+	// +required
+	RequestCount int64 `json:"requestCount"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// APIRequestCountList is a list of APIRequestCount resources.
+type APIRequestCountList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata"`
+
+	Items []APIRequestCount `json:"items"`
+}
diff --git a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go
index 3fb611c1bb9a64b884b2338a468375a11d3d93e8..139b0c8f878b3b68a622634a4e81d30b167e3df3 100644
--- a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go
+++ b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go
@@ -9,6 +9,114 @@ import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *APIRequestCount) DeepCopyInto(out *APIRequestCount) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	out.Spec = in.Spec
+	in.Status.DeepCopyInto(&out.Status)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIRequestCount.
+func (in *APIRequestCount) DeepCopy() *APIRequestCount {
+	if in == nil {
+		return nil
+	}
+	out := new(APIRequestCount)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *APIRequestCount) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *APIRequestCountList) DeepCopyInto(out *APIRequestCountList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]APIRequestCount, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIRequestCountList.
+func (in *APIRequestCountList) DeepCopy() *APIRequestCountList {
+	if in == nil {
+		return nil
+	}
+	out := new(APIRequestCountList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *APIRequestCountList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *APIRequestCountSpec) DeepCopyInto(out *APIRequestCountSpec) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIRequestCountSpec.
+func (in *APIRequestCountSpec) DeepCopy() *APIRequestCountSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(APIRequestCountSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *APIRequestCountStatus) DeepCopyInto(out *APIRequestCountStatus) {
+	*out = *in
+	if in.Conditions != nil {
+		in, out := &in.Conditions, &out.Conditions
+		*out = make([]metav1.Condition, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	in.CurrentHour.DeepCopyInto(&out.CurrentHour)
+	if in.Last24h != nil {
+		in, out := &in.Last24h, &out.Last24h
+		*out = make([]PerResourceAPIRequestLog, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIRequestCountStatus.
+func (in *APIRequestCountStatus) DeepCopy() *APIRequestCountStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(APIRequestCountStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DeprecatedAPIRequest) DeepCopyInto(out *DeprecatedAPIRequest) {
 	*out = *in
@@ -141,6 +249,89 @@ func (in *NodeRequestLog) DeepCopy() *NodeRequestLog {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PerNodeAPIRequestLog) DeepCopyInto(out *PerNodeAPIRequestLog) {
+	*out = *in
+	if in.ByUser != nil {
+		in, out := &in.ByUser, &out.ByUser
+		*out = make([]PerUserAPIRequestCount, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PerNodeAPIRequestLog.
+func (in *PerNodeAPIRequestLog) DeepCopy() *PerNodeAPIRequestLog {
+	if in == nil {
+		return nil
+	}
+	out := new(PerNodeAPIRequestLog)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PerResourceAPIRequestLog) DeepCopyInto(out *PerResourceAPIRequestLog) {
+	*out = *in
+	if in.ByNode != nil {
+		in, out := &in.ByNode, &out.ByNode
+		*out = make([]PerNodeAPIRequestLog, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PerResourceAPIRequestLog.
+func (in *PerResourceAPIRequestLog) DeepCopy() *PerResourceAPIRequestLog {
+	if in == nil {
+		return nil
+	}
+	out := new(PerResourceAPIRequestLog)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PerUserAPIRequestCount) DeepCopyInto(out *PerUserAPIRequestCount) {
+	*out = *in
+	if in.ByVerb != nil {
+		in, out := &in.ByVerb, &out.ByVerb
+		*out = make([]PerVerbAPIRequestCount, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PerUserAPIRequestCount.
+func (in *PerUserAPIRequestCount) DeepCopy() *PerUserAPIRequestCount {
+	if in == nil {
+		return nil
+	}
+	out := new(PerUserAPIRequestCount)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PerVerbAPIRequestCount) DeepCopyInto(out *PerVerbAPIRequestCount) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PerVerbAPIRequestCount.
+func (in *PerVerbAPIRequestCount) DeepCopy() *PerVerbAPIRequestCount {
+	if in == nil {
+		return nil
+	}
+	out := new(PerVerbAPIRequestCount)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *RequestCount) DeepCopyInto(out *RequestCount) {
 	*out = *in
diff --git a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go
index 66f3dc582a3b23cae56a1dbac34389c4ec3c06a0..c1146a17aa021ee1ddcccabdefb4f3e5cee7c027 100644
--- a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go
+++ b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go
@@ -11,6 +11,87 @@ package v1
 // Those methods can be generated by using hack/update-swagger-docs.sh
 
 // AUTO-GENERATED FUNCTIONS START HERE
+var map_APIRequestCount = map[string]string{
+	"":       "APIRequestCount tracks requests made to an API. The instance name must be of the form `resource.version.group`, matching the resource.",
+	"spec":   "spec defines the characteristics of the resource.",
+	"status": "status contains the observed state of the resource.",
+}
+
+func (APIRequestCount) SwaggerDoc() map[string]string {
+	return map_APIRequestCount
+}
+
+var map_APIRequestCountList = map[string]string{
+	"": "APIRequestCountList is a list of APIRequestCount resources.",
+}
+
+func (APIRequestCountList) SwaggerDoc() map[string]string {
+	return map_APIRequestCountList
+}
+
+var map_APIRequestCountSpec = map[string]string{
+	"numberOfUsersToReport": "numberOfUsersToReport is the number of users to include in the report. If unspecified or zero, the default is ten.  This is default is subject to change.",
+}
+
+func (APIRequestCountSpec) SwaggerDoc() map[string]string {
+	return map_APIRequestCountSpec
+}
+
+var map_APIRequestCountStatus = map[string]string{
+	"conditions":       "conditions contains details of the current status of this API Resource.",
+	"removedInRelease": "removedInRelease is when the API will be removed.",
+	"requestCount":     "requestCount is a sum of all requestCounts across all current hours, nodes, and users.",
+	"currentHour":      "currentHour contains request history for the current hour. This is porcelain to make the API easier to read by humans seeing if they addressed a problem. This field is reset on the hour.",
+	"last24h":          "last24h contains request history for the last 24 hours, indexed by the hour, so 12:00AM-12:59 is in index 0, 6am-6:59am is index 6, etc. The index of the current hour is updated live and then duplicated into the requestsLastHour field.",
+}
+
+func (APIRequestCountStatus) SwaggerDoc() map[string]string {
+	return map_APIRequestCountStatus
+}
+
+var map_PerNodeAPIRequestLog = map[string]string{
+	"":             "PerNodeAPIRequestLog contains logs of requests to a certain node.",
+	"nodeName":     "nodeName where the request are being handled.",
+	"requestCount": "requestCount is a sum of all requestCounts across all users, even those outside of the top 10 users.",
+	"byUser":       "byUser contains request details by top .spec.numberOfUsersToReport users. Note that because in the case of an apiserver, restart the list of top users is determined on a best-effort basis, the list might be imprecise. In addition, some system users may be explicitly included in the list.",
+}
+
+func (PerNodeAPIRequestLog) SwaggerDoc() map[string]string {
+	return map_PerNodeAPIRequestLog
+}
+
+var map_PerResourceAPIRequestLog = map[string]string{
+	"":             "PerResourceAPIRequestLog logs request for various nodes.",
+	"byNode":       "byNode contains logs of requests per node.",
+	"requestCount": "requestCount is a sum of all requestCounts across nodes.",
+}
+
+func (PerResourceAPIRequestLog) SwaggerDoc() map[string]string {
+	return map_PerResourceAPIRequestLog
+}
+
+var map_PerUserAPIRequestCount = map[string]string{
+	"":             "PerUserAPIRequestCount contains logs of a user's requests.",
+	"username":     "userName that made the request.",
+	"userAgent":    "userAgent that made the request. The same user often has multiple binaries which connect (pods with many containers).  The different binaries will have different userAgents, but the same user.  In addition, we have userAgents with version information embedded and the userName isn't likely to change.",
+	"requestCount": "requestCount of requests by the user across all verbs.",
+	"byVerb":       "byVerb details by verb.",
+}
+
+func (PerUserAPIRequestCount) SwaggerDoc() map[string]string {
+	return map_PerUserAPIRequestCount
+}
+
+var map_PerVerbAPIRequestCount = map[string]string{
+	"":             "PerVerbAPIRequestCount requestCounts requests by API request verb.",
+	"verb":         "verb of API request (get, list, create, etc...)",
+	"requestCount": "requestCount of requests for verb.",
+}
+
+func (PerVerbAPIRequestCount) SwaggerDoc() map[string]string {
+	return map_PerVerbAPIRequestCount
+}
+
 var map_DeprecatedAPIRequest = map[string]string{
 	"":       "DeprecatedAPIRequest tracts requests made to a deprecated API. The instance name should be of the form `resource.version.group`, matching the deprecated resource.",
 	"spec":   "spec defines the characteristics of the resource.",
diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml
index 8e6f86222e4699e6ec456a050ae07eca72f8e57e..c05562e64ac438375c48c277a8d6083d83e930ab 100644
--- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml
+++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml
@@ -1,4 +1,4 @@
-apiVersion: apiextensions.k8s.io/v1beta1
+apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   name: dnses.config.openshift.io
@@ -14,91 +14,90 @@ spec:
     plural: dnses
     singular: dns
   scope: Cluster
-  preserveUnknownFields: false
   versions:
   - name: v1
     served: true
     storage: true
-  subresources:
-    status: {}
-  "validation":
-    "openAPIV3Schema":
-      description: DNS holds cluster-wide information about DNS. The canonical name
-        is `cluster`
-      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 holds user settable values for configuration
-          type: object
-          properties:
-            baseDomain:
-              description: "baseDomain is the base domain of the cluster. All managed
-                DNS records will be sub-domains of this base. \n For example, given
-                the base domain `openshift.example.com`, an API server DNS record
-                may be created for `cluster-api.openshift.example.com`. \n Once set,
-                this field cannot be changed."
-              type: string
-            privateZone:
-              description: "privateZone is the location where all the DNS records
-                that are only available internally to the cluster exist. \n If this
-                field is nil, no private records should be created. \n Once set, this
-                field cannot be changed."
-              type: object
-              properties:
-                id:
-                  description: "id is the identifier that can be used to find the
-                    DNS hosted zone. \n on AWS zone can be fetched using `ID` as id
-                    in [1] on Azure zone can be fetched using `ID` as a pre-determined
-                    name in [2], on GCP zone can be fetched using `ID` as a pre-determined
-                    name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options
-                    [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show
-                    [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get"
-                  type: string
-                tags:
-                  description: "tags can be used to query the DNS hosted zone. \n
-                    on AWS, resourcegroupstaggingapi [1] can be used to fetch a zone
-                    using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options"
-                  type: object
-                  additionalProperties:
+    subresources:
+      status: {}
+    "schema":
+      "openAPIV3Schema":
+        description: DNS holds cluster-wide information about DNS. The canonical name
+          is `cluster`
+        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 holds user settable values for configuration
+            type: object
+            properties:
+              baseDomain:
+                description: "baseDomain is the base domain of the cluster. All managed
+                  DNS records will be sub-domains of this base. \n For example, given
+                  the base domain `openshift.example.com`, an API server DNS record
+                  may be created for `cluster-api.openshift.example.com`. \n Once
+                  set, this field cannot be changed."
+                type: string
+              privateZone:
+                description: "privateZone is the location where all the DNS records
+                  that are only available internally to the cluster exist. \n If this
+                  field is nil, no private records should be created. \n Once set,
+                  this field cannot be changed."
+                type: object
+                properties:
+                  id:
+                    description: "id is the identifier that can be used to find the
+                      DNS hosted zone. \n on AWS zone can be fetched using `ID` as
+                      id in [1] on Azure zone can be fetched using `ID` as a pre-determined
+                      name in [2], on GCP zone can be fetched using `ID` as a pre-determined
+                      name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options
+                      [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show
+                      [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get"
                     type: string
-            publicZone:
-              description: "publicZone is the location where all the DNS records that
-                are publicly accessible to the internet exist. \n If this field is
-                nil, no public records should be created. \n Once set, this field
-                cannot be changed."
-              type: object
-              properties:
-                id:
-                  description: "id is the identifier that can be used to find the
-                    DNS hosted zone. \n on AWS zone can be fetched using `ID` as id
-                    in [1] on Azure zone can be fetched using `ID` as a pre-determined
-                    name in [2], on GCP zone can be fetched using `ID` as a pre-determined
-                    name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options
-                    [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show
-                    [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get"
-                  type: string
-                tags:
-                  description: "tags can be used to query the DNS hosted zone. \n
-                    on AWS, resourcegroupstaggingapi [1] can be used to fetch a zone
-                    using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options"
-                  type: object
-                  additionalProperties:
+                  tags:
+                    description: "tags can be used to query the DNS hosted zone. \n
+                      on AWS, resourcegroupstaggingapi [1] can be used to fetch a
+                      zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options"
+                    type: object
+                    additionalProperties:
+                      type: string
+              publicZone:
+                description: "publicZone is the location where all the DNS records
+                  that are publicly accessible to the internet exist. \n If this field
+                  is nil, no public records should be created. \n Once set, this field
+                  cannot be changed."
+                type: object
+                properties:
+                  id:
+                    description: "id is the identifier that can be used to find the
+                      DNS hosted zone. \n on AWS zone can be fetched using `ID` as
+                      id in [1] on Azure zone can be fetched using `ID` as a pre-determined
+                      name in [2], on GCP zone can be fetched using `ID` as a pre-determined
+                      name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options
+                      [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show
+                      [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get"
                     type: string
-        status:
-          description: status holds observed values from the cluster. They may not
-            be overridden.
-          type: object
+                  tags:
+                    description: "tags can be used to query the DNS hosted zone. \n
+                      on AWS, resourcegroupstaggingapi [1] can be used to fetch a
+                      zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options"
+                    type: object
+                    additionalProperties:
+                      type: string
+          status:
+            description: status holds observed values from the cluster. They may not
+              be overridden.
+            type: object
diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml
index 212c1e21f5fa8b8596523349ebd3fe74981f9c46..d8623cd85fd0819c3be0e71bd537a30055cc2060 100644
--- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml
+++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml
@@ -248,6 +248,37 @@ spec:
                         description: region holds the default AWS region for new AWS
                           resources created by the cluster.
                         type: string
+                      resourceTags:
+                        description: resourceTags is a list of additional tags to
+                          apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html
+                          for information on tagging AWS resources. AWS supports a
+                          maximum of 50 tags per resource. OpenShift reserves 25 tags
+                          for its use, leaving 25 tags available for the user.
+                        type: array
+                        maxItems: 25
+                        items:
+                          description: AWSResourceTag is a tag to apply to AWS resources
+                            created for the cluster.
+                          type: object
+                          required:
+                          - key
+                          - value
+                          properties:
+                            key:
+                              description: key is the key of the tag
+                              type: string
+                              maxLength: 128
+                              minLength: 1
+                              pattern: ^[0-9A-Za-z_.:/=+-@]+$
+                            value:
+                              description: value is the value of the tag. Some AWS
+                                service do not support empty values. Since tags are
+                                added to resources in many services, the length of
+                                the tag value must meet the requirements of all services.
+                              type: string
+                              maxLength: 256
+                              minLength: 1
+                              pattern: ^[0-9A-Za-z_.:/=+-@]+$
                       serviceEndpoints:
                         description: ServiceEndpoints list contains custom endpoints
                           which will override default service endpoint of AWS Services.
diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml
index e464717320e0f2f511d01f67e45b5a732ef682e8..7c1b4f6d7b4d51a5dd275eb7d9354961a794e494 100644
--- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml
+++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml
@@ -1,4 +1,4 @@
-apiVersion: apiextensions.k8s.io/v1beta1
+apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   name: ingresses.config.openshift.io
@@ -14,283 +14,286 @@ spec:
     plural: ingresses
     singular: ingress
   scope: Cluster
-  preserveUnknownFields: false
   versions:
   - name: v1
     served: true
     storage: true
-  subresources:
-    status: {}
-  "validation":
-    "openAPIV3Schema":
-      description: Ingress holds cluster-wide information about ingress, including
-        the default ingress domain used for routes. The canonical name is `cluster`.
-      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 holds user settable values for configuration
-          type: object
-          properties:
-            appsDomain:
-              description: appsDomain is an optional domain to use instead of the
-                one specified in the domain field when a Route is created without
-                specifying an explicit host. If appsDomain is nonempty, this value
-                is used to generate default host values for Route. Unlike domain,
-                appsDomain may be modified after installation. This assumes a new
-                ingresscontroller has been setup with a wildcard certificate.
-              type: string
-            componentRoutes:
-              description: "componentRoutes is an optional list of routes that are
-                managed by OpenShift components that a cluster-admin is able to configure
-                the hostname and serving certificate for. The namespace and name of
-                each route in this list should match an existing entry in the status.componentRoutes
-                list. \n To determine the set of configurable Routes, look at namespace
-                and name of entries in the .status.componentRoutes list, where participating
-                operators write the status of configurable routes."
-              type: array
-              items:
-                description: ComponentRouteSpec allows for configuration of a route's
-                  hostname and serving certificate.
-                type: object
-                required:
-                - hostname
-                - name
-                - namespace
-                properties:
-                  hostname:
-                    description: hostname is the hostname that should be used by the
-                      route.
-                    type: string
-                    format: hostname
-                  name:
-                    description: "name is the logical name of the route to customize.
-                      \n The namespace and name of this componentRoute must match
-                      a corresponding entry in the list of status.componentRoutes
-                      if the route is to be customized."
-                    type: string
-                    maxLength: 256
-                    minLength: 1
-                  namespace:
-                    description: "namespace is the namespace of the route to customize.
-                      \n The namespace and name of this componentRoute must match
-                      a corresponding entry in the list of status.componentRoutes
-                      if the route is to be customized."
-                    type: string
-                    maxLength: 63
-                    minLength: 1
-                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
-                  servingCertKeyPairSecret:
-                    description: servingCertKeyPairSecret is a reference to a secret
-                      of type `kubernetes.io/tls` in the openshift-config namespace.
-                      The serving cert/key pair must match and will be used by the
-                      operator to fulfill the intent of serving with this name. If
-                      the custom hostname uses the default routing suffix of the cluster,
-                      the Secret specification for a serving certificate will not
-                      be needed.
-                    type: object
-                    required:
-                    - name
-                    properties:
-                      name:
-                        description: name is the metadata.name of the referenced secret
-                        type: string
-            domain:
-              description: "domain is used to generate a default host name for a route
-                when the route's host name is empty. The generated host name will
-                follow this pattern: \"<route-name>.<route-namespace>.<domain>\".
-                \n It is also used as the default wildcard domain suffix for ingress.
-                The default ingresscontroller domain will follow this pattern: \"*.<domain>\".
-                \n Once set, changing domain is not currently supported."
-              type: string
-        status:
-          description: status holds observed values from the cluster. They may not
-            be overridden.
-          type: object
-          properties:
-            componentRoutes:
-              description: componentRoutes is where participating operators place
-                the current route status for routes whose hostnames and serving certificates
-                can be customized by the cluster-admin.
-              type: array
-              items:
-                description: ComponentRouteStatus contains information allowing configuration
-                  of a route's hostname and serving certificate.
-                type: object
-                required:
-                - defaultHostname
-                - name
-                - namespace
-                - relatedObjects
-                properties:
-                  conditions:
-                    description: "conditions are used to communicate the state of
-                      the componentRoutes entry. \n Supported conditions include Available,
-                      Degraded and Progressing. \n If available is true, the content
-                      served by the route can be accessed by users. This includes
-                      cases where a default may continue to serve content while the
-                      customized route specified by the cluster-admin is being configured.
-                      \n If Degraded is true, that means something has gone wrong
-                      trying to handle the componentRoutes entry. The currentHostnames
-                      field may or may not be in effect. \n If Progressing is true,
-                      that means the component is taking some action related to the
-                      componentRoutes entry."
-                    type: array
-                    items:
-                      description: "Condition contains details for one aspect of the
-                        current state of this API Resource. --- This struct is intended
-                        for direct use as an array at the field path .status.conditions.
-                        \ For example, type FooStatus struct{     // Represents the
-                        observations of a foo's current state.     // Known .status.conditions.type
-                        are: \"Available\", \"Progressing\", and \"Degraded\"     //
-                        +patchMergeKey=type     // +patchStrategy=merge     // +listType=map
-                        \    // +listMapKey=type     Conditions []metav1.Condition
-                        `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"
-                        protobuf:\"bytes,1,rep,name=conditions\"` \n     // other
-                        fields }"
-                      type: object
-                      required:
-                      - lastTransitionTime
-                      - message
-                      - reason
-                      - status
-                      - type
-                      properties:
-                        lastTransitionTime:
-                          description: lastTransitionTime is the last time the condition
-                            transitioned from one status to another. This should be
-                            when the underlying condition changed.  If that is not
-                            known, then using the time when the API field changed
-                            is acceptable.
-                          type: string
-                          format: date-time
-                        message:
-                          description: message is a human readable message indicating
-                            details about the transition. This may be an empty string.
-                          type: string
-                          maxLength: 32768
-                        observedGeneration:
-                          description: observedGeneration represents the .metadata.generation
-                            that the condition was set based upon. For instance, if
-                            .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration
-                            is 9, the condition is out of date with respect to the
-                            current state of the instance.
-                          type: integer
-                          format: int64
-                          minimum: 0
-                        reason:
-                          description: reason contains a programmatic identifier indicating
-                            the reason for the condition's last transition. Producers
-                            of specific condition types may define expected values
-                            and meanings for this field, and whether the values are
-                            considered a guaranteed API. The value should be a CamelCase
-                            string. This field may not be empty.
-                          type: string
-                          maxLength: 1024
-                          minLength: 1
-                          pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
-                        status:
-                          description: status of the condition, one of True, False,
-                            Unknown.
-                          type: string
-                          enum:
-                          - "True"
-                          - "False"
-                          - Unknown
-                        type:
-                          description: type of condition in CamelCase or in foo.example.com/CamelCase.
-                            --- Many .condition.type values are consistent across
-                            resources like Available, but because arbitrary conditions
-                            can be useful (see .node.status.conditions), the ability
-                            to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
-                          type: string
-                          maxLength: 316
-                          pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-                  consumingUsers:
-                    description: consumingUsers is a slice of ServiceAccounts that
-                      need to have read permission on the servingCertKeyPairSecret
-                      secret.
-                    type: array
-                    maxItems: 5
-                    items:
-                      description: ConsumingUser is an alias for string which we add
-                        validation to. Currently only service accounts are supported.
+    subresources:
+      status: {}
+    "schema":
+      "openAPIV3Schema":
+        description: Ingress holds cluster-wide information about ingress, including
+          the default ingress domain used for routes. The canonical name is `cluster`.
+        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 holds user settable values for configuration
+            type: object
+            properties:
+              appsDomain:
+                description: appsDomain is an optional domain to use instead of the
+                  one specified in the domain field when a Route is created without
+                  specifying an explicit host. If appsDomain is nonempty, this value
+                  is used to generate default host values for Route. Unlike domain,
+                  appsDomain may be modified after installation. This assumes a new
+                  ingresscontroller has been setup with a wildcard certificate.
+                type: string
+              componentRoutes:
+                description: "componentRoutes is an optional list of routes that are
+                  managed by OpenShift components that a cluster-admin is able to
+                  configure the hostname and serving certificate for. The namespace
+                  and name of each route in this list should match an existing entry
+                  in the status.componentRoutes list. \n To determine the set of configurable
+                  Routes, look at namespace and name of entries in the .status.componentRoutes
+                  list, where participating operators write the status of configurable
+                  routes."
+                type: array
+                items:
+                  description: ComponentRouteSpec allows for configuration of a route's
+                    hostname and serving certificate.
+                  type: object
+                  required:
+                  - hostname
+                  - name
+                  - namespace
+                  properties:
+                    hostname:
+                      description: hostname is the hostname that should be used by
+                        the route.
                       type: string
-                      maxLength: 512
+                      format: hostname
+                    name:
+                      description: "name is the logical name of the route to customize.
+                        \n The namespace and name of this componentRoute must match
+                        a corresponding entry in the list of status.componentRoutes
+                        if the route is to be customized."
+                      type: string
+                      maxLength: 256
                       minLength: 1
-                      pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
-                  currentHostnames:
-                    description: currentHostnames is the list of current names used
-                      by the route. Typically, this list should consist of a single
-                      hostname, but if multiple hostnames are supported by the route
-                      the operator may write multiple entries to this list.
-                    type: array
-                    minItems: 1
-                    items:
-                      description: Hostname is an alias for hostname string validation.
+                    namespace:
+                      description: "namespace is the namespace of the route to customize.
+                        \n The namespace and name of this componentRoute must match
+                        a corresponding entry in the list of status.componentRoutes
+                        if the route is to be customized."
                       type: string
-                      format: hostname
-                  defaultHostname:
-                    description: defaultHostname is the hostname of this route prior
-                      to customization.
-                    type: string
-                    format: hostname
-                  name:
-                    description: "name is the logical name of the route to customize.
-                      It does not have to be the actual name of a route resource but
-                      it cannot be renamed. \n The namespace and name of this componentRoute
-                      must match a corresponding entry in the list of spec.componentRoutes
-                      if the route is to be customized."
-                    type: string
-                    maxLength: 256
-                    minLength: 1
-                  namespace:
-                    description: "namespace is the namespace of the route to customize.
-                      It must be a real namespace. Using an actual namespace ensures
-                      that no two components will conflict and the same component
-                      can be installed multiple times. \n The namespace and name of
-                      this componentRoute must match a corresponding entry in the
-                      list of spec.componentRoutes if the route is to be customized."
-                    type: string
-                    maxLength: 63
-                    minLength: 1
-                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
-                  relatedObjects:
-                    description: relatedObjects is a list of resources which are useful
-                      when debugging or inspecting how spec.componentRoutes is applied.
-                    type: array
-                    minItems: 1
-                    items:
-                      description: ObjectReference contains enough information to
-                        let you inspect or modify the referred object.
+                      maxLength: 63
+                      minLength: 1
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                    servingCertKeyPairSecret:
+                      description: servingCertKeyPairSecret is a reference to a secret
+                        of type `kubernetes.io/tls` in the openshift-config namespace.
+                        The serving cert/key pair must match and will be used by the
+                        operator to fulfill the intent of serving with this name.
+                        If the custom hostname uses the default routing suffix of
+                        the cluster, the Secret specification for a serving certificate
+                        will not be needed.
                       type: object
                       required:
-                      - group
                       - name
-                      - resource
                       properties:
-                        group:
-                          description: group of the referent.
-                          type: string
                         name:
-                          description: name of the referent.
-                          type: string
-                        namespace:
-                          description: namespace of the referent.
-                          type: string
-                        resource:
-                          description: resource of the referent.
+                          description: name is the metadata.name of the referenced
+                            secret
                           type: string
+              domain:
+                description: "domain is used to generate a default host name for a
+                  route when the route's host name is empty. The generated host name
+                  will follow this pattern: \"<route-name>.<route-namespace>.<domain>\".
+                  \n It is also used as the default wildcard domain suffix for ingress.
+                  The default ingresscontroller domain will follow this pattern: \"*.<domain>\".
+                  \n Once set, changing domain is not currently supported."
+                type: string
+          status:
+            description: status holds observed values from the cluster. They may not
+              be overridden.
+            type: object
+            properties:
+              componentRoutes:
+                description: componentRoutes is where participating operators place
+                  the current route status for routes whose hostnames and serving
+                  certificates can be customized by the cluster-admin.
+                type: array
+                items:
+                  description: ComponentRouteStatus contains information allowing
+                    configuration of a route's hostname and serving certificate.
+                  type: object
+                  required:
+                  - defaultHostname
+                  - name
+                  - namespace
+                  - relatedObjects
+                  properties:
+                    conditions:
+                      description: "conditions are used to communicate the state of
+                        the componentRoutes entry. \n Supported conditions include
+                        Available, Degraded and Progressing. \n If available is true,
+                        the content served by the route can be accessed by users.
+                        This includes cases where a default may continue to serve
+                        content while the customized route specified by the cluster-admin
+                        is being configured. \n If Degraded is true, that means something
+                        has gone wrong trying to handle the componentRoutes entry.
+                        The currentHostnames field may or may not be in effect. \n
+                        If Progressing is true, that means the component is taking
+                        some action related to the componentRoutes entry."
+                      type: array
+                      items:
+                        description: "Condition contains details for one aspect of
+                          the current state of this API Resource. --- This struct
+                          is intended for direct use as an array at the field path
+                          .status.conditions.  For example, type FooStatus struct{
+                          \    // Represents the observations of a foo's current state.
+                          \    // Known .status.conditions.type are: \"Available\",
+                          \"Progressing\", and \"Degraded\"     // +patchMergeKey=type
+                          \    // +patchStrategy=merge     // +listType=map     //
+                          +listMapKey=type     Conditions []metav1.Condition `json:\"conditions,omitempty\"
+                          patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
+                          \n     // other fields }"
+                        type: object
+                        required:
+                        - lastTransitionTime
+                        - message
+                        - reason
+                        - status
+                        - type
+                        properties:
+                          lastTransitionTime:
+                            description: lastTransitionTime is the last time the condition
+                              transitioned from one status to another. This should
+                              be when the underlying condition changed.  If that is
+                              not known, then using the time when the API field changed
+                              is acceptable.
+                            type: string
+                            format: date-time
+                          message:
+                            description: message is a human readable message indicating
+                              details about the transition. This may be an empty string.
+                            type: string
+                            maxLength: 32768
+                          observedGeneration:
+                            description: observedGeneration represents the .metadata.generation
+                              that the condition was set based upon. For instance,
+                              if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration
+                              is 9, the condition is out of date with respect to the
+                              current state of the instance.
+                            type: integer
+                            format: int64
+                            minimum: 0
+                          reason:
+                            description: reason contains a programmatic identifier
+                              indicating the reason for the condition's last transition.
+                              Producers of specific condition types may define expected
+                              values and meanings for this field, and whether the
+                              values are considered a guaranteed API. The value should
+                              be a CamelCase string. This field may not be empty.
+                            type: string
+                            maxLength: 1024
+                            minLength: 1
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                          status:
+                            description: status of the condition, one of True, False,
+                              Unknown.
+                            type: string
+                            enum:
+                            - "True"
+                            - "False"
+                            - Unknown
+                          type:
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                              --- Many .condition.type values are consistent across
+                              resources like Available, but because arbitrary conditions
+                              can be useful (see .node.status.conditions), the ability
+                              to deconflict is important. The regex it matches is
+                              (dns1123SubdomainFmt/)?(qualifiedNameFmt)
+                            type: string
+                            maxLength: 316
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                    consumingUsers:
+                      description: consumingUsers is a slice of ServiceAccounts that
+                        need to have read permission on the servingCertKeyPairSecret
+                        secret.
+                      type: array
+                      maxItems: 5
+                      items:
+                        description: ConsumingUser is an alias for string which we
+                          add validation to. Currently only service accounts are supported.
+                        type: string
+                        maxLength: 512
+                        minLength: 1
+                        pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+                    currentHostnames:
+                      description: currentHostnames is the list of current names used
+                        by the route. Typically, this list should consist of a single
+                        hostname, but if multiple hostnames are supported by the route
+                        the operator may write multiple entries to this list.
+                      type: array
+                      minItems: 1
+                      items:
+                        description: Hostname is an alias for hostname string validation.
+                        type: string
+                        format: hostname
+                    defaultHostname:
+                      description: defaultHostname is the hostname of this route prior
+                        to customization.
+                      type: string
+                      format: hostname
+                    name:
+                      description: "name is the logical name of the route to customize.
+                        It does not have to be the actual name of a route resource
+                        but it cannot be renamed. \n The namespace and name of this
+                        componentRoute must match a corresponding entry in the list
+                        of spec.componentRoutes if the route is to be customized."
+                      type: string
+                      maxLength: 256
+                      minLength: 1
+                    namespace:
+                      description: "namespace is the namespace of the route to customize.
+                        It must be a real namespace. Using an actual namespace ensures
+                        that no two components will conflict and the same component
+                        can be installed multiple times. \n The namespace and name
+                        of this componentRoute must match a corresponding entry in
+                        the list of spec.componentRoutes if the route is to be customized."
+                      type: string
+                      maxLength: 63
+                      minLength: 1
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$
+                    relatedObjects:
+                      description: relatedObjects is a list of resources which are
+                        useful when debugging or inspecting how spec.componentRoutes
+                        is applied.
+                      type: array
+                      minItems: 1
+                      items:
+                        description: ObjectReference contains enough information to
+                          let you inspect or modify the referred object.
+                        type: object
+                        required:
+                        - group
+                        - name
+                        - resource
+                        properties:
+                          group:
+                            description: group of the referent.
+                            type: string
+                          name:
+                            description: name of the referent.
+                            type: string
+                          namespace:
+                            description: namespace of the referent.
+                            type: string
+                          resource:
+                            description: resource of the referent.
+                            type: string
diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml
index 8d5c193efe1012d869c17146556a87962f2a4a11..10eb476ede9bee6bf014217538801ef0a33d9fbd 100644
--- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml
+++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml
@@ -1,4 +1,4 @@
-apiVersion: apiextensions.k8s.io/v1beta1
+apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   name: networks.config.openshift.io
@@ -19,148 +19,154 @@ spec:
   - name: v1
     served: true
     storage: true
-  "validation":
-    "openAPIV3Schema":
-      description: 'Network holds cluster-wide information about Network. The canonical
-        name is `cluster`. It is used to configure the desired network configuration,
-        such as: IP address pools for services/pod IPs, network plugin, etc. Please
-        view network.spec for an explanation on what applies when configuring this
-        resource.'
-      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 holds user settable values for configuration. As a general
-            rule, this SHOULD NOT be read directly. Instead, you should consume the
-            NetworkStatus, as it indicates the currently deployed configuration. Currently,
-            most spec fields are immutable after installation. Please view the individual
-            ones for further details on each.
-          type: object
-          properties:
-            clusterNetwork:
-              description: IP address pool to use for pod IPs. This field is immutable
-                after installation.
-              type: array
-              items:
-                description: ClusterNetworkEntry is a contiguous block of IP addresses
-                  from which pod IPs are allocated.
+    "schema":
+      "openAPIV3Schema":
+        description: 'Network holds cluster-wide information about Network. The canonical
+          name is `cluster`. It is used to configure the desired network configuration,
+          such as: IP address pools for services/pod IPs, network plugin, etc. Please
+          view network.spec for an explanation on what applies when configuring this
+          resource.'
+        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 holds user settable values for configuration. As a general
+              rule, this SHOULD NOT be read directly. Instead, you should consume
+              the NetworkStatus, as it indicates the currently deployed configuration.
+              Currently, most spec fields are immutable after installation. Please
+              view the individual ones for further details on each.
+            type: object
+            properties:
+              clusterNetwork:
+                description: IP address pool to use for pod IPs. This field is immutable
+                  after installation.
+                type: array
+                items:
+                  description: ClusterNetworkEntry is a contiguous block of IP addresses
+                    from which pod IPs are allocated.
+                  type: object
+                  properties:
+                    cidr:
+                      description: The complete block for pod IPs.
+                      type: string
+                    hostPrefix:
+                      description: The size (prefix) of block to allocate to each
+                        node. If this field is not used by the plugin, it can be left
+                        unset.
+                      type: integer
+                      format: int32
+                      minimum: 0
+              externalIP:
+                description: externalIP defines configuration for controllers that
+                  affect Service.ExternalIP. If nil, then ExternalIP is not allowed
+                  to be set.
                 type: object
                 properties:
-                  cidr:
-                    description: The complete block for pod IPs.
-                    type: string
-                  hostPrefix:
-                    description: The size (prefix) of block to allocate to each node.
-                      If this field is not used by the plugin, it can be left unset.
-                    type: integer
-                    format: int32
-                    minimum: 0
-            externalIP:
-              description: externalIP defines configuration for controllers that affect
-                Service.ExternalIP. If nil, then ExternalIP is not allowed to be set.
-              type: object
-              properties:
-                autoAssignCIDRs:
-                  description: autoAssignCIDRs is a list of CIDRs from which to automatically
-                    assign Service.ExternalIP. These are assigned when the service
-                    is of type LoadBalancer. In general, this is only useful for bare-metal
-                    clusters. In Openshift 3.x, this was misleadingly called "IngressIPs".
-                    Automatically assigned External IPs are not affected by any ExternalIPPolicy
-                    rules. Currently, only one entry may be provided.
-                  type: array
-                  items:
-                    type: string
-                policy:
-                  description: policy is a set of restrictions applied to the ExternalIP
-                    field. If nil or empty, then ExternalIP is not allowed to be set.
+                  autoAssignCIDRs:
+                    description: autoAssignCIDRs is a list of CIDRs from which to
+                      automatically assign Service.ExternalIP. These are assigned
+                      when the service is of type LoadBalancer. In general, this is
+                      only useful for bare-metal clusters. In Openshift 3.x, this
+                      was misleadingly called "IngressIPs". Automatically assigned
+                      External IPs are not affected by any ExternalIPPolicy rules.
+                      Currently, only one entry may be provided.
+                    type: array
+                    items:
+                      type: string
+                  policy:
+                    description: policy is a set of restrictions applied to the ExternalIP
+                      field. If nil or empty, then ExternalIP is not allowed to be
+                      set.
+                    type: object
+                    properties:
+                      allowedCIDRs:
+                        description: allowedCIDRs is the list of allowed CIDRs.
+                        type: array
+                        items:
+                          type: string
+                      rejectedCIDRs:
+                        description: rejectedCIDRs is the list of disallowed CIDRs.
+                          These take precedence over allowedCIDRs.
+                        type: array
+                        items:
+                          type: string
+              networkType:
+                description: 'NetworkType is the plugin that is to be deployed (e.g.
+                  OpenShiftSDN). This should match a value that the cluster-network-operator
+                  understands, or else no networking will be installed. Currently
+                  supported values are: - OpenShiftSDN This field is immutable after
+                  installation.'
+                type: string
+              serviceNetwork:
+                description: IP address pool for services. Currently, we only support
+                  a single entry here. This field is immutable after installation.
+                type: array
+                items:
+                  type: string
+              serviceNodePortRange:
+                description: The port range allowed for Services of type NodePort.
+                  If not specified, the default of 30000-32767 will be used. Such
+                  Services without a NodePort specified will have one automatically
+                  allocated from this range. This parameter can be updated after the
+                  cluster is installed.
+                type: string
+                pattern: ^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
+          status:
+            description: status holds observed values from the cluster. They may not
+              be overridden.
+            type: object
+            properties:
+              clusterNetwork:
+                description: IP address pool to use for pod IPs.
+                type: array
+                items:
+                  description: ClusterNetworkEntry is a contiguous block of IP addresses
+                    from which pod IPs are allocated.
                   type: object
                   properties:
-                    allowedCIDRs:
-                      description: allowedCIDRs is the list of allowed CIDRs.
-                      type: array
-                      items:
-                        type: string
-                    rejectedCIDRs:
-                      description: rejectedCIDRs is the list of disallowed CIDRs.
-                        These take precedence over allowedCIDRs.
-                      type: array
-                      items:
-                        type: string
-            networkType:
-              description: 'NetworkType is the plugin that is to be deployed (e.g.
-                OpenShiftSDN). This should match a value that the cluster-network-operator
-                understands, or else no networking will be installed. Currently supported
-                values are: - OpenShiftSDN This field is immutable after installation.'
-              type: string
-            serviceNetwork:
-              description: IP address pool for services. Currently, we only support
-                a single entry here. This field is immutable after installation.
-              type: array
-              items:
-                type: string
-            serviceNodePortRange:
-              description: The port range allowed for Services of type NodePort. If
-                not specified, the default of 30000-32767 will be used. Such Services
-                without a NodePort specified will have one automatically allocated
-                from this range. This parameter can be updated after the cluster is
-                installed.
-              type: string
-              pattern: ^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
-        status:
-          description: status holds observed values from the cluster. They may not
-            be overridden.
-          type: object
-          properties:
-            clusterNetwork:
-              description: IP address pool to use for pod IPs.
-              type: array
-              items:
-                description: ClusterNetworkEntry is a contiguous block of IP addresses
-                  from which pod IPs are allocated.
+                    cidr:
+                      description: The complete block for pod IPs.
+                      type: string
+                    hostPrefix:
+                      description: The size (prefix) of block to allocate to each
+                        node. If this field is not used by the plugin, it can be left
+                        unset.
+                      type: integer
+                      format: int32
+                      minimum: 0
+              clusterNetworkMTU:
+                description: ClusterNetworkMTU is the MTU for inter-pod networking.
+                type: integer
+              migration:
+                description: Migration contains the cluster network migration configuration.
                 type: object
                 properties:
-                  cidr:
-                    description: The complete block for pod IPs.
+                  networkType:
+                    description: 'NetworkType is the target plugin that is to be deployed.
+                      Currently supported values are: OpenShiftSDN, OVNKubernetes'
                     type: string
-                  hostPrefix:
-                    description: The size (prefix) of block to allocate to each node.
-                      If this field is not used by the plugin, it can be left unset.
-                    type: integer
-                    format: int32
-                    minimum: 0
-            clusterNetworkMTU:
-              description: ClusterNetworkMTU is the MTU for inter-pod networking.
-              type: integer
-            migration:
-              description: Migration contains the cluster network migration configuration.
-              type: object
-              properties:
-                networkType:
-                  description: 'NetworkType is the target plugin that is to be deployed.
-                    Currently supported values are: OpenShiftSDN, OVNKubernetes'
-                  type: string
-                  enum:
-                  - OpenShiftSDN
-                  - OVNKubernetes
-            networkType:
-              description: NetworkType is the plugin that is deployed (e.g. OpenShiftSDN).
-              type: string
-            serviceNetwork:
-              description: IP address pool for services. Currently, we only support
-                a single entry here.
-              type: array
-              items:
+                    enum:
+                    - OpenShiftSDN
+                    - OVNKubernetes
+              networkType:
+                description: NetworkType is the plugin that is deployed (e.g. OpenShiftSDN).
                 type: string
+              serviceNetwork:
+                description: IP address pool for services. Currently, we only support
+                  a single entry here.
+                type: array
+                items:
+                  type: string
diff --git a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go
index d5ebcc91c5ee6998f3d64714afb3912d82470341..6e78d5ea6d2cb1118753c5f34cc01064a20fcd15 100644
--- a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go
+++ b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go
@@ -313,6 +313,34 @@ type AWSPlatformStatus struct {
 	// There must be only one ServiceEndpoint for a service.
 	// +optional
 	ServiceEndpoints []AWSServiceEndpoint `json:"serviceEndpoints,omitempty"`
+
+	// resourceTags is a list of additional tags to apply to AWS resources created for the cluster.
+	// See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources.
+	// AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags
+	// available for the user.
+	// +kubebuilder:validation:MaxItems=25
+	// +optional
+	ResourceTags []AWSResourceTag `json:"resourceTags,omitempty"`
+}
+
+// AWSResourceTag is a tag to apply to AWS resources created for the cluster.
+type AWSResourceTag struct {
+	// key is the key of the tag
+	// +kubebuilder:validation:Required
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MaxLength=128
+	// +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$`
+	// +required
+	Key string `json:"key"`
+	// value is the value of the tag.
+	// Some AWS service do not support empty values. Since tags are added to resources in many services, the
+	// length of the tag value must meet the requirements of all services.
+	// +kubebuilder:validation:Required
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MaxLength=256
+	// +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$`
+	// +required
+	Value string `json:"value"`
 }
 
 // AzurePlatformSpec holds the desired state of the Azure infrastructure provider.
diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go
index e6012e04e3fd90da21140efc69b31d6c116d7d5c..cb933dac08cf0830d66440306dd78160a0254e29 100644
--- a/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go
+++ b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go
@@ -207,6 +207,11 @@ func (in *AWSPlatformStatus) DeepCopyInto(out *AWSPlatformStatus) {
 		*out = make([]AWSServiceEndpoint, len(*in))
 		copy(*out, *in)
 	}
+	if in.ResourceTags != nil {
+		in, out := &in.ResourceTags, &out.ResourceTags
+		*out = make([]AWSResourceTag, len(*in))
+		copy(*out, *in)
+	}
 	return
 }
 
@@ -220,6 +225,22 @@ func (in *AWSPlatformStatus) DeepCopy() *AWSPlatformStatus {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AWSResourceTag) DeepCopyInto(out *AWSResourceTag) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSResourceTag.
+func (in *AWSResourceTag) DeepCopy() *AWSResourceTag {
+	if in == nil {
+		return nil
+	}
+	out := new(AWSResourceTag)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *AWSServiceEndpoint) DeepCopyInto(out *AWSServiceEndpoint) {
 	*out = *in
diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go
index 6cc78bc37b9cb86b4282c2d346a07e69e3704f23..22de664b22a940f7982d61054f9639d91d3a59aa 100644
--- a/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go
+++ b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go
@@ -725,12 +725,23 @@ var map_AWSPlatformStatus = map[string]string{
 	"":                 "AWSPlatformStatus holds the current status of the Amazon Web Services infrastructure provider.",
 	"region":           "region holds the default AWS region for new AWS resources created by the cluster.",
 	"serviceEndpoints": "ServiceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.",
+	"resourceTags":     "resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user.",
 }
 
 func (AWSPlatformStatus) SwaggerDoc() map[string]string {
 	return map_AWSPlatformStatus
 }
 
+var map_AWSResourceTag = map[string]string{
+	"":      "AWSResourceTag is a tag to apply to AWS resources created for the cluster.",
+	"key":   "key is the key of the tag",
+	"value": "value is the value of the tag. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services.",
+}
+
+func (AWSResourceTag) SwaggerDoc() map[string]string {
+	return map_AWSResourceTag
+}
+
 var map_AWSServiceEndpoint = map[string]string{
 	"":     "AWSServiceEndpoint store the configuration of a custom url to override existing defaults of AWS Services.",
 	"name": "name is the name of the AWS service. The list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html This must be provided and cannot be empty.",
diff --git a/vendor/github.com/openshift/api/network/v1/001-clusternetwork-crd.yaml b/vendor/github.com/openshift/api/network/v1/001-clusternetwork-crd.yaml
index 773530104aecc123118139b04b86bf37ca269bc1..aa8c848749cd854bfc294c953b81e8d5cfbbc4cc 100644
--- a/vendor/github.com/openshift/api/network/v1/001-clusternetwork-crd.yaml
+++ b/vendor/github.com/openshift/api/network/v1/001-clusternetwork-crd.yaml
@@ -10,7 +10,6 @@ spec:
     plural: clusternetworks
     singular: clusternetwork
   scope: Cluster
-  version: v1
   versions:
   - name: v1
     served: true
diff --git a/vendor/github.com/openshift/api/network/v1/002-hostsubnet-crd.yaml b/vendor/github.com/openshift/api/network/v1/002-hostsubnet-crd.yaml
index 61cd99c4a7e6afbe7ecfbc9e0c161a7619fc3345..c101d06f91413d7077a0dd14ae14e25eb4376dda 100644
--- a/vendor/github.com/openshift/api/network/v1/002-hostsubnet-crd.yaml
+++ b/vendor/github.com/openshift/api/network/v1/002-hostsubnet-crd.yaml
@@ -10,7 +10,6 @@ spec:
     plural: hostsubnets
     singular: hostsubnet
   scope: Cluster
-  version: v1
   versions:
   - name: v1
     served: true
diff --git a/vendor/github.com/openshift/api/network/v1/003-netnamespace-crd.yaml b/vendor/github.com/openshift/api/network/v1/003-netnamespace-crd.yaml
index ac2772d542f644963a63fc566d33a2659e11f456..42229763689e1f15cf290f69e0e9f7885e4a7260 100644
--- a/vendor/github.com/openshift/api/network/v1/003-netnamespace-crd.yaml
+++ b/vendor/github.com/openshift/api/network/v1/003-netnamespace-crd.yaml
@@ -10,7 +10,6 @@ spec:
     plural: netnamespaces
     singular: netnamespace
   scope: Cluster
-  version: v1
   versions:
   - name: v1
     served: true
diff --git a/vendor/github.com/openshift/api/network/v1/004-egressnetworkpolicy-crd.yaml b/vendor/github.com/openshift/api/network/v1/004-egressnetworkpolicy-crd.yaml
index 7660739480c25de70b057656d1c699a35b0dcb29..26bd4df1b65f531a8b08174bea055badc5aabf4e 100644
--- a/vendor/github.com/openshift/api/network/v1/004-egressnetworkpolicy-crd.yaml
+++ b/vendor/github.com/openshift/api/network/v1/004-egressnetworkpolicy-crd.yaml
@@ -10,7 +10,6 @@ spec:
     plural: egressnetworkpolicies
     singular: egressnetworkpolicy
   scope: Namespaced
-  version: v1
   versions:
   - name: v1
     served: true
diff --git a/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-ingresscontroller.crd.yaml b/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-ingresscontroller.crd.yaml
index b2c13e0550d3e178249b2645871b7ca537efcdcc..9bcd8445a25eb8990102f2c54ace9a89f0428be7 100644
--- a/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-ingresscontroller.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-ingresscontroller.crd.yaml
@@ -667,7 +667,7 @@ spec:
                 properties:
                   nodeSelector:
                     description: "nodeSelector is the node selector applied to ingress
-                      controller deployments. \n If unset, the default is: \n   beta.kubernetes.io/os:
+                      controller deployments. \n If unset, the default is: \n   kubernetes.io/os:
                       linux   node-role.kubernetes.io/worker: '' \n If set, the specified
                       selector is used and replaces the default."
                     properties:
diff --git a/vendor/github.com/openshift/api/operator/v1/0000_70_dns-operator_00-custom-resource-definition.yaml b/vendor/github.com/openshift/api/operator/v1/0000_70_dns-operator_00-custom-resource-definition.yaml
index 7d50cfe76bc86cafb7448ba3966e860c1f8ce895..66e595bb8011d19fe5b2299c906ce15a34c8d58d 100644
--- a/vendor/github.com/openshift/api/operator/v1/0000_70_dns-operator_00-custom-resource-definition.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/0000_70_dns-operator_00-custom-resource-definition.yaml
@@ -63,9 +63,9 @@ spec:
                   nodeSelector:
                     description: "nodeSelector is the node selector applied to DNS
                       pods. \n If empty, the default is used, which is currently the
-                      following: \n   beta.kubernetes.io/os: linux \n This default
-                      is subject to change. \n If set, the specified selector is used
-                      and replaces the default."
+                      following: \n   kubernetes.io/os: linux \n This default is subject
+                      to change. \n If set, the specified selector is used and replaces
+                      the default."
                     type: object
                     additionalProperties:
                       type: string
diff --git a/vendor/github.com/openshift/api/operator/v1/types_dns.go b/vendor/github.com/openshift/api/operator/v1/types_dns.go
index 112907c9b347f10f9974a0107027c6e2ad734aa8..ce4cf32389f660e07fecc07648b85b1c4d1ff594 100644
--- a/vendor/github.com/openshift/api/operator/v1/types_dns.go
+++ b/vendor/github.com/openshift/api/operator/v1/types_dns.go
@@ -99,7 +99,7 @@ type DNSNodePlacement struct {
 	//
 	// If empty, the default is used, which is currently the following:
 	//
-	//   beta.kubernetes.io/os: linux
+	//   kubernetes.io/os: linux
 	//
 	// This default is subject to change.
 	//
diff --git a/vendor/github.com/openshift/api/operator/v1/types_ingress.go b/vendor/github.com/openshift/api/operator/v1/types_ingress.go
index fa107ab875005c2f8483c3a457a4d367579b7a04..235d11849299bb8638b09780e50caaf349048306 100644
--- a/vendor/github.com/openshift/api/operator/v1/types_ingress.go
+++ b/vendor/github.com/openshift/api/operator/v1/types_ingress.go
@@ -217,7 +217,7 @@ type NodePlacement struct {
 	//
 	// If unset, the default is:
 	//
-	//   beta.kubernetes.io/os: linux
+	//   kubernetes.io/os: linux
 	//   node-role.kubernetes.io/worker: ''
 	//
 	// If set, the specified selector is used and replaces the default.
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go
index 59c937c743c0e91242ead49117795674d3f6e81b..92b86a201fb8c0982ac6889b4190e3d9c07e4910 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go
@@ -385,7 +385,7 @@ func (DNSList) SwaggerDoc() map[string]string {
 
 var map_DNSNodePlacement = map[string]string{
 	"":             "DNSNodePlacement describes the node scheduling configuration for DNS pods.",
-	"nodeSelector": "nodeSelector is the node selector applied to DNS pods.\n\nIf empty, the default is used, which is currently the following:\n\n  beta.kubernetes.io/os: linux\n\nThis default is subject to change.\n\nIf set, the specified selector is used and replaces the default.",
+	"nodeSelector": "nodeSelector is the node selector applied to DNS pods.\n\nIf empty, the default is used, which is currently the following:\n\n  kubernetes.io/os: linux\n\nThis default is subject to change.\n\nIf set, the specified selector is used and replaces the default.",
 	"tolerations":  "tolerations is a list of tolerations applied to DNS pods.\n\nThe default is an empty list.  This default is subject to change.\n\nSee https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/",
 }
 
@@ -688,7 +688,7 @@ func (LoggingDestination) SwaggerDoc() map[string]string {
 
 var map_NodePlacement = map[string]string{
 	"":             "NodePlacement describes node scheduling configuration for an ingress controller.",
-	"nodeSelector": "nodeSelector is the node selector applied to ingress controller deployments.\n\nIf unset, the default is:\n\n  beta.kubernetes.io/os: linux\n  node-role.kubernetes.io/worker: ''\n\nIf set, the specified selector is used and replaces the default.",
+	"nodeSelector": "nodeSelector is the node selector applied to ingress controller deployments.\n\nIf unset, the default is:\n\n  kubernetes.io/os: linux\n  node-role.kubernetes.io/worker: ''\n\nIf set, the specified selector is used and replaces the default.",
 	"tolerations":  "tolerations is a list of tolerations applied to ingress controller deployments.\n\nThe default is an empty list.\n\nSee https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/",
 }
 
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 18f8845c5256cf05ae829c317a58b26d5ed087aa..07c0bfb19214298a7434128f3f7318afbf09340a 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -153,7 +153,7 @@ github.com/onsi/gomega/matchers/support/goraph/edge
 github.com/onsi/gomega/matchers/support/goraph/node
 github.com/onsi/gomega/matchers/support/goraph/util
 github.com/onsi/gomega/types
-# github.com/openshift/api v0.0.0-20210412212256-79bd8cfbbd59
+# github.com/openshift/api v0.0.0-20210416115537-a60c0dc032fd
 github.com/openshift/api
 github.com/openshift/api/apiserver
 github.com/openshift/api/apiserver/v1
@@ -909,7 +909,7 @@ k8s.io/utils/pointer
 k8s.io/utils/trace
 # sigs.k8s.io/cluster-api-provider-aws v0.0.0-00010101000000-000000000000 => github.com/openshift/cluster-api-provider-aws v0.2.1-0.20201125052318-b85a18cbf338
 sigs.k8s.io/cluster-api-provider-aws/pkg/apis/awsprovider/v1beta1
-# sigs.k8s.io/cluster-api-provider-azure v0.0.0-00010101000000-000000000000 => github.com/openshift/cluster-api-provider-azure v0.0.0-20210209143830-3442c7a36c1e
+# sigs.k8s.io/cluster-api-provider-azure v0.0.0-00010101000000-000000000000 => github.com/openshift/cluster-api-provider-azure v0.1.0-alpha.3.0.20211213001529-73596b5c3b6a
 sigs.k8s.io/cluster-api-provider-azure/pkg/apis/azureprovider/v1beta1
 # sigs.k8s.io/controller-runtime v0.9.0-beta.1.0.20210512131817-ce2f0c92d77e
 sigs.k8s.io/controller-runtime
diff --git a/vendor/sigs.k8s.io/cluster-api-provider-azure/pkg/apis/azureprovider/v1beta1/types.go b/vendor/sigs.k8s.io/cluster-api-provider-azure/pkg/apis/azureprovider/v1beta1/types.go
index 4ed20f3f296926975cb26a8139898d5079adfa37..7353eae6fcf0976daccdba59bc5547cc0b41d653 100644
--- a/vendor/sigs.k8s.io/cluster-api-provider-azure/pkg/apis/azureprovider/v1beta1/types.go
+++ b/vendor/sigs.k8s.io/cluster-api-provider-azure/pkg/apis/azureprovider/v1beta1/types.go
@@ -318,6 +318,7 @@ type LoadBalancerHealthCheck struct {
 type VMState string
 
 var (
+	// ProvisioningState related values
 	// VMStateCreating ...
 	VMStateCreating = VMState("Creating")
 	// VMStateDeleting ...
@@ -331,6 +332,7 @@ var (
 	// VMStateUpdating ...
 	VMStateUpdating = VMState("Updating")
 
+	// PowerState related values
 	// VMStateStarting ...
 	VMStateStarting = VMState("Starting")
 	// VMStateRunning ...
@@ -395,6 +397,14 @@ type Image struct {
 	Version   string `json:"version"`
 	// ResourceID represents the location of OS Image in azure subscription
 	ResourceID string `json:"resourceID"`
+	// Type identifies the source of the image and related information, such as purchase plans.
+	// Valid values are "ID", "MarketplaceWithPlan", "MarketplaceNoPlan", and omitted, which
+	// means no opinion and the platform chooses a good default which may change over time.
+	// Currently that default is "MarketplaceNoPlan" if publisher data is supplied, or "ID" if not.
+	// For more information about purchase plans, see:
+	// https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cli-ps-findimage#check-the-purchase-plan-information
+	// +optional
+	Type AzureImageType `json:"type,omitempty"`
 }
 
 // VMIdentity defines the identity of the virtual machine, if configured.
@@ -423,3 +433,15 @@ type SecurityProfile struct {
 	// set. Default is disabled.
 	EncryptionAtHost *bool `json:"encryptionAtHost,omitempty"`
 }
+
+// AzureImageType provides an enumeration for the valid image types.
+type AzureImageType string
+
+const (
+	// AzureImageTypeID specifies that the image should be referenced by its resource ID.
+	AzureImageTypeID AzureImageType = "ID"
+	// AzureImageTypeMarketplaceNoPlan are images available from the marketplace that do not require a purchase plan.
+	AzureImageTypeMarketplaceNoPlan AzureImageType = "MarketplaceNoPlan"
+	// AzureImageTypeMarketplaceWithPlan require a purchase plan. Upstream these images are referred to as "ThirdParty."
+	AzureImageTypeMarketplaceWithPlan AzureImageType = "MarketplaceWithPlan"
+)