@@ -165,6 +165,45 @@ func NewPowerVSClusterScope(params PowerVSClusterScopeParams) (*PowerVSClusterSc
165
165
return nil , err
166
166
}
167
167
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
+
168
207
auth , err := authenticator .GetAuthenticator ()
169
208
if err != nil {
170
209
return nil , fmt .Errorf ("error failed to create authenticator %w" , err )
@@ -177,23 +216,26 @@ func NewPowerVSClusterScope(params PowerVSClusterScopeParams) (*PowerVSClusterSc
177
216
sessionOptions := & ibmpisession.IBMPIOptions {
178
217
Authenticator : auth ,
179
218
UserAccount : account ,
180
- Zone : * params . IBMPowerVSCluster . Spec .Zone ,
219
+ Zone : options .Zone ,
181
220
}
182
221
session , err := ibmpisession .NewIBMPISession (sessionOptions )
183
222
if err != nil {
184
223
return nil , fmt .Errorf ("error failed to get power vs session %w" , err )
185
224
}
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
196
237
}
238
+
197
239
if params .IBMPowerVSCluster .Spec .VPC == nil || params .IBMPowerVSCluster .Spec .VPC .Region == nil {
198
240
return nil , fmt .Errorf ("error failed to generate vpc client as VPC info is nil" )
199
241
}
@@ -334,6 +376,12 @@ func (s *PowerVSClusterScope) SetStatus(resourceType ResourceType, resource infr
334
376
return
335
377
}
336
378
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 )
337
385
}
338
386
}
339
387
@@ -1246,15 +1294,15 @@ func (s *PowerVSClusterScope) ReconcileCOSInstance() error {
1246
1294
return err
1247
1295
}
1248
1296
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 )})
1250
1298
} else {
1251
1299
// create COS service instance
1252
1300
cosServiceInstanceStatus , err = s .createCOSServiceInstance ()
1253
1301
if err != nil {
1254
1302
s .Error (err , "error creating cos service instance" )
1255
1303
return err
1256
1304
}
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 )})
1258
1306
}
1259
1307
1260
1308
apiKey := os .Getenv ("IBMCLOUD_API_KEY" )
@@ -1271,7 +1319,9 @@ func (s *PowerVSClusterScope) ReconcileCOSInstance() error {
1271
1319
s .COSClient = cosClient
1272
1320
1273
1321
// 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 {
1275
1325
s .Error (err , "error checking cos bucket" )
1276
1326
return err
1277
1327
}
@@ -1319,6 +1369,8 @@ func (s *PowerVSClusterScope) createCOSBucket() error {
1319
1369
// If bucket already exists, all good.
1320
1370
case s3 .ErrCodeBucketAlreadyOwnedByYou :
1321
1371
return nil
1372
+ case s3 .ErrCodeBucketAlreadyExists :
1373
+ return nil
1322
1374
default :
1323
1375
return fmt .Errorf ("error creating COS bucket %w" , err )
1324
1376
}
@@ -1353,12 +1405,10 @@ func (s *PowerVSClusterScope) createCOSServiceInstance() (*resourcecontrollerv2.
1353
1405
// return nil, fmt.Errorf("error retrieving id info for powervs service %w", err)
1354
1406
//}
1355
1407
1356
- //TODO(karthik-k-n): add funciton to fetch name
1357
1408
target := "Global"
1358
- serviceInstanceName := fmt .Sprintf ("%s-%s" , s .InfraCluster ().GetName (), "cosInstance" )
1359
1409
// create service instance
1360
1410
serviceInstance , _ , err := s .ResourceClient .CreateResourceInstance (& resourcecontrollerv2.CreateResourceInstanceOptions {
1361
- Name : & serviceInstanceName ,
1411
+ Name : s . GetServiceName ( COSInstance ) ,
1362
1412
Target : & target ,
1363
1413
ResourceGroup : & resourceGroupID ,
1364
1414
ResourcePlanID : pointer .String (cosResourcePlanID ),
@@ -1708,6 +1758,10 @@ func (s *PowerVSClusterScope) DeleteCosInstance() error {
1708
1758
return fmt .Errorf ("error fetching COS instance: %w" , err )
1709
1759
}
1710
1760
1761
+ if cosInstance != nil && (* cosInstance .State == "pending_reclamation" || * cosInstance .State == string (infrav1beta2 .ServiceInstanceStateRemoved )) {
1762
+ return nil
1763
+ }
1764
+
1711
1765
_ , err = s .ResourceClient .DeleteResourceInstance (& resourcecontrollerv2.DeleteResourceInstanceOptions {
1712
1766
ID : cosInstance .ID ,
1713
1767
Recursive : pointer .Bool (true ),
0 commit comments