Skip to content

Commit

Permalink
feat: allow OCI client endpoint override per cluster (#248)
Browse files Browse the repository at this point in the history
This allows users to define individual client URL overrides per cluster in yaml.
  • Loading branch information
joekr committed Apr 26, 2023
1 parent dd9791d commit f4f9841
Show file tree
Hide file tree
Showing 22 changed files with 486 additions and 30 deletions.
1 change: 1 addition & 0 deletions api/v1beta1/ocicluster_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ func (src *OCICluster) ConvertTo(dstRaw conversion.Hub) error {
dst.Spec.NetworkSpec.Vcn.InternetGateway.Skip = restored.Spec.NetworkSpec.Vcn.InternetGateway.Skip
dst.Spec.NetworkSpec.Vcn.RouteTable.Skip = restored.Spec.NetworkSpec.Vcn.RouteTable.Skip
dst.Spec.NetworkSpec.APIServerLB.LoadBalancerType = restored.Spec.NetworkSpec.APIServerLB.LoadBalancerType
dst.Spec.ClientOverrides = restored.Spec.ClientOverrides

return nil
}
Expand Down
1 change: 1 addition & 0 deletions api/v1beta1/ociclustertemplate_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ func (src *OCIClusterTemplate) ConvertTo(dstRaw conversion.Hub) error {
dst.Spec.Template.Spec.NetworkSpec.Vcn.RouteTable.Skip = restored.Spec.Template.Spec.NetworkSpec.Vcn.RouteTable.Skip
dst.Spec.Template.Spec.AvailabilityDomains = restored.Spec.Template.Spec.AvailabilityDomains
dst.Spec.Template.Spec.NetworkSpec.APIServerLB.LoadBalancerType = restored.Spec.Template.Spec.NetworkSpec.APIServerLB.LoadBalancerType
dst.Spec.Template.Spec.ClientOverrides = restored.Spec.Template.Spec.ClientOverrides
return nil
}

Expand Down
1 change: 1 addition & 0 deletions api/v1beta1/zz_generated.conversion.go

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

52 changes: 52 additions & 0 deletions api/v1beta2/ocicluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ type OCIClusterSpec struct {
// where the map key is the AD name and the struct is details about the AD.
// +optional
AvailabilityDomains map[string]OCIAvailabilityDomain `json:"availabilityDomains,omitempty"`

// ClientOverrides allows the default client SDK URLs to be changed.
//
// +optional
// +nullable
ClientOverrides *ClientOverrides `json:"clientOverrides,omitempty"`
}

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

// ClientOverrides contains information about client host url overrides.
type ClientOverrides struct {

// ComputeClientUrl allows the default compute SDK client URL to be changed.
//
// +optional
// +nullable
ComputeClientUrl *string `json:"computeClientUrl,omitempty"`

// ComputeManagementClientUrl allows the default compute management SDK client URL to be changed.
//
// +optional
// +nullable
ComputeManagementClientUrl *string `json:"computeManagementClientUrl,omitempty"`

// VCNClientUrl allows the default vcn SDK client URL to be changed.
//
// +optional
// +nullable
VCNClientUrl *string `json:"vCNClientUrl,omitempty"`

// LoadBalancerClientUrl allows the default load balancer SDK client URL to be changed.
//
// +optional
// +nullable
LoadBalancerClientUrl *string `json:"loadBalancerClientUrl,omitempty"`

// NetworkLoadBalancerClientUrl allows the default NLB SDK client URL to be changed.
//
// +optional
// +nullable
NetworkLoadBalancerClientUrl *string `json:"networkLoadBalancerClientUrl,omitempty"`

// IdentityClientUrl allows the default identity SDK client URL to be changed.
//
// +optional
// +nullable
IdentityClientUrl *string `json:"identityClientUrl,omitempty"`

// ContainerEngineClientUrl allows the default container engine SDK client URL to be changed.
//
// +optional
// +nullable
ContainerEngineClientUrl *string `json:"containerEngineClientUrl,omitempty"`
}

// GetConditions returns the list of conditions for an OCICluster API object.
func (c *OCICluster) GetConditions() clusterv1.Conditions {
return c.Status.Conditions
Expand Down
55 changes: 55 additions & 0 deletions api/v1beta2/zz_generated.deepcopy.go

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

81 changes: 60 additions & 21 deletions cloud/scope/clients.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"sync"

"github.com/go-logr/logr"
"github.com/oracle/cluster-api-provider-oci/api/v1beta2"
"github.com/oracle/cluster-api-provider-oci/cloud/services/base"
"github.com/oracle/cluster-api-provider-oci/cloud/services/compute"
"github.com/oracle/cluster-api-provider-oci/cloud/services/computemanagement"
Expand Down Expand Up @@ -58,26 +59,42 @@ type ClientProvider struct {
ociClients map[string]OCIClients
ociClientsLock *sync.RWMutex
ociAuthConfigProvider common.ConfigurationProvider
ociClientOverrides *v1beta2.ClientOverrides
}

// ClientProviderParams is the params struct for NewClientProvider
type ClientProviderParams struct {
// OciAuthConfigProvider wraps information about the account owner
OciAuthConfigProvider common.ConfigurationProvider

// ClientOverrides contains information about client host url overrides.
ClientOverrides *v1beta2.ClientOverrides
}

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

if ociAuthConfigProvider == nil {
if params.OciAuthConfigProvider == nil {
return nil, errors.New("ConfigurationProvider can not be nil")
}

provider := ClientProvider{
Logger: &log,
ociAuthConfigProvider: ociAuthConfigProvider,
ociAuthConfigProvider: params.OciAuthConfigProvider,
ociClients: map[string]OCIClients{},
ociClientsLock: new(sync.RWMutex),
ociClientOverrides: params.ClientOverrides,
}

return &provider, nil
}

// GetAuthProvider returns the client provider auth config
func (c *ClientProvider) GetAuthProvider() common.ConfigurationProvider {
return c.ociAuthConfigProvider
}

// GetOrBuildClient if the OCIClients exist for the region they are returned, if not clients will build them
func (c *ClientProvider) GetOrBuildClient(region string) (OCIClients, error) {
if len(region) <= 0 {
Expand All @@ -94,7 +111,7 @@ func (c *ClientProvider) GetOrBuildClient(region string) (OCIClients, error) {

c.ociClientsLock.Lock()
defer c.ociClientsLock.Unlock()
regionalClient, err := createClients(region, c.ociAuthConfigProvider, c.Logger)
regionalClient, err := c.createClients(region)
if err != nil {
return regionalClient, err
}
Expand All @@ -108,36 +125,36 @@ func (c *ClientProvider) GetRegion() (string, error) {
return c.ociAuthConfigProvider.Region()
}

func createClients(region string, oCIAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (OCIClients, error) {
vcnClient, err := createVncClient(region, oCIAuthConfigProvider, logger)
func (c *ClientProvider) createClients(region string) (OCIClients, error) {
vcnClient, err := c.createVncClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
nlbClient, err := createNLbClient(region, oCIAuthConfigProvider, logger)
nlbClient, err := c.createNLbClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
lbClient, err := createLBClient(region, oCIAuthConfigProvider, logger)
lbClient, err := c.createLBClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
identityClient, err := createIdentityClient(region, oCIAuthConfigProvider, logger)
identityClient, err := c.createIdentityClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
computeClient, err := createComputeClient(region, oCIAuthConfigProvider, logger)
computeClient, err := c.createComputeClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
computeManagementClient, err := createComputeManagementClient(region, oCIAuthConfigProvider, logger)
computeManagementClient, err := c.createComputeManagementClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
containerEngineClient, err := createContainerEngineClient(region, oCIAuthConfigProvider, logger)
containerEngineClient, err := c.createContainerEngineClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
baseClient, err := createBaseClient(region, oCIAuthConfigProvider, logger)
baseClient, err := c.createBaseClient(region, c.ociAuthConfigProvider, c.Logger)
if err != nil {
return OCIClients{}, err
}
Expand All @@ -158,91 +175,113 @@ func createClients(region string, oCIAuthConfigProvider common.ConfigurationProv
}, err
}

func createVncClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.VirtualNetworkClient, error) {
func (c *ClientProvider) createVncClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.VirtualNetworkClient, error) {
vcnClient, err := core.NewVirtualNetworkClientWithConfigurationProvider(ociAuthConfigProvider)
if err != nil {
logger.Error(err, "unable to create OCI VCN Client")
return nil, err
}
vcnClient.SetRegion(region)
if c.ociClientOverrides != nil && c.ociClientOverrides.VCNClientUrl != nil {
vcnClient.Host = *c.ociClientOverrides.VCNClientUrl
}
vcnClient.Interceptor = setVersionHeader()

return &vcnClient, nil
}

func createNLbClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*networkloadbalancer.NetworkLoadBalancerClient, error) {
func (c *ClientProvider) createNLbClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*networkloadbalancer.NetworkLoadBalancerClient, error) {
nlbClient, err := networkloadbalancer.NewNetworkLoadBalancerClientWithConfigurationProvider(ociAuthConfigProvider)
if err != nil {
logger.Error(err, "unable to create OCI LB Client")
return nil, err
}
nlbClient.SetRegion(region)
if c.ociClientOverrides != nil && c.ociClientOverrides.NetworkLoadBalancerClientUrl != nil {
nlbClient.Host = *c.ociClientOverrides.NetworkLoadBalancerClientUrl
}
nlbClient.Interceptor = setVersionHeader()

return &nlbClient, nil
}

func createLBClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*loadbalancer.LoadBalancerClient, error) {
func (c *ClientProvider) createLBClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*loadbalancer.LoadBalancerClient, error) {
lbClient, err := loadbalancer.NewLoadBalancerClientWithConfigurationProvider(ociAuthConfigProvider)
if err != nil {
logger.Error(err, "unable to create OCI LBaaS Client")
return nil, err
}
lbClient.SetRegion(region)
if c.ociClientOverrides != nil && c.ociClientOverrides.LoadBalancerClientUrl != nil {
lbClient.Host = *c.ociClientOverrides.LoadBalancerClientUrl
}
lbClient.Interceptor = setVersionHeader()

return &lbClient, nil
}

func createIdentityClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*identity.IdentityClient, error) {
func (c *ClientProvider) createIdentityClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*identity.IdentityClient, error) {
identityClient, err := identity.NewIdentityClientWithConfigurationProvider(ociAuthConfigProvider)
if err != nil {
logger.Error(err, "unable to create OCI Identity Client")
return nil, err
}
identityClient.SetRegion(region)

if c.ociClientOverrides != nil && c.ociClientOverrides.IdentityClientUrl != nil {
identityClient.Host = *c.ociClientOverrides.IdentityClientUrl
}
identityClient.Interceptor = setVersionHeader()

return &identityClient, nil
}

func createComputeClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeClient, error) {
func (c *ClientProvider) createComputeClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeClient, error) {
computeClient, err := core.NewComputeClientWithConfigurationProvider(ociAuthConfigProvider)
if err != nil {
logger.Error(err, "unable to create OCI Compute Client")
return nil, err
}
computeClient.SetRegion(region)
if c.ociClientOverrides != nil && c.ociClientOverrides.ComputeClientUrl != nil {
computeClient.Host = *c.ociClientOverrides.ComputeClientUrl
}
computeClient.Interceptor = setVersionHeader()

return &computeClient, nil
}

func createComputeManagementClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeManagementClient, error) {
func (c *ClientProvider) createComputeManagementClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*core.ComputeManagementClient, error) {
computeManagementClient, err := core.NewComputeManagementClientWithConfigurationProvider(ociAuthConfigProvider)
if err != nil {
logger.Error(err, "unable to create OCI Compute Management Client")
return nil, err
}
computeManagementClient.SetRegion(region)
if c.ociClientOverrides != nil && c.ociClientOverrides.ComputeManagementClientUrl != nil {
computeManagementClient.Host = *c.ociClientOverrides.ComputeManagementClientUrl
}
computeManagementClient.Interceptor = setVersionHeader()

return &computeManagementClient, nil
}

func createContainerEngineClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*containerengine.ContainerEngineClient, error) {
func (c *ClientProvider) createContainerEngineClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (*containerengine.ContainerEngineClient, error) {
containerEngineClient, err := containerengine.NewContainerEngineClientWithConfigurationProvider(ociAuthConfigProvider)
if err != nil {
logger.Error(err, "unable to create OCI Container Engine Client")
return nil, err
}
containerEngineClient.SetRegion(region)
if c.ociClientOverrides != nil && c.ociClientOverrides.ContainerEngineClientUrl != nil {
containerEngineClient.Host = *c.ociClientOverrides.ContainerEngineClientUrl
}
containerEngineClient.Interceptor = setVersionHeader()

return &containerEngineClient, nil
}

func createBaseClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (base.BaseClient, error) {
func (c *ClientProvider) createBaseClient(region string, ociAuthConfigProvider common.ConfigurationProvider, logger *logr.Logger) (base.BaseClient, error) {
baseClient, err := base.NewBaseClient(ociAuthConfigProvider, logger)
if err != nil {
logger.Error(err, "unable to create OCI Base Client")
Expand Down
Loading

0 comments on commit f4f9841

Please sign in to comment.