diff --git a/go.mod b/go.mod
index a711ca3587..d67c8d9a57 100644
--- a/go.mod
+++ b/go.mod
@@ -128,3 +128,8 @@ require (
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
)
+
+replace (
+ github.com/openshift/api => github.com/haircommander/api v0.0.0-20241011205550-e76c7116e5bb
+ github.com/openshift/library-go => github.com/haircommander/library-go v0.0.0-20241015194702-21ccc5885f91
+)
diff --git a/go.sum b/go.sum
index 43456d69ec..0001c563d5 100644
--- a/go.sum
+++ b/go.sum
@@ -123,6 +123,10 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/haircommander/api v0.0.0-20241011205550-e76c7116e5bb h1:WyfPLhwP1oQYjNgChfnKMkiHSi5wm9A/6GK/drvzttI=
+github.com/haircommander/api v0.0.0-20241011205550-e76c7116e5bb/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo=
+github.com/haircommander/library-go v0.0.0-20241015194702-21ccc5885f91 h1:f4IDvLUmJWqJWX2YsmrvPpu3eDWTKrj1WizdMDMUFLY=
+github.com/haircommander/library-go v0.0.0-20241015194702-21ccc5885f91/go.mod h1:Fwp1VdADxusVT0uTpkNyhLYv+bACWlazj30sny4Vpc0=
github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw=
github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
@@ -161,14 +165,10 @@ github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
-github.com/openshift/api v0.0.0-20241001152557-e415140e5d5f h1:ya1OmyZm3LIIxI3U9VE9Nyx3ehCHgBwxyFUPflYPWls=
-github.com/openshift/api v0.0.0-20241001152557-e415140e5d5f/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo=
github.com/openshift/build-machinery-go v0.0.0-20240613134303-8359781da660 h1:F0zE2bmdVvaEd18VXuGYQdJJ1FYJu4MIDW9PYZWc9No=
github.com/openshift/build-machinery-go v0.0.0-20240613134303-8359781da660/go.mod h1:8jcm8UPtg2mCAsxfqKil1xrmRMI3a+XU2TZ9fF8A7TE=
github.com/openshift/client-go v0.0.0-20241001162912-da6d55e4611f h1:FRc0bVNWprihWS0GqQWzb3dY4dkCwpOP3mDw5NwSoR4=
github.com/openshift/client-go v0.0.0-20241001162912-da6d55e4611f/go.mod h1:KiZi2mJRH1TOJ3FtBDYS6YvUL30s/iIXaGSUrSa36mo=
-github.com/openshift/library-go v0.0.0-20241017185845-c32b33471ba3 h1:gv1a4WK1d83jvjxFji8AAt3zOIeTW+q6s0dkDCLUHL0=
-github.com/openshift/library-go v0.0.0-20241017185845-c32b33471ba3/go.mod h1:9B1MYPoLtP9tqjWxcbUNVpwxy68zOH/3EIP6c31dAM0=
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
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 392d128c11..0daa62d309 100644
--- a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go
+++ b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go
@@ -507,6 +507,20 @@ type AWSPlatformStatus struct {
// +listType=atomic
// +optional
ResourceTags []AWSResourceTag `json:"resourceTags,omitempty"`
+
+ // cloudLoadBalancerConfig holds configuration related to DNS and cloud
+ // load balancers. It allows configuration of in-cluster DNS as an alternative
+ // to the platform default DNS implementation.
+ // When using the ClusterHosted DNS type, Load Balancer IP addresses
+ // must be provided for the API and internal API load balancers as well as the
+ // ingress load balancer.
+ //
+ // +default={"dnsType": "PlatformDefault"}
+ // +kubebuilder:default={"dnsType": "PlatformDefault"}
+ // +openshift:enable:FeatureGate=AWSClusterHostedDNS
+ // +optional
+ // +nullable
+ CloudLoadBalancerConfig *CloudLoadBalancerConfig `json:"cloudLoadBalancerConfig,omitempty"`
}
// AWSResourceTag is a tag to apply to AWS resources created for the cluster.
@@ -647,12 +661,12 @@ type GCPPlatformStatus struct {
// Tombstone the field as a reminder.
// ClusterHostedDNS ClusterHostedDNS `json:"clusterHostedDNS,omitempty"`
- // cloudLoadBalancerConfig is a union that contains the IP addresses of API,
- // API-Int and Ingress Load Balancers created on the cloud platform. These
- // values would not be populated on on-prem platforms. These Load Balancer
- // IPs are used to configure the in-cluster DNS instances for API, API-Int
- // and Ingress services. `dnsType` is expected to be set to `ClusterHosted`
- // when these Load Balancer IP addresses are populated and used.
+ // cloudLoadBalancerConfig holds configuration related to DNS and cloud
+ // load balancers. It allows configuration of in-cluster DNS as an alternative
+ // to the platform default DNS implementation.
+ // When using the ClusterHosted DNS type, Load Balancer IP addresses
+ // must be provided for the API and internal API load balancers as well as the
+ // ingress load balancer.
//
// +default={"dnsType": "PlatformDefault"}
// +kubebuilder:default={"dnsType": "PlatformDefault"}
diff --git a/vendor/github.com/openshift/api/config/v1/types_node.go b/vendor/github.com/openshift/api/config/v1/types_node.go
index b3b1b62c4d..7a36368283 100644
--- a/vendor/github.com/openshift/api/config/v1/types_node.go
+++ b/vendor/github.com/openshift/api/config/v1/types_node.go
@@ -46,6 +46,13 @@ type NodeSpec struct {
// the status and corresponding reaction of the cluster
// +optional
WorkerLatencyProfile WorkerLatencyProfileType `json:"workerLatencyProfile,omitempty"`
+
+ // MinimumKubeletVersion is the lowest version of a kubelet that can join the cluster.
+ // Specifically, the apiserver will deny any authorization requests of kubelets that are older
+ // than the specified version.
+ // +kubebuilder:validation:Pattern=`^([0-9]*\.[0-9]*\.[0-9]*$`
+ // +optional
+ MinimumKubeletVersion string `json:"minimumKubeletVersion,omitempty"`
}
type NodeStatus struct {
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 0693469984..1b7fa44aad 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
@@ -245,6 +245,11 @@ func (in *AWSPlatformStatus) DeepCopyInto(out *AWSPlatformStatus) {
*out = make([]AWSResourceTag, len(*in))
copy(*out, *in)
}
+ if in.CloudLoadBalancerConfig != nil {
+ in, out := &in.CloudLoadBalancerConfig, &out.CloudLoadBalancerConfig
+ *out = new(CloudLoadBalancerConfig)
+ (*in).DeepCopyInto(*out)
+ }
return
}
diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml b/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml
index fa5dd4e31d..6b8dfd3f00 100644
--- a/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml
+++ b/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml
@@ -310,6 +310,7 @@ infrastructures.config.openshift.io:
Capability: ""
Category: ""
FeatureGates:
+ - AWSClusterHostedDNS
- BareMetalLoadBalancer
- GCPClusterHostedDNS
- GCPLabelsTags
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 c580bd8342..2af2cb4b26 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
@@ -1184,10 +1184,11 @@ func (AWSPlatformSpec) SwaggerDoc() map[string]string {
}
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.",
+ "": "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.",
+ "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.",
}
func (AWSPlatformStatus) SwaggerDoc() map[string]string {
@@ -1389,7 +1390,7 @@ var map_GCPPlatformStatus = map[string]string{
"region": "region holds the region for new GCP resources created for the cluster.",
"resourceLabels": "resourceLabels is a list of additional labels to apply to GCP resources created for the cluster. See https://cloud.google.com/compute/docs/labeling-resources for information on labeling GCP resources. GCP supports a maximum of 64 labels per resource. OpenShift reserves 32 labels for internal use, allowing 32 labels for user configuration.",
"resourceTags": "resourceTags is a list of additional tags to apply to GCP resources created for the cluster. See https://cloud.google.com/resource-manager/docs/tags/tags-overview for information on tagging GCP resources. GCP supports a maximum of 50 tags per resource.",
- "cloudLoadBalancerConfig": "cloudLoadBalancerConfig is a union that contains the IP addresses of API, API-Int and Ingress Load Balancers created on the cloud platform. These values would not be populated on on-prem platforms. These Load Balancer IPs are used to configure the in-cluster DNS instances for API, API-Int and Ingress services. `dnsType` is expected to be set to `ClusterHosted` when these Load Balancer IP addresses are populated and used.",
+ "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.",
}
func (GCPPlatformStatus) SwaggerDoc() map[string]string {
@@ -2087,8 +2088,9 @@ func (NodeList) SwaggerDoc() map[string]string {
}
var map_NodeSpec = map[string]string{
- "cgroupMode": "CgroupMode determines the cgroups version on the node",
- "workerLatencyProfile": "WorkerLatencyProfile determins the how fast the kubelet is updating the status and corresponding reaction of the cluster",
+ "cgroupMode": "CgroupMode determines the cgroups version on the node",
+ "workerLatencyProfile": "WorkerLatencyProfile determins the how fast the kubelet is updating the status and corresponding reaction of the cluster",
+ "minimumKubeletVersion": "MinimumKubeletVersion is the lowest version of a kubelet that can join the cluster. Specifically, the apiserver will deny any authorization requests of kubelets that are older than the specified version.",
}
func (NodeSpec) SwaggerDoc() map[string]string {
diff --git a/vendor/github.com/openshift/api/config/v1alpha1/types_cluster_image_policy.go b/vendor/github.com/openshift/api/config/v1alpha1/types_cluster_image_policy.go
index e3670f03e8..14650fd48f 100644
--- a/vendor/github.com/openshift/api/config/v1alpha1/types_cluster_image_policy.go
+++ b/vendor/github.com/openshift/api/config/v1alpha1/types_cluster_image_policy.go
@@ -41,6 +41,7 @@ type ClusterImagePolicySpec struct {
// If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored.
// In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories
// quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation.
+ // If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied.
// For additional details about the format, please refer to the document explaining the docker transport field,
// which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker
// +kubebuilder:validation:Required
diff --git a/vendor/github.com/openshift/api/config/v1alpha1/types_image_policy.go b/vendor/github.com/openshift/api/config/v1alpha1/types_image_policy.go
index 7031110ff1..a177ddb0d6 100644
--- a/vendor/github.com/openshift/api/config/v1alpha1/types_image_policy.go
+++ b/vendor/github.com/openshift/api/config/v1alpha1/types_image_policy.go
@@ -40,6 +40,7 @@ type ImagePolicySpec struct {
// If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored.
// In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories
// quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation.
+ // If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied.
// For additional details about the format, please refer to the document explaining the docker transport field,
// which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker
// +kubebuilder:validation:Required
diff --git a/vendor/github.com/openshift/api/config/v1alpha1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/config/v1alpha1/zz_generated.swagger_doc_generated.go
index 9da086efc5..55468f38da 100644
--- a/vendor/github.com/openshift/api/config/v1alpha1/zz_generated.swagger_doc_generated.go
+++ b/vendor/github.com/openshift/api/config/v1alpha1/zz_generated.swagger_doc_generated.go
@@ -102,7 +102,7 @@ func (ClusterImagePolicyList) SwaggerDoc() map[string]string {
var map_ClusterImagePolicySpec = map[string]string{
"": "CLusterImagePolicySpec is the specification of the ClusterImagePolicy custom resource.",
- "scopes": "scopes defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker",
+ "scopes": "scopes defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker",
"policy": "policy contains configuration to allow scopes to be verified, and defines how images not matching the verification policy will be treated.",
}
@@ -151,7 +151,7 @@ func (ImagePolicyList) SwaggerDoc() map[string]string {
var map_ImagePolicySpec = map[string]string{
"": "ImagePolicySpec is the specification of the ImagePolicy CRD.",
- "scopes": "scopes defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker",
+ "scopes": "scopes defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker",
"policy": "policy contains configuration to allow scopes to be verified, and defines how images not matching the verification policy will be treated.",
}
diff --git a/vendor/github.com/openshift/api/envtest-releases.yaml b/vendor/github.com/openshift/api/envtest-releases.yaml
index fa789b18ce..5651bbcc9d 100644
--- a/vendor/github.com/openshift/api/envtest-releases.yaml
+++ b/vendor/github.com/openshift/api/envtest-releases.yaml
@@ -12,3 +12,16 @@ releases:
envtest-v1.30.3-linux-arm64.tar.gz:
hash: deb395d5e9578a58786c42b4e7d878b4aef984ac2dce510031fbecf12092162a4aee1cde774f1527cfae90f6885382dc7b3d79ec379b7f4160c3a35fad7cbc3b
selfLink: https://storage.googleapis.com/openshift-kubebuilder-tools/envtest-v1.30.3-linux-arm64.tar.gz
+ v1.31.1:
+ envtest-v1.31.1-darwin-amd64.tar.gz:
+ hash: c884c6a9751f12f57ede0dc3d8dfffdb0f60f7111d6d01ca0693b66d663dfbd37c21ab6a9e571d1a6f649ed7db54b04b069ab0aff6366b2db2f5d3d8ba84a296
+ selfLink: https://storage.googleapis.com/openshift-kubebuilder-tools/envtest-v1.31.1-darwin-amd64.tar.gz
+ envtest-v1.31.1-darwin-arm64.tar.gz:
+ hash: c760be21c579a516cad8fbafd0f202229f5e074da1869958b84ae8dca295ffb33eb6fd4fd0b66349c31c4adff1561e7dd188137885e3661e34c0a14e12ada20e
+ selfLink: https://storage.googleapis.com/openshift-kubebuilder-tools/envtest-v1.31.1-darwin-arm64.tar.gz
+ envtest-v1.31.1-linux-amd64.tar.gz:
+ hash: a683fad736249b681d50c40715068ecb64f3ef22a85f29387eb61435c36dfe0cebf0bc7e109e237071cd856bc0e37d79a732309fd8d0b16fba6e019cf5c6e8b6
+ selfLink: https://storage.googleapis.com/openshift-kubebuilder-tools/envtest-v1.31.1-linux-amd64.tar.gz
+ envtest-v1.31.1-linux-arm64.tar.gz:
+ hash: 86fa42c6a3d92e438e35d6066587d0e4f36b910885e10520868959ece2fe740d99abc735f69d6ebe8920291f70d3819b169ad5ddd2db805f8f56a3b83eee3893
+ selfLink: https://storage.googleapis.com/openshift-kubebuilder-tools/envtest-v1.31.1-linux-arm64.tar.gz
diff --git a/vendor/github.com/openshift/api/features.md b/vendor/github.com/openshift/api/features.md
index e668fc88b3..e5737ef9cd 100644
--- a/vendor/github.com/openshift/api/features.md
+++ b/vendor/github.com/openshift/api/features.md
@@ -7,6 +7,7 @@
| MachineAPIOperatorDisableMachineHealthCheckController| | | | | | |
| MultiArchInstallAzure| | | | | | |
| GatewayAPI| | | Enabled | Enabled | | |
+| AWSClusterHostedDNS| | | Enabled | Enabled | Enabled | Enabled |
| AdditionalRoutingCapabilities| | | Enabled | Enabled | Enabled | Enabled |
| AutomatedEtcdBackup| | | Enabled | Enabled | Enabled | Enabled |
| BootcNodeManagement| | | Enabled | Enabled | Enabled | Enabled |
diff --git a/vendor/github.com/openshift/api/features/features.go b/vendor/github.com/openshift/api/features/features.go
index 7f49623954..80834aff59 100644
--- a/vendor/github.com/openshift/api/features/features.go
+++ b/vendor/github.com/openshift/api/features/features.go
@@ -313,6 +313,13 @@ var (
enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade).
mustRegister()
+ FeatureGateAWSClusterHostedDNS = newFeatureGate("AWSClusterHostedDNS").
+ reportProblemsToJiraComponent("Installer").
+ contactPerson("barbacbd").
+ productScope(ocpSpecific).
+ enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade).
+ mustRegister()
+
FeatureGateMixedCPUsAllocation = newFeatureGate("MixedCPUsAllocation").
reportProblemsToJiraComponent("NodeTuningOperator").
contactPerson("titzhak").
diff --git a/vendor/github.com/openshift/api/kubecontrolplane/v1/types.go b/vendor/github.com/openshift/api/kubecontrolplane/v1/types.go
index b9cdcc213b..845768e5ad 100644
--- a/vendor/github.com/openshift/api/kubecontrolplane/v1/types.go
+++ b/vendor/github.com/openshift/api/kubecontrolplane/v1/types.go
@@ -62,6 +62,11 @@ type KubeAPIServerConfig struct {
// TODO this needs to be removed.
APIServerArguments map[string]Arguments `json:"apiServerArguments"`
+
+ // MinimumKubeletVersion is the lowest version of a kubelet that can join the cluster.
+ // Specifically, the apiserver will deny any authorization requests of kubelets that are older
+ // than the specified version.
+ MinimumKubeletVersion string `json:"minimumKubeletVersion,omitempty"`
}
// Arguments masks the value so protobuf can generate
diff --git a/vendor/github.com/openshift/api/kubecontrolplane/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/kubecontrolplane/v1/zz_generated.swagger_doc_generated.go
index 906bb271b0..9a336712ae 100644
--- a/vendor/github.com/openshift/api/kubecontrolplane/v1/zz_generated.swagger_doc_generated.go
+++ b/vendor/github.com/openshift/api/kubecontrolplane/v1/zz_generated.swagger_doc_generated.go
@@ -33,6 +33,7 @@ var map_KubeAPIServerConfig = map[string]string{
"projectConfig": "projectConfig feeds an admission plugin",
"serviceAccountPublicKeyFiles": "serviceAccountPublicKeyFiles is a list of files, each containing a PEM-encoded public RSA key. (If any file contains a private key, the public portion of the key is used) The list of public keys is used to verify presented service account tokens. Each key is tried in order until the list is exhausted or verification succeeds. If no keys are specified, no service account authentication will be available.",
"oauthConfig": "oauthConfig, if present start the /oauth endpoint in this process",
+ "minimumKubeletVersion": "MinimumKubeletVersion is the lowest version of a kubelet that can join the cluster. Specifically, the apiserver will deny any authorization requests of kubelets that are older than the specified version.",
}
func (KubeAPIServerConfig) SwaggerDoc() map[string]string {
diff --git a/vendor/github.com/openshift/api/operator/v1/types.go b/vendor/github.com/openshift/api/operator/v1/types.go
index eeb8afdc6d..8d6f4b7484 100644
--- a/vendor/github.com/openshift/api/operator/v1/types.go
+++ b/vendor/github.com/openshift/api/operator/v1/types.go
@@ -178,12 +178,34 @@ var (
// OperatorCondition is just the standard condition fields.
type OperatorCondition struct {
+ // 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)
+ // +required
// +kubebuilder:validation:Required
- Type string `json:"type"`
- Status ConditionStatus `json:"status"`
- LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"`
- Reason string `json:"reason,omitempty"`
- Message string `json:"message,omitempty"`
+ // +kubebuilder:validation: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])$`
+ // +kubebuilder:validation:MaxLength=316
+ Type string `json:"type" protobuf:"bytes,1,opt,name=type"`
+
+ // status of the condition, one of True, False, Unknown.
+ // +required
+ // +kubebuilder:validation:Required
+ // +kubebuilder:validation:Enum=True;False;Unknown
+ Status ConditionStatus `json:"status"`
+
+ // 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.
+ // +required
+ // +kubebuilder:validation:Required
+ // +kubebuilder:validation:Type=string
+ // +kubebuilder:validation:Format=date-time
+ LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"`
+
+ Reason string `json:"reason,omitempty"`
+
+ Message string `json:"message,omitempty"`
}
type ConditionStatus string
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 7ae22ee0a7..1f56643456 100644
--- a/vendor/github.com/openshift/api/operator/v1/types_ingress.go
+++ b/vendor/github.com/openshift/api/operator/v1/types_ingress.go
@@ -392,6 +392,7 @@ type CIDR string
// LoadBalancerStrategy holds parameters for a load balancer.
// +openshift:validation:FeatureGateAwareXValidation:featureGate=SetEIPForNLBIngressController,rule="!has(self.scope) || self.scope != 'Internal' || !has(self.providerParameters) || !has(self.providerParameters.aws) || !has(self.providerParameters.aws.networkLoadBalancer) || !has(self.providerParameters.aws.networkLoadBalancer.eipAllocations)",message="eipAllocations are forbidden when the scope is Internal."
+// +kubebuilder:validation:XValidation:rule=`!has(self.scope) || self.scope != 'Internal' || !has(self.providerParameters) || !has(self.providerParameters.openstack) || !has(self.providerParameters.openstack.floatingIP) || self.providerParameters.openstack.floatingIP == ""`,message="cannot specify a floating ip when scope is internal"
type LoadBalancerStrategy struct {
// scope indicates the scope at which the load balancer is exposed.
// Possible values are "External" and "Internal".
@@ -678,19 +679,28 @@ type IBMLoadBalancerParameters struct {
// OpenStackLoadBalancerParameters provides configuration settings that are
// specific to OpenStack load balancers.
type OpenStackLoadBalancerParameters struct {
- // loadBalancerIP specifies the floating IP address that the load balancer will use.
+ // loadBalancerIP is tombstoned since the field was replaced by floatingIP.
+ // LoadBalancerIP string `json:"loadBalancerIP,omitempty"`
+
+ // floatingIP specifies the IP address that the load balancer will use.
// When not specified, an IP address will be assigned randomly by the OpenStack cloud provider.
+ // When specified, the floating IP has to be pre-created. If the
+ // specified value is not a floating IP or is already claimed, the
+ // OpenStack cloud provider won't be able to provision the load
+ // balancer.
+ // This field may only be used if the IngressController has External scope.
// This value must be a valid IPv4 or IPv6 address.
// + ---
- // + Note: this field is meant to be set by the ingress controller to populate the
- // + `Service.Spec.LoadBalancerIP` field which has been deprecated in Kubernetes:
+ // + Note: this field is meant to be set by the ingress controller
+ // + to populate the `Service.Spec.LoadBalancerIP` field which has been
+ // + deprecated in Kubernetes:
// + https://github.com/kubernetes/kubernetes/pull/107235
// + However, the field is still used by cloud-provider-openstack to reconcile
- // + the floating IP that we attach to the load balancer.
+ // + the floating IP that we attach to the external load balancer.
//
- // +kubebuilder:validation:XValidation:rule="isIP(self)",message="loadBalancerIP must be a valid IPv4 or IPv6 address"
+ // +kubebuilder:validation:XValidation:rule="isIP(self)",message="floatingIP must be a valid IPv4 or IPv6 address"
// +optional
- LoadBalancerIP string `json:"loadBalancerIP,omitempty"`
+ FloatingIP string `json:"floatingIP,omitempty"`
}
// AWSClassicLoadBalancerParameters holds configuration parameters for an
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_10_config-operator_01_configs.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_10_config-operator_01_configs.crd.yaml
index c2d91226ab..323ba46879 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_10_config-operator_01_configs.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_10_config-operator_01_configs.crd.yaml
@@ -110,6 +110,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -117,10 +120,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml
index afe82c37b3..b68cce4db3 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml
@@ -151,6 +151,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -158,10 +161,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml
index f5df3557f8..ebe2486ef5 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml
@@ -138,6 +138,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -145,10 +148,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml
index 3c01a3ce66..bc49df765d 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml
@@ -151,6 +151,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -158,10 +161,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml
index cfaa4c7cea..8449c20a6c 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml
@@ -151,6 +151,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -158,10 +161,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml
index da4ae9be68..435a8a81ee 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml
@@ -128,6 +128,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -135,10 +138,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml
index 4cbd378af6..7cd18e09b5 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml
@@ -137,6 +137,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -144,10 +147,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml
index 255eab4c1b..9654facc4d 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml
@@ -128,6 +128,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -135,10 +138,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_30_openshift-apiserver_01_openshiftapiservers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_30_openshift-apiserver_01_openshiftapiservers.crd.yaml
index d2ae6f79a6..bb9b904fc5 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_30_openshift-apiserver_01_openshiftapiservers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_30_openshift-apiserver_01_openshiftapiservers.crd.yaml
@@ -109,6 +109,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -116,10 +119,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_cloud-credential_00_cloudcredentials.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_cloud-credential_00_cloudcredentials.crd.yaml
index 197b3f4e79..bf6c616afc 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_cloud-credential_00_cloudcredentials.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_cloud-credential_00_cloudcredentials.crd.yaml
@@ -126,6 +126,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -133,10 +136,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_kube-storage-version-migrator_00_kubestorageversionmigrators.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_kube-storage-version-migrator_00_kubestorageversionmigrators.crd.yaml
index 930f5506ad..30d1f90558 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_kube-storage-version-migrator_00_kubestorageversionmigrators.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_40_kube-storage-version-migrator_00_kubestorageversionmigrators.crd.yaml
@@ -104,6 +104,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -111,10 +114,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_authentication_01_authentications.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_authentication_01_authentications.crd.yaml
index 52fac7bef3..3fab2ff1f5 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_authentication_01_authentications.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_authentication_01_authentications.crd.yaml
@@ -103,6 +103,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -110,10 +113,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_console_01_consoles.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_console_01_consoles.crd.yaml
index 956c845472..505332e4b5 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_console_01_consoles.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_console_01_consoles.crd.yaml
@@ -849,6 +849,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -856,10 +859,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_ingress_00_ingresscontrollers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_ingress_00_ingresscontrollers.crd.yaml
index 968febc36e..2524b5a84a 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_ingress_00_ingresscontrollers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_ingress_00_ingresscontrollers.crd.yaml
@@ -639,15 +639,20 @@ spec:
If empty, defaults will be applied. See specific openstack fields for
details about their defaults.
properties:
- loadBalancerIP:
+ floatingIP:
description: |-
- loadBalancerIP specifies the floating IP address that the load balancer will use.
+ floatingIP specifies the IP address that the load balancer will use.
When not specified, an IP address will be assigned randomly by the OpenStack cloud provider.
+ When specified, the floating IP has to be pre-created. If the
+ specified value is not a floating IP or is already claimed, the
+ OpenStack cloud provider won't be able to provision the load
+ balancer.
+ This field may only be used if the IngressController has External scope.
This value must be a valid IPv4 or IPv6 address.
type: string
x-kubernetes-validations:
- - message: loadBalancerIP must be a valid IPv4 or
- IPv6 address
+ - message: floatingIP must be a valid IPv4 or IPv6
+ address
rule: isIP(self)
type: object
type:
@@ -689,6 +694,10 @@ spec:
rule: '!has(self.scope) || self.scope != ''Internal'' || !has(self.providerParameters)
|| !has(self.providerParameters.aws) || !has(self.providerParameters.aws.networkLoadBalancer)
|| !has(self.providerParameters.aws.networkLoadBalancer.eipAllocations)'
+ - message: cannot specify a floating ip when scope is internal
+ rule: '!has(self.scope) || self.scope != ''Internal'' || !has(self.providerParameters)
+ || !has(self.providerParameters.openstack) || !has(self.providerParameters.openstack.floatingIP)
+ || self.providerParameters.openstack.floatingIP == ""'
nodePort:
description: |-
nodePort holds parameters for the NodePortService endpoint publishing strategy.
@@ -2336,6 +2345,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -2343,10 +2355,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
@@ -2815,15 +2837,20 @@ spec:
If empty, defaults will be applied. See specific openstack fields for
details about their defaults.
properties:
- loadBalancerIP:
+ floatingIP:
description: |-
- loadBalancerIP specifies the floating IP address that the load balancer will use.
+ floatingIP specifies the IP address that the load balancer will use.
When not specified, an IP address will be assigned randomly by the OpenStack cloud provider.
+ When specified, the floating IP has to be pre-created. If the
+ specified value is not a floating IP or is already claimed, the
+ OpenStack cloud provider won't be able to provision the load
+ balancer.
+ This field may only be used if the IngressController has External scope.
This value must be a valid IPv4 or IPv6 address.
type: string
x-kubernetes-validations:
- - message: loadBalancerIP must be a valid IPv4 or
- IPv6 address
+ - message: floatingIP must be a valid IPv4 or IPv6
+ address
rule: isIP(self)
type: object
type:
@@ -2865,6 +2892,10 @@ spec:
rule: '!has(self.scope) || self.scope != ''Internal'' || !has(self.providerParameters)
|| !has(self.providerParameters.aws) || !has(self.providerParameters.aws.networkLoadBalancer)
|| !has(self.providerParameters.aws.networkLoadBalancer.eipAllocations)'
+ - message: cannot specify a floating ip when scope is internal
+ rule: '!has(self.scope) || self.scope != ''Internal'' || !has(self.providerParameters)
+ || !has(self.providerParameters.openstack) || !has(self.providerParameters.openstack.floatingIP)
+ || self.providerParameters.openstack.floatingIP == ""'
nodePort:
description: |-
nodePort holds parameters for the NodePortService endpoint publishing strategy.
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_insights_00_insightsoperators.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_insights_00_insightsoperators.crd.yaml
index d1d2fa6b05..b7ce165e3f 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_insights_00_insightsoperators.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_insights_00_insightsoperators.crd.yaml
@@ -108,6 +108,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -115,10 +118,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_openshift-controller-manager_02_openshiftcontrollermanagers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_openshift-controller-manager_02_openshiftcontrollermanagers.crd.yaml
index 1abf8e03de..d6dabdda07 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_openshift-controller-manager_02_openshiftcontrollermanagers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_openshift-controller-manager_02_openshiftcontrollermanagers.crd.yaml
@@ -106,6 +106,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -113,10 +116,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_service-ca_02_servicecas.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_service-ca_02_servicecas.crd.yaml
index f31a18f210..16fba0d6d3 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_service-ca_02_servicecas.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_service-ca_02_servicecas.crd.yaml
@@ -107,6 +107,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -114,10 +117,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_storage_01_storages.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_storage_01_storages.crd.yaml
index b928c9137e..e0f8418814 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_storage_01_storages.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_50_storage_01_storages.crd.yaml
@@ -123,6 +123,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -130,10 +133,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_dns_00_dnses.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_dns_00_dnses.crd.yaml
index bdb32882b1..7d2acd004f 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_dns_00_dnses.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_dns_00_dnses.crd.yaml
@@ -576,6 +576,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -583,10 +586,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-CustomNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-CustomNoUpgrade.crd.yaml
index c023c8c272..146c684056 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-CustomNoUpgrade.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-CustomNoUpgrade.crd.yaml
@@ -923,6 +923,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -930,10 +933,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-Default.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-Default.crd.yaml
index e1adf488a6..3f150defe7 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-Default.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-Default.crd.yaml
@@ -867,6 +867,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -874,10 +877,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-DevPreviewNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-DevPreviewNoUpgrade.crd.yaml
index ce2db2e924..fd06797632 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-DevPreviewNoUpgrade.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-DevPreviewNoUpgrade.crd.yaml
@@ -923,6 +923,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -930,10 +933,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-TechPreviewNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-TechPreviewNoUpgrade.crd.yaml
index 2704f6fbd0..e55b94afc3 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-TechPreviewNoUpgrade.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_70_network_01_networks-TechPreviewNoUpgrade.crd.yaml
@@ -923,6 +923,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -930,10 +933,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_80_csi-snapshot-controller_01_csisnapshotcontrollers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_80_csi-snapshot-controller_01_csisnapshotcontrollers.crd.yaml
index 23197942ee..a166e4c3a7 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_80_csi-snapshot-controller_01_csisnapshotcontrollers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_80_csi-snapshot-controller_01_csisnapshotcontrollers.crd.yaml
@@ -107,6 +107,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -114,10 +117,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_90_csi-driver_01_clustercsidrivers.crd.yaml b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_90_csi-driver_01_clustercsidrivers.crd.yaml
index 1f0f61a943..9a65a695ac 100644
--- a/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_90_csi-driver_01_clustercsidrivers.crd.yaml
+++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.crd-manifests/0000_90_csi-driver_01_clustercsidrivers.crd.yaml
@@ -384,6 +384,9 @@ spec:
description: OperatorCondition is just the standard condition fields.
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.
format: date-time
type: string
message:
@@ -391,10 +394,20 @@ spec:
reason:
type: string
status:
+ description: status of the condition, one of True, False, Unknown.
+ enum:
+ - "True"
+ - "False"
+ - Unknown
type: string
type:
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
+ 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])$
type: string
required:
+ - lastTransitionTime
+ - status
- type
type: object
type: array
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 a3a78a89b7..03d9e16edb 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
@@ -52,7 +52,10 @@ func (NodeStatus) SwaggerDoc() map[string]string {
}
var map_OperatorCondition = map[string]string{
- "": "OperatorCondition is just the standard condition fields.",
+ "": "OperatorCondition is just the standard condition fields.",
+ "type": "type of condition in CamelCase or in foo.example.com/CamelCase.",
+ "status": "status of the condition, one of True, False, Unknown.",
+ "lastTransitionTime": "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.",
}
func (OperatorCondition) SwaggerDoc() map[string]string {
@@ -1122,8 +1125,8 @@ func (NodePortStrategy) SwaggerDoc() map[string]string {
}
var map_OpenStackLoadBalancerParameters = map[string]string{
- "": "OpenStackLoadBalancerParameters provides configuration settings that are specific to OpenStack load balancers.",
- "loadBalancerIP": "loadBalancerIP specifies the floating IP address that the load balancer will use. When not specified, an IP address will be assigned randomly by the OpenStack cloud provider. This value must be a valid IPv4 or IPv6 address. ",
+ "": "OpenStackLoadBalancerParameters provides configuration settings that are specific to OpenStack load balancers.",
+ "floatingIP": "floatingIP specifies the IP address that the load balancer will use. When not specified, an IP address will be assigned randomly by the OpenStack cloud provider. When specified, the floating IP has to be pre-created. If the specified value is not a floating IP or is already claimed, the OpenStack cloud provider won't be able to provision the load balancer. This field may only be used if the IngressController has External scope. This value must be a valid IPv4 or IPv6 address. ",
}
func (OpenStackLoadBalancerParameters) SwaggerDoc() map[string]string {
diff --git a/vendor/github.com/openshift/library-go/pkg/apiserver/jsonpatch/jsonpatch.go b/vendor/github.com/openshift/library-go/pkg/apiserver/jsonpatch/jsonpatch.go
deleted file mode 100644
index 282b17c602..0000000000
--- a/vendor/github.com/openshift/library-go/pkg/apiserver/jsonpatch/jsonpatch.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package jsonpatch
-
-import (
- "encoding/json"
-)
-
-type PatchOperation struct {
- Op string `json:"op,omitempty"`
- Path string `json:"path,omitempty"`
- Value interface{} `json:"value,omitempty"`
-}
-
-const (
- patchTestOperation = "test"
- patchRemoveOperation = "remove"
-)
-
-type PatchSet struct {
- patches []PatchOperation
-}
-
-func New() *PatchSet {
- return &PatchSet{}
-}
-
-func (p *PatchSet) WithRemove(path string, test TestCondition) *PatchSet {
- p.WithTest(test.path, test.value)
- p.addOperation(patchRemoveOperation, path, nil)
- return p
-}
-
-func (p *PatchSet) WithTest(path string, value interface{}) *PatchSet {
- p.addOperation(patchTestOperation, path, value)
- return p
-}
-
-func (p *PatchSet) IsEmpty() bool {
- return len(p.patches) == 0
-}
-
-func (p *PatchSet) Marshal() ([]byte, error) {
- jsonBytes, err := json.Marshal(p.patches)
- if err != nil {
- return nil, err
- }
- return jsonBytes, nil
-}
-
-func (p *PatchSet) addOperation(op, path string, value interface{}) {
- patch := PatchOperation{
- Op: op,
- Path: path,
- Value: value,
- }
- p.patches = append(p.patches, patch)
-}
-
-type TestCondition struct {
- path string
- value interface{}
-}
-
-func NewTestCondition(path string, value interface{}) TestCondition {
- return TestCondition{path, value}
-}
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/configobserver/node/observe_minimum_kubelet_version.go b/vendor/github.com/openshift/library-go/pkg/operator/configobserver/node/observe_minimum_kubelet_version.go
new file mode 100644
index 0000000000..6e489ce545
--- /dev/null
+++ b/vendor/github.com/openshift/library-go/pkg/operator/configobserver/node/observe_minimum_kubelet_version.go
@@ -0,0 +1,45 @@
+package node
+
+import (
+ "github.com/openshift/library-go/pkg/operator/configobserver"
+ "github.com/openshift/library-go/pkg/operator/events"
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+ "k8s.io/klog/v2"
+)
+
+var minimumKubeletVersionConfigPath = "minimumKubeletVersion"
+
+// ObserveKubeletMinimumVersion watches the node configuration and generates the minimumKubeletVersion
+func ObserveMinimumKubeletVersion(genericListers configobserver.Listers, _ events.Recorder, existingConfig map[string]interface{}) (ret map[string]interface{}, errs []error) {
+ defer func() {
+ // Prune the observed config so that it only contains minimumKubeletVersion field.
+ ret = configobserver.Pruned(ret, []string{minimumKubeletVersionConfigPath})
+ }()
+ listers := genericListers.(NodeLister)
+ configNode, err := listers.NodeLister().Get("cluster")
+ // we got an error so without the node object we are not able to determine minimumKubeletVersion
+ if err != nil {
+ // if config/v1/node/cluster object is not found, that can be treated as a non-error case
+ if !apierrors.IsNotFound(err) {
+ errs = append(errs, err)
+ } else { // but raise a warning
+ klog.Warningf("nodes.config.openshift.io/cluster object could not be found")
+ }
+ return existingConfig, errs
+ }
+
+ if configNode.Spec.MinimumKubeletVersion == "" {
+ // in case minimum kubelet version is not set on cluster
+ // return empty set of configs, this helps to unset the config
+ // values related to the minimumKubeletVersion.
+ // Also, ensures that this observer doesn't break cluster upgrades/downgrades
+ return map[string]interface{}{}, errs
+ }
+
+ if err := unstructured.SetNestedField(ret, configNode.Spec.MinimumKubeletVersion, minimumKubeletVersionConfigPath); err != nil {
+ errs = append(errs, err)
+ }
+
+ return ret, errs
+}
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_operator_client.go b/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_operator_client.go
index 1c09bea361..7c50d42b30 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_operator_client.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_operator_client.go
@@ -9,16 +9,13 @@ import (
operatorv1 "github.com/openshift/api/operator/v1"
applyoperatorv1 "github.com/openshift/client-go/operator/applyconfigurations/operator/v1"
- "github.com/openshift/library-go/pkg/apiserver/jsonpatch"
"github.com/openshift/library-go/pkg/operator/v1helpers"
-
"k8s.io/apimachinery/pkg/api/equality"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
- "k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/dynamic/dynamicinformer"
"k8s.io/client-go/informers"
@@ -379,19 +376,6 @@ func (c dynamicOperatorClient) applyOperatorStatus(ctx context.Context, fieldMan
return nil
}
-func (c dynamicOperatorClient) PatchOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error) {
- return c.patchOperatorStatus(ctx, jsonPatch)
-}
-
-func (c dynamicOperatorClient) patchOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error) {
- jsonPatchBytes, err := jsonPatch.Marshal()
- if err != nil {
- return err
- }
- _, err = c.client.Patch(ctx, c.configName, types.JSONPatchType, jsonPatchBytes, metav1.PatchOptions{}, "/status")
- return err
-}
-
func (c dynamicOperatorClient) EnsureFinalizer(ctx context.Context, finalizer string) error {
uncastInstance, err := c.informer.Lister().Get(c.configName)
if err != nil {
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_staticpod_operator_client.go b/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_staticpod_operator_client.go
index 05ee335c0a..3e13f01d89 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_staticpod_operator_client.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/genericoperatorclient/dynamic_staticpod_operator_client.go
@@ -4,12 +4,9 @@ import (
"context"
"github.com/imdario/mergo"
-
operatorv1 "github.com/openshift/api/operator/v1"
applyoperatorv1 "github.com/openshift/client-go/operator/applyconfigurations/operator/v1"
- "github.com/openshift/library-go/pkg/apiserver/jsonpatch"
"github.com/openshift/library-go/pkg/operator/v1helpers"
-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
@@ -120,10 +117,6 @@ func (c dynamicOperatorClient) ApplyStaticPodOperatorStatus(ctx context.Context,
return c.applyOperatorStatus(ctx, fieldManager, desiredConfiguration)
}
-func (c dynamicOperatorClient) PatchStaticOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error) {
- return c.patchOperatorStatus(ctx, jsonPatch)
-}
-
func getStaticPodOperatorSpecFromUnstructured(obj map[string]interface{}) (*operatorv1.StaticPodOperatorSpec, error) {
uncastSpec, exists, err := unstructured.NestedMap(obj, "spec")
if !exists {
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go
index d0996a2afb..99f3ecb73b 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go
@@ -2,17 +2,23 @@ package resourceapply
import (
"context"
+ errorsstdlib "errors"
+ "fmt"
- "github.com/openshift/library-go/pkg/operator/events"
- "github.com/openshift/library-go/pkg/operator/resource/resourcehelper"
- "github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+ "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/klog/v2"
+ "k8s.io/utils/ptr"
+
+ "github.com/openshift/library-go/pkg/operator/events"
+ "github.com/openshift/library-go/pkg/operator/resource/resourcehelper"
+
+ "github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
)
var alertmanagerGVR = schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "alertmanagers"}
@@ -82,10 +88,10 @@ func ApplyUnstructuredResourceImproved(
}
existing, err := client.Resource(resourceGVR).Namespace(namespace).Get(ctx, name, metav1.GetOptions{})
if errors.IsNotFound(err) {
- want, errCreate := client.Resource(resourceGVR).Namespace(namespace).Create(ctx, required, metav1.CreateOptions{})
- resourcehelper.ReportCreateEvent(recorder, required, errCreate)
+ want, err := client.Resource(resourceGVR).Namespace(namespace).Create(ctx, required, metav1.CreateOptions{})
+ resourcehelper.ReportCreateEvent(recorder, required, err)
cache.UpdateCachedResourceMetadata(required, want)
- return want, true, errCreate
+ return want, true, err
}
if err != nil {
return nil, false, err
@@ -96,15 +102,44 @@ func ApplyUnstructuredResourceImproved(
return existing, false, nil
}
+ // Ensure metadata field is present on the object.
existingCopy := existing.DeepCopy()
+ existingObjectMeta, found, err := unstructured.NestedMap(existingCopy.Object, "metadata")
+ if err != nil {
+ return nil, false, err
+ }
+ if !found {
+ return nil, false, errorsstdlib.New(fmt.Sprintf("metadata not found in the existing object: %s/%s", existing.GetNamespace(), existingCopy.GetName()))
+ }
+ requiredObjectMeta, found, err := unstructured.NestedMap(required.Object, "metadata")
+ if err != nil {
+ return nil, false, err
+ }
+ if !found {
+ return nil, false, errorsstdlib.New(fmt.Sprintf("metadata not found in the required object: %s/%s", required.GetNamespace(), required.GetName()))
+ }
- // Replace and/or merge certain metadata fields.
- didMetadataModify := false
- err = resourcemerge.EnsureObjectMetaForUnstructured(&didMetadataModify, existingCopy, required)
+ // Cast the metadata to the correct type.
+ var existingObjectMetaTyped, requiredObjectMetaTyped metav1.ObjectMeta
+ err = runtime.DefaultUnstructuredConverter.FromUnstructured(existingObjectMeta, &existingObjectMetaTyped)
+ if err != nil {
+ return nil, false, err
+ }
+ err = runtime.DefaultUnstructuredConverter.FromUnstructured(requiredObjectMeta, &requiredObjectMetaTyped)
if err != nil {
return nil, false, err
}
+ // Fail-fast if the resource versions differ.
+ if requiredObjectMetaTyped.ResourceVersion != "" && existingObjectMetaTyped.ResourceVersion != requiredObjectMetaTyped.ResourceVersion {
+ err = errors.NewConflict(resourceGVR.GroupResource(), name, fmt.Errorf("rejected to update %s %s because the object has been modified: desired/actual ResourceVersion: %v/%v", existing.GetKind(), existing.GetName(), requiredObjectMetaTyped.ResourceVersion, existingObjectMetaTyped.ResourceVersion))
+ return nil, false, err
+ }
+
+ // Check if the metadata objects differ.
+ didMetadataModify := ptr.To(false)
+ resourcemerge.EnsureObjectMeta(didMetadataModify, &existingObjectMetaTyped, requiredObjectMetaTyped)
+
// Deep-check the spec objects for equality, and update the cache in either case.
if defaultingFunc == nil {
defaultingFunc = noDefaulting
@@ -112,26 +147,26 @@ func ApplyUnstructuredResourceImproved(
if equalityChecker == nil {
equalityChecker = equality.Semantic
}
- didSpecModify := false
- err = ensureGenericSpec(&didSpecModify, required, existingCopy, defaultingFunc, equalityChecker)
+ existingCopy, didSpecModify, err := ensureGenericSpec(required, existingCopy, defaultingFunc, equalityChecker)
if err != nil {
return nil, false, err
}
- if !didSpecModify && !didMetadataModify {
+ if !didSpecModify && !*didMetadataModify {
// Update cache even if certain fields are not modified, in order to maintain a consistent cache based on the
// resource hash. The resource hash depends on the entire metadata, not just the fields that were checked above,
cache.UpdateCachedResourceMetadata(required, existingCopy)
return existingCopy, false, nil
}
- // Perform update if resource exists but different from the required (desired) one.
if klog.V(4).Enabled() {
klog.Infof("%s %q changes: %v", resourceGVR.String(), namespace+"/"+name, JSONPatchNoError(existing, existingCopy))
}
- actual, errUpdate := client.Resource(resourceGVR).Namespace(namespace).Update(ctx, existingCopy, metav1.UpdateOptions{})
- resourcehelper.ReportUpdateEvent(recorder, existingCopy, errUpdate)
- cache.UpdateCachedResourceMetadata(existingCopy, actual)
- return actual, true, errUpdate
+
+ // Perform update if resource exists but different from the required (desired) one.
+ actual, err := client.Resource(resourceGVR).Namespace(namespace).Update(ctx, required, metav1.UpdateOptions{})
+ resourcehelper.ReportUpdateEvent(recorder, required, err)
+ cache.UpdateCachedResourceMetadata(required, actual)
+ return actual, true, err
}
// DeleteUnstructuredResource deletes the unstructured resource.
@@ -147,27 +182,27 @@ func DeleteUnstructuredResource(ctx context.Context, client dynamic.Interface, r
return nil, true, nil
}
-func ensureGenericSpec(didSpecModify *bool, required, existing *unstructured.Unstructured, mimicDefaultingFn mimicDefaultingFunc, equalityChecker equalityChecker) error {
+func ensureGenericSpec(required, existing *unstructured.Unstructured, mimicDefaultingFn mimicDefaultingFunc, equalityChecker equalityChecker) (*unstructured.Unstructured, bool, error) {
mimicDefaultingFn(required)
requiredSpec, _, err := unstructured.NestedMap(required.UnstructuredContent(), "spec")
if err != nil {
- return err
+ return nil, false, err
}
existingSpec, _, err := unstructured.NestedMap(existing.UnstructuredContent(), "spec")
if err != nil {
- return err
+ return nil, false, err
}
if equalityChecker.DeepEqual(existingSpec, requiredSpec) {
- return nil
+ return existing, false, nil
}
- if err = unstructured.SetNestedMap(existing.UnstructuredContent(), requiredSpec, "spec"); err != nil {
- return err
+ existingCopy := existing.DeepCopy()
+ if err := unstructured.SetNestedMap(existingCopy.UnstructuredContent(), requiredSpec, "spec"); err != nil {
+ return nil, true, err
}
- *didSpecModify = true
- return nil
+ return existingCopy, true, nil
}
// mimicDefaultingFunc is used to set fields that are defaulted. This allows for sparse manifests to apply correctly.
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourcemerge/object_merger.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourcemerge/object_merger.go
index 20e19a78fe..4c5dcacaa7 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourcemerge/object_merger.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourcemerge/object_merger.go
@@ -1,14 +1,10 @@
package resourcemerge
import (
- errorsstdlib "errors"
- "fmt"
"reflect"
"strings"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
- "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
@@ -22,48 +18,6 @@ func EnsureObjectMeta(modified *bool, existing *metav1.ObjectMeta, required meta
MergeOwnerRefs(modified, &existing.OwnerReferences, required.OwnerReferences)
}
-func EnsureObjectMetaForUnstructured(modified *bool, existing *unstructured.Unstructured, required *unstructured.Unstructured) error {
-
- // Ensure metadata field is present on the object.
- existingObjectMeta, found, err := unstructured.NestedMap(existing.Object, "metadata")
- if err != nil {
- return err
- }
- if !found {
- return errorsstdlib.New(fmt.Sprintf("metadata not found in the existing object: %s/%s", existing.GetNamespace(), existing.GetName()))
- }
- var requiredObjectMeta map[string]interface{}
- requiredObjectMeta, found, err = unstructured.NestedMap(required.Object, "metadata")
- if err != nil {
- return err
- }
- if !found {
- return errorsstdlib.New(fmt.Sprintf("metadata not found in the required object: %s/%s", required.GetNamespace(), required.GetName()))
- }
-
- // Cast the metadata to the correct type.
- var existingObjectMetaTyped, requiredObjectMetaTyped metav1.ObjectMeta
- err = runtime.DefaultUnstructuredConverter.FromUnstructured(existingObjectMeta, &existingObjectMetaTyped)
- if err != nil {
- return err
- }
- err = runtime.DefaultUnstructuredConverter.FromUnstructured(requiredObjectMeta, &requiredObjectMetaTyped)
- if err != nil {
- return err
- }
-
- // Check if the metadata objects differ. This only checks for selective fields (excluding the resource version, among others).
- EnsureObjectMeta(modified, &existingObjectMetaTyped, requiredObjectMetaTyped)
- if *modified {
- existing.Object["metadata"], err = runtime.DefaultUnstructuredConverter.ToUnstructured(&existingObjectMetaTyped)
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
// WithCleanLabelsAndAnnotations cleans the metadata off the removal annotations/labels/ownerrefs
// (those that end with trailing "-")
func WithCleanLabelsAndAnnotations(obj metav1.Object) metav1.Object {
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controller/node/node_controller.go b/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controller/node/node_controller.go
index 764d89bb99..b8799fc041 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controller/node/node_controller.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controller/node/node_controller.go
@@ -12,8 +12,7 @@ import (
corelisterv1 "k8s.io/client-go/listers/core/v1"
operatorv1 "github.com/openshift/api/operator/v1"
- applyoperatorv1 "github.com/openshift/client-go/operator/applyconfigurations/operator/v1"
- "github.com/openshift/library-go/pkg/apiserver/jsonpatch"
+
"github.com/openshift/library-go/pkg/controller/factory"
"github.com/openshift/library-go/pkg/operator/condition"
"github.com/openshift/library-go/pkg/operator/events"
@@ -22,22 +21,19 @@ import (
// NodeController watches for new master nodes and adds them to the node status list in the operator config status.
type NodeController struct {
- controllerInstanceName string
- operatorClient v1helpers.StaticPodOperatorClient
- nodeLister corelisterv1.NodeLister
+ operatorClient v1helpers.StaticPodOperatorClient
+ nodeLister corelisterv1.NodeLister
}
// NewNodeController creates a new node controller.
func NewNodeController(
- instanceName string,
operatorClient v1helpers.StaticPodOperatorClient,
kubeInformersClusterScoped informers.SharedInformerFactory,
eventRecorder events.Recorder,
) factory.Controller {
c := &NodeController{
- controllerInstanceName: factory.ControllerInstanceName(instanceName, "Node"),
- operatorClient: operatorClient,
- nodeLister: kubeInformersClusterScoped.Core().V1().Nodes().Lister(),
+ operatorClient: operatorClient,
+ nodeLister: kubeInformersClusterScoped.Core().V1().Nodes().Lister(),
}
return factory.New().
WithInformers(
@@ -46,7 +42,7 @@ func NewNodeController(
).
WithSync(c.sync).
ToController(
- c.controllerInstanceName,
+ "NodeController", // don't change what is passed here unless you also remove the old FooDegraded condition
eventRecorder,
)
}
@@ -66,9 +62,7 @@ func (c NodeController) sync(ctx context.Context, syncCtx factory.SyncContext) e
return err
}
- jsonPatch := jsonpatch.New()
- var removedNodeStatusesCounter int
- newTargetNodeStates := []*applyoperatorv1.NodeStatusApplyConfiguration{}
+ newTargetNodeStates := []operatorv1.NodeStatus{}
// remove entries for missing nodes
for i, nodeState := range originalOperatorStatus.NodeStatuses {
found := false
@@ -78,30 +72,9 @@ func (c NodeController) sync(ctx context.Context, syncCtx factory.SyncContext) e
}
}
if found {
- newTargetNodeState := applyoperatorv1.NodeStatus().
- WithNodeName(originalOperatorStatus.NodeStatuses[i].NodeName).
- WithCurrentRevision(originalOperatorStatus.NodeStatuses[i].CurrentRevision).
- WithTargetRevision(originalOperatorStatus.NodeStatuses[i].TargetRevision).
- WithLastFailedRevision(originalOperatorStatus.NodeStatuses[i].LastFailedRevision).
- WithLastFailedReason(originalOperatorStatus.NodeStatuses[i].LastFailedReason).
- WithLastFailedCount(originalOperatorStatus.NodeStatuses[i].LastFailedCount).
- WithLastFallbackCount(originalOperatorStatus.NodeStatuses[i].LastFallbackCount).
- WithLastFailedRevisionErrors(originalOperatorStatus.NodeStatuses[i].LastFailedRevisionErrors...)
- if originalOperatorStatus.NodeStatuses[i].LastFailedTime != nil {
- newTargetNodeState.WithLastFailedTime(*originalOperatorStatus.NodeStatuses[i].LastFailedTime)
- }
- newTargetNodeStates = append(newTargetNodeStates, newTargetNodeState)
+ newTargetNodeStates = append(newTargetNodeStates, originalOperatorStatus.NodeStatuses[i])
} else {
syncCtx.Recorder().Warningf("MasterNodeRemoved", "Observed removal of master node %s", nodeState.NodeName)
- // each delete operation is applied to the object,
- // which modifies the array. Thus, we need to
- // adjust the indices to find the correct node to remove.
- removeAtIndex := i
- if !jsonPatch.IsEmpty() {
- removeAtIndex = removeAtIndex - removedNodeStatusesCounter
- }
- jsonPatch.WithRemove(fmt.Sprintf("/status/nodeStatuses/%d", removeAtIndex), jsonpatch.NewTestCondition(fmt.Sprintf("/status/nodeStatuses/%d/nodeName", removeAtIndex), nodeState.NodeName))
- removedNodeStatusesCounter++
}
}
@@ -118,24 +91,7 @@ func (c NodeController) sync(ctx context.Context, syncCtx factory.SyncContext) e
}
syncCtx.Recorder().Eventf("MasterNodeObserved", "Observed new master node %s", node.Name)
- newTargetNodeState := applyoperatorv1.NodeStatus().WithNodeName(node.Name)
- newTargetNodeStates = append(newTargetNodeStates, newTargetNodeState)
- }
-
- degradedCondition := applyoperatorv1.OperatorCondition().WithType(condition.NodeControllerDegradedConditionType)
- if !jsonPatch.IsEmpty() {
- if err = c.operatorClient.PatchStaticOperatorStatus(ctx, jsonPatch); err != nil {
- degradedCondition = degradedCondition.
- WithStatus(operatorv1.ConditionTrue).
- WithReason("MasterNodeNotRemoved").
- WithMessage(fmt.Sprintf("failed applying JSONPatch, err: %v", err.Error()))
-
- status := applyoperatorv1.StaticPodOperatorStatus().
- WithConditions(degradedCondition).
- WithNodeStatuses(newTargetNodeStates...)
-
- return c.operatorClient.ApplyStaticPodOperatorStatus(ctx, c.controllerInstanceName, status)
- }
+ newTargetNodeStates = append(newTargetNodeStates, operatorv1.NodeStatus{NodeName: node.Name})
}
// detect and report master nodes that are not ready
@@ -154,29 +110,42 @@ func (c NodeController) sync(ctx context.Context, syncCtx factory.SyncContext) e
}
}
+ newCondition := operatorv1.OperatorCondition{
+ Type: condition.NodeControllerDegradedConditionType,
+ }
if len(notReadyNodes) > 0 {
- degradedCondition = degradedCondition.
- WithStatus(operatorv1.ConditionTrue).
- WithReason("MasterNodesReady").
- WithMessage(fmt.Sprintf("The master nodes not ready: %s", strings.Join(notReadyNodes, ", ")))
+ newCondition.Status = operatorv1.ConditionTrue
+ newCondition.Reason = "MasterNodesReady"
+ newCondition.Message = fmt.Sprintf("The master nodes not ready: %s", strings.Join(notReadyNodes, ", "))
} else {
- degradedCondition = degradedCondition.
- WithStatus(operatorv1.ConditionFalse).
- WithReason("MasterNodesReady").
- WithMessage("All master nodes are ready")
+ newCondition.Status = operatorv1.ConditionFalse
+ newCondition.Reason = "MasterNodesReady"
+ newCondition.Message = "All master nodes are ready"
}
- status := applyoperatorv1.StaticPodOperatorStatus().
- WithConditions(degradedCondition).
- WithNodeStatuses(newTargetNodeStates...)
- if err = c.operatorClient.ApplyStaticPodOperatorStatus(ctx, c.controllerInstanceName, status); err != nil {
- return err
+ oldStatus := &operatorv1.StaticPodOperatorStatus{}
+ _, updated, updateError := v1helpers.UpdateStaticPodStatus(ctx, c.operatorClient, func(status *operatorv1.StaticPodOperatorStatus) error {
+ //a hack for storing the old status (before we mutate it)
+ oldStatus = status
+ return nil
+ }, v1helpers.UpdateStaticPodConditionFn(newCondition), func(status *operatorv1.StaticPodOperatorStatus) error {
+ status.NodeStatuses = newTargetNodeStates
+ return nil
+ })
+
+ if updateError != nil {
+ return updateError
}
- oldNodeDegradedCondition := v1helpers.FindOperatorCondition(originalOperatorStatus.Conditions, condition.NodeControllerDegradedConditionType)
- if oldNodeDegradedCondition == nil || oldNodeDegradedCondition.Message != *degradedCondition.Message {
- syncCtx.Recorder().Eventf("MasterNodesReadyChanged", *degradedCondition.Message)
+ if !updated {
+ return nil
}
+
+ oldNodeDegradedCondition := v1helpers.FindOperatorCondition(oldStatus.Conditions, condition.NodeControllerDegradedConditionType)
+ if oldNodeDegradedCondition == nil || oldNodeDegradedCondition.Message != newCondition.Message {
+ syncCtx.Recorder().Eventf("MasterNodesReadyChanged", newCondition.Message)
+ }
+
return nil
}
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controllers.go b/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controllers.go
index 8131668dec..6a1c693c55 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controllers.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/staticpod/controllers.go
@@ -340,7 +340,6 @@ func (b *staticPodOperatorControllerBuilder) ToControllers() (manager.Controller
}
manager.WithController(node.NewNodeController(
- b.operandName,
b.staticPodOperatorClient,
clusterInformers,
eventRecorder,
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/informers.go b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/informers.go
index cd31031242..1dd17e7590 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/informers.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/informers.go
@@ -2,7 +2,6 @@ package v1helpers
import (
"fmt"
- "reflect"
"time"
corev1 "k8s.io/api/core/v1"
@@ -19,10 +18,6 @@ type KubeInformersForNamespaces interface {
InformersFor(namespace string) informers.SharedInformerFactory
Namespaces() sets.Set[string]
- // WaitForCacheSync blocks until all started informers' caches were synced
- // or the stop channel gets closed.
- WaitForCacheSync(stopCh <-chan struct{}) map[string]map[reflect.Type]bool
-
ConfigMapLister() corev1listers.ConfigMapLister
SecretLister() corev1listers.SecretLister
@@ -47,16 +42,6 @@ func NewKubeInformersForNamespaces(kubeClient kubernetes.Interface, namespaces .
type kubeInformersForNamespaces map[string]informers.SharedInformerFactory
-// WaitForCacheSync waits for all started informers' cache were synced.
-func (i kubeInformersForNamespaces) WaitForCacheSync(stopCh <-chan struct{}) map[string]map[reflect.Type]bool {
- ret := map[string]map[reflect.Type]bool{}
- for namespace, informerFactory := range i {
- ret[namespace] = informerFactory.WaitForCacheSync(stopCh)
- }
-
- return ret
-}
-
func (i kubeInformersForNamespaces) Start(stopCh <-chan struct{}) {
for _, informer := range i {
informer.Start(stopCh)
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/interfaces.go b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/interfaces.go
index 50bfae945e..68201864ba 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/interfaces.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/interfaces.go
@@ -3,12 +3,11 @@ package v1helpers
import (
"context"
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+
operatorv1 "github.com/openshift/api/operator/v1"
applyoperatorv1 "github.com/openshift/client-go/operator/applyconfigurations/operator/v1"
- "github.com/openshift/library-go/pkg/apiserver/jsonpatch"
-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/client-go/tools/cache"
)
@@ -27,8 +26,6 @@ type OperatorClient interface {
ApplyOperatorSpec(ctx context.Context, fieldManager string, applyConfiguration *applyoperatorv1.OperatorSpecApplyConfiguration) (err error)
ApplyOperatorStatus(ctx context.Context, fieldManager string, applyConfiguration *applyoperatorv1.OperatorStatusApplyConfiguration) (err error)
-
- PatchOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error)
}
type StaticPodOperatorClient interface {
@@ -46,8 +43,6 @@ type StaticPodOperatorClient interface {
ApplyStaticPodOperatorSpec(ctx context.Context, fieldManager string, applyConfiguration *applyoperatorv1.StaticPodOperatorSpecApplyConfiguration) (err error)
ApplyStaticPodOperatorStatus(ctx context.Context, fieldManager string, applyConfiguration *applyoperatorv1.StaticPodOperatorStatusApplyConfiguration) (err error)
-
- PatchStaticOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error)
}
type OperatorClientWithFinalizers interface {
diff --git a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go
index 5f37e5255c..70d0251a9b 100644
--- a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go
+++ b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go
@@ -6,6 +6,7 @@ import (
"strconv"
"time"
+ applyoperatorv1 "github.com/openshift/client-go/operator/applyconfigurations/operator/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -18,8 +19,6 @@ import (
operatorv1 "github.com/openshift/api/operator/v1"
v1 "github.com/openshift/api/operator/v1"
- applyoperatorv1 "github.com/openshift/client-go/operator/applyconfigurations/operator/v1"
- "github.com/openshift/library-go/pkg/apiserver/jsonpatch"
)
// NewFakeSharedIndexInformer returns a fake shared index informer, suitable to use in static pod controller unit tests.
@@ -85,7 +84,7 @@ func (fakeSharedIndexInformer) SetTransform(f cache.TransformFunc) error {
func NewFakeStaticPodOperatorClient(
staticPodSpec *operatorv1.StaticPodOperatorSpec, staticPodStatus *operatorv1.StaticPodOperatorStatus,
triggerStatusErr func(rv string, status *operatorv1.StaticPodOperatorStatus) error,
- triggerSpecErr func(rv string, spec *operatorv1.StaticPodOperatorSpec) error) *fakeStaticPodOperatorClient {
+ triggerSpecErr func(rv string, spec *operatorv1.StaticPodOperatorSpec) error) StaticPodOperatorClient {
return &fakeStaticPodOperatorClient{
fakeStaticPodOperatorSpec: staticPodSpec,
fakeStaticPodOperatorStatus: staticPodStatus,
@@ -101,8 +100,6 @@ type fakeStaticPodOperatorClient struct {
resourceVersion string
triggerStatusUpdateError func(rv string, status *operatorv1.StaticPodOperatorStatus) error
triggerSpecUpdateError func(rv string, status *operatorv1.StaticPodOperatorSpec) error
-
- patchedOperatorStatus *jsonpatch.PatchSet
}
func (c *fakeStaticPodOperatorClient) Informer() cache.SharedIndexInformer {
@@ -187,22 +184,6 @@ func (c *fakeStaticPodOperatorClient) ApplyStaticPodOperatorStatus(ctx context.C
return nil
}
-func (c *fakeStaticPodOperatorClient) PatchOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error) {
- return nil
-}
-
-func (c *fakeStaticPodOperatorClient) PatchStaticOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error) {
- if c.triggerStatusUpdateError != nil {
- return c.triggerStatusUpdateError("", nil)
- }
- c.patchedOperatorStatus = jsonPatch
- return nil
-}
-
-func (c *fakeStaticPodOperatorClient) GetPatchedOperatorStatus() *jsonpatch.PatchSet {
- return c.patchedOperatorStatus
-}
-
func (c *fakeStaticPodOperatorClient) GetOperatorState() (*operatorv1.OperatorSpec, *operatorv1.OperatorStatus, string, error) {
return &c.fakeStaticPodOperatorSpec.OperatorSpec, &c.fakeStaticPodOperatorStatus.OperatorStatus, c.resourceVersion, nil
}
@@ -340,10 +321,6 @@ func (c *fakeOperatorClient) ApplyOperatorStatus(ctx context.Context, fieldManag
return nil
}
-func (c *fakeOperatorClient) PatchOperatorStatus(ctx context.Context, jsonPatch *jsonpatch.PatchSet) (err error) {
- return nil
-}
-
func (c *fakeOperatorClient) EnsureFinalizer(ctx context.Context, finalizer string) error {
if c.fakeObjectMeta == nil {
c.fakeObjectMeta = &metav1.ObjectMeta{}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 95b6e983f8..da454cc160 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -210,7 +210,7 @@ github.com/modern-go/reflect2
# github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
## explicit
github.com/munnerz/goautoneg
-# github.com/openshift/api v0.0.0-20241001152557-e415140e5d5f
+# github.com/openshift/api v0.0.0-20241001152557-e415140e5d5f => github.com/haircommander/api v0.0.0-20241011205550-e76c7116e5bb
## explicit; go 1.22.0
github.com/openshift/api
github.com/openshift/api/annotations
@@ -349,9 +349,8 @@ github.com/openshift/client-go/security/informers/externalversions/internalinter
github.com/openshift/client-go/security/informers/externalversions/security
github.com/openshift/client-go/security/informers/externalversions/security/v1
github.com/openshift/client-go/security/listers/security/v1
-# github.com/openshift/library-go v0.0.0-20241017185845-c32b33471ba3
+# github.com/openshift/library-go v0.0.0-20241017185845-c32b33471ba3 => github.com/haircommander/library-go v0.0.0-20241015194702-21ccc5885f91
## explicit; go 1.22.0
-github.com/openshift/library-go/pkg/apiserver/jsonpatch
github.com/openshift/library-go/pkg/assets
github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer
github.com/openshift/library-go/pkg/certs
@@ -1542,3 +1541,5 @@ sigs.k8s.io/structured-merge-diff/v4/value
## explicit; go 1.12
sigs.k8s.io/yaml
sigs.k8s.io/yaml/goyaml.v2
+# github.com/openshift/api => github.com/haircommander/api v0.0.0-20241011205550-e76c7116e5bb
+# github.com/openshift/library-go => github.com/haircommander/library-go v0.0.0-20241015194702-21ccc5885f91