Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ require (
github.com/golang/mock v1.6.0
github.com/onsi/ginkgo/v2 v2.27.2
github.com/onsi/gomega v1.38.2
github.com/openshift/api v0.0.0-20251120220512-cb382c9eaf42
github.com/openshift/api v0.0.0-20251205114208-5eb46a7b4ce8
github.com/openshift/library-go v0.0.0-20251107090138-0de9712313a5
github.com/openshift/machine-api-operator v0.2.1-0.20251110092458-e0af0f3f44b8
k8s.io/api v0.34.1
Expand Down Expand Up @@ -70,7 +70,7 @@ require (
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/openshift/client-go v0.0.0-20251015124057-db0dee36e235 // indirect
github.com/openshift/client-go v0.0.0-20251202151200-fb4471581cf8 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -355,10 +355,10 @@ github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns
github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
github.com/openshift/api v0.0.0-20251120220512-cb382c9eaf42 h1:Mo2FlDdoCZ+BE2W4C0lNcxEDeIIhfsYFP6vj4Sggp8w=
github.com/openshift/api v0.0.0-20251120220512-cb382c9eaf42/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY=
github.com/openshift/client-go v0.0.0-20251015124057-db0dee36e235 h1:9JBeIXmnHlpXTQPi7LPmu1jdxznBhAE7bb1K+3D8gxY=
github.com/openshift/client-go v0.0.0-20251015124057-db0dee36e235/go.mod h1:L49W6pfrZkfOE5iC1PqEkuLkXG4W0BX4w8b+L2Bv7fM=
github.com/openshift/api v0.0.0-20251205114208-5eb46a7b4ce8 h1:kF1HhMhHSpipdHjHm92WngUCxhNC4Iy7wbF6RL739w0=
github.com/openshift/api v0.0.0-20251205114208-5eb46a7b4ce8/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY=
github.com/openshift/client-go v0.0.0-20251202151200-fb4471581cf8 h1:97rgISdT4IOmXlmEUV5Wr6d8BzzjPclzAjCARLbSlT0=
github.com/openshift/client-go v0.0.0-20251202151200-fb4471581cf8/go.mod h1:WVJnsrbSO1J8x8KceOmv1d5CpoN34Uzsaz1O4MIOKJI=
github.com/openshift/cluster-api-actuator-pkg/testutils v0.0.0-20250910145856-21d03d30056d h1:+sqUThLi/lmgT5/scmmjnS6+RZFtbdxRAscNfCPyLPI=
github.com/openshift/cluster-api-actuator-pkg/testutils v0.0.0-20250910145856-21d03d30056d/go.mod h1:9+FWWWLkVrnBo1eYhA/0Ehlq5JMgIAHtcB0IF+qV1AA=
github.com/openshift/cluster-control-plane-machine-set-operator v0.0.0-20251029084908-344babe6a957 h1:eVnkMTFnirnoUOlAUT3Hy8WriIi1JoSrilWym3Dl8Q4=
Expand Down
4 changes: 3 additions & 1 deletion hack/ci-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,11 @@ if [ "$OPENSHIFT_CI" == "true" ] && [ -n "$ARTIFACT_DIR" ] && [ -d "$ARTIFACT_DI
GINKGO_ARGS="${GINKGO_ARGS} --junit-report=junit_machine_api_provider_aws.xml --cover --coverprofile=test-unit-coverage.out --output-dir=${ARTIFACT_DIR}"
fi

TEST_PACKAGES=${TEST_PACKAGES:-"./pkg/... ./cmd/..."}

# Print the command we are going to run as Make would.
echo ${GINKGO} ${GINKGO_ARGS} ${GINKGO_EXTRA_ARGS} "<omitted>"
${GINKGO} ${GINKGO_ARGS} ${GINKGO_EXTRA_ARGS} ./pkg/... ./cmd/...
${GINKGO} ${GINKGO_ARGS} ${GINKGO_EXTRA_ARGS} ${TEST_PACKAGES}
# Capture the test result to exit on error after coverage.
TEST_RESULT=$?

Expand Down
49 changes: 49 additions & 0 deletions pkg/actuators/machine/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/ec2"

configv1 "github.com/openshift/api/config/v1"
machinev1beta1 "github.com/openshift/api/machine/v1beta1"
mapierrors "github.com/openshift/machine-api-operator/pkg/controller/machine"
"github.com/openshift/machine-api-operator/pkg/metrics"
awsclient "github.com/openshift/machine-api-provider-aws/pkg/client"
"k8s.io/klog/v2"
"k8s.io/utils/ptr"
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
)

Expand Down Expand Up @@ -666,6 +668,53 @@ func constructInstancePlacement(machine *machinev1beta1.Machine, machineProvider
machinev1beta1.HostTenancy)
}

// Dedicated host logic
mapiPlacement := machineProviderConfig.Placement
if mapiPlacement.Host != nil {
hostAffinity := mapiPlacement.Host.Affinity
switch *hostAffinity {
case machinev1beta1.HostAffinityAnyAvailable:
placement.Affinity = aws.String("default")
case machinev1beta1.HostAffinityDedicatedHost:
placement.Affinity = aws.String("host")

// HostAffinityDedicatedHost requires host to be set
if mapiPlacement.Host.DedicatedHost == nil || mapiPlacement.Host.DedicatedHost.ID == "" {
return nil, mapierrors.InvalidMachineConfiguration("host affinity %v requires dedicated host ID to be provided", machinev1beta1.HostAffinityDedicatedHost)
}
default:
return nil, mapierrors.InvalidMachineConfiguration("invalid host affinity: %v", *hostAffinity)
}

// Set Host ID if set
var hostID *string
if mapiPlacement.Host.DedicatedHost != nil {
hostID = ptr.To(mapiPlacement.Host.DedicatedHost.ID)
}

klog.V(2).Info("Running instance with dedicated host placement",
"hostId", hostID,
"affinity", mapiPlacement.Host.Affinity)

if *placement != (ec2.Placement{}) {
klog.Warningf("Placement already set for instance, overwriting with dedicated host placement. hostId:%v affinity:%v placement:%v",
hostID,
mapiPlacement.Host.Affinity,
placement)
}

var tenancy *string
if mapiPlacement.Tenancy != "" {
tenancy = ptr.To(string(machinev1beta1.HostTenancy))
}

placement = &ec2.Placement{
Tenancy: tenancy,
Affinity: placement.Affinity,
HostId: hostID,
}
}

if *placement == (ec2.Placement{}) {
// If the placement is empty, we should just return a nil so as not to pollute the RunInstancesInput
return nil, nil
Expand Down
91 changes: 91 additions & 0 deletions pkg/actuators/machine/instances_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1746,3 +1746,94 @@ func TestGetCPUOptionsRequest(t *testing.T) {
})
}
}

func TestConstructInstancePlacement_HostPlacement(t *testing.T) {
hostID := "h-0123456789abcdef0"
testCases := []struct {
name string
mutate func(pc *machinev1beta1.AWSMachineProviderConfig)
expected *ec2.Placement
wantErr bool
}{
{
name: "AnyAvailable sets Affinity default, no Tenancy, no HostId",
mutate: func(pc *machinev1beta1.AWSMachineProviderConfig) {
pc.Placement.Host = &machinev1beta1.HostPlacement{
Affinity: ptr.To(machinev1beta1.HostAffinityAnyAvailable),
}
},
expected: &ec2.Placement{
Affinity: aws.String("default"),
},
},
{
name: "DedicatedHost sets Tenancy host and HostId",
mutate: func(pc *machinev1beta1.AWSMachineProviderConfig) {
pc.Placement = machinev1beta1.Placement{
Tenancy: machinev1beta1.HostTenancy,
Host: &machinev1beta1.HostPlacement{
Affinity: ptr.To(machinev1beta1.HostAffinityDedicatedHost),
DedicatedHost: &machinev1beta1.DedicatedHost{
ID: hostID},
},
}
},
expected: &ec2.Placement{
Affinity: aws.String("host"),
Tenancy: aws.String("host"),
HostId: ptr.To(hostID),
},
},
{
name: "DedicatedHost overwrites existing placement fields",
mutate: func(pc *machinev1beta1.AWSMachineProviderConfig) {
pc.PlacementGroupName = "placement-group1"
pc.PlacementGroupPartition = ptr.To(int32(3))
pc.Placement = machinev1beta1.Placement{
Tenancy: machinev1beta1.HostTenancy,
Host: &machinev1beta1.HostPlacement{
Affinity: ptr.To(machinev1beta1.HostAffinityDedicatedHost),
DedicatedHost: &machinev1beta1.DedicatedHost{
ID: hostID},
},
}
},
expected: &ec2.Placement{
Tenancy: aws.String("host"),
Affinity: aws.String("host"),
HostId: ptr.To(hostID),
},
},
{
name: "DedicatedHost without ID returns error",
mutate: func(pc *machinev1beta1.AWSMachineProviderConfig) {
pc.Placement.Host = &machinev1beta1.HostPlacement{
Affinity: ptr.To(machinev1beta1.HostAffinityDedicatedHost),
DedicatedHost: &machinev1beta1.DedicatedHost{ID: ""},
}
},
wantErr: true,
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
g := gmg.NewWithT(t)

m, err := stubMachine()
if err != nil {
t.Fatalf("Unable to build test machine manifest: %v", err)
}
pc := stubProviderConfig()
tc.mutate(pc)

got, cerr := constructInstancePlacement(m, pc, fake.NewFakeClient())
if tc.wantErr {
g.Expect(cerr).To(gmg.HaveOccurred())
return
}
g.Expect(cerr).ToNot(gmg.HaveOccurred())
g.Expect(got).To(gmg.BeEquivalentTo(tc.expected))
})
}
}
2 changes: 0 additions & 2 deletions vendor/github.com/openshift/api/config/v1/register.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

98 changes: 35 additions & 63 deletions vendor/github.com/openshift/api/config/v1/types_infrastructure.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading