Skip to content

Commit caf6f04

Browse files
Support custom service endpoints (#680)
Signed-off-by: Prajyot-Parab <[email protected]>
1 parent ac5bab2 commit caf6f04

24 files changed

+550
-88
lines changed

cloud/scope/cluster.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,18 @@ import (
3131

3232
infrav1beta1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta1"
3333
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/vpc"
34+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
3435
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
3536
)
3637

3738
// ClusterScopeParams defines the input parameters used to create a new ClusterScope.
3839
type ClusterScopeParams struct {
39-
IBMVPCClient vpc.Vpc
40-
Client client.Client
41-
Logger logr.Logger
42-
Cluster *capiv1beta1.Cluster
43-
IBMVPCCluster *infrav1beta1.IBMVPCCluster
40+
IBMVPCClient vpc.Vpc
41+
Client client.Client
42+
Logger logr.Logger
43+
Cluster *capiv1beta1.Cluster
44+
IBMVPCCluster *infrav1beta1.IBMVPCCluster
45+
ServiceEndpoint []endpoints.ServiceEndpoint
4446
}
4547

4648
// ClusterScope defines a scope defined around a cluster.
@@ -49,13 +51,14 @@ type ClusterScope struct {
4951
client client.Client
5052
patchHelper *patch.Helper
5153

52-
IBMVPCClient vpc.Vpc
53-
Cluster *capiv1beta1.Cluster
54-
IBMVPCCluster *infrav1beta1.IBMVPCCluster
54+
IBMVPCClient vpc.Vpc
55+
Cluster *capiv1beta1.Cluster
56+
IBMVPCCluster *infrav1beta1.IBMVPCCluster
57+
ServiceEndpoint []endpoints.ServiceEndpoint
5558
}
5659

5760
// NewClusterScope creates a new ClusterScope from the supplied parameters.
58-
func NewClusterScope(params ClusterScopeParams, authenticator core.Authenticator, svcEndpoint string) (*ClusterScope, error) {
61+
func NewClusterScope(params ClusterScopeParams, authenticator core.Authenticator) (*ClusterScope, error) {
5962
if params.Cluster == nil {
6063
return nil, errors.New("failed to generate new scope from nil Cluster")
6164
}
@@ -72,6 +75,9 @@ func NewClusterScope(params ClusterScopeParams, authenticator core.Authenticator
7275
return nil, errors.Wrap(err, "failed to init patch helper")
7376
}
7477

78+
// Fetch the service endpoint.
79+
svcEndpoint := endpoints.FetchVPCEndpoint(params.IBMVPCCluster.Spec.Region, params.ServiceEndpoint)
80+
7581
vpcClient, err := vpc.NewService(svcEndpoint)
7682
if err != nil {
7783
return nil, errors.Wrap(err, "failed to create IBM VPC session")

cloud/scope/machine.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,20 @@ import (
3333

3434
infrav1beta1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta1"
3535
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/vpc"
36+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
3637
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
3738
)
3839

3940
// MachineScopeParams defines the input parameters used to create a new MachineScope.
4041
type MachineScopeParams struct {
41-
IBMVPCClient vpc.Vpc
42-
Client client.Client
43-
Logger logr.Logger
44-
Cluster *capiv1beta1.Cluster
45-
Machine *capiv1beta1.Machine
46-
IBMVPCCluster *infrav1beta1.IBMVPCCluster
47-
IBMVPCMachine *infrav1beta1.IBMVPCMachine
42+
IBMVPCClient vpc.Vpc
43+
Client client.Client
44+
Logger logr.Logger
45+
Cluster *capiv1beta1.Cluster
46+
Machine *capiv1beta1.Machine
47+
IBMVPCCluster *infrav1beta1.IBMVPCCluster
48+
IBMVPCMachine *infrav1beta1.IBMVPCMachine
49+
ServiceEndpoint []endpoints.ServiceEndpoint
4850
}
4951

5052
// MachineScope defines a scope defined around a machine and its cluster.
@@ -53,15 +55,16 @@ type MachineScope struct {
5355
client client.Client
5456
patchHelper *patch.Helper
5557

56-
IBMVPCClient vpc.Vpc
57-
Cluster *capiv1beta1.Cluster
58-
Machine *capiv1beta1.Machine
59-
IBMVPCCluster *infrav1beta1.IBMVPCCluster
60-
IBMVPCMachine *infrav1beta1.IBMVPCMachine
58+
IBMVPCClient vpc.Vpc
59+
Cluster *capiv1beta1.Cluster
60+
Machine *capiv1beta1.Machine
61+
IBMVPCCluster *infrav1beta1.IBMVPCCluster
62+
IBMVPCMachine *infrav1beta1.IBMVPCMachine
63+
ServiceEndpoint []endpoints.ServiceEndpoint
6164
}
6265

6366
// NewMachineScope creates a new MachineScope from the supplied parameters.
64-
func NewMachineScope(params MachineScopeParams, authenticator core.Authenticator, svcEndpoint string) (*MachineScope, error) {
67+
func NewMachineScope(params MachineScopeParams, authenticator core.Authenticator) (*MachineScope, error) {
6568
if params.Machine == nil {
6669
return nil, errors.New("failed to generate new scope from nil Machine")
6770
}
@@ -78,6 +81,9 @@ func NewMachineScope(params MachineScopeParams, authenticator core.Authenticator
7881
return nil, errors.Wrap(err, "failed to init patch helper")
7982
}
8083

84+
// Fetch the service endpoint.
85+
svcEndpoint := endpoints.FetchVPCEndpoint(params.IBMVPCCluster.Spec.Region, params.ServiceEndpoint)
86+
8187
vpcClient, err := vpc.NewService(svcEndpoint)
8288
if err != nil {
8389
return nil, errors.Wrap(err, "failed to create IBM VPC session")

cloud/scope/powervs_cluster.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
3737
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
3838
servicesutils "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/utils"
39+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
3940
)
4041

4142
const (
@@ -49,6 +50,7 @@ type PowerVSClusterScopeParams struct {
4950
Logger logr.Logger
5051
Cluster *capiv1beta1.Cluster
5152
IBMPowerVSCluster *infrav1beta1.IBMPowerVSCluster
53+
ServiceEndpoint []endpoints.ServiceEndpoint
5254
}
5355

5456
// PowerVSClusterScope defines a scope defined around a Power VS Cluster.
@@ -60,6 +62,7 @@ type PowerVSClusterScope struct {
6062
IBMPowerVSClient powervs.PowerVS
6163
Cluster *capiv1beta1.Cluster
6264
IBMPowerVSCluster *infrav1beta1.IBMPowerVSCluster
65+
ServiceEndpoint []endpoints.ServiceEndpoint
6366
}
6467

6568
// NewPowerVSClusterScope creates a new PowerVSClusterScope from the supplied parameters.
@@ -115,6 +118,14 @@ func NewPowerVSClusterScope(params PowerVSClusterScopeParams) (scope *PowerVSClu
115118
return
116119
}
117120

121+
// Fetch the resource controller endpoint.
122+
if rcEndpoint := endpoints.FetchRCEndpoint(params.ServiceEndpoint); rcEndpoint != "" {
123+
if err := rc.SetServiceURL(rcEndpoint); err != nil {
124+
return nil, errors.Wrap(err, "failed to set resource controller endpoint")
125+
}
126+
scope.Logger.V(3).Info("overriding the default resource controller endpoint")
127+
}
128+
118129
res, _, err := rc.GetResourceInstance(
119130
&resourcecontrollerv2.GetResourceInstanceOptions{
120131
ID: core.StringPtr(spec.ServiceInstanceID),
@@ -139,6 +150,13 @@ func NewPowerVSClusterScope(params PowerVSClusterScopeParams) (scope *PowerVSClu
139150
},
140151
CloudInstanceID: spec.ServiceInstanceID,
141152
}
153+
154+
// Fetch the service endpoint.
155+
if svcEndpoint := endpoints.FetchPVSEndpoint(region, params.ServiceEndpoint); svcEndpoint != "" {
156+
options.IBMPIOptions.URL = svcEndpoint
157+
scope.Logger.V(3).Info("overriding the default powervs service endpoint")
158+
}
159+
142160
c, err := powervs.NewService(options)
143161
if err != nil {
144162
err = fmt.Errorf("failed to create NewIBMPowerVSClient")

cloud/scope/powervs_image.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
3737
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
3838
servicesutils "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/utils"
39+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
3940
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
4041
)
4142

@@ -44,9 +45,11 @@ const BucketAccess = "public"
4445

4546
// PowerVSImageScopeParams defines the input parameters used to create a new PowerVSImageScope.
4647
type PowerVSImageScopeParams struct {
47-
Client client.Client
48-
Logger logr.Logger
49-
IBMPowerVSImage *infrav1beta1.IBMPowerVSImage
48+
Client client.Client
49+
Logger logr.Logger
50+
IBMPowerVSImage *infrav1beta1.IBMPowerVSImage
51+
IBMPowerVSCluster *infrav1beta1.IBMPowerVSCluster
52+
ServiceEndpoint []endpoints.ServiceEndpoint
5053
}
5154

5255
// PowerVSImageScope defines a scope defined around a Power VS Cluster.
@@ -55,8 +58,10 @@ type PowerVSImageScope struct {
5558
client client.Client
5659
patchHelper *patch.Helper
5760

58-
IBMPowerVSClient powervs.PowerVS
59-
IBMPowerVSImage *infrav1beta1.IBMPowerVSImage
61+
IBMPowerVSClient powervs.PowerVS
62+
IBMPowerVSImage *infrav1beta1.IBMPowerVSImage
63+
IBMPowerVSCluster *infrav1beta1.IBMPowerVSCluster
64+
ServiceEndpoint []endpoints.ServiceEndpoint
6065
}
6166

6267
// NewPowerVSImageScope creates a new PowerVSImageScope from the supplied parameters.
@@ -106,6 +111,14 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
106111
return
107112
}
108113

114+
// Fetch the resource controller endpoint.
115+
if rcEndpoint := endpoints.FetchRCEndpoint(params.ServiceEndpoint); rcEndpoint != "" {
116+
if err := rc.SetServiceURL(rcEndpoint); err != nil {
117+
return nil, errors.Wrap(err, "failed to set resource controller endpoint")
118+
}
119+
scope.Logger.V(3).Info("overriding the default resource controller endpoint")
120+
}
121+
109122
res, _, err := rc.GetResourceInstance(
110123
&resourcecontrollerv2.GetResourceInstanceOptions{
111124
ID: core.StringPtr(spec.ServiceInstanceID),
@@ -130,8 +143,20 @@ func NewPowerVSImageScope(params PowerVSImageScopeParams) (scope *PowerVSImageSc
130143
},
131144
CloudInstanceID: spec.ServiceInstanceID,
132145
}
133-
c, err := powervs.NewService(options)
134146

147+
if params.IBMPowerVSCluster == nil {
148+
err = errors.New("failed to generate new scope from nil IBMPowerVSCluster")
149+
return
150+
}
151+
scope.IBMPowerVSCluster = params.IBMPowerVSCluster
152+
153+
// Fetch the service endpoint.
154+
if svcEndpoint := endpoints.FetchPVSEndpoint(region, params.ServiceEndpoint); svcEndpoint != "" {
155+
options.IBMPIOptions.URL = svcEndpoint
156+
scope.Logger.V(3).Info("overriding the default powervs service endpoint")
157+
}
158+
159+
c, err := powervs.NewService(options)
135160
if err != nil {
136161
err = fmt.Errorf("failed to create NewIBMPowerVSClient")
137162
return

cloud/scope/powervs_machine.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import (
4545
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
4646
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
4747
servicesutils "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/utils"
48+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
4849
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/options"
4950
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
5051
)
@@ -58,6 +59,7 @@ type PowerVSMachineScopeParams struct {
5859
IBMPowerVSCluster *infrav1beta1.IBMPowerVSCluster
5960
IBMPowerVSMachine *infrav1beta1.IBMPowerVSMachine
6061
IBMPowerVSImage *infrav1beta1.IBMPowerVSImage
62+
ServiceEndpoint []endpoints.ServiceEndpoint
6163
}
6264

6365
// PowerVSMachineScope defines a scope defined around a Power VS Machine.
@@ -72,6 +74,7 @@ type PowerVSMachineScope struct {
7274
IBMPowerVSCluster *infrav1beta1.IBMPowerVSCluster
7375
IBMPowerVSMachine *infrav1beta1.IBMPowerVSMachine
7476
IBMPowerVSImage *infrav1beta1.IBMPowerVSImage
77+
ServiceEndpoint []endpoints.ServiceEndpoint
7578
}
7679

7780
// NewPowerVSMachineScope creates a new PowerVSMachineScope from the supplied parameters.
@@ -135,6 +138,14 @@ func NewPowerVSMachineScope(params PowerVSMachineScopeParams) (scope *PowerVSMac
135138
return
136139
}
137140

141+
// Fetch the resource controller endpoint.
142+
if rcEndpoint := endpoints.FetchRCEndpoint(params.ServiceEndpoint); rcEndpoint != "" {
143+
if err := rc.SetServiceURL(rcEndpoint); err != nil {
144+
return nil, errors.Wrap(err, "failed to set resource controller endpoint")
145+
}
146+
scope.Logger.V(3).Info("overriding the default resource controller endpoint")
147+
}
148+
138149
res, _, err := rc.GetResourceInstance(
139150
&resourcecontrollerv2.GetResourceInstanceOptions{
140151
ID: core.StringPtr(m.Spec.ServiceInstanceID),
@@ -161,6 +172,13 @@ func NewPowerVSMachineScope(params PowerVSMachineScopeParams) (scope *PowerVSMac
161172
},
162173
CloudInstanceID: m.Spec.ServiceInstanceID,
163174
}
175+
176+
// Fetch the service endpoint.
177+
if svcEndpoint := endpoints.FetchPVSEndpoint(region, params.ServiceEndpoint); svcEndpoint != "" {
178+
options.IBMPIOptions.URL = svcEndpoint
179+
scope.Logger.V(3).Info("overriding the default powervs service endpoint")
180+
}
181+
164182
c, err := powervs.NewService(options)
165183
if err != nil {
166184
err = fmt.Errorf("failed to create PowerVS service")

config/default/credentials.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ stringData:
88
ibm-credentials.env: |-
99
IBMCLOUD_AUTH_TYPE=iam
1010
IBMCLOUD_APIKEY=${IBMCLOUD_API_KEY}
11-
IBMCLOUD_AUTH_URL=https://iam.cloud.ibm.com
11+
IBMCLOUD_AUTH_URL=${IBMCLOUD_AUTH_URL:=https://iam.cloud.ibm.com}

config/manager/manager.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ spec:
2929
- "--leader-elect"
3030
- "--metrics-bind-addr=127.0.0.1:8080"
3131
- "--powervs-provider-id-fmt=${POWERVS_PROVIDER_ID_FORMAT:=v1}"
32+
- "--service-endpoint=${SERVICE_ENDPOINT:=}"
3233
- "--v=${LOGLEVEL:=0}"
3334
image: controller:latest
3435
name: manager

controllers/ibmpowervscluster_controller.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,16 @@ import (
3737

3838
infrav1beta1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta1"
3939
"sigs.k8s.io/cluster-api-provider-ibmcloud/cloud/scope"
40+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
4041
)
4142

4243
// IBMPowerVSClusterReconciler reconciles a IBMPowerVSCluster object.
4344
type IBMPowerVSClusterReconciler struct {
4445
client.Client
45-
Log logr.Logger
46-
Recorder record.EventRecorder
47-
Scheme *runtime.Scheme
46+
Log logr.Logger
47+
Recorder record.EventRecorder
48+
ServiceEndpoint []endpoints.ServiceEndpoint
49+
Scheme *runtime.Scheme
4850
}
4951

5052
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=ibmpowervsclusters,verbs=get;list;watch;create;update;patch;delete
@@ -80,6 +82,7 @@ func (r *IBMPowerVSClusterReconciler) Reconcile(ctx context.Context, req ctrl.Re
8082
Logger: log,
8183
Cluster: cluster,
8284
IBMPowerVSCluster: ibmCluster,
85+
ServiceEndpoint: r.ServiceEndpoint,
8386
})
8487

8588
// Always close the scope when exiting this function so we can persist any GCPMachine changes.

controllers/ibmpowervsimage_controller.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,17 @@ import (
3838

3939
infrav1beta1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta1"
4040
"sigs.k8s.io/cluster-api-provider-ibmcloud/cloud/scope"
41+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
4142
"sigs.k8s.io/cluster-api-provider-ibmcloud/util"
4243
)
4344

4445
// IBMPowerVSImageReconciler reconciles a IBMPowerVSImage object.
4546
type IBMPowerVSImageReconciler struct {
4647
client.Client
47-
Log logr.Logger
48-
Recorder record.EventRecorder
49-
Scheme *runtime.Scheme
48+
Log logr.Logger
49+
Recorder record.EventRecorder
50+
ServiceEndpoint []endpoints.ServiceEndpoint
51+
Scheme *runtime.Scheme
5052
}
5153

5254
//+kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=ibmpowervsimages,verbs=get;list;watch;create;update;patch;delete
@@ -72,9 +74,11 @@ func (r *IBMPowerVSImageReconciler) Reconcile(ctx context.Context, req ctrl.Requ
7274

7375
// Create the scope.
7476
imageScope, err := scope.NewPowerVSImageScope(scope.PowerVSImageScopeParams{
75-
Client: r.Client,
76-
Logger: log,
77-
IBMPowerVSImage: ibmImage,
77+
Client: r.Client,
78+
Logger: log,
79+
IBMPowerVSImage: ibmImage,
80+
IBMPowerVSCluster: cluster,
81+
ServiceEndpoint: r.ServiceEndpoint,
7882
})
7983

8084
// Always close the scope when exiting this function so we can persist any GCPMachine changes.

controllers/ibmpowervsmachine_controller.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,17 @@ import (
3636

3737
infrav1beta1 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta1"
3838
"sigs.k8s.io/cluster-api-provider-ibmcloud/cloud/scope"
39+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
3940
capibmrecord "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
4041
)
4142

4243
// IBMPowerVSMachineReconciler reconciles a IBMPowerVSMachine object.
4344
type IBMPowerVSMachineReconciler struct {
4445
client.Client
45-
Log logr.Logger
46-
Recorder record.EventRecorder
47-
Scheme *runtime.Scheme
46+
Log logr.Logger
47+
Recorder record.EventRecorder
48+
ServiceEndpoint []endpoints.ServiceEndpoint
49+
Scheme *runtime.Scheme
4850
}
4951

5052
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=ibmpowervsmachines,verbs=get;list;watch;create;update;patch;delete
@@ -114,6 +116,7 @@ func (r *IBMPowerVSMachineReconciler) Reconcile(ctx context.Context, req ctrl.Re
114116
Machine: machine,
115117
IBMPowerVSMachine: ibmPowerVSMachine,
116118
IBMPowerVSImage: ibmPowerVSImage,
119+
ServiceEndpoint: r.ServiceEndpoint,
117120
})
118121
if err != nil {
119122
return ctrl.Result{}, errors.Errorf("failed to create scope: %+v", err)

0 commit comments

Comments
 (0)