ソースを参照

fix: add reflect parser

Signed-off-by: Moritz Johner <beller.moritz@googlemail.com>
Moritz Johner 3 年 前
コミット
06dfed4f53
1 ファイル変更140 行追加0 行削除
  1. 140 0
      cmd/provider/client.go

+ 140 - 0
cmd/provider/client.go

@@ -4,8 +4,11 @@ import (
 	"context"
 	"flag"
 	"log"
+	"reflect"
 	"time"
 
+	"github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
+	v1 "github.com/external-secrets/external-secrets/apis/meta/v1"
 	pb "github.com/external-secrets/external-secrets/pkg/plugin/grpc"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials/insecure"
@@ -17,6 +20,7 @@ var (
 
 func main() {
 	flag.Parse()
+	reflector()
 	// Set up a connection to the server.
 	conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
 	if err != nil {
@@ -37,3 +41,139 @@ func main() {
 	}
 	log.Printf("secret=%s, err=%s", string(res.Secret), res.Error)
 }
+
+func reflector() {
+
+	ns := "bar"
+	prov := &v1beta1.SecretStoreProvider{
+		Kubernetes: &v1beta1.KubernetesProvider{
+			Auth: v1beta1.KubernetesAuth{
+				Token: &v1beta1.TokenAuth{
+					BearerToken: v1.SecretKeySelector{
+						Name: "brr",
+						Key:  "fart",
+					},
+				},
+				ServiceAccount: &v1.ServiceAccountSelector{
+					Name:      "ccccc",
+					Namespace: &ns,
+					Audiences: nil,
+				},
+			},
+			Server: v1beta1.KubernetesServer{
+				URL:      "asdasda",
+				CABundle: []byte{1, 23, 4, 1, 231, 23, 1},
+				CAProvider: &v1beta1.CAProvider{
+					Type:      v1beta1.CAProviderTypeConfigMap,
+					Name:      "ca",
+					Key:       "ca.crt",
+					Namespace: &ns,
+				},
+			},
+		},
+		Vault: &v1beta1.VaultProvider{
+			Auth: v1beta1.VaultAuth{
+				TokenSecretRef: &v1.SecretKeySelector{
+					Name:      "foo",
+					Namespace: &ns,
+					Key:       "Baz",
+				},
+				Kubernetes: &v1beta1.VaultKubernetesAuth{
+					ServiceAccountRef: &v1.ServiceAccountSelector{
+						Name:      "kfoo",
+						Namespace: &ns,
+						Audiences: []string{"bzzzzing"},
+					},
+				},
+			},
+		},
+	}
+
+	res := &ItResult{}
+
+	iterate(prov, res)
+
+	log.Printf("=== RESULTS: %#v", res)
+}
+
+type ItResult struct {
+	SecretKeySelectors      []v1.SecretKeySelector
+	ServiceAccountSelectors []v1.ServiceAccountSelector
+	CAProviders             []v1beta1.CAProvider
+}
+
+func iterate(data interface{}, res *ItResult) {
+	log.Printf("iterate: %#v %#v", reflect.ValueOf(data).Interface(), res)
+	if reflect.ValueOf(data).Kind() == reflect.Slice {
+		d := reflect.ValueOf(data)
+		for i := 0; i < d.Len(); i++ {
+			val := d.Index(i)
+			analyse(val, res)
+			iterate(reflect.Indirect(d.Index(i)).Interface(), res)
+		}
+	} else if reflect.ValueOf(data).Kind() == reflect.Map {
+		d := reflect.ValueOf(data)
+		for _, k := range d.MapKeys() {
+			typeOfValue := reflect.TypeOf(d.MapIndex(k).Interface()).Kind()
+			if typeOfValue == reflect.Map || typeOfValue == reflect.Slice {
+				val := d.MapIndex(k)
+				analyse(val, res)
+				iterate(reflect.Indirect(val).Interface(), res)
+			} else {
+				log.Printf("val not map or slice: %#v", typeOfValue)
+			}
+		}
+	} else if reflect.ValueOf(data).Kind() == reflect.Pointer {
+		originalValue := reflect.ValueOf(data).Elem()
+		if !originalValue.IsValid() {
+			return
+		}
+		iterate(reflect.Indirect(originalValue).Interface(), res)
+	} else if reflect.ValueOf(data).Kind() == reflect.Struct {
+		v := reflect.ValueOf(data)
+		for _, f := range reflect.VisibleFields(v.Type()) {
+			val := v.FieldByIndex(f.Index)
+			log.Printf("checking field %s ftype=%s type=%s kind=%d|%s", f.Name, f.Type, val.Type(), val.Type().Kind(), val.Type().Kind())
+			analyse(val, res)
+			vv := reflect.Indirect(val)
+			if vv.IsValid() {
+				iterate(vv.Interface(), res)
+			}
+		}
+	}
+}
+
+func analyse(val reflect.Value, res *ItResult) {
+	log.Printf("analyse: %#v %#v", val, res)
+	if val.Kind() == reflect.Pointer {
+		originalValue := val.Elem()
+		if !originalValue.IsValid() {
+			return
+		}
+		analyse(reflect.Indirect(originalValue), res)
+		return
+	}
+
+	secretSelT := reflect.TypeOf(v1.SecretKeySelector{})
+	if val.Type().AssignableTo(secretSelT) {
+		sel := val.Interface().(v1.SecretKeySelector)
+		res.SecretKeySelectors = append(res.SecretKeySelectors, sel)
+		return
+	}
+
+	serviceAccSelT := reflect.TypeOf(v1.ServiceAccountSelector{})
+	if val.Type().AssignableTo(serviceAccSelT) {
+		sel := val.Interface().(v1.ServiceAccountSelector)
+		res.ServiceAccountSelectors = append(res.ServiceAccountSelectors, sel)
+		return
+	}
+
+	caProviderT := reflect.TypeOf(v1beta1.CAProvider{})
+	if val.Type().AssignableTo(caProviderT) {
+		sel := val.Interface().(v1beta1.CAProvider)
+		res.CAProviders = append(res.CAProviders, sel)
+		return
+	}
+
+	// TODO: add more types that are of interest...
+}