Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow OCI client endpoint override per cluster #248

Merged
merged 3 commits into from
Apr 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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"`
joekr marked this conversation as resolved.
Show resolved Hide resolved

// 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()
joekr marked this conversation as resolved.
Show resolved Hide resolved

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)
joekr marked this conversation as resolved.
Show resolved Hide resolved
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