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

// ComputeClientHost allows the default compute SDK client URL to be changed.
//
// +optional
// +nullable
ComputeClientHost *string `json:"computeClientHost,omitempty"`
joekr marked this conversation as resolved.
Show resolved Hide resolved

// 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"`
joekr marked this conversation as resolved.
Show resolved Hide resolved
}

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