Skip to content

Commit

Permalink
feat: allow OCI client endpoint override per cluster
Browse files Browse the repository at this point in the history
  • Loading branch information
joekr committed Apr 24, 2023
1 parent dd9791d commit cd450a4
Show file tree
Hide file tree
Showing 22 changed files with 329 additions and 27 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.ClientHostUrls = restored.Spec.ClientHostUrls

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.ClientHostUrls = restored.Spec.Template.Spec.ClientHostUrls
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.

46 changes: 46 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"`

// HostUrls allows the default client SDK URLs to be changed.
//
// +optional
// +nullable
ClientHostUrls *ClusterClientHostUrls `json:"clientHostUrls,omitempty"`
}

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

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

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

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

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

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

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

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

// GetConditions returns the list of conditions for an OCICluster API object.
func (c *OCICluster) GetConditions() clusterv1.Conditions {
return c.Status.Conditions
Expand Down
50 changes: 50 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.

66 changes: 47 additions & 19 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,10 +59,11 @@ type ClientProvider struct {
ociClients map[string]OCIClients
ociClientsLock *sync.RWMutex
ociAuthConfigProvider common.ConfigurationProvider
ociClientHostUrls *v1beta2.ClusterClientHostUrls
}

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

if ociAuthConfigProvider == nil {
Expand All @@ -73,11 +75,17 @@ func NewClientProvider(ociAuthConfigProvider common.ConfigurationProvider) (*Cli
ociAuthConfigProvider: ociAuthConfigProvider,
ociClients: map[string]OCIClients{},
ociClientsLock: new(sync.RWMutex),
ociClientHostUrls: clientHostUrlOverrides,
}

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 +102,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 +116,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,19 +166,22 @@ 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.ociClientHostUrls != nil && c.ociClientHostUrls.VCNClientHost != nil {
vcnClient.Host = *c.ociClientHostUrls.VCNClientHost
}
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")
Expand All @@ -182,67 +193,84 @@ func createNLbClient(region string, ociAuthConfigProvider common.ConfigurationPr
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.ociClientHostUrls != nil && c.ociClientHostUrls.LoadBalancerClientHost != nil {
lbClient.Host = *c.ociClientHostUrls.LoadBalancerClientHost
}
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.ociClientHostUrls != nil && c.ociClientHostUrls.IdentityClientHost != nil {
identityClient.Host = *c.ociClientHostUrls.IdentityClientHost
}
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)
//https://dyn.slack.com/archives/C7MS7QWC8/p1675719244230459?thread_ts=1675460644.801049&cid=C7MS7QWC8
if c.ociClientHostUrls != nil && c.ociClientHostUrls.ComputeClientHost != nil {
computeClient.Host = *c.ociClientHostUrls.ComputeClientHost
}
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.ociClientHostUrls != nil && c.ociClientHostUrls.ComputeManagementClientHost != nil {
computeManagementClient.Host = *c.ociClientHostUrls.ComputeManagementClientHost
}
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.ociClientHostUrls != nil && c.ociClientHostUrls.ContainerEngineClientHost != nil {
containerEngineClient.Host = *c.ociClientHostUrls.ContainerEngineClientHost
}
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
4 changes: 2 additions & 2 deletions cloud/scope/clients_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func TestClients_NewClientProvider(t *testing.T) {

}

clientProvider, err := NewClientProvider(ociAuthConfigProvider)
clientProvider, err := NewClientProvider(ociAuthConfigProvider, nil)
if err != nil {
t.Errorf("Expected %v to equal nil", err)
}
Expand All @@ -49,7 +49,7 @@ func TestClients_NewClientProvider(t *testing.T) {

func TestClients_NewClientProviderWithBadAuthConfig(t *testing.T) {

clientProvider, err := NewClientProvider(nil)
clientProvider, err := NewClientProvider(nil, nil)
if err == nil {
t.Errorf("Expected error:%v to not equal nil", err)
}
Expand Down
2 changes: 2 additions & 0 deletions cloud/scope/cluster_accessor.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ type OCIClusterAccessor interface {
GetNameSpace() string
// GetRegion returns the region of the cluster, if specified in the spec.
GetRegion() string
// GetClientHostUrls returns the client host url overrides for the cluster
GetClientHostUrls() *infrastructurev1beta2.ClusterClientHostUrls
// GetNetworkSpec returns the NetworkSpec of the cluster.
GetNetworkSpec() *infrastructurev1beta2.NetworkSpec
// SetControlPlaneEndpoint sets the control plane endpoint of the cluster.
Expand Down
4 changes: 4 additions & 0 deletions cloud/scope/oci_managed_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ func (c OCIManagedCluster) GetRegion() string {
return c.OCIManagedCluster.Spec.Region
}

func (c OCIManagedCluster) GetClientHostUrls() *infrastructurev1beta2.ClusterClientHostUrls {
return c.OCIManagedCluster.Spec.ClientHostUrls
}

func (c OCIManagedCluster) MarkConditionFalse(t clusterv1.ConditionType, reason string, severity clusterv1.ConditionSeverity, messageFormat string, messageArgs ...interface{}) {
conditions.MarkFalse(c.OCIManagedCluster, infrastructurev1beta2.ClusterReadyCondition, reason, severity, messageFormat, messageArgs...)

Expand Down
Loading

0 comments on commit cd450a4

Please sign in to comment.