Skip to content

Commit dea3da8

Browse files
committed
Support previous cluster creation workflow
1 parent 78987ec commit dea3da8

16 files changed

+147
-196
lines changed

api/v1beta1/ibmpowervs_conversion.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func Convert_v1beta2_IBMPowerVSMachineSpec_To_v1beta1_IBMPowerVSMachineSpec(in *
195195
}
196196

197197
func Convert_v1beta2_IBMPowerVSClusterSpec_To_v1beta1_IBMPowerVSClusterSpec(in *infrav1beta2.IBMPowerVSClusterSpec, out *IBMPowerVSClusterSpec, s apiconversion.Scope) error {
198-
if in.ServiceInstance.ID != nil {
198+
if in.ServiceInstance != nil && in.ServiceInstance.ID != nil {
199199
out.ServiceInstanceID = *in.ServiceInstance.ID
200200
}
201201
return autoConvert_v1beta2_IBMPowerVSClusterSpec_To_v1beta1_IBMPowerVSClusterSpec(in, out, s)

api/v1beta2/ibmpowervscluster_types.go

-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ type IBMPowerVSClusterSpec struct {
5656

5757
// zone is the name of Power VS zone where the cluster will be created
5858
// possible values can be found here https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-creating-power-virtual-server.
59-
// when omitted syd04 will be set as default zone.
60-
// +kubebuilder:default=dal10
6159
// +optional
6260
Zone *string `json:"zone,omitempty"`
6361

cloud/scope/powervs_cluster.go

+71-17
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,45 @@ func NewPowerVSClusterScope(params PowerVSClusterScopeParams) (*PowerVSClusterSc
165165
return nil, err
166166
}
167167

168+
options := powervs.ServiceOptions{
169+
IBMPIOptions: &ibmpisession.IBMPIOptions{
170+
Debug: params.Logger.V(DEBUGLEVEL).Enabled(),
171+
},
172+
}
173+
174+
if params.IBMPowerVSCluster.Spec.ServiceInstanceID != "" {
175+
rc, err := resourcecontroller.NewService(resourcecontroller.ServiceOptions{})
176+
if err != nil {
177+
return nil, err
178+
}
179+
180+
// Fetch the resource controller endpoint.
181+
if rcEndpoint := endpoints.FetchRCEndpoint(params.ServiceEndpoint); rcEndpoint != "" {
182+
if err := rc.SetServiceURL(rcEndpoint); err != nil {
183+
return nil, fmt.Errorf("failed to set resource controller endpoint: %w", err)
184+
}
185+
}
186+
187+
res, _, err := rc.GetResourceInstance(
188+
&resourcecontrollerv2.GetResourceInstanceOptions{
189+
ID: core.StringPtr(params.IBMPowerVSCluster.Spec.ServiceInstanceID),
190+
})
191+
if err != nil {
192+
err = fmt.Errorf("failed to get resource instance: %w", err)
193+
return nil, err
194+
}
195+
options.Zone = *res.RegionID
196+
options.CloudInstanceID = params.IBMPowerVSCluster.Spec.ServiceInstanceID
197+
} else {
198+
options.Zone = *params.IBMPowerVSCluster.Spec.Zone
199+
}
200+
201+
// TODO(karhtik-k-n): may be optimize NewService to use the session created here
202+
powerVSClient, err := powervs.NewService(options)
203+
if err != nil {
204+
return nil, fmt.Errorf("error failed to create power vs client %w", err)
205+
}
206+
168207
auth, err := authenticator.GetAuthenticator()
169208
if err != nil {
170209
return nil, fmt.Errorf("error failed to create authenticator %w", err)
@@ -177,23 +216,26 @@ func NewPowerVSClusterScope(params PowerVSClusterScopeParams) (*PowerVSClusterSc
177216
sessionOptions := &ibmpisession.IBMPIOptions{
178217
Authenticator: auth,
179218
UserAccount: account,
180-
Zone: *params.IBMPowerVSCluster.Spec.Zone,
219+
Zone: options.Zone,
181220
}
182221
session, err := ibmpisession.NewIBMPISession(sessionOptions)
183222
if err != nil {
184223
return nil, fmt.Errorf("error failed to get power vs session %w", err)
185224
}
186-
options := powervs.ServiceOptions{
187-
IBMPIOptions: &ibmpisession.IBMPIOptions{
188-
Debug: params.Logger.V(DEBUGLEVEL).Enabled(),
189-
Zone: *params.IBMPowerVSCluster.Spec.Zone,
190-
},
191-
}
192-
// TODO(karhtik-k-n): may be optimize NewService to use the session created here
193-
powerVSClient, err := powervs.NewService(options)
194-
if err != nil {
195-
return nil, fmt.Errorf("error failed to create power vs client %w", err)
225+
226+
if !genUtil.CreateInfra(*params.IBMPowerVSCluster) {
227+
return &PowerVSClusterScope{
228+
session: session,
229+
Logger: params.Logger,
230+
Client: params.Client,
231+
patchHelper: helper,
232+
Cluster: params.Cluster,
233+
IBMPowerVSCluster: params.IBMPowerVSCluster,
234+
ServiceEndpoint: params.ServiceEndpoint,
235+
IBMPowerVSClient: powerVSClient,
236+
}, nil
196237
}
238+
197239
if params.IBMPowerVSCluster.Spec.VPC == nil || params.IBMPowerVSCluster.Spec.VPC.Region == nil {
198240
return nil, fmt.Errorf("error failed to generate vpc client as VPC info is nil")
199241
}
@@ -334,6 +376,12 @@ func (s *PowerVSClusterScope) SetStatus(resourceType ResourceType, resource infr
334376
return
335377
}
336378
s.IBMPowerVSCluster.Status.DHCPServer.Set(resource)
379+
case COSInstance:
380+
if s.IBMPowerVSCluster.Status.COSInstance == nil {
381+
s.IBMPowerVSCluster.Status.COSInstance = &resource
382+
return
383+
}
384+
s.IBMPowerVSCluster.Status.COSInstance.Set(resource)
337385
}
338386
}
339387

@@ -1246,15 +1294,15 @@ func (s *PowerVSClusterScope) ReconcileCOSInstance() error {
12461294
return err
12471295
}
12481296
if cosServiceInstanceStatus != nil {
1249-
s.SetStatus(TransitGateway, infrav1beta2.ResourceReference{ID: cosServiceInstanceStatus.GUID, ControllerCreated: pointer.Bool(false)})
1297+
s.SetStatus(COSInstance, infrav1beta2.ResourceReference{ID: cosServiceInstanceStatus.GUID, ControllerCreated: pointer.Bool(false)})
12501298
} else {
12511299
// create COS service instance
12521300
cosServiceInstanceStatus, err = s.createCOSServiceInstance()
12531301
if err != nil {
12541302
s.Error(err, "error creating cos service instance")
12551303
return err
12561304
}
1257-
s.SetStatus(TransitGateway, infrav1beta2.ResourceReference{ID: cosServiceInstanceStatus.GUID, ControllerCreated: pointer.Bool(true)})
1305+
s.SetStatus(COSInstance, infrav1beta2.ResourceReference{ID: cosServiceInstanceStatus.GUID, ControllerCreated: pointer.Bool(true)})
12581306
}
12591307

12601308
apiKey := os.Getenv("IBMCLOUD_API_KEY")
@@ -1271,7 +1319,9 @@ func (s *PowerVSClusterScope) ReconcileCOSInstance() error {
12711319
s.COSClient = cosClient
12721320

12731321
// check bucket exist in service instance
1274-
if exist, err := s.checkCOSBucket(); exist || err != nil {
1322+
if exist, err := s.checkCOSBucket(); exist {
1323+
return nil
1324+
} else if err != nil {
12751325
s.Error(err, "error checking cos bucket")
12761326
return err
12771327
}
@@ -1319,6 +1369,8 @@ func (s *PowerVSClusterScope) createCOSBucket() error {
13191369
// If bucket already exists, all good.
13201370
case s3.ErrCodeBucketAlreadyOwnedByYou:
13211371
return nil
1372+
case s3.ErrCodeBucketAlreadyExists:
1373+
return nil
13221374
default:
13231375
return fmt.Errorf("error creating COS bucket %w", err)
13241376
}
@@ -1353,12 +1405,10 @@ func (s *PowerVSClusterScope) createCOSServiceInstance() (*resourcecontrollerv2.
13531405
// return nil, fmt.Errorf("error retrieving id info for powervs service %w", err)
13541406
//}
13551407

1356-
//TODO(karthik-k-n): add funciton to fetch name
13571408
target := "Global"
1358-
serviceInstanceName := fmt.Sprintf("%s-%s", s.InfraCluster().GetName(), "cosInstance")
13591409
// create service instance
13601410
serviceInstance, _, err := s.ResourceClient.CreateResourceInstance(&resourcecontrollerv2.CreateResourceInstanceOptions{
1361-
Name: &serviceInstanceName,
1411+
Name: s.GetServiceName(COSInstance),
13621412
Target: &target,
13631413
ResourceGroup: &resourceGroupID,
13641414
ResourcePlanID: pointer.String(cosResourcePlanID),
@@ -1708,6 +1758,10 @@ func (s *PowerVSClusterScope) DeleteCosInstance() error {
17081758
return fmt.Errorf("error fetching COS instance: %w", err)
17091759
}
17101760

1761+
if cosInstance != nil && (*cosInstance.State == "pending_reclamation" || *cosInstance.State == string(infrav1beta2.ServiceInstanceStateRemoved)) {
1762+
return nil
1763+
}
1764+
17111765
_, err = s.ResourceClient.DeleteResourceInstance(&resourcecontrollerv2.DeleteResourceInstanceOptions{
17121766
ID: cosInstance.ID,
17131767
Recursive: pointer.Bool(true),

cloud/scope/powervs_image.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,22 @@ import (
2020
"context"
2121
"errors"
2222
"fmt"
23-
"github.com/IBM/platform-services-go-sdk/resourcecontrollerv2"
23+
2424
"github.com/go-logr/logr"
25-
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
2625

2726
"github.com/IBM-Cloud/power-go-client/ibmpisession"
2827
"github.com/IBM-Cloud/power-go-client/power/models"
2928
"github.com/IBM/go-sdk-core/v5/core"
30-
"k8s.io/klog/v2/klogr"
29+
"github.com/IBM/platform-services-go-sdk/resourcecontrollerv2"
3130

31+
"k8s.io/klog/v2/klogr"
3232
"sigs.k8s.io/controller-runtime/pkg/client"
3333

3434
"sigs.k8s.io/cluster-api/util/patch"
3535

3636
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
3737
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
38+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
3839
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
3940
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
4041
)

cloud/scope/powervs_machine.go

+32-28
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
"os"
2828
"path"
2929
"regexp"
30-
"sigs.k8s.io/cluster-api/util"
3130
"strconv"
3231
"strings"
3332

@@ -53,6 +52,7 @@ import (
5352

5453
capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
5554
capierrors "sigs.k8s.io/cluster-api/errors"
55+
"sigs.k8s.io/cluster-api/util"
5656
"sigs.k8s.io/cluster-api/util/patch"
5757

5858
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
@@ -63,7 +63,7 @@ import (
6363
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
6464
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/options"
6565
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
66-
putil "sigs.k8s.io/cluster-api-provider-ibmcloud/util"
66+
genUtil "sigs.k8s.io/cluster-api-provider-ibmcloud/util"
6767
)
6868

6969
// PowerVSMachineScopeParams defines the input parameters used to create a new PowerVSMachineScope.
@@ -82,9 +82,8 @@ type PowerVSMachineScopeParams struct {
8282
// PowerVSMachineScope defines a scope defined around a Power VS Machine.
8383
type PowerVSMachineScope struct {
8484
logr.Logger
85-
Client client.Client
86-
patchHelper *patch.Helper
87-
serviceInstanceID string
85+
Client client.Client
86+
patchHelper *patch.Helper
8887

8988
IBMPowerVSClient powervs.PowerVS
9089
IBMVPCClient vpc.Vpc
@@ -153,36 +152,36 @@ func NewPowerVSMachineScope(params PowerVSMachineScopeParams) (scope *PowerVSMac
153152
scope.Logger.V(3).Info("Overriding the default resource controller endpoint")
154153
}
155154

156-
region := endpoints.ConstructRegionFromZone(*params.IBMPowerVSCluster.Spec.Zone)
157-
scope.SetRegion(region)
158-
scope.SetZone(*params.IBMPowerVSCluster.Spec.Zone)
159-
160-
var serviceInstanceID string
155+
var serviceInstanceID, serviceInstanceName string
161156
if params.IBMPowerVSMachine.Spec.ServiceInstanceID != "" {
162157
serviceInstanceID = params.IBMPowerVSMachine.Spec.ServiceInstanceID
163158
} else {
164-
name := fmt.Sprintf("%s-%s", params.IBMPowerVSCluster.GetName(), "serviceInstance")
159+
serviceInstanceName = fmt.Sprintf("%s-%s", params.IBMPowerVSCluster.GetName(), "serviceInstance")
165160
if params.IBMPowerVSCluster.Spec.ServiceInstance != nil && params.IBMPowerVSCluster.Spec.ServiceInstance.Name != nil {
166-
name = *params.IBMPowerVSCluster.Spec.ServiceInstance.Name
161+
serviceInstanceName = *params.IBMPowerVSCluster.Spec.ServiceInstance.Name
167162
}
168-
serviceInstance, err := rc.GetServiceInstance("", name)
169-
if err != nil {
170-
params.Logger.Error(err, "error failed to get service instance id from name", "name", name)
171-
return nil, err
172-
}
173-
if serviceInstance == nil {
174-
return nil, fmt.Errorf("service instance %s is not yet created", name)
175-
}
176-
if *serviceInstance.State != "active" {
177-
return nil, fmt.Errorf("service instance %s is not in active state", name)
178-
}
179-
serviceInstanceID = *serviceInstance.GUID
180163
}
164+
serviceInstance, err := rc.GetServiceInstance(serviceInstanceID, serviceInstanceName)
165+
if err != nil {
166+
params.Logger.Error(err, "error failed to get service instance details", "name", serviceInstanceName, "id", serviceInstanceID)
167+
return nil, err
168+
}
169+
if serviceInstance == nil {
170+
return nil, fmt.Errorf("service instance %s is not yet created", serviceInstanceName)
171+
}
172+
if *serviceInstance.State != "active" {
173+
return nil, fmt.Errorf("service instance name: %s id: %s is not in active state", serviceInstanceName, serviceInstanceID)
174+
}
175+
serviceInstanceID = *serviceInstance.GUID
176+
177+
region := endpoints.ConstructRegionFromZone(*serviceInstance.RegionID)
178+
scope.SetRegion(region)
179+
scope.SetZone(*serviceInstance.RegionID)
181180

182181
serviceOptions := powervs.ServiceOptions{
183182
IBMPIOptions: &ibmpisession.IBMPIOptions{
184183
Debug: params.Logger.V(DEBUGLEVEL).Enabled(),
185-
Zone: *params.IBMPowerVSCluster.Spec.Zone,
184+
Zone: *serviceInstance.RegionID,
186185
},
187186
CloudInstanceID: serviceInstanceID,
188187
}
@@ -200,9 +199,16 @@ func NewPowerVSMachineScope(params PowerVSMachineScopeParams) (scope *PowerVSMac
200199
}
201200
c.WithClients(serviceOptions)
202201

202+
scope.IBMPowerVSClient = c
203+
scope.DHCPIPCacheStore = params.DHCPIPCacheStore
204+
205+
if !genUtil.CreateInfra(*params.IBMPowerVSCluster) {
206+
return scope, nil
207+
}
208+
203209
var vpcRegion string
204210
if params.IBMPowerVSCluster.Spec.VPC == nil || params.IBMPowerVSCluster.Spec.VPC.Region == nil {
205-
vpcRegion, err = putil.VPCRegionForPowerVSRegion(scope.GetRegion())
211+
vpcRegion, err = genUtil.VPCRegionForPowerVSRegion(scope.GetRegion())
206212
if err != nil {
207213
return nil, fmt.Errorf("failed to create vpc client, error getting vpc region %v", err)
208214
}
@@ -216,8 +222,6 @@ func NewPowerVSMachineScope(params PowerVSMachineScopeParams) (scope *PowerVSMac
216222
}
217223

218224
scope.IBMVPCClient = vpcClient
219-
scope.IBMPowerVSClient = c
220-
scope.DHCPIPCacheStore = params.DHCPIPCacheStore
221225
scope.ResourceClient = rc
222226
return scope, nil
223227
}

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclusters.yaml

-2
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,8 @@ spec:
342342
type: object
343343
type: array
344344
zone:
345-
default: dal10
346345
description: zone is the name of Power VS zone where the cluster will
347346
be created possible values can be found here https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-creating-power-virtual-server.
348-
when omitted syd04 will be set as default zone.
349347
type: string
350348
required:
351349
- network

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclustertemplates.yaml

-2
Original file line numberDiff line numberDiff line change
@@ -373,10 +373,8 @@ spec:
373373
type: object
374374
type: array
375375
zone:
376-
default: dal10
377376
description: zone is the name of Power VS zone where the cluster
378377
will be created possible values can be found here https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-creating-power-virtual-server.
379-
when omitted syd04 will be set as default zone.
380378
type: string
381379
required:
382380
- network

0 commit comments

Comments
 (0)