diff --git a/k8s/crds/kops.k8s.io_clusters.yaml b/k8s/crds/kops.k8s.io_clusters.yaml index 01be7bae6b..9e55c32641 100644 --- a/k8s/crds/kops.k8s.io_clusters.yaml +++ b/k8s/crds/kops.k8s.io_clusters.yaml @@ -438,6 +438,8 @@ spec: type: boolean ignore-volume-az: type: boolean + ignore-volume-microversion: + type: boolean override-volume-az: type: string type: object diff --git a/pkg/apis/kops/componentconfig.go b/pkg/apis/kops/componentconfig.go index 6873f5fc81..3809eccbff 100644 --- a/pkg/apis/kops/componentconfig.go +++ b/pkg/apis/kops/componentconfig.go @@ -782,9 +782,10 @@ type OpenstackLoadbalancerConfig struct { } type OpenstackBlockStorageConfig struct { - Version *string `json:"bs-version,omitempty"` - IgnoreAZ *bool `json:"ignore-volume-az,omitempty"` - OverrideAZ *string `json:"override-volume-az,omitempty"` + Version *string `json:"bs-version,omitempty"` + IgnoreAZ *bool `json:"ignore-volume-az,omitempty"` + OverrideAZ *string `json:"override-volume-az,omitempty"` + IgnoreVolumeMicroVersion *bool `json:"ignore-volume-microversion,omitempty"` // CreateStorageClass provisions a default class for the Cinder plugin CreateStorageClass *bool `json:"createStorageClass,omitempty"` CSIPluginImage string `json:"csiPluginImage,omitempty"` diff --git a/pkg/apis/kops/v1alpha2/componentconfig.go b/pkg/apis/kops/v1alpha2/componentconfig.go index bc00b62553..8a9e3105cd 100644 --- a/pkg/apis/kops/v1alpha2/componentconfig.go +++ b/pkg/apis/kops/v1alpha2/componentconfig.go @@ -788,9 +788,10 @@ type OpenstackLoadbalancerConfig struct { } type OpenstackBlockStorageConfig struct { - Version *string `json:"bs-version,omitempty"` - IgnoreAZ *bool `json:"ignore-volume-az,omitempty"` - OverrideAZ *string `json:"override-volume-az,omitempty"` + Version *string `json:"bs-version,omitempty"` + IgnoreAZ *bool `json:"ignore-volume-az,omitempty"` + OverrideAZ *string `json:"override-volume-az,omitempty"` + IgnoreVolumeMicroVersion *bool `json:"ignore-volume-microversion,omitempty"` // CreateStorageClass provisions a default class for the Cinder plugin CreateStorageClass *bool `json:"createStorageClass,omitempty"` CSIPluginImage string `json:"csiPluginImage,omitempty"` diff --git a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go index 2e9affd9f7..c562439460 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go @@ -6416,6 +6416,7 @@ func autoConvert_v1alpha2_OpenstackBlockStorageConfig_To_kops_OpenstackBlockStor out.Version = in.Version out.IgnoreAZ = in.IgnoreAZ out.OverrideAZ = in.OverrideAZ + out.IgnoreVolumeMicroVersion = in.IgnoreVolumeMicroVersion out.CreateStorageClass = in.CreateStorageClass out.CSIPluginImage = in.CSIPluginImage out.CSITopologySupport = in.CSITopologySupport @@ -6431,6 +6432,7 @@ func autoConvert_kops_OpenstackBlockStorageConfig_To_v1alpha2_OpenstackBlockStor out.Version = in.Version out.IgnoreAZ = in.IgnoreAZ out.OverrideAZ = in.OverrideAZ + out.IgnoreVolumeMicroVersion = in.IgnoreVolumeMicroVersion out.CreateStorageClass = in.CreateStorageClass out.CSIPluginImage = in.CSIPluginImage out.CSITopologySupport = in.CSITopologySupport diff --git a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go index 0600acd260..c0d4671535 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go @@ -4695,6 +4695,11 @@ func (in *OpenstackBlockStorageConfig) DeepCopyInto(out *OpenstackBlockStorageCo *out = new(string) **out = **in } + if in.IgnoreVolumeMicroVersion != nil { + in, out := &in.IgnoreVolumeMicroVersion, &out.IgnoreVolumeMicroVersion + *out = new(bool) + **out = **in + } if in.CreateStorageClass != nil { in, out := &in.CreateStorageClass, &out.CreateStorageClass *out = new(bool) diff --git a/pkg/apis/kops/v1alpha3/componentconfig.go b/pkg/apis/kops/v1alpha3/componentconfig.go index 836bceef01..cf17cb3892 100644 --- a/pkg/apis/kops/v1alpha3/componentconfig.go +++ b/pkg/apis/kops/v1alpha3/componentconfig.go @@ -779,9 +779,10 @@ type OpenstackLoadbalancerConfig struct { } type OpenstackBlockStorageConfig struct { - Version *string `json:"bs-version,omitempty"` - IgnoreAZ *bool `json:"ignore-volume-az,omitempty"` - OverrideAZ *string `json:"override-volume-az,omitempty"` + Version *string `json:"bs-version,omitempty"` + IgnoreAZ *bool `json:"ignore-volume-az,omitempty"` + OverrideAZ *string `json:"override-volume-az,omitempty"` + IgnoreVolumeMicroVersion *bool `json:"ignore-volume-microversion,omitempty"` // CreateStorageClass provisions a default class for the Cinder plugin CreateStorageClass *bool `json:"createStorageClass,omitempty"` CSIPluginImage string `json:"csiPluginImage,omitempty"` diff --git a/pkg/apis/kops/v1alpha3/zz_generated.conversion.go b/pkg/apis/kops/v1alpha3/zz_generated.conversion.go index 88cc17b5ce..2acc378689 100644 --- a/pkg/apis/kops/v1alpha3/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha3/zz_generated.conversion.go @@ -6665,6 +6665,7 @@ func autoConvert_v1alpha3_OpenstackBlockStorageConfig_To_kops_OpenstackBlockStor out.Version = in.Version out.IgnoreAZ = in.IgnoreAZ out.OverrideAZ = in.OverrideAZ + out.IgnoreVolumeMicroVersion = in.IgnoreVolumeMicroVersion out.CreateStorageClass = in.CreateStorageClass out.CSIPluginImage = in.CSIPluginImage out.CSITopologySupport = in.CSITopologySupport @@ -6680,6 +6681,7 @@ func autoConvert_kops_OpenstackBlockStorageConfig_To_v1alpha3_OpenstackBlockStor out.Version = in.Version out.IgnoreAZ = in.IgnoreAZ out.OverrideAZ = in.OverrideAZ + out.IgnoreVolumeMicroVersion = in.IgnoreVolumeMicroVersion out.CreateStorageClass = in.CreateStorageClass out.CSIPluginImage = in.CSIPluginImage out.CSITopologySupport = in.CSITopologySupport diff --git a/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go index 6e083dc953..fb30ad9f19 100644 --- a/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha3/zz_generated.deepcopy.go @@ -4616,6 +4616,11 @@ func (in *OpenstackBlockStorageConfig) DeepCopyInto(out *OpenstackBlockStorageCo *out = new(string) **out = **in } + if in.IgnoreVolumeMicroVersion != nil { + in, out := &in.IgnoreVolumeMicroVersion, &out.IgnoreVolumeMicroVersion + *out = new(bool) + **out = **in + } if in.CreateStorageClass != nil { in, out := &in.CreateStorageClass, &out.CreateStorageClass *out = new(bool) diff --git a/pkg/apis/kops/zz_generated.deepcopy.go b/pkg/apis/kops/zz_generated.deepcopy.go index 1376854560..d7fc665efc 100644 --- a/pkg/apis/kops/zz_generated.deepcopy.go +++ b/pkg/apis/kops/zz_generated.deepcopy.go @@ -4891,6 +4891,11 @@ func (in *OpenstackBlockStorageConfig) DeepCopyInto(out *OpenstackBlockStorageCo *out = new(string) **out = **in } + if in.IgnoreVolumeMicroVersion != nil { + in, out := &in.IgnoreVolumeMicroVersion, &out.IgnoreVolumeMicroVersion + *out = new(bool) + **out = **in + } if in.CreateStorageClass != nil { in, out := &in.CreateStorageClass, &out.CreateStorageClass *out = new(bool) diff --git a/upup/pkg/fi/cloudup/openstack/cloud.go b/upup/pkg/fi/cloudup/openstack/cloud.go index 719530367f..910c87b27b 100644 --- a/upup/pkg/fi/cloudup/openstack/cloud.go +++ b/upup/pkg/fi/cloudup/openstack/cloud.go @@ -888,6 +888,7 @@ func MakeCloudConfig(spec kops.ClusterSpec) []string { "[BlockStorage]", fmt.Sprintf("bs-version=%s", fi.ValueOf(bs.Version)), fmt.Sprintf("ignore-volume-az=%t", fi.ValueOf(bs.IgnoreAZ)), + fmt.Sprintf("ignore-volume-microversion=%t", fi.ValueOf(bs.IgnoreVolumeMicroVersion)), "") } diff --git a/upup/pkg/fi/cloudup/openstack/cloud_test.go b/upup/pkg/fi/cloudup/openstack/cloud_test.go index eafc470b8d..68c46d6676 100644 --- a/upup/pkg/fi/cloudup/openstack/cloud_test.go +++ b/upup/pkg/fi/cloudup/openstack/cloud_test.go @@ -35,6 +35,74 @@ import ( "k8s.io/kops/util/pkg/vfs" ) +func Test_OpenstackCloud_MakeCloud(t *testing.T) { + baseCloudConfigWithBlockStorage := []string{ + "auth-url=\"\"", + "username=\"\"", + "password=\"\"", + "region=\"\"", + "tenant-id=\"\"", + "tenant-name=\"\"", + "domain-name=\"\"", + "domain-id=\"\"", + "", + "[BlockStorage]", + "bs-version=", + "ignore-volume-az=false", + } + + tests := []struct { + desc string + cluster *kops.Cluster + expectedCloudConfig []string + }{ + { + desc: "Ignore volume microversion is set to false when not configured", + cluster: &kops.Cluster{ + Spec: kops.ClusterSpec{ + CloudProvider: kops.CloudProviderSpec{ + Openstack: &kops.OpenstackSpec{ + BlockStorage: &kops.OpenstackBlockStorageConfig{}, + }, + }, + }, + }, + expectedCloudConfig: append(baseCloudConfigWithBlockStorage, + "ignore-volume-microversion=false", + "", + ), + }, + { + desc: "Ignore volume microversion is set to configured value", + cluster: &kops.Cluster{ + Spec: kops.ClusterSpec{ + CloudProvider: kops.CloudProviderSpec{ + Openstack: &kops.OpenstackSpec{ + BlockStorage: &kops.OpenstackBlockStorageConfig{ + IgnoreVolumeMicroVersion: fi.PtrTo(true), + }, + }, + }, + }, + }, + expectedCloudConfig: append(baseCloudConfigWithBlockStorage, + "ignore-volume-microversion=true", + "", + ), + }, + } + + for _, testCase := range tests { + t.Run(testCase.desc, func(t *testing.T) { + actualCloudConfig := MakeCloudConfig(testCase.cluster.Spec) + + if !reflect.DeepEqual(actualCloudConfig, testCase.expectedCloudConfig) { + t.Errorf("Ingress status differ: expected\n%+#v\n\tgot:\n%+#v\n", testCase.expectedCloudConfig, actualCloudConfig) + } + }) + } +} + func Test_OpenstackCloud_GetApiIngressStatus(t *testing.T) { tests := []struct { desc string