Skip to content

Commit f4f9841

Browse files
authored
feat: allow OCI client endpoint override per cluster (#248)
This allows users to define individual client URL overrides per cluster in yaml.
1 parent dd9791d commit f4f9841

22 files changed

+486
-30
lines changed

api/v1beta1/ocicluster_conversion.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func (src *OCICluster) ConvertTo(dstRaw conversion.Hub) error {
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
5050
dst.Spec.NetworkSpec.APIServerLB.LoadBalancerType = restored.Spec.NetworkSpec.APIServerLB.LoadBalancerType
51+
dst.Spec.ClientOverrides = restored.Spec.ClientOverrides
5152

5253
return nil
5354
}

api/v1beta1/ociclustertemplate_conversion.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func (src *OCIClusterTemplate) ConvertTo(dstRaw conversion.Hub) error {
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
4444
dst.Spec.Template.Spec.NetworkSpec.APIServerLB.LoadBalancerType = restored.Spec.Template.Spec.NetworkSpec.APIServerLB.LoadBalancerType
45+
dst.Spec.Template.Spec.ClientOverrides = restored.Spec.Template.Spec.ClientOverrides
4546
return nil
4647
}
4748

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/ocicluster_types.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ type OCIClusterSpec struct {
7474
// where the map key is the AD name and the struct is details about the AD.
7575
// +optional
7676
AvailabilityDomains map[string]OCIAvailabilityDomain `json:"availabilityDomains,omitempty"`
77+
78+
// ClientOverrides allows the default client SDK URLs to be changed.
79+
//
80+
// +optional
81+
// +nullable
82+
ClientOverrides *ClientOverrides `json:"clientOverrides,omitempty"`
7783
}
7884

7985
// OCIClusterStatus defines the observed state of OCICluster
@@ -120,6 +126,52 @@ type OCIAvailabilityDomain struct {
120126
FaultDomains []string `json:"faultDomains,omitempty"`
121127
}
122128

129+
// ClientOverrides contains information about client host url overrides.
130+
type ClientOverrides struct {
131+
132+
// ComputeClientUrl allows the default compute SDK client URL to be changed.
133+
//
134+
// +optional
135+
// +nullable
136+
ComputeClientUrl *string `json:"computeClientUrl,omitempty"`
137+
138+
// ComputeManagementClientUrl allows the default compute management SDK client URL to be changed.
139+
//
140+
// +optional
141+
// +nullable
142+
ComputeManagementClientUrl *string `json:"computeManagementClientUrl,omitempty"`
143+
144+
// VCNClientUrl allows the default vcn SDK client URL to be changed.
145+
//
146+
// +optional
147+
// +nullable
148+
VCNClientUrl *string `json:"vCNClientUrl,omitempty"`
149+
150+
// LoadBalancerClientUrl allows the default load balancer SDK client URL to be changed.
151+
//
152+
// +optional
153+
// +nullable
154+
LoadBalancerClientUrl *string `json:"loadBalancerClientUrl,omitempty"`
155+
156+
// NetworkLoadBalancerClientUrl allows the default NLB SDK client URL to be changed.
157+
//
158+
// +optional
159+
// +nullable
160+
NetworkLoadBalancerClientUrl *string `json:"networkLoadBalancerClientUrl,omitempty"`
161+
162+
// IdentityClientUrl allows the default identity SDK client URL to be changed.
163+
//
164+
// +optional
165+
// +nullable
166+
IdentityClientUrl *string `json:"identityClientUrl,omitempty"`
167+
168+
// ContainerEngineClientUrl allows the default container engine SDK client URL to be changed.
169+
//
170+
// +optional
171+
// +nullable
172+
ContainerEngineClientUrl *string `json:"containerEngineClientUrl,omitempty"`
173+
}
174+
123175
// GetConditions returns the list of conditions for an OCICluster API object.
124176
func (c *OCICluster) GetConditions() clusterv1.Conditions {
125177
return c.Status.Conditions

api/v1beta2/zz_generated.deepcopy.go

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

cloud/scope/clients.go

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"sync"
2222

2323
"github.com/go-logr/logr"
24+
"github.com/oracle/cluster-api-provider-oci/api/v1beta2"
2425
"github.com/oracle/cluster-api-provider-oci/cloud/services/base"
2526
"github.com/oracle/cluster-api-provider-oci/cloud/services/compute"
2627
"github.com/oracle/cluster-api-provider-oci/cloud/services/computemanagement"
@@ -58,26 +59,42 @@ type ClientProvider struct {
5859
ociClients map[string]OCIClients
5960
ociClientsLock *sync.RWMutex
6061
ociAuthConfigProvider common.ConfigurationProvider
62+
ociClientOverrides *v1beta2.ClientOverrides
63+
}
64+
65+
// ClientProviderParams is the params struct for NewClientProvider
66+
type ClientProviderParams struct {
67+
// OciAuthConfigProvider wraps information about the account owner
68+
OciAuthConfigProvider common.ConfigurationProvider
69+
70+
// ClientOverrides contains information about client host url overrides.
71+
ClientOverrides *v1beta2.ClientOverrides
6172
}
6273

6374
// NewClientProvider builds the ClientProvider with a client for the given region
64-
func NewClientProvider(ociAuthConfigProvider common.ConfigurationProvider) (*ClientProvider, error) {
75+
func NewClientProvider(params ClientProviderParams) (*ClientProvider, error) {
6576
log := klogr.New()
6677

67-
if ociAuthConfigProvider == nil {
78+
if params.OciAuthConfigProvider == nil {
6879
return nil, errors.New("ConfigurationProvider can not be nil")
6980
}
7081

7182
provider := ClientProvider{
7283
Logger: &log,
73-
ociAuthConfigProvider: ociAuthConfigProvider,
84+
ociAuthConfigProvider: params.OciAuthConfigProvider,
7485
ociClients: map[string]OCIClients{},
7586
ociClientsLock: new(sync.RWMutex),
87+
ociClientOverrides: params.ClientOverrides,
7688
}
7789

7890
return &provider, nil
7991
}
8092

93+
// GetAuthProvider returns the client provider auth config
94+
func (c *ClientProvider) GetAuthProvider() common.ConfigurationProvider {
95+
return c.ociAuthConfigProvider
96+
}
97+
8198
// GetOrBuildClient if the OCIClients exist for the region they are returned, if not clients will build them
8299
func (c *ClientProvider) GetOrBuildClient(region string) (OCIClients, error) {
83100
if len(region) <= 0 {
@@ -94,7 +111,7 @@ func (c *ClientProvider) GetOrBuildClient(region string) (OCIClients, error) {
94111

95112
c.ociClientsLock.Lock()
96113
defer c.ociClientsLock.Unlock()
97-
regionalClient, err := createClients(region, c.ociAuthConfigProvider, c.Logger)
114+
regionalClient, err := c.createClients(region)
98115
if err != nil {
99116
return regionalClient, err
100117
}
@@ -108,36 +125,36 @@ func (c *ClientProvider) GetRegion() (string, error) {
108125
return c.ociAuthConfigProvider.Region()
109126
}
110127

111-
func createClients(region string, oCIAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (OCIClients, error) {
112-
vcnClient, err := createVncClient(region, oCIAuthConfigProvider, logger)
128+
func (c *ClientProvider) createClients(region string) (OCIClients, error) {
129+
vcnClient, err := c.createVncClient(region, c.ociAuthConfigProvider, c.Logger)
113130
if err != nil {
114131
return OCIClients{}, err
115132
}
116-
nlbClient, err := createNLbClient(region, oCIAuthConfigProvider, logger)
133+
nlbClient, err := c.createNLbClient(region, c.ociAuthConfigProvider, c.Logger)
117134
if err != nil {
118135
return OCIClients{}, err
119136
}
120-
lbClient, err := createLBClient(region, oCIAuthConfigProvider, logger)
137+
lbClient, err := c.createLBClient(region, c.ociAuthConfigProvider, c.Logger)
121138
if err != nil {
122139
return OCIClients{}, err
123140
}
124-
identityClient, err := createIdentityClient(region, oCIAuthConfigProvider, logger)
141+
identityClient, err := c.createIdentityClient(region, c.ociAuthConfigProvider, c.Logger)
125142
if err != nil {
126143
return OCIClients{}, err
127144
}
128-
computeClient, err := createComputeClient(region, oCIAuthConfigProvider, logger)
145+
computeClient, err := c.createComputeClient(region, c.ociAuthConfigProvider, c.Logger)
129146
if err != nil {
130147
return OCIClients{}, err
131148
}
132-
computeManagementClient, err := createComputeManagementClient(region, oCIAuthConfigProvider, logger)
149+
computeManagementClient, err := c.createComputeManagementClient(region, c.ociAuthConfigProvider, c.Logger)
133150
if err != nil {
134151
return OCIClients{}, err
135152
}
136-
containerEngineClient, err := createContainerEngineClient(region, oCIAuthConfigProvider, logger)
153+
containerEngineClient, err := c.createContainerEngineClient(region, c.ociAuthConfigProvider, c.Logger)
137154
if err != nil {
138155
return OCIClients{}, err
139156
}
140-
baseClient, err := createBaseClient(region, oCIAuthConfigProvider, logger)
157+
baseClient, err := c.createBaseClient(region, c.ociAuthConfigProvider, c.Logger)
141158
if err != nil {
142159
return OCIClients{}, err
143160
}
@@ -158,91 +175,113 @@ func createClients(region string, oCIAuthConfigProvider common.ConfigurationProv
158175
}, err
159176
}
160177

161-
func createVncClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.VirtualNetworkClient, error) {
178+
func (c *ClientProvider) createVncClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.VirtualNetworkClient, error) {
162179
vcnClient, err := core.NewVirtualNetworkClientWithConfigurationProvider(ociAuthConfigProvider)
163180
if err != nil {
164181
logger.Error(err, "unable to create OCI VCN Client")
165182
return nil, err
166183
}
167184
vcnClient.SetRegion(region)
185+
if c.ociClientOverrides != nil && c.ociClientOverrides.VCNClientUrl != nil {
186+
vcnClient.Host = *c.ociClientOverrides.VCNClientUrl
187+
}
168188
vcnClient.Interceptor = setVersionHeader()
169189

170190
return &vcnClient, nil
171191
}
172192

173-
func createNLbClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*networkloadbalancer.NetworkLoadBalancerClient, error) {
193+
func (c *ClientProvider) createNLbClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*networkloadbalancer.NetworkLoadBalancerClient, error) {
174194
nlbClient, err := networkloadbalancer.NewNetworkLoadBalancerClientWithConfigurationProvider(ociAuthConfigProvider)
175195
if err != nil {
176196
logger.Error(err, "unable to create OCI LB Client")
177197
return nil, err
178198
}
179199
nlbClient.SetRegion(region)
200+
if c.ociClientOverrides != nil && c.ociClientOverrides.NetworkLoadBalancerClientUrl != nil {
201+
nlbClient.Host = *c.ociClientOverrides.NetworkLoadBalancerClientUrl
202+
}
180203
nlbClient.Interceptor = setVersionHeader()
181204

182205
return &nlbClient, nil
183206
}
184207

185-
func createLBClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*loadbalancer.LoadBalancerClient, error) {
208+
func (c *ClientProvider) createLBClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*loadbalancer.LoadBalancerClient, error) {
186209
lbClient, err := loadbalancer.NewLoadBalancerClientWithConfigurationProvider(ociAuthConfigProvider)
187210
if err != nil {
188211
logger.Error(err, "unable to create OCI LBaaS Client")
189212
return nil, err
190213
}
191214
lbClient.SetRegion(region)
215+
if c.ociClientOverrides != nil && c.ociClientOverrides.LoadBalancerClientUrl != nil {
216+
lbClient.Host = *c.ociClientOverrides.LoadBalancerClientUrl
217+
}
192218
lbClient.Interceptor = setVersionHeader()
193219

194220
return &lbClient, nil
195221
}
196222

197-
func createIdentityClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*identity.IdentityClient, error) {
223+
func (c *ClientProvider) createIdentityClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*identity.IdentityClient, error) {
198224
identityClient, err := identity.NewIdentityClientWithConfigurationProvider(ociAuthConfigProvider)
199225
if err != nil {
200226
logger.Error(err, "unable to create OCI Identity Client")
201227
return nil, err
202228
}
203229
identityClient.SetRegion(region)
230+
231+
if c.ociClientOverrides != nil && c.ociClientOverrides.IdentityClientUrl != nil {
232+
identityClient.Host = *c.ociClientOverrides.IdentityClientUrl
233+
}
204234
identityClient.Interceptor = setVersionHeader()
205235

206236
return &identityClient, nil
207237
}
208238

209-
func createComputeClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeClient, error) {
239+
func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeClient, error) {
210240
computeClient, err := core.NewComputeClientWithConfigurationProvider(ociAuthConfigProvider)
211241
if err != nil {
212242
logger.Error(err, "unable to create OCI Compute Client")
213243
return nil, err
214244
}
215245
computeClient.SetRegion(region)
246+
if c.ociClientOverrides != nil && c.ociClientOverrides.ComputeClientUrl != nil {
247+
computeClient.Host = *c.ociClientOverrides.ComputeClientUrl
248+
}
216249
computeClient.Interceptor = setVersionHeader()
217250

218251
return &computeClient, nil
219252
}
220253

221-
func createComputeManagementClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeManagementClient, error) {
254+
func (c *ClientProvider) createComputeManagementClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeManagementClient, error) {
222255
computeManagementClient, err := core.NewComputeManagementClientWithConfigurationProvider(ociAuthConfigProvider)
223256
if err != nil {
224257
logger.Error(err, "unable to create OCI Compute Management Client")
225258
return nil, err
226259
}
227260
computeManagementClient.SetRegion(region)
261+
if c.ociClientOverrides != nil && c.ociClientOverrides.ComputeManagementClientUrl != nil {
262+
computeManagementClient.Host = *c.ociClientOverrides.ComputeManagementClientUrl
263+
}
228264
computeManagementClient.Interceptor = setVersionHeader()
229265

230266
return &computeManagementClient, nil
231267
}
232268

233-
func createContainerEngineClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*containerengine.ContainerEngineClient, error) {
269+
func (c *ClientProvider) createContainerEngineClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*containerengine.ContainerEngineClient, error) {
234270
containerEngineClient, err := containerengine.NewContainerEngineClientWithConfigurationProvider(ociAuthConfigProvider)
235271
if err != nil {
236272
logger.Error(err, "unable to create OCI Container Engine Client")
237273
return nil, err
238274
}
239275
containerEngineClient.SetRegion(region)
276+
if c.ociClientOverrides != nil && c.ociClientOverrides.ContainerEngineClientUrl != nil {
277+
containerEngineClient.Host = *c.ociClientOverrides.ContainerEngineClientUrl
278+
}
240279
containerEngineClient.Interceptor = setVersionHeader()
241280

242281
return &containerEngineClient, nil
243282
}
244283

245-
func createBaseClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (base.BaseClient, error) {
284+
func (c *ClientProvider) createBaseClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (base.BaseClient, error) {
246285
baseClient, err := base.NewBaseClient(ociAuthConfigProvider, logger)
247286
if err != nil {
248287
logger.Error(err, "unable to create OCI Base Client")

0 commit comments

Comments
 (0)