11package system
22
33import (
4+ "context"
45 "errors"
56 "fmt"
67 "net"
@@ -11,11 +12,9 @@ import (
1112 "strings"
1213 "time"
1314
14- // TODO: once we have STS handle it
15- // "context"
16- // "encoding/json"
17- _ "cloud.google.com/go/storage"
15+ "encoding/json"
1816
17+ "cloud.google.com/go/storage"
1918 "github.com/marstr/randname"
2019 nbv1 "github.com/noobaa/noobaa-operator/v5/pkg/apis/noobaa/v1alpha1"
2120 "github.com/noobaa/noobaa-operator/v5/pkg/bundle"
@@ -25,10 +24,7 @@ import (
2524 secv1 "github.com/openshift/api/security/v1"
2625 monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
2726 "github.com/sirupsen/logrus"
28-
29- // TODO: once we have STS handle it
30- _ "google.golang.org/api/option"
31-
27+ "google.golang.org/api/option"
3228 corev1 "k8s.io/api/core/v1"
3329 "k8s.io/apimachinery/pkg/api/resource"
3430 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -54,10 +50,9 @@ const (
5450 serviceMonitorCAFile = "/etc/prometheus/configmaps/serving-certs-ca-bundle/service-ca.crt"
5551)
5652
57- // TODO: once we have STS handle it
58- // type gcpAuthJSON struct {
59- // ProjectID string `json:"project_id"`
60- // }
53+ type gcpAuthJSON struct {
54+ ProjectID string `json:"project_id"`
55+ }
6156
6257// ReconcilePhaseConfiguring runs the reconcile phase
6358func (r * Reconciler ) ReconcilePhaseConfiguring () error {
@@ -983,12 +978,11 @@ func (r *Reconciler) ReconcileDefaultBackingStore() error {
983978 if err := r .prepareAzureBackingStore (); err != nil {
984979 return err
985980 }
986- // TODO: once we have STS handle it
987- // } else if r.GCPCloudCreds.UID != "" {
988- // log.Infof("CredentialsRequest %q created. creating default backing store on GCP objectstore", r.GCPCloudCreds.Name)
989- // if err := r.prepareGCPBackingStore(); err != nil {
990- // return err
991- // }
981+ } else if r .GCPCloudCreds .UID != "" {
982+ log .Infof ("CredentialsRequest %q created. creating default backing store on GCP objectstore" , r .GCPCloudCreds .Name )
983+ if err := r .prepareGCPBackingStore (); err != nil {
984+ return err
985+ }
992986 } else if r .IBMCosBucketCreds .UID != "" {
993987 log .Infof ("IBM objectstore credentials %q created. Creating default backing store on IBM objectstore" , r .IBMCosBucketCreds .Name )
994988 if err := r .prepareIBMBackingStore (); err != nil {
@@ -1256,78 +1250,77 @@ func (r *Reconciler) prepareAzureBackingStore() error {
12561250 return nil
12571251}
12581252
1259- // TODO: once we have STS handle it
1260- // func (r *Reconciler) prepareGCPBackingStore() error {
1261- // secretName := r.GCPCloudCreds.Spec.SecretRef.Name
1262- // cloudCredsSecret := &corev1.Secret{
1263- // ObjectMeta: metav1.ObjectMeta{
1264- // Name: secretName,
1265- // Namespace: r.GCPCloudCreds.Spec.SecretRef.Namespace,
1266- // },
1267- // }
1268-
1269- // util.KubeCheck(cloudCredsSecret)
1270- // if cloudCredsSecret.UID == "" {
1271- // // TODO: we need to figure out why secret is not created, and react accordingly
1272- // // e.g. maybe we are running on AWS but our CredentialsRequest is for GCP
1273- // r.Logger.Infof("Secret %q was not created yet by cloud-credentials operator. retry on next reconcile..", secretName)
1274-
1275- // // in case we have a cred request but we do not get a secret
1276- // if r.defaultBSCreationTimedout(r.GCPCloudCreds.CreationTimestamp.Time) {
1277- // return r.fallbackToPVPoolWithEvent(nbv1.StoreTypeGoogleCloudStorage, secretName)
1278-
1279- // }
1280- // return fmt.Errorf("cloud credentials secret %q is not ready yet", secretName)
1281- // }
1282- // r.Logger.Infof("Secret %s was created successfully by cloud-credentials operator", secretName)
1283-
1284- // util.KubeCheck(r.GCPBucketCreds)
1285- // if r.GCPBucketCreds.UID == "" {
1286- // r.GCPBucketCreds.StringData = cloudCredsSecret.StringData
1287- // r.Own(r.GCPBucketCreds)
1288- // if err := r.Client.Create(r.Ctx, r.GCPBucketCreds); err != nil {
1289- // return fmt.Errorf("got error on GCPBucketCreds creation. error: %v", err)
1290- // }
1291- // }
1292- // authJSON := &gcpAuthJSON{}
1293- // err := json.Unmarshal([]byte(cloudCredsSecret.StringData["service_account.json"]), authJSON)
1294- // if err != nil {
1295- // fmt.Println("Failed to parse secret", err)
1296- // return err
1297- // }
1298- // projectID := authJSON.ProjectID
1299- // if r.GCPBucketCreds.StringData == nil {
1300- // r.Logger.Infof("Secret %q does not contain a map of StringData yet. retry on next reconcile...", secretName)
1301- // return fmt.Errorf("cloud credentials secret %q is not ready yet (does not contain a map of StringData yet)", secretName)
1302- // }
1303- // r.GCPBucketCreds.StringData["GoogleServiceAccountPrivateKeyJson"] = cloudCredsSecret.StringData["service_account.json"]
1304- // ctx := context.Background()
1305- // gcpclient, err := storage.NewClient(ctx, option.WithCredentialsJSON([]byte(cloudCredsSecret.StringData["service_account.json"])))
1306- // if err != nil {
1307- // r.Logger.Info(err)
1308- // return err
1309- // }
1310-
1311- // var bucketName = strings.ToLower(randname.GenerateWithPrefix("noobaabucket", 5))
1312- // if err := r.createGCPBucketForBackingStore(gcpclient, projectID, bucketName); err != nil {
1313- // r.Logger.Info(err)
1314- // return err
1315- // }
1316-
1317- // if errUpdate := r.Client.Update(r.Ctx, r.GCPBucketCreds); errUpdate != nil {
1318- // return fmt.Errorf("got error on GCPBucketCreds update. error: %v", errUpdate)
1319- // }
1320- // // create backing store
1321- // r.DefaultBackingStore.Spec.Type = nbv1.StoreTypeGoogleCloudStorage
1322- // r.DefaultBackingStore.Spec.GoogleCloudStorage = &nbv1.GoogleCloudStorageSpec{
1323- // TargetBucket: bucketName,
1324- // Secret: corev1.SecretReference{
1325- // Name: r.GCPBucketCreds.Name,
1326- // Namespace: r.GCPBucketCreds.Namespace,
1327- // },
1328- // }
1329- // return nil
1330- // }
1253+ func (r * Reconciler ) prepareGCPBackingStore () error {
1254+ secretName := r .GCPCloudCreds .Spec .SecretRef .Name
1255+ cloudCredsSecret := & corev1.Secret {
1256+ ObjectMeta : metav1.ObjectMeta {
1257+ Name : secretName ,
1258+ Namespace : r .GCPCloudCreds .Spec .SecretRef .Namespace ,
1259+ },
1260+ }
1261+
1262+ util .KubeCheck (cloudCredsSecret )
1263+ if cloudCredsSecret .UID == "" {
1264+ // TODO: we need to figure out why secret is not created, and react accordingly
1265+ // e.g. maybe we are running on AWS but our CredentialsRequest is for GCP
1266+ r .Logger .Infof ("Secret %q was not created yet by cloud-credentials operator. retry on next reconcile.." , secretName )
1267+
1268+ // in case we have a cred request but we do not get a secret
1269+ if r .defaultBSCreationTimedout (r .GCPCloudCreds .CreationTimestamp .Time ) {
1270+ return r .fallbackToPVPoolWithEvent (nbv1 .StoreTypeGoogleCloudStorage , secretName )
1271+
1272+ }
1273+ return fmt .Errorf ("cloud credentials secret %q is not ready yet" , secretName )
1274+ }
1275+ r .Logger .Infof ("Secret %s was created successfully by cloud-credentials operator" , secretName )
1276+
1277+ util .KubeCheck (r .GCPBucketCreds )
1278+ if r .GCPBucketCreds .UID == "" {
1279+ r .GCPBucketCreds .StringData = cloudCredsSecret .StringData
1280+ r .Own (r .GCPBucketCreds )
1281+ if err := r .Client .Create (r .Ctx , r .GCPBucketCreds ); err != nil {
1282+ return fmt .Errorf ("got error on GCPBucketCreds creation. error: %v" , err )
1283+ }
1284+ }
1285+ authJSON := & gcpAuthJSON {}
1286+ err := json .Unmarshal ([]byte (cloudCredsSecret .StringData ["service_account.json" ]), authJSON )
1287+ if err != nil {
1288+ fmt .Println ("Failed to parse secret" , err )
1289+ return err
1290+ }
1291+ projectID := authJSON .ProjectID
1292+ if r .GCPBucketCreds .StringData == nil {
1293+ r .Logger .Infof ("Secret %q does not contain a map of StringData yet. retry on next reconcile..." , secretName )
1294+ return fmt .Errorf ("cloud credentials secret %q is not ready yet (does not contain a map of StringData yet)" , secretName )
1295+ }
1296+ r .GCPBucketCreds .StringData ["GoogleServiceAccountPrivateKeyJson" ] = cloudCredsSecret .StringData ["service_account.json" ]
1297+ ctx := context .Background ()
1298+ gcpclient , err := storage .NewClient (ctx , option .WithCredentialsJSON ([]byte (cloudCredsSecret .StringData ["service_account.json" ])))
1299+ if err != nil {
1300+ r .Logger .Info (err )
1301+ return err
1302+ }
1303+
1304+ var bucketName = strings .ToLower (randname .GenerateWithPrefix ("noobaabucket" , 5 ))
1305+ if err := r .createGCPBucketForBackingStore (gcpclient , projectID , bucketName ); err != nil {
1306+ r .Logger .Info (err )
1307+ return err
1308+ }
1309+
1310+ if errUpdate := r .Client .Update (r .Ctx , r .GCPBucketCreds ); errUpdate != nil {
1311+ return fmt .Errorf ("got error on GCPBucketCreds update. error: %v" , errUpdate )
1312+ }
1313+ // create backing store
1314+ r .DefaultBackingStore .Spec .Type = nbv1 .StoreTypeGoogleCloudStorage
1315+ r .DefaultBackingStore .Spec .GoogleCloudStorage = & nbv1.GoogleCloudStorageSpec {
1316+ TargetBucket : bucketName ,
1317+ Secret : corev1.SecretReference {
1318+ Name : r .GCPBucketCreds .Name ,
1319+ Namespace : r .GCPBucketCreds .Namespace ,
1320+ },
1321+ }
1322+ return nil
1323+ }
13311324
13321325func (r * Reconciler ) prepareIBMBackingStore () error {
13331326 r .Logger .Info ("Preparing backing store in IBM Cloud" )
@@ -1430,19 +1423,18 @@ func (r *Reconciler) prepareIBMBackingStore() error {
14301423 return nil
14311424}
14321425
1433- // TODO: once we have STS handle it
1434- // func (r *Reconciler) createGCPBucketForBackingStore(client *storage.Client, projectID, bucketName string) error {
1435- // // [START create_bucket]
1436- // ctx := context.Background()
1437- //
1438- // ctx, cancel := context.WithTimeout(ctx, time.Second*30)
1439- // defer cancel()
1440- // if err := client.Bucket(bucketName).Create(ctx, projectID, nil); err != nil {
1441- // return err
1442- // }
1443- // // [END create_bucket]
1444- // return nil
1445- // }
1426+ func (r * Reconciler ) createGCPBucketForBackingStore (client * storage.Client , projectID , bucketName string ) error {
1427+ // [START create_bucket]
1428+ ctx := context .Background ()
1429+
1430+ ctx , cancel := context .WithTimeout (ctx , time .Second * 30 )
1431+ defer cancel ()
1432+ if err := client .Bucket (bucketName ).Create (ctx , projectID , nil ); err != nil {
1433+ return err
1434+ }
1435+ // [END create_bucket]
1436+ return nil
1437+ }
14461438
14471439func (r * Reconciler ) prepareCephBackingStore () error {
14481440 objectStoreUserName := r .CephObjectStoreUser .Name
0 commit comments