Skip to content

Commit ed41da7

Browse files
committed
Added dedicated host support for AWS
1 parent 34a5167 commit ed41da7

File tree

3 files changed

+60
-5
lines changed

3 files changed

+60
-5
lines changed

manifests/0000_30_cluster-api_01_credentials-request.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ spec:
2525
- ec2:DescribeDhcpOptions
2626
- ec2:DescribeImages
2727
- ec2:DescribeInstances
28+
- ec2:DescribeInstanceTypes
2829
- ec2:DescribeInternetGateways
2930
- ec2:DescribeSecurityGroups
3031
- ec2:DescribeSubnets

pkg/conversion/capi2mapi/aws.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,12 @@ var (
4141
)
4242

4343
const (
44-
errUnsupportedCAPATenancy = "unable to convert tenancy, unknown value"
45-
errUnsupportedCAPAMarketType = "unable to convert market type, unknown value"
46-
errUnsupportedHTTPTokensState = "unable to convert httpTokens state, unknown value" //nolint:gosec // This is an error message, not a credential
47-
defaultIdentityName = "default"
48-
defaultCredentialsSecretName = "aws-cloud-credentials" //#nosec G101 -- False positive, not actually a credential.
44+
errUnsupportedCAPATenancy = "unable to convert tenancy, unknown value"
45+
errUnsupportedCAPAMarketType = "unable to convert market type, unknown value"
46+
errUnsupportedHTTPTokensState = "unable to convert httpTokens state, unknown value" //nolint:gosec // This is an error message, not a credential
47+
defaultIdentityName = "default"
48+
defaultCredentialsSecretName = "aws-cloud-credentials" //#nosec G101 -- False positive, not actually a credential.
49+
errUnsupportedHostAffinityType = "unable to convert hostAffinity, unknown value"
4950
)
5051

5152
// machineAndAWSMachineAndAWSCluster stores the details of a Cluster API Machine and AWSMachine and AWSCluster.
@@ -167,6 +168,25 @@ func (m machineAndAWSMachineAndAWSCluster) toProviderSpec() (*mapiv1beta1.AWSMac
167168
MarketType: mapiAWSMarketType,
168169
}
169170

171+
// Dedicated host support
172+
if m.awsMachine.Spec.HostAffinity != nil {
173+
switch *m.awsMachine.Spec.HostAffinity {
174+
case "host":
175+
mapaProviderConfig.HostPlacement = &mapiv1beta1.HostPlacement{
176+
Affinity: ptr.To(mapiv1beta1.HostAffinityDedicatedHost),
177+
DedicatedHost: &mapiv1beta1.DedicatedHost{
178+
ID: *m.awsMachine.Spec.HostID,
179+
},
180+
}
181+
case "default":
182+
mapaProviderConfig.HostPlacement = &mapiv1beta1.HostPlacement{
183+
Affinity: ptr.To(mapiv1beta1.HostAffinityAnyAvailable),
184+
}
185+
default:
186+
errors = append(errors, field.Invalid(fldPath.Child("hostAffinity"), m.awsMachine.Spec.HostAffinity, errUnsupportedHostAffinityType))
187+
}
188+
}
189+
170190
secretRef, errs := handleAWSIdentityRef(fldPath.Child("identityRef"), m.awsCluster.Spec.IdentityRef)
171191

172192
if len(errs) > 0 {

pkg/conversion/mapi2capi/aws.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ func (m *awsMachineAndInfra) toAWSMachine(providerSpec mapiv1beta1.AWSMachinePro
281281
SpotMarketOptions: convertAWSSpotMarketOptionsToCAPI(providerSpec.SpotMarketOptions),
282282
Subnet: convertAWSResourceReferenceToCAPI(providerSpec.Subnet),
283283
Tenancy: string(providerSpec.Placement.Tenancy),
284+
HostAffinity: convertAWSHostAffinityToCAPI(providerSpec.HostPlacement),
285+
HostID: convertAWSHostIDToCAPI(providerSpec.HostPlacement),
284286
// UncompressedUserData: Not used in OpenShift.
285287
MarketType: capiAWSMarketType,
286288
}
@@ -478,6 +480,38 @@ func awsMachineToAWSMachineTemplate(awsMachine *awsv1.AWSMachine, name string, n
478480

479481
//////// Conversion helpers
480482

483+
func convertAWSHostAffinityToCAPI(placement *mapiv1beta1.HostPlacement) *string {
484+
if placement != nil {
485+
switch *placement.Affinity {
486+
case mapiv1beta1.HostAffinityAnyAvailable:
487+
return ptr.To("default")
488+
case mapiv1beta1.HostAffinityDedicatedHost:
489+
return ptr.To("host")
490+
default:
491+
return nil
492+
}
493+
}
494+
495+
return nil
496+
}
497+
498+
func convertAWSHostIDToCAPI(placement *mapiv1beta1.HostPlacement) *string {
499+
if placement != nil {
500+
switch *placement.Affinity {
501+
case mapiv1beta1.HostAffinityAnyAvailable:
502+
return nil
503+
case mapiv1beta1.HostAffinityDedicatedHost:
504+
if placement.DedicatedHost != nil {
505+
return ptr.To(placement.DedicatedHost.ID)
506+
}
507+
default:
508+
return nil
509+
}
510+
}
511+
512+
return nil
513+
}
514+
481515
func convertAWSAMIResourceReferenceToCAPI(fldPath *field.Path, amiRef mapiv1beta1.AWSResourceReference) (awsv1.AMIReference, *field.Error) {
482516
if amiRef.ARN != nil {
483517
return awsv1.AMIReference{}, field.Invalid(fldPath.Child("arn"), amiRef.ARN, "unable to convert AMI ARN reference. Not supported in CAPI")

0 commit comments

Comments
 (0)