Skip to content

Commit d1fd50b

Browse files
authored
Add LBaaS support for Cluster API Provider OCI. (#235)
* Add LBaaS support for Cluster API Provider OCI. * Refactor: Use 'LB' for load balancer and 'NLB' for network load balancer. * Update e2e tests. * Add test cases for loadbalancer. * Remove lb template.
1 parent 6b2e322 commit d1fd50b

27 files changed

+2756
-600
lines changed

api/v1beta1/ocicluster_conversion.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ func (src *OCICluster) ConvertTo(dstRaw conversion.Hub) error {
4747
dst.Spec.NetworkSpec.Vcn.ServiceGateway.Skip = restored.Spec.NetworkSpec.Vcn.ServiceGateway.Skip
4848
dst.Spec.NetworkSpec.Vcn.InternetGateway.Skip = restored.Spec.NetworkSpec.Vcn.InternetGateway.Skip
4949
dst.Spec.NetworkSpec.Vcn.RouteTable.Skip = restored.Spec.NetworkSpec.Vcn.RouteTable.Skip
50+
dst.Spec.NetworkSpec.APIServerLB.LoadBalancerType = restored.Spec.NetworkSpec.APIServerLB.LoadBalancerType
5051

5152
return nil
5253
}

api/v1beta1/ociclustertemplate_conversion.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func (src *OCIClusterTemplate) ConvertTo(dstRaw conversion.Hub) error {
4141
dst.Spec.Template.Spec.NetworkSpec.Vcn.InternetGateway.Skip = restored.Spec.Template.Spec.NetworkSpec.Vcn.InternetGateway.Skip
4242
dst.Spec.Template.Spec.NetworkSpec.Vcn.RouteTable.Skip = restored.Spec.Template.Spec.NetworkSpec.Vcn.RouteTable.Skip
4343
dst.Spec.Template.Spec.AvailabilityDomains = restored.Spec.Template.Spec.AvailabilityDomains
44+
dst.Spec.Template.Spec.NetworkSpec.APIServerLB.LoadBalancerType = restored.Spec.Template.Spec.NetworkSpec.APIServerLB.LoadBalancerType
4445
return nil
4546
}
4647

api/v1beta1/zz_generated.conversion.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta2/types.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,17 @@ type VCN struct {
902902
NetworkSecurityGroup NetworkSecurityGroup `json:"networkSecurityGroup,omitempty"`
903903
}
904904

905+
// LoadBalancerType is an enumeration of the supported load balancer types.
906+
type LoadBalancerType string
907+
908+
const (
909+
// NetworkLoadBalancer is the default load balancer type.
910+
LoadBalancerTypeNLB LoadBalancerType = LoadBalancerType("nlb")
911+
912+
// LoadBalancer is the alternative load balancer type.
913+
LoadBalancerTypeLB LoadBalancerType = LoadBalancerType("lb")
914+
)
915+
905916
// LoadBalancer Configuration
906917
type LoadBalancer struct {
907918
//LoadBalancer Name.
@@ -911,6 +922,10 @@ type LoadBalancer struct {
911922
// ID of Load Balancer.
912923
// +optional
913924
LoadBalancerId *string `json:"loadBalancerId,omitempty"`
925+
926+
// Type of Load Balancer: NLB (default) or LBaaS.
927+
// +optional
928+
LoadBalancerType LoadBalancerType `json:"loadBalancerType,omitempty"`
914929
}
915930

916931
// NetworkSpec specifies what the OCI networking resources should look like.

cloud/ociutil/ociutil.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ import (
2222
"net/http"
2323
"time"
2424

25+
lb "github.com/oracle/cluster-api-provider-oci/cloud/services/loadbalancer"
2526
nlb "github.com/oracle/cluster-api-provider-oci/cloud/services/networkloadbalancer"
2627

2728
"github.com/oracle/oci-go-sdk/v65/common"
2829
"github.com/oracle/oci-go-sdk/v65/core"
30+
"github.com/oracle/oci-go-sdk/v65/loadbalancer"
2931
"github.com/oracle/oci-go-sdk/v65/networkloadbalancer"
32+
3033
"github.com/pkg/errors"
3134
"k8s.io/apimachinery/pkg/util/wait"
3235
)
@@ -58,15 +61,15 @@ func IsNotFound(err error) bool {
5861
return ok && serviceErr.GetHTTPStatusCode() == http.StatusNotFound
5962
}
6063

61-
// AwaitLBWorkRequest waits for the LB work request to either succeed, fail. See k8s.io/apimachinery/pkg/util/wait
62-
func AwaitLBWorkRequest(ctx context.Context, networkLoadBalancerClient nlb.NetworkLoadBalancerClient, workRequestId *string) (*networkloadbalancer.WorkRequest, error) {
64+
// AwaitNLBWorkRequest waits for the LB work request to either succeed, fail. See k8s.io/apimachinery/pkg/util/wait
65+
func AwaitNLBWorkRequest(ctx context.Context, networkLoadBalancerClient nlb.NetworkLoadBalancerClient, workRequestId *string) (*networkloadbalancer.WorkRequest, error) {
6366
var wr *networkloadbalancer.WorkRequest
6467
err := wait.PollWithContext(ctx, WorkRequestPollInterval, WorkRequestTimeout, func(ctx context.Context) (done bool, err error) {
6568
twr, err := networkLoadBalancerClient.GetWorkRequest(ctx, networkloadbalancer.GetWorkRequestRequest{
6669
WorkRequestId: workRequestId,
6770
})
6871
if err != nil {
69-
return true, errors.Wrap(err, "failed create poll lb workrequest")
72+
return true, errors.Wrap(err, "failed create poll nlb workrequest")
7073
}
7174
switch twr.Status {
7275
case networkloadbalancer.OperationStatusSucceeded:
@@ -80,6 +83,28 @@ func AwaitLBWorkRequest(ctx context.Context, networkLoadBalancerClient nlb.Netwo
8083
return wr, err
8184
}
8285

86+
// AwaitLBWorkRequest waits for the LBaaS work request to either succeed, fail. See k8s.io/apimachinery/pkg/util/wait
87+
func AwaitLBWorkRequest(ctx context.Context, loadBalancerClient lb.LoadBalancerClient, workRequestId *string) (*loadbalancer.WorkRequest, error) {
88+
var wr *loadbalancer.WorkRequest
89+
err := wait.PollWithContext(ctx, WorkRequestPollInterval, WorkRequestTimeout, func(ctx context.Context) (done bool, err error) {
90+
twr, err := loadBalancerClient.GetWorkRequest(ctx, loadbalancer.GetWorkRequestRequest{
91+
WorkRequestId: workRequestId,
92+
})
93+
if err != nil {
94+
return true, errors.Wrap(err, "failed create poll lb workrequest")
95+
}
96+
switch twr.WorkRequest.LifecycleState {
97+
case loadbalancer.WorkRequestLifecycleStateSucceeded:
98+
wr = &twr.WorkRequest
99+
return true, nil
100+
case loadbalancer.WorkRequestLifecycleStateFailed:
101+
return false, errors.Errorf("WorkRequest %s failed", *workRequestId)
102+
}
103+
return false, nil
104+
})
105+
return wr, err
106+
}
107+
83108
func truncateOPCRetryToken(str string) string {
84109
b := []byte(str)
85110
if len(b) > MaxOPCRetryTokenBytes {

cloud/scope/clients.go

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,30 @@ import (
2626
"github.com/oracle/cluster-api-provider-oci/cloud/services/computemanagement"
2727
containerEngineClient "github.com/oracle/cluster-api-provider-oci/cloud/services/containerengine"
2828
identityClient "github.com/oracle/cluster-api-provider-oci/cloud/services/identity"
29+
lb "github.com/oracle/cluster-api-provider-oci/cloud/services/loadbalancer"
2930
nlb "github.com/oracle/cluster-api-provider-oci/cloud/services/networkloadbalancer"
3031
"github.com/oracle/cluster-api-provider-oci/cloud/services/vcn"
3132
"github.com/oracle/cluster-api-provider-oci/version"
3233
"github.com/oracle/oci-go-sdk/v65/common"
3334
"github.com/oracle/oci-go-sdk/v65/containerengine"
3435
"github.com/oracle/oci-go-sdk/v65/core"
3536
"github.com/oracle/oci-go-sdk/v65/identity"
37+
"github.com/oracle/oci-go-sdk/v65/loadbalancer"
3638
"github.com/oracle/oci-go-sdk/v65/networkloadbalancer"
3739
"github.com/pkg/errors"
3840
"k8s.io/klog/v2/klogr"
3941
)
4042

4143
// OCIClients is the struct of all the needed OCI clients
4244
type OCIClients struct {
43-
ComputeClient compute.ComputeClient
44-
ComputeManagementClient computemanagement.Client
45-
VCNClient vcn.Client
46-
LoadBalancerClient nlb.NetworkLoadBalancerClient
47-
IdentityClient identityClient.Client
48-
ContainerEngineClient containerEngineClient.Client
49-
BaseClient base.BaseClient
45+
ComputeClient compute.ComputeClient
46+
ComputeManagementClient computemanagement.Client
47+
VCNClient vcn.Client
48+
NetworkLoadBalancerClient nlb.NetworkLoadBalancerClient
49+
LoadBalancerClient lb.LoadBalancerClient
50+
IdentityClient identityClient.Client
51+
ContainerEngineClient containerEngineClient.Client
52+
BaseClient base.BaseClient
5053
}
5154

5255
// ClientProvider defines the regional clients
@@ -110,7 +113,11 @@ func createClients(region string, oCIAuthConfigProvider common.ConfigurationProv
110113
if err != nil {
111114
return OCIClients{}, err
112115
}
113-
lbClient, err := createLbClient(region, oCIAuthConfigProvider, logger)
116+
nlbClient, err := createNLbClient(region, oCIAuthConfigProvider, logger)
117+
if err != nil {
118+
return OCIClients{}, err
119+
}
120+
lbClient, err := createLBClient(region, oCIAuthConfigProvider, logger)
114121
if err != nil {
115122
return OCIClients{}, err
116123
}
@@ -140,13 +147,14 @@ func createClients(region string, oCIAuthConfigProvider common.ConfigurationProv
140147
}
141148

142149
return OCIClients{
143-
VCNClient: vcnClient,
144-
LoadBalancerClient: lbClient,
145-
IdentityClient: identityClient,
146-
ComputeClient: computeClient,
147-
ComputeManagementClient: computeManagementClient,
148-
ContainerEngineClient: containerEngineClient,
149-
BaseClient: baseClient,
150+
VCNClient: vcnClient,
151+
NetworkLoadBalancerClient: nlbClient,
152+
LoadBalancerClient: lbClient,
153+
IdentityClient: identityClient,
154+
ComputeClient: computeClient,
155+
ComputeManagementClient: computeManagementClient,
156+
ContainerEngineClient: containerEngineClient,
157+
BaseClient: baseClient,
150158
}, err
151159
}
152160

@@ -162,12 +170,24 @@ func createVncClient(region string, ociAuthConfigProvider common.ConfigurationPr
162170
return &vcnClient, nil
163171
}
164172

165-
func createLbClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*networkloadbalancer.NetworkLoadBalancerClient, error) {
166-
lbClient, err := networkloadbalancer.NewNetworkLoadBalancerClientWithConfigurationProvider(ociAuthConfigProvider)
173+
func createNLbClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*networkloadbalancer.NetworkLoadBalancerClient, error) {
174+
nlbClient, err := networkloadbalancer.NewNetworkLoadBalancerClientWithConfigurationProvider(ociAuthConfigProvider)
167175
if err != nil {
168176
logger.Error(err, "unable to create OCI LB Client")
169177
return nil, err
170178
}
179+
nlbClient.SetRegion(region)
180+
nlbClient.Interceptor = setVersionHeader()
181+
182+
return &nlbClient, nil
183+
}
184+
185+
func createLBClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*loadbalancer.LoadBalancerClient, error) {
186+
lbClient, err := loadbalancer.NewLoadBalancerClientWithConfigurationProvider(ociAuthConfigProvider)
187+
if err != nil {
188+
logger.Error(err, "unable to create OCI LBaaS Client")
189+
return nil, err
190+
}
171191
lbClient.SetRegion(region)
172192
lbClient.Interceptor = setVersionHeader()
173193

cloud/scope/clients_mock.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@ import (
2929
"github.com/oracle/cluster-api-provider-oci/cloud/services/compute"
3030
"github.com/oracle/cluster-api-provider-oci/cloud/services/identity"
3131
"github.com/oracle/cluster-api-provider-oci/cloud/services/vcn"
32+
"github.com/oracle/oci-go-sdk/v65/loadbalancer"
3233
"github.com/oracle/oci-go-sdk/v65/networkloadbalancer"
3334
"k8s.io/klog/v2/klogr"
3435
)
3536

3637
type MockOCIClients struct {
37-
VCNClient vcn.Client
38-
ComputeClient compute.ComputeClient
39-
LoadBalancerClient *networkloadbalancer.NetworkLoadBalancerClient
40-
IdentityClient identity.Client
38+
VCNClient vcn.Client
39+
ComputeClient compute.ComputeClient
40+
NetworkLoadBalancerClient *networkloadbalancer.NetworkLoadBalancerClient
41+
LoadBalancerClient *loadbalancer.LoadBalancerClient
42+
IdentityClient identity.Client
4143
}
4244

4345
var (
@@ -47,10 +49,11 @@ var (
4749
func MockNewClientProvider(mockClients MockOCIClients) (*ClientProvider, error) {
4850

4951
clientsInject := map[string]OCIClients{MockTestRegion: {
50-
VCNClient: mockClients.VCNClient,
51-
LoadBalancerClient: mockClients.LoadBalancerClient,
52-
IdentityClient: mockClients.IdentityClient,
53-
ComputeClient: mockClients.ComputeClient,
52+
VCNClient: mockClients.VCNClient,
53+
NetworkLoadBalancerClient: mockClients.NetworkLoadBalancerClient,
54+
LoadBalancerClient: mockClients.LoadBalancerClient,
55+
IdentityClient: mockClients.IdentityClient,
56+
ComputeClient: mockClients.ComputeClient,
5457
}}
5558

5659
authConfig, err := MockAuthConfig()

cloud/scope/cluster.go

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
infrastructurev1beta2 "github.com/oracle/cluster-api-provider-oci/api/v1beta2"
2727
"github.com/oracle/cluster-api-provider-oci/cloud/ociutil"
2828
identityClient "github.com/oracle/cluster-api-provider-oci/cloud/services/identity"
29+
lb "github.com/oracle/cluster-api-provider-oci/cloud/services/loadbalancer"
2930
nlb "github.com/oracle/cluster-api-provider-oci/cloud/services/networkloadbalancer"
3031
"github.com/oracle/cluster-api-provider-oci/cloud/services/vcn"
3132
"github.com/oracle/oci-go-sdk/v65/common"
@@ -47,12 +48,13 @@ const (
4748

4849
// ClusterScopeParams defines the params need to create a new ClusterScope
4950
type ClusterScopeParams struct {
50-
Client client.Client
51-
Logger *logr.Logger
52-
Cluster *clusterv1.Cluster
53-
VCNClient vcn.Client
54-
LoadBalancerClient nlb.NetworkLoadBalancerClient
55-
IdentityClient identityClient.Client
51+
Client client.Client
52+
Logger *logr.Logger
53+
Cluster *clusterv1.Cluster
54+
VCNClient vcn.Client
55+
NetworkLoadBalancerClient nlb.NetworkLoadBalancerClient
56+
LoadBalancerClient lb.LoadBalancerClient
57+
IdentityClient identityClient.Client
5658
// RegionIdentifier Identifier as specified here https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm
5759
RegionIdentifier string
5860
OCIAuthConfigProvider common.ConfigurationProvider
@@ -64,12 +66,13 @@ type ClusterScopeParams struct {
6466

6567
type ClusterScope struct {
6668
*logr.Logger
67-
client client.Client
68-
patchHelper *patch.Helper
69-
Cluster *clusterv1.Cluster
70-
VCNClient vcn.Client
71-
LoadBalancerClient nlb.NetworkLoadBalancerClient
72-
IdentityClient identityClient.Client
69+
client client.Client
70+
patchHelper *patch.Helper
71+
Cluster *clusterv1.Cluster
72+
VCNClient vcn.Client
73+
NetworkLoadBalancerClient nlb.NetworkLoadBalancerClient
74+
LoadBalancerClient lb.LoadBalancerClient
75+
IdentityClient identityClient.Client
7376
// RegionIdentifier Identifier as specified here https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm
7477
RegionIdentifier string
7578
ClientProvider *ClientProvider
@@ -94,16 +97,17 @@ func NewClusterScope(params ClusterScopeParams) (*ClusterScope, error) {
9497
}
9598

9699
return &ClusterScope{
97-
Logger: params.Logger,
98-
client: params.Client,
99-
Cluster: params.Cluster,
100-
VCNClient: params.VCNClient,
101-
LoadBalancerClient: params.LoadBalancerClient,
102-
IdentityClient: params.IdentityClient,
103-
RegionIdentifier: params.RegionIdentifier,
104-
ClientProvider: params.ClientProvider,
105-
OCIClusterAccessor: params.OCIClusterAccessor,
106-
RegionKey: params.RegionKey,
100+
Logger: params.Logger,
101+
client: params.Client,
102+
Cluster: params.Cluster,
103+
VCNClient: params.VCNClient,
104+
NetworkLoadBalancerClient: params.NetworkLoadBalancerClient,
105+
LoadBalancerClient: params.LoadBalancerClient,
106+
IdentityClient: params.IdentityClient,
107+
RegionIdentifier: params.RegionIdentifier,
108+
ClientProvider: params.ClientProvider,
109+
OCIClusterAccessor: params.OCIClusterAccessor,
110+
RegionKey: params.RegionKey,
107111
}, nil
108112
}
109113

cloud/scope/cluster_client.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ type ClusterScopeClient interface {
1212
ReconcileNSG(ctx context.Context) error
1313
ReconcileRouteTable(ctx context.Context) error
1414
ReconcileSubnet(ctx context.Context) error
15+
ReconcileApiServerNLB(ctx context.Context) error
1516
ReconcileApiServerLB(ctx context.Context) error
1617
ReconcileFailureDomains(ctx context.Context) error
1718
ReconcileDRG(ctx context.Context) error
1819
DeleteDRG(ctx context.Context) error
1920
ReconcileDRGVCNAttachment(ctx context.Context) error
2021
ReconcileDRGRPCAttachment(ctx context.Context) error
22+
DeleteApiServerNLB(ctx context.Context) error
2123
DeleteApiServerLB(ctx context.Context) error
2224
DeleteNSGs(ctx context.Context) error
2325
DeleteSubnets(ctx context.Context) error

0 commit comments

Comments
 (0)