Skip to content

Commit

Permalink
Add helper functions to objectstore (#4031)
Browse files Browse the repository at this point in the history
Add get/put/delete data helper functions to objectstore
#K10-1536
  • Loading branch information
SupriyaKasten committed Oct 8, 2018
1 parent a693380 commit f691ba2
Showing 1 changed file with 101 additions and 1 deletion.
102 changes: 101 additions & 1 deletion pkg/objectstore/helper.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
package objectstore

import "context"
import (
"context"
"os"

"github.com/pkg/errors"
"golang.org/x/oauth2/google"
"google.golang.org/api/compute/v1"

"github.com/kanisterio/kanister/pkg/param"
)

// GetOrCreateBucket is a helper function to access the package level getOrCreateBucket
func GetOrCreateBucket(ctx context.Context, p Provider, bucketName string, region string) (Directory, error) {
Expand All @@ -14,3 +23,94 @@ func IsS3Provider(p Provider) bool {
}
return false
}
func GetBucket(ctx context.Context, profile *param.Profile, osType ProviderType, bucketName string) (Bucket, error) {
pc := ProviderConfig{Type: osType}
if osType == ProviderTypeS3 {
if profile.Credential.Type != param.CredentialTypeKeyPair {
return nil, errors.New("Unsupported Credential type")
}
}
secret, err := GetSecret(osType, profile)
if err != nil {
return nil, errors.Wrapf(err, "Failed to get provider credentials")
}
provider, err := NewProvider(ctx, pc, secret)
if err != nil {
return nil, errors.Wrapf(err, "Failed to get new provider")
}
return provider.GetBucket(ctx, bucketName)
}

func PutData(ctx context.Context, profile *param.Profile, osType ProviderType, bucketName, dirName, fileName string, data []byte) error {
bucket, err := GetBucket(ctx, profile, osType, bucketName)
if err != nil {
return errors.Wrapf(err, "Failed to get bucket")
}
directory, err := bucket.GetDirectory(ctx, dirName)
if err != nil {
directory, err = bucket.CreateDirectory(ctx, dirName)
if err != nil {
return errors.Wrapf(err, "Failed to create directory")
}
}
return directory.PutBytes(ctx, fileName, data, nil)
}

func GetData(ctx context.Context, profile *param.Profile, osType ProviderType, bucketName, dirName, fileName string) ([]byte, error) {
bucket, err := GetBucket(ctx, profile, osType, bucketName)
if err != nil {
return nil, errors.Wrapf(err, "Failed to get bucket")
}
directory, err := bucket.GetDirectory(ctx, dirName)
if err != nil {
return nil, errors.Wrapf(err, "Failed to get directory")
}
data, _, err := directory.GetBytes(ctx, fileName)
if err != nil {
return nil, errors.Wrapf(err, "Failed to get data")
}
return data, nil
}

func DeleteData(ctx context.Context, profile *param.Profile, osType ProviderType, bucketName, dirName string) error {
bucket, err := GetBucket(ctx, profile, osType, bucketName)
if err != nil {
return errors.Wrapf(err, "Failed to get bucket")
}
directory, err := bucket.GetDirectory(ctx, dirName)
if err != nil {
return errors.Wrapf(err, "Failed to get directory")
}
return errors.Wrapf(directory.DeleteDirectory(ctx), "Failed to delete data")
}

func GetSecret(osType ProviderType, profile *param.Profile) (*Secret, error) {
secret := &Secret{}
switch osType {
case ProviderTypeS3:
secret.Type = SecretTypeAwsAccessKey
secret.Aws = &SecretAws{
AccessKeyID: profile.Credential.KeyPair.ID,
SecretAccessKey: profile.Credential.KeyPair.Secret,
}
case ProviderTypeGCS:
creds, err := google.FindDefaultCredentials(context.Background(), compute.ComputeScope)
if err != nil {
return nil, errors.New("Could not get GCS credentials")
}
secret.Type = SecretTypeGcpServiceAccountKey
secret.Gcp = &SecretGcp{
ServiceKey: string(creds.JSON),
ProjectID: creds.ProjectID,
}
case ProviderTypeAzure:
secret.Type = SecretTypeAzStorageAccount
secret.Azure = &SecretAzure{
StorageAccount: os.Getenv("AZURE_STORAGE_ACCOUNT_NAME"),
StorageKey: os.Getenv("AZURE_STORAGE_ACCOUNT_KEY"),
}
default:
return nil, errors.New("Unsupported provider " + string(osType))
}
return secret, nil
}

0 comments on commit f691ba2

Please sign in to comment.