@@ -24,7 +24,6 @@ import (
24
24
"errors"
25
25
"fmt"
26
26
"net/url"
27
- "os"
28
27
"path"
29
28
"regexp"
30
29
"strconv"
@@ -56,6 +55,7 @@ import (
56
55
"sigs.k8s.io/cluster-api/util/patch"
57
56
58
57
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
58
+ "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/authenticator"
59
59
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/cos"
60
60
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
61
61
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
@@ -378,36 +378,14 @@ func (m *PowerVSMachineScope) createIgnitionData(data []byte) (string, error) {
378
378
return "" , fmt .Errorf ("got empty data" )
379
379
}
380
380
381
- serviceInstanceName := fmt .Sprintf ("%s-%s" , m .IBMPowerVSCluster .GetName (), "cosInstance" )
382
- serviceInstance , err := m .ResourceClient .GetInstanceByName (serviceInstanceName , cosResourceID , cosResourcePlanID )
381
+ cosClient , err := m .createCOSClient ()
383
382
if err != nil {
384
- m .Error (err , "failed to get cos service instance" , "name" , serviceInstanceName )
385
- return "" , err
386
- }
387
- if serviceInstance == nil {
388
- m .Info ("cos service instance is nil" )
389
- return "" , err
390
- }
391
- if * serviceInstance .State != "active" {
392
- m .Info ("cos service instance is not in active state" , "state" , * serviceInstance .State )
393
- return "" , fmt .Errorf ("cos instance not in active state, current state: %s" , * serviceInstance .State )
383
+ m .Error (err , "failed to create cosClient" )
384
+ return "" , fmt .Errorf ("failed to create cosClient %w" , err )
394
385
}
395
386
key := m .bootstrapDataKey ()
396
387
m .Info ("bootstrap data key" , "key" , key )
397
388
398
- //TODO(karthik-k-n): Fix me
399
- apiKey := os .Getenv ("IBMCLOUD_API_KEY" )
400
- if apiKey == "" {
401
- fmt .Printf ("ibmcloud api key is not provided, set %s environmental variable" , "IBMCLOUD_API_KEY" )
402
- }
403
- apiKey = APIKEY
404
-
405
- cosClient , err := cos .NewService (cos.ServiceOptions {}, m .IBMPowerVSCluster .Spec .CosInstance .BucketRegion , apiKey , * serviceInstance .GUID )
406
- if err != nil {
407
- m .Error (err , "failed to create cos client" )
408
- return "" , fmt .Errorf ("failed to create cos client: %w" , err )
409
- }
410
-
411
389
bucket := m .IBMPowerVSCluster .Spec .CosInstance .BucketName
412
390
if _ , err := cosClient .PutObject (& s3.PutObjectInput {
413
391
Body : aws .ReadSeekCloser (bytes .NewReader (data )),
@@ -507,6 +485,71 @@ func (m *PowerVSMachineScope) DeleteMachine() error {
507
485
return nil
508
486
}
509
487
488
+ // DeleteMachineIgnition deletes the ignition associated with machine.
489
+ func (m * PowerVSMachineScope ) DeleteMachineIgnition () error {
490
+ cosClient , err := m .createCOSClient ()
491
+ if err != nil {
492
+ m .Error (err , "failed to create cosClient" )
493
+ return fmt .Errorf ("failed to create cosClient %w" , err )
494
+ }
495
+
496
+ bucket := m .IBMPowerVSCluster .Spec .CosInstance .BucketName
497
+ objs , _ := cosClient .ListObjects (& s3.ListObjectsInput {
498
+ Bucket : aws .String (bucket ),
499
+ })
500
+
501
+ for _ , j := range objs .Contents {
502
+ if strings .Contains (* j .Key , m .Name ()) {
503
+ if _ , err := cosClient .DeleteObject (& s3.DeleteObjectInput {
504
+ Bucket : aws .String (bucket ),
505
+ Key : j .Key ,
506
+ }); err != nil {
507
+ m .Error (err , "failed to delete cos object" )
508
+ record .Warnf (m .IBMPowerVSMachine , "FailedDeleteMachineIgnition" , "Failed machine ignition deletion - %v" , err )
509
+ return fmt .Errorf ("failed to delete cos object %w" , err )
510
+ }
511
+ }
512
+ }
513
+ record .Eventf (m .IBMPowerVSMachine , "SuccessfulDeleteMachineIgnition" , "Deleted machine ignition %q" , m .IBMPowerVSMachine .Name )
514
+ return nil
515
+ }
516
+
517
+ // createCOSClient creates a new cosClient from the supplied parameters.
518
+ func (m * PowerVSMachineScope ) createCOSClient () (* cos.Service , error ) {
519
+ cosInstanceName := m .IBMPowerVSCluster .Spec .CosInstance .Name
520
+ serviceInstance , err := m .ResourceClient .GetInstanceByName (cosInstanceName , cosResourceID , cosResourcePlanID )
521
+ if err != nil {
522
+ m .Error (err , "failed to get cos service instance" , "name" , cosInstanceName )
523
+ return nil , err
524
+ }
525
+ if serviceInstance == nil {
526
+ m .Info ("cos service instance is nil" )
527
+ return nil , err
528
+ }
529
+ if * serviceInstance .State != "active" {
530
+ m .Info ("cos service instance is not in active state" , "state" , * serviceInstance .State )
531
+ return nil , fmt .Errorf ("cos instance not in active state, current state: %s" , * serviceInstance .State )
532
+ }
533
+
534
+ props , err := authenticator .GetProperties ()
535
+ if err != nil {
536
+ m .Error (err , "error while fetching service properties" )
537
+ return nil , fmt .Errorf ("error while fetching service properties: %w" , err )
538
+ }
539
+ apiKey := props ["APIKEY" ]
540
+ if len (apiKey ) == 0 {
541
+ fmt .Printf ("ibmcloud api key is not provided, set %s environmental variable" , "IBMCLOUD_API_KEY" )
542
+ }
543
+
544
+ cosClient , err := cos .NewService (cos.ServiceOptions {}, m .IBMPowerVSCluster .Spec .CosInstance .BucketRegion , apiKey , * serviceInstance .GUID )
545
+ if err != nil {
546
+ m .Error (err , "failed to create cos client" )
547
+ return nil , fmt .Errorf ("failed to create cos client: %w" , err )
548
+ }
549
+
550
+ return cosClient , nil
551
+ }
552
+
510
553
func (m * PowerVSMachineScope ) GetRawBootstrapDataWithFormat () ([]byte , string , error ) {
511
554
if m .Machine .Spec .Bootstrap .DataSecretName == nil {
512
555
return nil , "" , errors .New ("error retrieving bootstrap data: linked Machine's bootstrap.dataSecretName is nil" )
0 commit comments