Skip to content

Commit edac819

Browse files
authored
Merge pull request #4 from prajyot-workspace/update-ignition
COS related fixes
2 parents 1fbc757 + a48b4fd commit edac819

File tree

6 files changed

+100
-34
lines changed

6 files changed

+100
-34
lines changed

cloud/scope/powervs_cluster.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"context"
2121
"errors"
2222
"fmt"
23-
"os"
2423
"strings"
2524

2625
"github.com/IBM-Cloud/power-go-client/ibmpisession"
@@ -61,9 +60,6 @@ const (
6160
// PowerVS service and plan name
6261
powerVSService = "power-iaas"
6362
powerVSServicePlan = "power-virtual-server-group"
64-
65-
//TODO: Remove this
66-
APIKEY = ""
6763
)
6864

6965
const (
@@ -1305,11 +1301,16 @@ func (s *PowerVSClusterScope) ReconcileCOSInstance() error {
13051301
s.SetStatus(COSInstance, infrav1beta2.ResourceReference{ID: cosServiceInstanceStatus.GUID, ControllerCreated: pointer.Bool(true)})
13061302
}
13071303

1308-
apiKey := os.Getenv("IBMCLOUD_API_KEY")
1309-
if apiKey == "" {
1304+
props, err := authenticator.GetProperties()
1305+
if err != nil {
1306+
s.Error(err, "error while fetching service properties")
1307+
return err
1308+
}
1309+
1310+
apiKey := props["APIKEY"]
1311+
if len(apiKey) == 0 {
13101312
fmt.Printf("ibmcloud api key is not provided, set %s environmental variable", "IBMCLOUD_API_KEY")
13111313
}
1312-
apiKey = APIKEY
13131314

13141315
cosClient, err := cos.NewService(cos.ServiceOptions{}, s.IBMPowerVSCluster.Spec.CosInstance.BucketRegion, apiKey, *cosServiceInstanceStatus.GUID)
13151316
if err != nil {

cloud/scope/powervs_machine.go

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"errors"
2525
"fmt"
2626
"net/url"
27-
"os"
2827
"path"
2928
"regexp"
3029
"strconv"
@@ -56,6 +55,7 @@ import (
5655
"sigs.k8s.io/cluster-api/util/patch"
5756

5857
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
58+
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/authenticator"
5959
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/cos"
6060
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/powervs"
6161
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/resourcecontroller"
@@ -378,36 +378,14 @@ func (m *PowerVSMachineScope) createIgnitionData(data []byte) (string, error) {
378378
return "", fmt.Errorf("got empty data")
379379
}
380380

381-
serviceInstanceName := fmt.Sprintf("%s-%s", m.IBMPowerVSCluster.GetName(), "cosInstance")
382-
serviceInstance, err := m.ResourceClient.GetInstanceByName(serviceInstanceName, cosResourceID, cosResourcePlanID)
381+
cosClient, err := m.createCOSClient()
383382
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)
394385
}
395386
key := m.bootstrapDataKey()
396387
m.Info("bootstrap data key", "key", key)
397388

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-
411389
bucket := m.IBMPowerVSCluster.Spec.CosInstance.BucketName
412390
if _, err := cosClient.PutObject(&s3.PutObjectInput{
413391
Body: aws.ReadSeekCloser(bytes.NewReader(data)),
@@ -507,6 +485,71 @@ func (m *PowerVSMachineScope) DeleteMachine() error {
507485
return nil
508486
}
509487

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+
510553
func (m *PowerVSMachineScope) GetRawBootstrapDataWithFormat() ([]byte, string, error) {
511554
if m.Machine.Spec.Bootstrap.DataSecretName == nil {
512555
return nil, "", errors.New("error retrieving bootstrap data: linked Machine's bootstrap.dataSecretName is nil")

controllers/ibmpowervsmachine_controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ func (r *IBMPowerVSMachineReconciler) reconcileDelete(scope *scope.PowerVSMachin
182182
scope.Info("error deleting IBMPowerVSMachine")
183183
return ctrl.Result{}, fmt.Errorf("error deleting IBMPowerVSMachine %v: %w", klog.KObj(scope.IBMPowerVSMachine), err)
184184
}
185+
if err := scope.DeleteMachineIgnition(); err != nil {
186+
scope.Info("error deleting IBMPowerVSMachine ignition")
187+
return ctrl.Result{}, fmt.Errorf("error deleting IBMPowerVSMachine ignition %v: %w", klog.KObj(scope.IBMPowerVSMachine), err)
188+
}
185189
// Remove the cached VM IP
186190
err := scope.DHCPIPCacheStore.Delete(powervs.VMip{Name: scope.IBMPowerVSMachine.Name})
187191
if err != nil {

pkg/cloud/services/authenticator/authenticator.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,12 @@ func GetAuthenticator() (core.Authenticator, error) {
4848
}
4949
return auth, nil
5050
}
51+
52+
// GetProperties returns a map containing configuration properties for the specified service that are retrieved from external configuration sources.
53+
func GetProperties() (map[string]string, error) {
54+
properties, err := core.GetServiceProperties(serviceIBMCloud)
55+
if err != nil {
56+
return nil, fmt.Errorf("error while fetching service properties")
57+
}
58+
return properties, nil
59+
}

pkg/cloud/services/cos/cos.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ type Cos interface {
3030
CreateBucketWithContext(ctx aws.Context, input *s3.CreateBucketInput, opts ...request.Option) (*s3.CreateBucketOutput, error)
3131
PutObject(*s3.PutObjectInput) (*s3.PutObjectOutput, error)
3232
GetObjectRequest(*s3.GetObjectInput) (*request.Request, *s3.GetObjectOutput)
33-
33+
ListObjects(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error)
34+
DeleteObject(input *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error)
3435
PutPublicAccessBlock(input *s3.PutPublicAccessBlockInput) (*s3.PutPublicAccessBlockOutput, error)
3536
}

pkg/cloud/services/cos/service.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ func (s *Service) GetObjectRequest(input *s3.GetObjectInput) (*request.Request,
6767
return s.client.GetObjectRequest(input)
6868
}
6969

70+
func (s *Service) ListObjects(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) {
71+
return s.client.ListObjects(input)
72+
}
73+
74+
func (s *Service) DeleteObject(input *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) {
75+
return s.client.DeleteObject(input)
76+
}
77+
7078
func (s *Service) PutPublicAccessBlock(input *s3.PutPublicAccessBlockInput) (*s3.PutPublicAccessBlockOutput, error) {
7179
return s.client.PutPublicAccessBlock(input)
7280
}

0 commit comments

Comments
 (0)