9
9
container "cloud.google.com/go/container/apiv1"
10
10
"github.com/kubescape/k8s-interface/k8sinterface"
11
11
"golang.org/x/oauth2/google"
12
+ "google.golang.org/api/iam/v1"
13
+ "google.golang.org/api/option"
12
14
containerpb "google.golang.org/genproto/googleapis/container/v1"
13
15
)
14
16
@@ -18,6 +20,7 @@ type IGKESupport interface {
18
20
GetProject (cluster string ) (string , error )
19
21
GetRegion (cluster string ) (string , error )
20
22
GetContextName (cluster string ) string
23
+ GetIAMMappings (project string ) (map [string ]string , map [string ]string , error )
21
24
}
22
25
type GKESupport struct {
23
26
}
@@ -111,3 +114,64 @@ func (gkeSupport *GKESupport) GetContextName(cluster string) string {
111
114
}
112
115
return parsedName [3 ]
113
116
}
117
+
118
+ // GetIAMMappings returns iam-roles and service accounts
119
+ func (gkeSupport * GKESupport ) GetIAMMappings (project string ) (map [string ]string , map [string ]string , error ) {
120
+ ctx := context .Background ()
121
+ client , err := google .DefaultClient (ctx , iam .CloudPlatformScope )
122
+ if err != nil {
123
+ return nil , nil , fmt .Errorf ("failed to create Google Cloud client: %w" , err )
124
+ }
125
+ if err != nil {
126
+ return nil , nil , fmt .Errorf ("failed to create Google Cloud client: %w" , err )
127
+ }
128
+
129
+ iamService , err := iam .NewService (ctx , option .WithHTTPClient (client ))
130
+ if err != nil {
131
+ return nil , nil , fmt .Errorf ("failed to create IAM service client: %w" , err )
132
+ }
133
+
134
+ roleMappings := make (map [string ]string )
135
+ saMappings := make (map [string ]string )
136
+
137
+ roleIterator , err := iamService .Projects .Roles .List ("projects/" + project ).Do ()
138
+ if err != nil {
139
+ return nil , nil , fmt .Errorf ("failed to retrieve roles: %w" , err )
140
+ }
141
+ for {
142
+ for _ , role := range roleIterator .Roles {
143
+ roleMappings [role .Name ] = role .Title
144
+ }
145
+
146
+ if roleIterator .NextPageToken == "" {
147
+ break
148
+ }
149
+
150
+ roleIterator , err = iamService .Projects .Roles .List ("projects/" + project ).PageToken (roleIterator .NextPageToken ).Do ()
151
+ if err != nil {
152
+ return nil , nil , fmt .Errorf ("failed to retrieve roles: %w" , err )
153
+ }
154
+ }
155
+
156
+ saIterator , err := iamService .Projects .ServiceAccounts .List ("projects/" + project ).Do ()
157
+ if err != nil {
158
+ return nil , nil , fmt .Errorf ("failed to retrieve service accounts: %w" , err )
159
+ }
160
+ for {
161
+
162
+ for _ , sa := range saIterator .Accounts {
163
+ saMappings [sa .Name ] = sa .Name
164
+ }
165
+
166
+ if saIterator .NextPageToken == "" {
167
+ break
168
+ }
169
+
170
+ saIterator , err = iamService .Projects .ServiceAccounts .List ("projects/" + project ).PageToken (saIterator .NextPageToken ).Do ()
171
+ if err != nil {
172
+ return nil , nil , fmt .Errorf ("failed to retrieve service accounts: %w" , err )
173
+ }
174
+ }
175
+
176
+ return roleMappings , saMappings , nil
177
+ }
0 commit comments