diff --git a/pkg/apis/kops/componentconfig.go b/pkg/apis/kops/componentconfig.go index fe1cf3f78d6c2..bcfeb024ab742 100644 --- a/pkg/apis/kops/componentconfig.go +++ b/pkg/apis/kops/componentconfig.go @@ -762,6 +762,12 @@ type OpenstackNetwork struct { AvailabilityZoneHints []*string `json:"availabilityZoneHints,omitempty"` } +// OpenstackMetadata defines config for metadata service related settings +type OpenstackMetadata struct { + // ConfigDrive specifies to use config drive for retrieving user data instead of the metadata service when launching instances + ConfigDrive *bool `json:"configDrive,omitempty"` +} + // OpenstackConfiguration defines cloud config elements for the openstack cloud provider type OpenstackConfiguration struct { Loadbalancer *OpenstackLoadbalancerConfig `json:"loadbalancer,omitempty"` @@ -770,6 +776,7 @@ type OpenstackConfiguration struct { BlockStorage *OpenstackBlockStorageConfig `json:"blockStorage,omitempty"` InsecureSkipVerify *bool `json:"insecureSkipVerify,omitempty"` Network *OpenstackNetwork `json:"network,omitempty"` + Metadata *OpenstackMetadata `json:"metadata,omitempty"` } // AzureConfiguration defines Azure specific cluster configuration. diff --git a/pkg/apis/kops/v1alpha2/componentconfig.go b/pkg/apis/kops/v1alpha2/componentconfig.go index 9b9e641b5c168..c17131b09f96a 100644 --- a/pkg/apis/kops/v1alpha2/componentconfig.go +++ b/pkg/apis/kops/v1alpha2/componentconfig.go @@ -761,6 +761,12 @@ type OpenstackNetwork struct { AvailabilityZoneHints []*string `json:"availabilityZoneHints,omitempty"` } +// OpenstackMetadata defines config for metadata service related settings +type OpenstackMetadata struct { + // ConfigDrive specifies to use config drive for retrieving user data instead of the metadata service when launching instances + ConfigDrive *bool `json:"configDrive,omitempty"` +} + // OpenstackConfiguration defines cloud config elements for the openstack cloud provider type OpenstackConfiguration struct { Loadbalancer *OpenstackLoadbalancerConfig `json:"loadbalancer,omitempty"` @@ -769,6 +775,7 @@ type OpenstackConfiguration struct { BlockStorage *OpenstackBlockStorageConfig `json:"blockStorage,omitempty"` InsecureSkipVerify *bool `json:"insecureSkipVerify,omitempty"` Network *OpenstackNetwork `json:"network,omitempty"` + Metadata *OpenstackMetadata `json:"metadata,omitempty"` } // AzureConfiguration defines Azure specific cluster configuration. diff --git a/pkg/model/components/openstack.go b/pkg/model/components/openstack.go index 6583cef656a6a..0699d30379e34 100644 --- a/pkg/model/components/openstack.go +++ b/pkg/model/components/openstack.go @@ -52,6 +52,13 @@ func (b *OpenStackOptionsBulder) BuildOptions(o interface{}) error { clusterSpec.CloudConfig.Openstack.BlockStorage.CreateStorageClass = fi.Bool(true) } + if clusterSpec.CloudConfig.Openstack.Metadata == nil { + clusterSpec.CloudConfig.Openstack.Metadata = &kops.OpenstackMetadata{} + } + if clusterSpec.CloudConfig.Openstack.Metadata.ConfigDrive == nil { + clusterSpec.CloudConfig.Openstack.Metadata.ConfigDrive = fi.Bool(false) + } + if clusterSpec.ExternalCloudControllerManager == nil { clusterSpec.ExternalCloudControllerManager = &kops.CloudControllerManagerConfig{} } diff --git a/pkg/model/openstackmodel/servergroup.go b/pkg/model/openstackmodel/servergroup.go index 849c3b1653685..e8a0a6dd7d560 100644 --- a/pkg/model/openstackmodel/servergroup.go +++ b/pkg/model/openstackmodel/servergroup.go @@ -162,6 +162,7 @@ func (b *ServerGroupModelBuilder) buildInstances(c *fi.ModelBuilderContext, sg * Metadata: metaWithName, SecurityGroups: ig.Spec.AdditionalSecurityGroups, AvailabilityZone: az, + ConfigDrive: b.Cluster.Spec.CloudConfig.Openstack.Metadata.ConfigDrive, } c.AddTask(instanceTask) diff --git a/upup/pkg/fi/cloudup/openstacktasks/instance.go b/upup/pkg/fi/cloudup/openstacktasks/instance.go index 1ffc297610e06..4a588b308c494 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/instance.go +++ b/upup/pkg/fi/cloudup/openstacktasks/instance.go @@ -50,6 +50,7 @@ type Instance struct { AvailabilityZone *string SecurityGroups []string FloatingIP *FloatingIP + ConfigDrive *bool Lifecycle *fi.Lifecycle ForAPIServer bool @@ -165,6 +166,7 @@ func (e *Instance) Find(c *fi.Context) (*Instance, error) { Role: fi.String(server.Metadata["KopsRole"]), AvailabilityZone: e.AvailabilityZone, GroupName: e.GroupName, + ConfigDrive: e.ConfigDrive, } ports, err := cloud.ListPorts(ports.ListOpts{ @@ -305,6 +307,7 @@ func (_ *Instance) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, change }, Metadata: e.Metadata, SecurityGroups: e.SecurityGroups, + ConfigDrive: e.ConfigDrive, } if e.UserData != nil { bytes, err := fi.ResourceAsBytes(e.UserData)