client.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "log"
  6. "reflect"
  7. "time"
  8. "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  9. v1 "github.com/external-secrets/external-secrets/apis/meta/v1"
  10. pb "github.com/external-secrets/external-secrets/pkg/plugin/grpc"
  11. "google.golang.org/grpc"
  12. "google.golang.org/grpc/credentials/insecure"
  13. )
  14. var (
  15. addr = flag.String("addr", "unix:///tmp/plugin.sock", "the address to connect to")
  16. )
  17. func main() {
  18. flag.Parse()
  19. reflector()
  20. // Set up a connection to the server.
  21. conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
  22. if err != nil {
  23. log.Fatalf("did not connect: %v", err)
  24. }
  25. defer conn.Close()
  26. c := pb.NewSecretsClientClient(conn)
  27. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  28. defer cancel()
  29. res, err := c.GetSecret(ctx, &pb.GetSecretRequest{
  30. RemoteRef: &pb.RemoteRef{
  31. Key: "foo",
  32. },
  33. })
  34. if err != nil {
  35. log.Fatalf("could not greet: %v", err)
  36. }
  37. log.Printf("secret=%s, err=%s", string(res.Secret), res.Error)
  38. }
  39. func reflector() {
  40. ns := "bar"
  41. prov := &v1beta1.SecretStoreProvider{
  42. Kubernetes: &v1beta1.KubernetesProvider{
  43. Auth: v1beta1.KubernetesAuth{
  44. Token: &v1beta1.TokenAuth{
  45. BearerToken: v1.SecretKeySelector{
  46. Name: "brr",
  47. Key: "fart",
  48. },
  49. },
  50. ServiceAccount: &v1.ServiceAccountSelector{
  51. Name: "ccccc",
  52. Namespace: &ns,
  53. Audiences: nil,
  54. },
  55. },
  56. Server: v1beta1.KubernetesServer{
  57. URL: "asdasda",
  58. CABundle: []byte{1, 23, 4, 1, 231, 23, 1},
  59. CAProvider: &v1beta1.CAProvider{
  60. Type: v1beta1.CAProviderTypeConfigMap,
  61. Name: "ca",
  62. Key: "ca.crt",
  63. Namespace: &ns,
  64. },
  65. },
  66. },
  67. Vault: &v1beta1.VaultProvider{
  68. Auth: v1beta1.VaultAuth{
  69. TokenSecretRef: &v1.SecretKeySelector{
  70. Name: "foo",
  71. Namespace: &ns,
  72. Key: "Baz",
  73. },
  74. Kubernetes: &v1beta1.VaultKubernetesAuth{
  75. ServiceAccountRef: &v1.ServiceAccountSelector{
  76. Name: "kfoo",
  77. Namespace: &ns,
  78. Audiences: []string{"bzzzzing"},
  79. },
  80. },
  81. },
  82. },
  83. }
  84. res := &ItResult{}
  85. iterate(prov, res)
  86. log.Printf("=== RESULTS: %#v", res)
  87. }
  88. type ItResult struct {
  89. SecretKeySelectors []v1.SecretKeySelector
  90. ServiceAccountSelectors []v1.ServiceAccountSelector
  91. CAProviders []v1beta1.CAProvider
  92. }
  93. func iterate(data interface{}, res *ItResult) {
  94. log.Printf("iterate: %#v %#v", reflect.ValueOf(data).Interface(), res)
  95. if reflect.ValueOf(data).Kind() == reflect.Slice {
  96. d := reflect.ValueOf(data)
  97. for i := 0; i < d.Len(); i++ {
  98. val := d.Index(i)
  99. analyse(val, res)
  100. iterate(reflect.Indirect(d.Index(i)).Interface(), res)
  101. }
  102. } else if reflect.ValueOf(data).Kind() == reflect.Map {
  103. d := reflect.ValueOf(data)
  104. for _, k := range d.MapKeys() {
  105. typeOfValue := reflect.TypeOf(d.MapIndex(k).Interface()).Kind()
  106. if typeOfValue == reflect.Map || typeOfValue == reflect.Slice {
  107. val := d.MapIndex(k)
  108. analyse(val, res)
  109. iterate(reflect.Indirect(val).Interface(), res)
  110. } else {
  111. log.Printf("val not map or slice: %#v", typeOfValue)
  112. }
  113. }
  114. } else if reflect.ValueOf(data).Kind() == reflect.Pointer {
  115. originalValue := reflect.ValueOf(data).Elem()
  116. if !originalValue.IsValid() {
  117. return
  118. }
  119. iterate(reflect.Indirect(originalValue).Interface(), res)
  120. } else if reflect.ValueOf(data).Kind() == reflect.Struct {
  121. v := reflect.ValueOf(data)
  122. for _, f := range reflect.VisibleFields(v.Type()) {
  123. val := v.FieldByIndex(f.Index)
  124. log.Printf("checking field %s ftype=%s type=%s kind=%d|%s", f.Name, f.Type, val.Type(), val.Type().Kind(), val.Type().Kind())
  125. analyse(val, res)
  126. vv := reflect.Indirect(val)
  127. if vv.IsValid() {
  128. iterate(vv.Interface(), res)
  129. }
  130. }
  131. }
  132. }
  133. func analyse(val reflect.Value, res *ItResult) {
  134. log.Printf("analyse: %#v %#v", val, res)
  135. if val.Kind() == reflect.Pointer {
  136. originalValue := val.Elem()
  137. if !originalValue.IsValid() {
  138. return
  139. }
  140. analyse(reflect.Indirect(originalValue), res)
  141. return
  142. }
  143. secretSelT := reflect.TypeOf(v1.SecretKeySelector{})
  144. if val.Type().AssignableTo(secretSelT) {
  145. sel := val.Interface().(v1.SecretKeySelector)
  146. res.SecretKeySelectors = append(res.SecretKeySelectors, sel)
  147. return
  148. }
  149. serviceAccSelT := reflect.TypeOf(v1.ServiceAccountSelector{})
  150. if val.Type().AssignableTo(serviceAccSelT) {
  151. sel := val.Interface().(v1.ServiceAccountSelector)
  152. res.ServiceAccountSelectors = append(res.ServiceAccountSelectors, sel)
  153. return
  154. }
  155. caProviderT := reflect.TypeOf(v1beta1.CAProvider{})
  156. if val.Type().AssignableTo(caProviderT) {
  157. sel := val.Interface().(v1beta1.CAProvider)
  158. res.CAProviders = append(res.CAProviders, sel)
  159. return
  160. }
  161. // TODO: add more types that are of interest...
  162. }