diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/awsmachine_types.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/awsmachine_types.go index 64c06e23e..7031bdbaa 100644 --- a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/awsmachine_types.go +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/awsmachine_types.go @@ -116,6 +116,11 @@ type AWSMachineSpec struct { // +kubebuilder:validation:MinLength:=2 InstanceType string `json:"instanceType"` + // CPUOptions defines CPU-related settings for the instance, including the confidential computing policy. + // When omitted, this means no opinion and the AWS platform is left to choose a reasonable default. + // +optional + CPUOptions CPUOptions `json:"cpuOptions,omitempty,omitzero"` + // AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the // AWS provider. If both the AWSCluster and the AWSMachine specify the same tag name with different values, the // AWSMachine's value takes precedence. diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/types.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/types.go index 9fd22efc8..c268165c1 100644 --- a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/types.go +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/types.go @@ -293,6 +293,11 @@ type Instance struct { // +kubebuilder:validation:Enum="";None;CapacityReservationsOnly;Open // +optional CapacityReservationPreference CapacityReservationPreference `json:"capacityReservationPreference,omitempty"` + + // CPUOptions defines CPU-related settings for the instance, including the confidential computing policy. + // When omitted, this means no opinion and the AWS platform is left to choose a reasonable default. + // +optional + CPUOptions CPUOptions `json:"cpuOptions,omitempty,omitzero"` } // CapacityReservationPreference describes the preferred use of capacity reservations @@ -534,3 +539,33 @@ var ( // SubnetSchemaPreferPublic allocates more subnets in the VPC to public subnets. SubnetSchemaPreferPublic = SubnetSchemaType("PreferPublic") ) + +// AWSConfidentialComputePolicy represents the confidential compute configuration for the instance. +// +kubebuilder:validation:Enum=Disabled;AMDEncryptedVirtualizationNestedPaging +type AWSConfidentialComputePolicy string + +const ( + // AWSConfidentialComputePolicyDisabled disables confidential computing for the instance. + AWSConfidentialComputePolicyDisabled AWSConfidentialComputePolicy = "Disabled" + // AWSConfidentialComputePolicySEVSNP enables AMD SEV-SNP as the confidential computing technology for the instance. + AWSConfidentialComputePolicySEVSNP AWSConfidentialComputePolicy = "AMDEncryptedVirtualizationNestedPaging" +) + +// CPUOptions defines CPU-related settings for the instance, including the confidential computing policy. +// +kubebuilder:validation:MinProperties=1 +type CPUOptions struct { + // ConfidentialCompute specifies whether confidential computing should be enabled for the instance, + // and, if so, which confidential computing technology to use. + // Valid values are: Disabled, AMDEncryptedVirtualizationNestedPaging + // When set to Disabled, confidential computing will be disabled for the instance. + // When set to AMDEncryptedVirtualizationNestedPaging, AMD SEV-SNP will be used as the confidential computing technology for the instance. + // In this case, ensure the following conditions are met: + // 1) The selected instance type supports AMD SEV-SNP. + // 2) The selected AWS region supports AMD SEV-SNP. + // 3) The selected AMI supports AMD SEV-SNP. + // More details can be checked at https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html + // When omitted, this means no opinion and the AWS platform is left to choose a reasonable default, + // which is subject to change without notice. The current default is Disabled. + // +optional + ConfidentialCompute AWSConfidentialComputePolicy `json:"confidentialCompute,omitempty"` +} diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/zz_generated.deepcopy.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/zz_generated.deepcopy.go index 5c21fefeb..197cffba6 100644 --- a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/zz_generated.deepcopy.go +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2/zz_generated.deepcopy.go @@ -687,6 +687,7 @@ func (in *AWSMachineSpec) DeepCopyInto(out *AWSMachineSpec) { **out = **in } in.AMI.DeepCopyInto(&out.AMI) + out.CPUOptions = in.CPUOptions if in.AdditionalTags != nil { in, out := &in.AdditionalTags, &out.AdditionalTags *out = make(Tags, len(*in)) @@ -1337,6 +1338,21 @@ func (in *CNISpec) DeepCopy() *CNISpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CPUOptions) DeepCopyInto(out *CPUOptions) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CPUOptions. +func (in *CPUOptions) DeepCopy() *CPUOptions { + if in == nil { + return nil + } + out := new(CPUOptions) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ClassicELBAttributes) DeepCopyInto(out *ClassicELBAttributes) { *out = *in @@ -1720,6 +1736,7 @@ func (in *Instance) DeepCopyInto(out *Instance) { *out = new(string) **out = **in } + out.CPUOptions = in.CPUOptions } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Instance. diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/eksconfig_types.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/eksconfig_types.go index a2fce8e2c..6cb7b3114 100644 --- a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/eksconfig_types.go +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/eksconfig_types.go @@ -110,203 +110,6 @@ type EKSConfigStatus struct { Conditions clusterv1.Conditions `json:"conditions,omitempty"` } -// Encoding specifies the cloud-init file encoding. -// +kubebuilder:validation:Enum=base64;gzip;gzip+base64 -type Encoding string - -const ( - // Base64 implies the contents of the file are encoded as base64. - Base64 Encoding = "base64" - // Gzip implies the contents of the file are encoded with gzip. - Gzip Encoding = "gzip" - // GzipBase64 implies the contents of the file are first base64 encoded and then gzip encoded. - GzipBase64 Encoding = "gzip+base64" -) - -// File defines the input for generating write_files in cloud-init. -type File struct { - // Path specifies the full path on disk where to store the file. - Path string `json:"path"` - - // Owner specifies the ownership of the file, e.g. "root:root". - // +optional - Owner string `json:"owner,omitempty"` - - // Permissions specifies the permissions to assign to the file, e.g. "0640". - // +optional - Permissions string `json:"permissions,omitempty"` - - // Encoding specifies the encoding of the file contents. - // +optional - Encoding Encoding `json:"encoding,omitempty"` - - // Append specifies whether to append Content to existing file if Path exists. - // +optional - Append bool `json:"append,omitempty"` - - // Content is the actual content of the file. - // +optional - Content string `json:"content,omitempty"` - - // ContentFrom is a referenced source of content to populate the file. - // +optional - ContentFrom *FileSource `json:"contentFrom,omitempty"` -} - -// FileSource is a union of all possible external source types for file data. -// Only one field may be populated in any given instance. Developers adding new -// sources of data for target systems should add them here. -type FileSource struct { - // Secret represents a secret that should populate this file. - Secret SecretFileSource `json:"secret"` -} - -// SecretFileSource adapts a Secret into a FileSource. -// -// The contents of the target Secret's Data field will be presented -// as files using the keys in the Data field as the file names. -type SecretFileSource struct { - // Name of the secret in the KubeadmBootstrapConfig's namespace to use. - Name string `json:"name"` - - // Key is the key in the secret's data map for this value. - Key string `json:"key"` -} - -// PasswdSource is a union of all possible external source types for passwd data. -// Only one field may be populated in any given instance. Developers adding new -// sources of data for target systems should add them here. -type PasswdSource struct { - // Secret represents a secret that should populate this password. - Secret SecretPasswdSource `json:"secret"` -} - -// SecretPasswdSource adapts a Secret into a PasswdSource. -// -// The contents of the target Secret's Data field will be presented -// as passwd using the keys in the Data field as the file names. -type SecretPasswdSource struct { - // Name of the secret in the KubeadmBootstrapConfig's namespace to use. - Name string `json:"name"` - - // Key is the key in the secret's data map for this value. - Key string `json:"key"` -} - -// User defines the input for a generated user in cloud-init. -type User struct { - // Name specifies the username - Name string `json:"name"` - - // Gecos specifies the gecos to use for the user - // +optional - Gecos *string `json:"gecos,omitempty"` - - // Groups specifies the additional groups for the user - // +optional - Groups *string `json:"groups,omitempty"` - - // HomeDir specifies the home directory to use for the user - // +optional - HomeDir *string `json:"homeDir,omitempty"` - - // Inactive specifies whether to mark the user as inactive - // +optional - Inactive *bool `json:"inactive,omitempty"` - - // Shell specifies the user's shell - // +optional - Shell *string `json:"shell,omitempty"` - - // Passwd specifies a hashed password for the user - // +optional - Passwd *string `json:"passwd,omitempty"` - - // PasswdFrom is a referenced source of passwd to populate the passwd. - // +optional - PasswdFrom *PasswdSource `json:"passwdFrom,omitempty"` - - // PrimaryGroup specifies the primary group for the user - // +optional - PrimaryGroup *string `json:"primaryGroup,omitempty"` - - // LockPassword specifies if password login should be disabled - // +optional - LockPassword *bool `json:"lockPassword,omitempty"` - - // Sudo specifies a sudo role for the user - // +optional - Sudo *string `json:"sudo,omitempty"` - - // SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - // +optional - SSHAuthorizedKeys []string `json:"sshAuthorizedKeys,omitempty"` -} - -// NTP defines input for generated ntp in cloud-init. -type NTP struct { - // Servers specifies which NTP servers to use - // +optional - Servers []string `json:"servers,omitempty"` - - // Enabled specifies whether NTP should be enabled - // +optional - Enabled *bool `json:"enabled,omitempty"` -} - -// DiskSetup defines input for generated disk_setup and fs_setup in cloud-init. -type DiskSetup struct { - // Partitions specifies the list of the partitions to setup. - // +optional - Partitions []Partition `json:"partitions,omitempty"` - - // Filesystems specifies the list of file systems to setup. - // +optional - Filesystems []Filesystem `json:"filesystems,omitempty"` -} - -// Partition defines how to create and layout a partition. -type Partition struct { - // Device is the name of the device. - Device string `json:"device"` - // Layout specifies the device layout. - // If it is true, a single partition will be created for the entire device. - // When layout is false, it means don't partition or ignore existing partitioning. - Layout bool `json:"layout"` - // Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. - // Use with caution. Default is 'false'. - // +optional - Overwrite *bool `json:"overwrite,omitempty"` - // TableType specifies the tupe of partition table. The following are supported: - // 'mbr': default and setups a MS-DOS partition table - // 'gpt': setups a GPT partition table - // +optional - TableType *string `json:"tableType,omitempty"` -} - -// Filesystem defines the file systems to be created. -type Filesystem struct { - // Device specifies the device name - Device string `json:"device"` - // Filesystem specifies the file system type. - Filesystem string `json:"filesystem"` - // Label specifies the file system label to be used. If set to None, no label is used. - Label string `json:"label"` - // Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number. - // +optional - Partition *string `json:"partition,omitempty"` - // Overwrite defines whether or not to overwrite any existing filesystem. - // If true, any pre-existing file system will be destroyed. Use with Caution. - // +optional - Overwrite *bool `json:"overwrite,omitempty"` - // ExtraOpts defined extra options to add to the command for creating the file system. - // +optional - ExtraOpts []string `json:"extraOpts,omitempty"` -} - -// MountPoints defines input for generated mounts in cloud-init. -type MountPoints []string - // +kubebuilder:object:root=true // +kubebuilder:resource:path=eksconfigs,scope=Namespaced,categories=cluster-api,shortName=eksc // +kubebuilder:storageversion diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/nodeadmconfig_types.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/nodeadmconfig_types.go new file mode 100644 index 000000000..52786dc28 --- /dev/null +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/nodeadmconfig_types.go @@ -0,0 +1,144 @@ +package v1beta2 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + + clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" +) + +// NodeadmConfigSpec defines the desired state of NodeadmConfig. +type NodeadmConfigSpec struct { + // Kubelet contains options for kubelet. + // +optional + Kubelet *KubeletOptions `json:"kubelet,omitempty"` + + // Containerd contains options for containerd. + // +optional + Containerd *ContainerdOptions `json:"containerd,omitempty"` + + // FeatureGates holds key-value pairs to enable or disable application features. + // +optional + FeatureGates map[Feature]bool `json:"featureGates,omitempty"` + + // PreNodeadmCommands specifies extra commands to run before bootstrapping nodes. + // +optional + PreNodeadmCommands []string `json:"PreNodeadmCommands,omitempty"` + + // Files specifies extra files to be passed to user_data upon creation. + // +optional + Files []File `json:"files,omitempty"` + + // Users specifies extra users to add. + // +optional + Users []User `json:"users,omitempty"` + + // NTP specifies NTP configuration. + // +optional + NTP *NTP `json:"ntp,omitempty"` + + // DiskSetup specifies options for the creation of partition tables and file systems on devices. + // +optional + DiskSetup *DiskSetup `json:"diskSetup,omitempty"` + + // Mounts specifies a list of mount points to be setup. + // +optional + Mounts []MountPoints `json:"mounts,omitempty"` +} + +// KubeletOptions are additional parameters passed to kubelet. +type KubeletOptions struct { + // Config is a KubeletConfiguration that will be merged with the defaults. + // +optional + // +kubebuilder:pruning:PreserveUnknownFields + Config *runtime.RawExtension `json:"config,omitempty"` + + // Flags are command-line kubelet arguments that will be appended to the defaults. + // +optional + Flags []string `json:"flags,omitempty"` +} + +// ContainerdOptions are additional parameters passed to containerd. +type ContainerdOptions struct { + // Config is an inline containerd configuration TOML that will be merged with the defaults. + // +optional + Config string `json:"config,omitempty"` + + // BaseRuntimeSpec is the OCI runtime specification upon which all containers will be based. + // +optional + // +kubebuilder:pruning:PreserveUnknownFields + BaseRuntimeSpec *runtime.RawExtension `json:"baseRuntimeSpec,omitempty"` +} + +// Feature specifies which feature gate should be toggled. +// +kubebuilder:validation:Enum=InstanceIdNodeName;FastImagePull +type Feature string + +const ( + // FeatureInstanceIDNodeName will use EC2 instance ID as node name. + FeatureInstanceIDNodeName Feature = "InstanceIdNodeName" + // FeatureFastImagePull enables a parallel image pull for container images. + FeatureFastImagePull Feature = "FastImagePull" +) + +// GetConditions returns the observations of the operational state of the NodeadmConfig resource. +func (r *NodeadmConfig) GetConditions() clusterv1.Conditions { + return r.Status.Conditions +} + +// SetConditions sets the underlying service state of the NodeadmConfig to the predescribed clusterv1.Conditions. +func (r *NodeadmConfig) SetConditions(conditions clusterv1.Conditions) { + r.Status.Conditions = conditions +} + +// NodeadmConfigStatus defines the observed state of NodeadmConfig. +type NodeadmConfigStatus struct { + // Ready indicates the BootstrapData secret is ready to be consumed. + // +optional + Ready bool `json:"ready,omitempty"` + + // DataSecretName is the name of the secret that stores the bootstrap data script. + // +optional + DataSecretName *string `json:"dataSecretName,omitempty"` + + // FailureReason will be set on non-retryable errors. + // +optional + FailureReason string `json:"failureReason,omitempty"` + + // FailureMessage will be set on non-retryable errors. + // +optional + FailureMessage string `json:"failureMessage,omitempty"` + + // ObservedGeneration is the latest generation observed by the controller. + // +optional + ObservedGeneration int64 `json:"observedGeneration,omitempty"` + + // Conditions defines current service state of the NodeadmConfig. + // +optional + Conditions clusterv1.Conditions `json:"conditions,omitempty"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status + +// NodeadmConfig is the Schema for the nodeadmconfigs API. +type NodeadmConfig struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec NodeadmConfigSpec `json:"spec,omitempty"` + Status NodeadmConfigStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// NodeadmConfigList contains a list of NodeadmConfig. +type NodeadmConfigList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []NodeadmConfig `json:"items"` +} + +func init() { + SchemeBuilder.Register(&NodeadmConfig{}, &NodeadmConfigList{}) +} diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/nodeadmconfigtemplate_type.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/nodeadmconfigtemplate_type.go new file mode 100644 index 000000000..732bd43ea --- /dev/null +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/nodeadmconfigtemplate_type.go @@ -0,0 +1,56 @@ +/* +Copyright 2022 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta2 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// NodeadmConfigTemplateSpec defines the desired state of templated NodeadmConfig Amazon EKS Configuration resources. +type NodeadmConfigTemplateSpec struct { + Template NodeadmConfigTemplateResource `json:"template"` +} + +// NodeadmConfigTemplateResource defines the Template structure. +type NodeadmConfigTemplateResource struct { + Spec NodeadmConfigSpec `json:"spec,omitempty"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=nodeadmconfigtemplates,scope=Namespaced,categories=cluster-api,shortName=nodeadmct +// +kubebuilder:storageversion + +// NodeadmConfigTemplate is the Amazon EKS Bootstrap Configuration Template API. +type NodeadmConfigTemplate struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec NodeadmConfigTemplateSpec `json:"spec,omitempty"` +} + +// +kubebuilder:object:root=true + +// NodeadmConfigTemplateList contains a list of Amazon EKS Bootstrap Configuration Templates. +type NodeadmConfigTemplateList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []NodeadmConfigTemplate `json:"items"` +} + +func init() { + SchemeBuilder.Register(&NodeadmConfigTemplate{}, &NodeadmConfigTemplateList{}) +} diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/types.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/types.go new file mode 100644 index 000000000..5f8589c0e --- /dev/null +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/types.go @@ -0,0 +1,198 @@ +package v1beta2 + +// Encoding specifies the cloud-init file encoding. +// +kubebuilder:validation:Enum=base64;gzip;gzip+base64 +type Encoding string + +const ( + // Base64 implies the contents of the file are encoded as base64. + Base64 Encoding = "base64" + // Gzip implies the contents of the file are encoded with gzip. + Gzip Encoding = "gzip" + // GzipBase64 implies the contents of the file are first base64 encoded and then gzip encoded. + GzipBase64 Encoding = "gzip+base64" +) + +// File defines the input for generating write_files in cloud-init. +type File struct { + // Path specifies the full path on disk where to store the file. + Path string `json:"path"` + + // Owner specifies the ownership of the file, e.g. "root:root". + // +optional + Owner string `json:"owner,omitempty"` + + // Permissions specifies the permissions to assign to the file, e.g. "0640". + // +optional + Permissions string `json:"permissions,omitempty"` + + // Encoding specifies the encoding of the file contents. + // +optional + Encoding Encoding `json:"encoding,omitempty"` + + // Append specifies whether to append Content to existing file if Path exists. + // +optional + Append bool `json:"append,omitempty"` + + // Content is the actual content of the file. + // +optional + Content string `json:"content,omitempty"` + + // ContentFrom is a referenced source of content to populate the file. + // +optional + ContentFrom *FileSource `json:"contentFrom,omitempty"` +} + +// FileSource is a union of all possible external source types for file data. +// Only one field may be populated in any given instance. Developers adding new +// sources of data for target systems should add them here. +type FileSource struct { + // Secret represents a secret that should populate this file. + Secret SecretFileSource `json:"secret"` +} + +// SecretFileSource adapts a Secret into a FileSource. +// +// The contents of the target Secret's Data field will be presented +// as files using the keys in the Data field as the file names. +type SecretFileSource struct { + // Name of the secret in the KubeadmBootstrapConfig's namespace to use. + Name string `json:"name"` + + // Key is the key in the secret's data map for this value. + Key string `json:"key"` +} + +// PasswdSource is a union of all possible external source types for passwd data. +// Only one field may be populated in any given instance. Developers adding new +// sources of data for target systems should add them here. +type PasswdSource struct { + // Secret represents a secret that should populate this password. + Secret SecretPasswdSource `json:"secret"` +} + +// SecretPasswdSource adapts a Secret into a PasswdSource. +// +// The contents of the target Secret's Data field will be presented +// as passwd using the keys in the Data field as the file names. +type SecretPasswdSource struct { + // Name of the secret in the KubeadmBootstrapConfig's namespace to use. + Name string `json:"name"` + + // Key is the key in the secret's data map for this value. + Key string `json:"key"` +} + +// User defines the input for a generated user in cloud-init. +type User struct { + // Name specifies the username + Name string `json:"name"` + + // Gecos specifies the gecos to use for the user + // +optional + Gecos *string `json:"gecos,omitempty"` + + // Groups specifies the additional groups for the user + // +optional + Groups *string `json:"groups,omitempty"` + + // HomeDir specifies the home directory to use for the user + // +optional + HomeDir *string `json:"homeDir,omitempty"` + + // Inactive specifies whether to mark the user as inactive + // +optional + Inactive *bool `json:"inactive,omitempty"` + + // Shell specifies the user's shell + // +optional + Shell *string `json:"shell,omitempty"` + + // Passwd specifies a hashed password for the user + // +optional + Passwd *string `json:"passwd,omitempty"` + + // PasswdFrom is a referenced source of passwd to populate the passwd. + // +optional + PasswdFrom *PasswdSource `json:"passwdFrom,omitempty"` + + // PrimaryGroup specifies the primary group for the user + // +optional + PrimaryGroup *string `json:"primaryGroup,omitempty"` + + // LockPassword specifies if password login should be disabled + // +optional + LockPassword *bool `json:"lockPassword,omitempty"` + + // Sudo specifies a sudo role for the user + // +optional + Sudo *string `json:"sudo,omitempty"` + + // SSHAuthorizedKeys specifies a list of ssh authorized keys for the user + // +optional + SSHAuthorizedKeys []string `json:"sshAuthorizedKeys,omitempty"` +} + +// NTP defines input for generated ntp in cloud-init. +type NTP struct { + // Servers specifies which NTP servers to use + // +optional + Servers []string `json:"servers,omitempty"` + + // Enabled specifies whether NTP should be enabled + // +optional + Enabled *bool `json:"enabled,omitempty"` +} + +// DiskSetup defines input for generated disk_setup and fs_setup in cloud-init. +type DiskSetup struct { + // Partitions specifies the list of the partitions to setup. + // +optional + Partitions []Partition `json:"partitions,omitempty"` + + // Filesystems specifies the list of file systems to setup. + // +optional + Filesystems []Filesystem `json:"filesystems,omitempty"` +} + +// Partition defines how to create and layout a partition. +type Partition struct { + // Device is the name of the device. + Device string `json:"device"` + // Layout specifies the device layout. + // If it is true, a single partition will be created for the entire device. + // When layout is false, it means don't partition or ignore existing partitioning. + Layout bool `json:"layout"` + // Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. + // Use with caution. Default is 'false'. + // +optional + Overwrite *bool `json:"overwrite,omitempty"` + // TableType specifies the tupe of partition table. The following are supported: + // 'mbr': default and setups a MS-DOS partition table + // 'gpt': setups a GPT partition table + // +optional + TableType *string `json:"tableType,omitempty"` +} + +// Filesystem defines the file systems to be created. +type Filesystem struct { + // Device specifies the device name + Device string `json:"device"` + // Filesystem specifies the file system type. + Filesystem string `json:"filesystem"` + // Label specifies the file system label to be used. If set to None, no label is used. + Label string `json:"label"` + // Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number. + // +optional + Partition *string `json:"partition,omitempty"` + // Overwrite defines whether or not to overwrite any existing filesystem. + // If true, any pre-existing file system will be destroyed. Use with Caution. + // +optional + Overwrite *bool `json:"overwrite,omitempty"` + // ExtraOpts defined extra options to add to the command for creating the file system. + // +optional + ExtraOpts []string `json:"extraOpts,omitempty"` +} + +// MountPoints defines input for generated mounts in cloud-init. +type MountPoints []string diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/zz_generated.deepcopy.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/zz_generated.deepcopy.go index 7b059799a..a60d60699 100644 --- a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/zz_generated.deepcopy.go +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/api/v1beta2/zz_generated.deepcopy.go @@ -25,6 +25,26 @@ import ( "sigs.k8s.io/cluster-api/api/v1beta1" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerdOptions) DeepCopyInto(out *ContainerdOptions) { + *out = *in + if in.BaseRuntimeSpec != nil { + in, out := &in.BaseRuntimeSpec, &out.BaseRuntimeSpec + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerdOptions. +func (in *ContainerdOptions) DeepCopy() *ContainerdOptions { + if in == nil { + return nil + } + out := new(ContainerdOptions) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DiskSetup) DeepCopyInto(out *DiskSetup) { *out = *in @@ -403,6 +423,31 @@ func (in *Filesystem) DeepCopy() *Filesystem { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubeletOptions) DeepCopyInto(out *KubeletOptions) { + *out = *in + if in.Config != nil { + in, out := &in.Config, &out.Config + *out = new(runtime.RawExtension) + (*in).DeepCopyInto(*out) + } + if in.Flags != nil { + in, out := &in.Flags, &out.Flags + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeletOptions. +func (in *KubeletOptions) DeepCopy() *KubeletOptions { + if in == nil { + return nil + } + out := new(KubeletOptions) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in MountPoints) DeepCopyInto(out *MountPoints) { { @@ -447,6 +492,254 @@ func (in *NTP) DeepCopy() *NTP { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfig) DeepCopyInto(out *NodeadmConfig) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfig. +func (in *NodeadmConfig) DeepCopy() *NodeadmConfig { + if in == nil { + return nil + } + out := new(NodeadmConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeadmConfig) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfigList) DeepCopyInto(out *NodeadmConfigList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]NodeadmConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfigList. +func (in *NodeadmConfigList) DeepCopy() *NodeadmConfigList { + if in == nil { + return nil + } + out := new(NodeadmConfigList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeadmConfigList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfigSpec) DeepCopyInto(out *NodeadmConfigSpec) { + *out = *in + if in.Kubelet != nil { + in, out := &in.Kubelet, &out.Kubelet + *out = new(KubeletOptions) + (*in).DeepCopyInto(*out) + } + if in.Containerd != nil { + in, out := &in.Containerd, &out.Containerd + *out = new(ContainerdOptions) + (*in).DeepCopyInto(*out) + } + if in.FeatureGates != nil { + in, out := &in.FeatureGates, &out.FeatureGates + *out = make(map[Feature]bool, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.PreNodeadmCommands != nil { + in, out := &in.PreNodeadmCommands, &out.PreNodeadmCommands + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Files != nil { + in, out := &in.Files, &out.Files + *out = make([]File, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Users != nil { + in, out := &in.Users, &out.Users + *out = make([]User, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.NTP != nil { + in, out := &in.NTP, &out.NTP + *out = new(NTP) + (*in).DeepCopyInto(*out) + } + if in.DiskSetup != nil { + in, out := &in.DiskSetup, &out.DiskSetup + *out = new(DiskSetup) + (*in).DeepCopyInto(*out) + } + if in.Mounts != nil { + in, out := &in.Mounts, &out.Mounts + *out = make([]MountPoints, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = make(MountPoints, len(*in)) + copy(*out, *in) + } + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfigSpec. +func (in *NodeadmConfigSpec) DeepCopy() *NodeadmConfigSpec { + if in == nil { + return nil + } + out := new(NodeadmConfigSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfigStatus) DeepCopyInto(out *NodeadmConfigStatus) { + *out = *in + if in.DataSecretName != nil { + in, out := &in.DataSecretName, &out.DataSecretName + *out = new(string) + **out = **in + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make(v1beta1.Conditions, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfigStatus. +func (in *NodeadmConfigStatus) DeepCopy() *NodeadmConfigStatus { + if in == nil { + return nil + } + out := new(NodeadmConfigStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfigTemplate) DeepCopyInto(out *NodeadmConfigTemplate) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfigTemplate. +func (in *NodeadmConfigTemplate) DeepCopy() *NodeadmConfigTemplate { + if in == nil { + return nil + } + out := new(NodeadmConfigTemplate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeadmConfigTemplate) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfigTemplateList) DeepCopyInto(out *NodeadmConfigTemplateList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]NodeadmConfigTemplate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfigTemplateList. +func (in *NodeadmConfigTemplateList) DeepCopy() *NodeadmConfigTemplateList { + if in == nil { + return nil + } + out := new(NodeadmConfigTemplateList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeadmConfigTemplateList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfigTemplateResource) DeepCopyInto(out *NodeadmConfigTemplateResource) { + *out = *in + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfigTemplateResource. +func (in *NodeadmConfigTemplateResource) DeepCopy() *NodeadmConfigTemplateResource { + if in == nil { + return nil + } + out := new(NodeadmConfigTemplateResource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeadmConfigTemplateSpec) DeepCopyInto(out *NodeadmConfigTemplateSpec) { + *out = *in + in.Template.DeepCopyInto(&out.Template) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeadmConfigTemplateSpec. +func (in *NodeadmConfigTemplateSpec) DeepCopy() *NodeadmConfigTemplateSpec { + if in == nil { + return nil + } + out := new(NodeadmConfigTemplateSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Partition) DeepCopyInto(out *Partition) { *out = *in diff --git a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2/types.go b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2/types.go index 7dde8b2f3..c07e2306e 100644 --- a/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2/types.go +++ b/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2/types.go @@ -141,6 +141,10 @@ type Addon struct { // ServiceAccountRoleArn is the ARN of an IAM role to bind to the addons service account // +optional ServiceAccountRoleArn *string `json:"serviceAccountRoleARN,omitempty"` + // PreserveOnDelete indicates that the addon resources should be + // preserved in the cluster on delete. + // +optional + PreserveOnDelete bool `json:"preserveOnDelete,omitempty"` } // AddonResolution defines the method for resolving parameter conflicts. diff --git a/clusterctl.yaml b/clusterctl.yaml new file mode 100644 index 000000000..2fe3ccde0 --- /dev/null +++ b/clusterctl.yaml @@ -0,0 +1,6 @@ +CLUSTERCTL_DISABLE_VERSIONCHECK: "true" + +providers: + - name: "aws" + url: "https://github.com/nutanix-cloud-native/cluster-api-provider-aws/releases/${CAPA_VERSION}/infrastructure-components.yaml" + type: "InfrastructureProvider" diff --git a/hack/examples/bases/aws/cluster/kustomization.yaml.tmpl b/hack/examples/bases/aws/cluster/kustomization.yaml.tmpl index f5ca44b92..5eeb9d461 100644 --- a/hack/examples/bases/aws/cluster/kustomization.yaml.tmpl +++ b/hack/examples/bases/aws/cluster/kustomization.yaml.tmpl @@ -5,7 +5,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: -- https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/download/${CAPA_VERSION}/cluster-template-simple-clusterclass.yaml +- https://github.com/nutanix-cloud-native/cluster-api-provider-aws/releases/download/${CAPA_VERSION}/cluster-template-simple-clusterclass.yaml sortOptions: order: fifo diff --git a/hack/examples/bases/aws/clusterclass/kustomization.yaml.tmpl b/hack/examples/bases/aws/clusterclass/kustomization.yaml.tmpl index d26955365..b561f204b 100644 --- a/hack/examples/bases/aws/clusterclass/kustomization.yaml.tmpl +++ b/hack/examples/bases/aws/clusterclass/kustomization.yaml.tmpl @@ -5,7 +5,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: -- https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/download/${CAPA_VERSION}/cluster-template-simple-clusterclass.yaml +- https://github.com/nutanix-cloud-native/cluster-api-provider-aws/releases/download/${CAPA_VERSION}/cluster-template-simple-clusterclass.yaml configurations: - kustomizeconfig.yaml diff --git a/hack/third-party/capa/go.mod b/hack/third-party/capa/go.mod index 47a9be42f..ee7145966 100644 --- a/hack/third-party/capa/go.mod +++ b/hack/third-party/capa/go.mod @@ -3,11 +3,11 @@ module github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/external/capa -go 1.23.1 +go 1.24.0 -toolchain go1.24.4 +toolchain go1.24.3 -require sigs.k8s.io/cluster-api-provider-aws/v2 v2.9.1 +require sigs.k8s.io/cluster-api-provider-aws/v2 v2.10.0 require ( github.com/aws/aws-sdk-go-v2 v1.38.0 // indirect @@ -76,3 +76,5 @@ require ( sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) + +replace sigs.k8s.io/cluster-api-provider-aws/v2 => github.com/nutanix-cloud-native/cluster-api-provider-aws/v2 v2.10.0-ncn.0 diff --git a/hack/third-party/capa/go.sum b/hack/third-party/capa/go.sum index 38fa3ea6f..4a91698d9 100644 --- a/hack/third-party/capa/go.sum +++ b/hack/third-party/capa/go.sum @@ -88,6 +88,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nutanix-cloud-native/cluster-api-provider-aws/v2 v2.10.0-ncn.0 h1:vD7oex8Dy4AiY/8i0UcP1VSQUwcAAdGf/ErAbezhYnw= +github.com/nutanix-cloud-native/cluster-api-provider-aws/v2 v2.10.0-ncn.0/go.mod h1:WY3AVEBesaq6mSdQDfnI42nHQCjDtGh7lWxFk/rcBcY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= @@ -203,8 +205,6 @@ k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6J k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/cluster-api v1.10.2 h1:xfvtNu4Fy/41grL0ryH5xSKQjpJEWdO8HiV2lPCCozQ= sigs.k8s.io/cluster-api v1.10.2/go.mod h1:/b9Un5Imprib6S7ZOcJitC2ep/5wN72b0pXpMQFfbTw= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.9.1 h1:VQT0hJ5wbD3qS3icucjMfpBWkc1gpIuXYsOAG6Kw25A= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.9.1/go.mod h1:wdqD8SRkgbIAoj0L2geEItos4X4xmCr8yQpEOqIwLp4= sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= diff --git a/make/clusterctl.mk b/make/clusterctl.mk index 892f9d5f6..af6402a31 100644 --- a/make/clusterctl.mk +++ b/make/clusterctl.mk @@ -3,7 +3,7 @@ export CAPI_VERSION := $(shell GOWORK=off go list -m -f '{{ .Version }}' sigs.k8s.io/cluster-api) export CAPD_VERSION := $(shell GOWORK=off go list -m -f '{{ .Version }}' sigs.k8s.io/cluster-api/test) -export CAPA_VERSION := $(shell cd hack/third-party/capa && GOWORK=off go list -m -f '{{ .Version }}' sigs.k8s.io/cluster-api-provider-aws/v2) +export CAPA_VERSION := $(shell cd hack/third-party/capa && GOWORK=off go list -m -f '{{ .Version }}' sigs.k8s.io/cluster-api-provider-aws/v2)-ncn.0 export CAPX_VERSION := $(shell cd hack/third-party/capx && GOWORK=off go list -m -f '{{ .Version }}' github.com/nutanix-cloud-native/cluster-api-provider-nutanix) export CAAPH_VERSION := $(shell cd hack/third-party/caaph && GOWORK=off go list -m -f '{{ .Version }}' sigs.k8s.io/cluster-api-addon-provider-helm) @@ -23,6 +23,7 @@ clusterctl.init: --control-plane kubeadm:$(CAPI_VERSION) \ --infrastructure docker:$(CAPD_VERSION),aws:$(CAPA_VERSION),nutanix:$(CAPX_VERSION) \ --addon helm:$(CAAPH_VERSION) \ + --config clusterctl.yaml \ --wait-providers .PHONY: clusterctl.delete diff --git a/test/e2e/config/caren.yaml b/test/e2e/config/caren.yaml index 74a1a18bb..6b6c9f5cf 100644 --- a/test/e2e/config/caren.yaml +++ b/test/e2e/config/caren.yaml @@ -53,7 +53,7 @@ providers: type: InfrastructureProvider versions: - name: "${CAPA_VERSION}" - value: "https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/download/${CAPA_VERSION}/infrastructure-components.yaml" + value: "https://github.com/nutanix-cloud-native/cluster-api-provider-aws/releases/download/${CAPA_VERSION}/infrastructure-components.yaml" type: "url" contract: v1beta1 files: diff --git a/test/e2e/data/shared/v1beta1-capa/metadata.yaml b/test/e2e/data/shared/v1beta1-capa/metadata.yaml index 2b636c965..e9fe7afe9 100644 --- a/test/e2e/data/shared/v1beta1-capa/metadata.yaml +++ b/test/e2e/data/shared/v1beta1-capa/metadata.yaml @@ -11,3 +11,6 @@ releaseSeries: - major: 2 minor: 9 contract: v1beta1 + - major: 2 + minor: 10 + contract: v1beta1