|
|
@@ -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...
|
|
|
+}
|