Browse Source

added GetSecret and GetSecretMap functions to Gitlab

jabray5 4 years ago
parent
commit
8211200e4d
2 changed files with 87 additions and 2 deletions
  1. 46 0
      pkg/provider/gitlab/gitlab.go
  2. 41 2
      pkg/provider/gitlab/gitlab_test.go

+ 46 - 0
pkg/provider/gitlab/gitlab.go

@@ -14,9 +14,15 @@ limitations under the License.
 package gitlab
 
 import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	// I think I've overwritten the log package I need with the default golang one?
 	"log"
 	"os"
 
+	esv1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
 	gitlab "github.com/xanzy/go-gitlab"
 )
 
@@ -49,3 +55,43 @@ func (g *Gitlab) NewGitlabClient(cred GitlabCredentials, projectID string) {
 		log.Fatalf("Failed to create client: %v", err)
 	}
 }
+
+func (g *Gitlab) GetSecret(ctx context.Context, ref esv1alpha1.ExternalSecretDataRemoteRef) ([]byte, error) {
+	data, _, err := g.client.ProjectVariables.GetVariable(g.projectID, ref.Key, nil) //Optional 'filter' parameter could be added later
+	// Do we need versions or anything?
+	if err != nil {
+		return nil, err
+	}
+
+	// Returns a secret in the form
+	// {
+	// 	"key": "TEST_VARIABLE_1",
+	// 	"variable_type": "env_var",
+	// 	"value": "TEST_1",
+	// 	"protected": false,
+	// 	"masked": true
+	// }
+
+	return []byte(data.Value), nil
+}
+
+func (g *Gitlab) GetSecretMap(ctx context.Context, ref esv1alpha1.ExternalSecretDataRemoteRef) (map[string][]byte, error) {
+	data, err := g.GetSecret(ctx, ref)
+	if err != nil {
+		return nil, fmt.Errorf("error getting secret %s: %w", ref.Key, err)
+	}
+
+	kv := make(map[string]string)
+	err = json.Unmarshal(data, &kv)
+	if err != nil {
+		fmt.Printf("unable to unmarshal secret %v: %v", ref.Key, err)
+		return nil, err
+	}
+
+	// Converts values in K:V pairs into bytes while leaving keys as strings
+	secretData := make(map[string][]byte)
+	for k, v := range kv {
+		secretData[k] = []byte(v)
+	}
+	return secretData, nil
+}

+ 41 - 2
pkg/provider/gitlab/gitlab_test.go

@@ -14,8 +14,11 @@ limitations under the License.
 package gitlab
 
 import (
+	"context"
 	"fmt"
 	"testing"
+
+	"github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
 )
 
 func TestCreateGitlabClient(t *testing.T) {
@@ -23,6 +26,42 @@ func TestCreateGitlabClient(t *testing.T) {
 	gitlab := NewGitlabProvider()
 	gitlab.NewGitlabClient(credentials, GITLAB_PROJECT_ID)
 
-	user, _, _ := gitlab.client.Users.CurrentUser()
-	fmt.Printf("Created client for username: %v", user)
+	// user, _, _ := gitlab.client.Users.CurrentUser()
+	// fmt.Printf("Created client for username: %v", user)
+}
+
+func TestGetSecret(t *testing.T) {
+	ctx := context.Background()
+
+	ref := v1alpha1.ExternalSecretDataRemoteRef{Key: "mySecretBanana"}
+
+	credentials := GitlabCredentials{Token: GITLAB_TOKEN}
+	gitlab := NewGitlabProvider()
+	gitlab.NewGitlabClient(credentials, GITLAB_PROJECT_ID)
+
+	secretData, err := gitlab.GetSecret(ctx, ref)
+
+	if err != nil {
+		fmt.Printf("that's an error, Charlie. %v", err)
+	}
+
+	fmt.Printf("Got secret data %v", string(secretData))
+}
+
+func TestGetSecretMap(t *testing.T) {
+	ctx := context.Background()
+
+	ref := v1alpha1.ExternalSecretDataRemoteRef{Key: "myJsonSecret"}
+
+	credentials := GitlabCredentials{Token: GITLAB_TOKEN}
+	gitlab := NewGitlabProvider()
+	gitlab.NewGitlabClient(credentials, GITLAB_PROJECT_ID)
+
+	secretData, err := gitlab.GetSecretMap(ctx, ref)
+
+	if err != nil {
+		fmt.Errorf("that's an error, Charlie. %w", err)
+	}
+
+	fmt.Printf("Got secret map: %v", secretData)
 }