diff --git a/data/data/install.openshift.io_installconfigs.yaml b/data/data/install.openshift.io_installconfigs.yaml index 7b9d033d990..97c2db5e5cc 100644 --- a/data/data/install.openshift.io_installconfigs.yaml +++ b/data/data/install.openshift.io_installconfigs.yaml @@ -1718,6 +1718,19 @@ spec: the subnets. Leave the hosted zone unset to have the installer create the hosted zone on your behalf. type: string + lbType: + description: 'LBType allows user to set a load balancer type. + When this field is set the default ingresscontroller will get + created using the specified LBType. If this field is not set + then the default ingress controller of LBType Classic will be + created. Valid values are: * "Classic": A Classic Load Balancer + that makes routing decisions at either the transport layer + (TCP/SSL) or the application layer (HTTP/HTTPS). See the following + for additional details: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb + * "NLB": A Network Load Balancer that makes routing decisions + at the transport layer (TCP/SSL). See the following for additional + details: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb' + type: string propagateUserTags: description: PropagateUserTags is a flag that directs in-cluster operators to include the specified user tags in the tags of diff --git a/pkg/asset/installconfig/vsphere/mock/authmanager_generated.go b/pkg/asset/installconfig/vsphere/mock/authmanager_generated.go index 960e89adcae..7730bfbe82a 100644 --- a/pkg/asset/installconfig/vsphere/mock/authmanager_generated.go +++ b/pkg/asset/installconfig/vsphere/mock/authmanager_generated.go @@ -1,40 +1,41 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: pkg/asset/installconfig/vsphere/permissions.go +// Source: ./permissions.go // Package mock is a generated GoMock package. package mock import ( context "context" + reflect "reflect" + gomock "github.com/golang/mock/gomock" types "github.com/vmware/govmomi/vim25/types" - reflect "reflect" ) -// MockAuthManager is a mock of AuthManager interface +// MockAuthManager is a mock of AuthManager interface. type MockAuthManager struct { ctrl *gomock.Controller recorder *MockAuthManagerMockRecorder } -// MockAuthManagerMockRecorder is the mock recorder for MockAuthManager +// MockAuthManagerMockRecorder is the mock recorder for MockAuthManager. type MockAuthManagerMockRecorder struct { mock *MockAuthManager } -// NewMockAuthManager creates a new mock instance +// NewMockAuthManager creates a new mock instance. func NewMockAuthManager(ctrl *gomock.Controller) *MockAuthManager { mock := &MockAuthManager{ctrl: ctrl} mock.recorder = &MockAuthManagerMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockAuthManager) EXPECT() *MockAuthManagerMockRecorder { return m.recorder } -// FetchUserPrivilegeOnEntities mocks base method +// FetchUserPrivilegeOnEntities mocks base method. func (m *MockAuthManager) FetchUserPrivilegeOnEntities(ctx context.Context, entities []types.ManagedObjectReference, userName string) ([]types.UserPrivilegeResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchUserPrivilegeOnEntities", ctx, entities, userName) @@ -43,13 +44,13 @@ func (m *MockAuthManager) FetchUserPrivilegeOnEntities(ctx context.Context, enti return ret0, ret1 } -// FetchUserPrivilegeOnEntities indicates an expected call of FetchUserPrivilegeOnEntities +// FetchUserPrivilegeOnEntities indicates an expected call of FetchUserPrivilegeOnEntities. func (mr *MockAuthManagerMockRecorder) FetchUserPrivilegeOnEntities(ctx, entities, userName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchUserPrivilegeOnEntities", reflect.TypeOf((*MockAuthManager)(nil).FetchUserPrivilegeOnEntities), ctx, entities, userName) } -// Properties mocks base method +// Properties mocks base method. func (m *MockAuthManager) Properties(ctx context.Context, r types.ManagedObjectReference, ps []string, dst interface{}) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Properties", ctx, r, ps, dst) @@ -57,13 +58,13 @@ func (m *MockAuthManager) Properties(ctx context.Context, r types.ManagedObjectR return ret0 } -// Properties indicates an expected call of Properties +// Properties indicates an expected call of Properties. func (mr *MockAuthManagerMockRecorder) Properties(ctx, r, ps, dst interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Properties", reflect.TypeOf((*MockAuthManager)(nil).Properties), ctx, r, ps, dst) } -// Reference mocks base method +// Reference mocks base method. func (m *MockAuthManager) Reference() types.ManagedObjectReference { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Reference") @@ -71,7 +72,7 @@ func (m *MockAuthManager) Reference() types.ManagedObjectReference { return ret0 } -// Reference indicates an expected call of Reference +// Reference indicates an expected call of Reference. func (mr *MockAuthManagerMockRecorder) Reference() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reference", reflect.TypeOf((*MockAuthManager)(nil).Reference)) diff --git a/pkg/asset/manifests/infrastructure_test.go b/pkg/asset/manifests/infrastructure_test.go index 540699e70a9..99491ee88c3 100644 --- a/pkg/asset/manifests/infrastructure_test.go +++ b/pkg/asset/manifests/infrastructure_test.go @@ -38,7 +38,8 @@ func TestGenerateInfrastructe(t *testing.T) { infraBuild.forPlatform(configv1.AWSPlatformType), infraBuild.withServiceEndpoint("service", "https://endpoint"), ), - }} + }, + } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { parents := asset.Parents{} @@ -121,6 +122,13 @@ func (b icBuildNamespace) withServiceEndpoint(name, url string) icOption { } } +func (b icBuildNamespace) withLBType(lbType configv1.AWSLBType) icOption { + return func(ic *types.InstallConfig) { + b.forAWS()(ic) + ic.Platform.AWS.LBType = lbType + } +} + type infraOption func(*configv1.Infrastructure) type infraBuildNamespace struct{} diff --git a/pkg/asset/manifests/ingress.go b/pkg/asset/manifests/ingress.go index a2626d59633..5dbb3d71b27 100644 --- a/pkg/asset/manifests/ingress.go +++ b/pkg/asset/manifests/ingress.go @@ -14,6 +14,7 @@ import ( "github.com/openshift/installer/pkg/asset" "github.com/openshift/installer/pkg/asset/installconfig" "github.com/openshift/installer/pkg/types" + "github.com/openshift/installer/pkg/types/aws" ) var ( @@ -115,6 +116,18 @@ func (ing *Ingress) generateClusterConfig(config *types.InstallConfig) ([]byte, DefaultPlacement: defaultPlacement, }, } + + switch config.Platform.Name() { + case aws.Name: + obj.Spec.LoadBalancer = configv1.LoadBalancer{ + Platform: configv1.IngressPlatformSpec{ + AWS: &configv1.AWSIngressSpec{ + Type: config.AWS.LBType, + }, + Type: configv1.AWSPlatformType, + }, + } + } return yaml.Marshal(obj) } diff --git a/pkg/asset/manifests/ingress_test.go b/pkg/asset/manifests/ingress_test.go index 44d857849ab..c0a70bb1e60 100644 --- a/pkg/asset/manifests/ingress_test.go +++ b/pkg/asset/manifests/ingress_test.go @@ -53,11 +53,13 @@ func installConfigFromTopologies(t *testing.T, options []icOption, func TestGenerateIngerssDefaultPlacement(t *testing.T) { cases := []struct { - name string - installConfigBuildOptions []icOption - controlPlaneTopology configv1.TopologyMode - infrastructureTopology configv1.TopologyMode - expectedIngressPlacement configv1.DefaultPlacement + name string + installConfigBuildOptions []icOption + controlPlaneTopology configv1.TopologyMode + infrastructureTopology configv1.TopologyMode + expectedIngressPlacement configv1.DefaultPlacement + expectedIngressAWSLBType configv1.AWSLBType + expectedIngressPlatformType configv1.PlatformType }{ { // AWS currently uses a load balancer even on single-node, so the @@ -91,6 +93,24 @@ func TestGenerateIngerssDefaultPlacement(t *testing.T) { infrastructureTopology: configv1.HighlyAvailableTopologyMode, expectedIngressPlacement: configv1.DefaultPlacementWorkers, }, + { + name: "test setting of aws lb type to NLB", + installConfigBuildOptions: []icOption{icBuild.withLBType(configv1.NLB)}, + controlPlaneTopology: configv1.HighlyAvailableTopologyMode, + infrastructureTopology: configv1.HighlyAvailableTopologyMode, + expectedIngressPlacement: configv1.DefaultPlacementWorkers, + expectedIngressAWSLBType: configv1.NLB, + expectedIngressPlatformType: configv1.AWSPlatformType, + }, + { + name: "test setting of aws lb type to Classic", + installConfigBuildOptions: []icOption{icBuild.withLBType(configv1.Classic)}, + controlPlaneTopology: configv1.HighlyAvailableTopologyMode, + infrastructureTopology: configv1.HighlyAvailableTopologyMode, + expectedIngressPlacement: configv1.DefaultPlacementWorkers, + expectedIngressAWSLBType: configv1.Classic, + expectedIngressPlatformType: configv1.AWSPlatformType, + }, { name: "none-platform single node with 0 or 1 day-1 workers", installConfigBuildOptions: []icOption{icBuild.forNone()}, @@ -154,6 +174,10 @@ func TestGenerateIngerssDefaultPlacement(t *testing.T) { return } assert.Equal(t, tc.expectedIngressPlacement, actualIngress.Status.DefaultPlacement) + if len(tc.expectedIngressAWSLBType) != 0 && len(tc.expectedIngressPlatformType) != 0 { + assert.Equal(t, tc.expectedIngressAWSLBType, actualIngress.Spec.LoadBalancer.Platform.AWS.Type) + assert.Equal(t, tc.expectedIngressPlatformType, actualIngress.Spec.LoadBalancer.Platform.Type) + } }) } } diff --git a/pkg/explain/printer_test.go b/pkg/explain/printer_test.go index e9458d96359..debb6ba36eb 100644 --- a/pkg/explain/printer_test.go +++ b/pkg/explain/printer_test.go @@ -147,6 +147,9 @@ func Test_PrintFields(t *testing.T) { hostedZone HostedZone is the ID of an existing hosted zone into which to add DNS records for the cluster's internal API. An existing hosted zone can only be used when also using existing subnets. The hosted zone must be associated with the VPC containing the subnets. Leave the hosted zone unset to have the installer create the hosted zone on your behalf. + lbType + LBType allows user to set a load balancer type. When this field is set the default ingresscontroller will get created using the specified LBType. If this field is not set then the default ingress controller of LBType Classic will be created. Valid values are: * "Classic": A Classic Load Balancer that makes routing decisions at either the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See the following for additional details: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb * "NLB": A Network Load Balancer that makes routing decisions at the transport layer (TCP/SSL). See the following for additional details: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb + propagateUserTags PropagateUserTags is a flag that directs in-cluster operators to include the specified user tags in the tags of the AWS resources that the operators create. diff --git a/pkg/types/aws/platform.go b/pkg/types/aws/platform.go index 5715bc8160e..702c33f8769 100644 --- a/pkg/types/aws/platform.go +++ b/pkg/types/aws/platform.go @@ -1,6 +1,9 @@ package aws -import "github.com/aws/aws-sdk-go/aws/endpoints" +import ( + "github.com/aws/aws-sdk-go/aws/endpoints" + configv1 "github.com/openshift/api/config/v1" +) // Platform stores all the global configuration that all machinesets // use. @@ -59,6 +62,20 @@ type Platform struct { // AWS resources that the operators create. // +optional PropagateUserTag bool `json:"propagateUserTags,omitempty"` + + // LBType allows user to set a load balancer type. + // When this field is set the default ingresscontroller will get created using the specified LBType. + // If this field is not set then the default ingress controller of LBType Classic will be created. + // Valid values are: + // * "Classic": A Classic Load Balancer that makes routing decisions at either + // the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See + // the following for additional details: + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb + // * "NLB": A Network Load Balancer that makes routing decisions at the + // transport layer (TCP/SSL). See the following for additional details: + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb + // +optional + LBType configv1.AWSLBType `json:"lbType,omitempty"` } // ServiceEndpoint store the configuration for services to