...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package iamclient
16
17 import (
18 "fmt"
19
20 corekccv1alpha1 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/apis/core/v1alpha1"
21 iamv1beta1 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/apis/iam/v1beta1"
22 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/gvks/externalonlygvks"
23
24 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
25 "k8s.io/apimachinery/pkg/runtime/schema"
26 )
27
28
29
30 type ExternalOnlyType struct {
31
32
33 UnstructHandler func(ref iamv1beta1.ResourceReference, u *unstructured.Unstructured) *unstructured.Unstructured
34
35
36
37 ResourceConfig *corekccv1alpha1.ResourceConfig
38
39
40
41 ExternalFormat string
42 }
43
44 var ExternalOnlyTypes = map[schema.GroupVersionKind]ExternalOnlyType{
45 externalonlygvks.OrganizationGVK: {
46 UnstructHandler: func(ref iamv1beta1.ResourceReference, u *unstructured.Unstructured) *unstructured.Unstructured {
47 u.Object["spec"] = map[string]interface{}{
48 "org_id": ref.External,
49 }
50 return u
51 },
52 ResourceConfig: &corekccv1alpha1.ResourceConfig{
53 IAMConfig: corekccv1alpha1.IAMConfig{
54 PolicyName: "google_organization_iam_policy",
55 PolicyMemberName: "google_organization_iam_member",
56 AuditConfigName: "google_organization_iam_audit_config",
57 ReferenceField: corekccv1alpha1.IAMReferenceField{
58 Name: "org_id",
59 Type: "id",
60 },
61 SupportsConditions: true,
62 },
63 },
64 ExternalFormat: "{{org_id}}",
65 },
66 externalonlygvks.BillingAccountGVK: {
67 UnstructHandler: func(ref iamv1beta1.ResourceReference, u *unstructured.Unstructured) *unstructured.Unstructured {
68 u.Object["spec"] = map[string]interface{}{
69 "billing_account_id": ref.External,
70 }
71 return u
72 },
73 ResourceConfig: &corekccv1alpha1.ResourceConfig{
74 IAMConfig: corekccv1alpha1.IAMConfig{
75 PolicyName: "google_billing_account_iam_policy",
76 PolicyMemberName: "google_billing_account_iam_member",
77 ReferenceField: corekccv1alpha1.IAMReferenceField{
78 Name: "billing_account_id",
79 Type: "id",
80 },
81 SupportsConditions: true,
82 },
83 },
84 ExternalFormat: "{{billing_account_id}}",
85 },
86 }
87
88 func GetResourceConfigForExternalOnlyGVK(gvk schema.GroupVersionKind) (*corekccv1alpha1.ResourceConfig, error) {
89 ext, ok := ExternalOnlyTypes[gvk]
90 if !ok {
91 return nil, fmt.Errorf("unsupported external-only reference of type %v", gvk)
92 }
93 return ext.ResourceConfig, nil
94 }
95
96 func unstructuredIAMSkeletonForExternalOnlyRef(resourceRef iamv1beta1.ResourceReference, u *unstructured.Unstructured) (
97 *unstructured.Unstructured, error) {
98 gvk := resourceRef.GroupVersionKind()
99 ext, ok := ExternalOnlyTypes[gvk]
100 if !ok {
101 return nil, fmt.Errorf("unsupported external-only reference of type %v", gvk)
102 }
103 return ext.UnstructHandler(resourceRef, u), nil
104 }
105
View as plain text