diff --git a/pkg/network/multus_admission_controller.go b/pkg/network/multus_admission_controller.go index 700ab0e23e..9e2a5548a4 100644 --- a/pkg/network/multus_admission_controller.go +++ b/pkg/network/multus_admission_controller.go @@ -50,7 +50,8 @@ func renderMultusAdmissonControllerConfig(manifestDir string, externalControlPla objs := []*uns.Unstructured{} var err error - replicas := getMultusAdmissionControllerReplicas(bootstrapResult) + hsc := hypershift.NewHyperShiftConfig() + replicas := getMultusAdmissionControllerReplicas(bootstrapResult, hsc.Enabled) if ignoredNamespaces == "" { ignoredNamespaces, err = getOpenshiftNamespaces(client) if err != nil { @@ -68,7 +69,6 @@ func renderMultusAdmissonControllerConfig(manifestDir string, externalControlPla data.Data["ExternalControlPlane"] = externalControlPlane data.Data["Replicas"] = replicas // Hypershift - hsc := hypershift.NewHyperShiftConfig() data.Data["HyperShiftEnabled"] = hsc.Enabled data.Data["ManagementClusterName"] = names.ManagementClusterName data.Data["AdmissionControllerNamespace"] = "openshift-multus" diff --git a/pkg/network/render.go b/pkg/network/render.go index 8a33157f7c..79ed1a4611 100644 --- a/pkg/network/render.go +++ b/pkg/network/render.go @@ -15,6 +15,7 @@ import ( operv1 "github.com/openshift/api/operator/v1" "github.com/openshift/cluster-network-operator/pkg/bootstrap" cnoclient "github.com/openshift/cluster-network-operator/pkg/client" + "github.com/openshift/cluster-network-operator/pkg/hypershift" "github.com/openshift/cluster-network-operator/pkg/render" iputil "github.com/openshift/cluster-network-operator/pkg/util/ip" "github.com/openshift/library-go/pkg/operator/configobserver/featuregates" @@ -742,10 +743,15 @@ func renderAdditionalNetworks(conf *operv1.NetworkSpec, manifestDir string) ([]* return out, nil } -func getMultusAdmissionControllerReplicas(bootstrapResult *bootstrap.BootstrapResult) int { +func getMultusAdmissionControllerReplicas(bootstrapResult *bootstrap.BootstrapResult, hyperShiftEnabled bool) int { replicas := 2 if bootstrapResult.Infra.ControlPlaneTopology == configv1.ExternalTopologyMode { - if bootstrapResult.Infra.InfrastructureTopology == configv1.SingleReplicaTopologyMode { + // In HyperShift check HostedControlPlane.ControllerAvailabilityPolicy, otherwise rely on Infra.InfrastructureTopology + if hyperShiftEnabled { + if bootstrapResult.Infra.HostedControlPlane.ControllerAvailabilityPolicy == hypershift.SingleReplica { + replicas = 1 + } + } else if bootstrapResult.Infra.InfrastructureTopology == configv1.SingleReplicaTopologyMode { replicas = 1 } } else if bootstrapResult.Infra.ControlPlaneTopology == configv1.SingleReplicaTopologyMode { diff --git a/pkg/network/render_test.go b/pkg/network/render_test.go index 52cd464250..02bc83bab7 100644 --- a/pkg/network/render_test.go +++ b/pkg/network/render_test.go @@ -426,13 +426,44 @@ func TestRenderUnknownNetwork(t *testing.T) { func Test_getMultusAdmissionControllerReplicas(t *testing.T) { type args struct { - bootstrapResult *bootstrap.BootstrapResult + bootstrapResult *bootstrap.BootstrapResult + hypershiftEnabled bool } tests := []struct { name string args args want int }{ + { + name: "External control plane, HyperShift, highly available infra", + args: args{ + bootstrapResult: &bootstrap.BootstrapResult{ + Infra: bootstrap.InfraStatus{ + ControlPlaneTopology: configv1.ExternalTopologyMode, + HostedControlPlane: &hypershift.HostedControlPlane{ + ControllerAvailabilityPolicy: hypershift.HighlyAvailable, + }, + }, + }, + hypershiftEnabled: true, + }, + want: 2, + }, + { + name: "External control plane, HyperShift, single-replica infra", + args: args{ + bootstrapResult: &bootstrap.BootstrapResult{ + Infra: bootstrap.InfraStatus{ + ControlPlaneTopology: configv1.ExternalTopologyMode, + HostedControlPlane: &hypershift.HostedControlPlane{ + ControllerAvailabilityPolicy: hypershift.SingleReplica, + }, + }, + }, + hypershiftEnabled: true, + }, + want: 1, + }, { name: "External control plane, highly available infra", args: args{ @@ -508,7 +539,7 @@ func Test_getMultusAdmissionControllerReplicas(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := getMultusAdmissionControllerReplicas(tt.args.bootstrapResult); got != tt.want { + if got := getMultusAdmissionControllerReplicas(tt.args.bootstrapResult, tt.args.hypershiftEnabled); got != tt.want { t.Errorf("getMultusAdmissionControllerReplicas() = %v, want %v", got, tt.want) } })