@@ -33,7 +33,7 @@ func TestSecrets_GenerateAccessToken(t *testing.T) {
33
33
secretType := SecretTypeAccessToken
34
34
rsName := "test-gentoken"
35
35
36
- td := setupTest (t )
36
+ td := setupTest (t , "0s" , "2h" )
37
37
defer cleanup (t , td , rsName , testRoles )
38
38
39
39
projRes := fmt .Sprintf (testProjectResourceTemplate , td .Project )
@@ -69,11 +69,11 @@ func TestSecrets_GenerateAccessToken(t *testing.T) {
69
69
verifyProjectBindingsRemoved (t , td , sa .Email , testRoles )
70
70
}
71
71
72
- func TestSecrets_GenerateKey (t * testing.T ) {
72
+ func TestSecrets_GenerateKeyConfigTTL (t * testing.T ) {
73
73
secretType := SecretTypeKey
74
74
rsName := "test-genkey"
75
75
76
- td := setupTest (t )
76
+ td := setupTest (t , "1h" , "2h" )
77
77
defer cleanup (t , td , rsName , testRoles )
78
78
79
79
projRes := fmt .Sprintf (testProjectResourceTemplate , td .Project )
@@ -95,13 +95,148 @@ func TestSecrets_GenerateKey(t *testing.T) {
95
95
// expect error for trying to read token from key roleset
96
96
testGetTokenFail (t , td , rsName )
97
97
98
- creds , secret := testGetKey (t , td , rsName )
98
+ creds , resp := testGetKey (t , td , rsName )
99
+ if int (resp .Secret .LeaseTotal ().Hours ()) != 1 {
100
+ t .Fatalf ("expected lease duration %d, got %d" , 1 , int (resp .Secret .LeaseTotal ().Hours ()))
101
+ }
102
+
103
+ // Confirm calls with key work
104
+ keyHttpC := oauth2 .NewClient (context .Background (), creds .TokenSource )
105
+ checkSecretPermissions (t , td , keyHttpC )
106
+
107
+ keyName := resp .Secret .InternalData ["key_name" ].(string )
108
+ if keyName == "" {
109
+ t .Fatalf ("expected internal data to include key name" )
110
+ }
111
+
112
+ _ , err = td .IamAdmin .Projects .ServiceAccounts .Keys .Get (keyName ).Do ()
113
+ if err != nil {
114
+ t .Fatalf ("could not get key from given internal 'key_name': %v" , err )
115
+ }
116
+
117
+ testRenewSecretKey (t , td , resp .Secret )
118
+ testRevokeSecretKey (t , td , resp .Secret )
119
+
120
+ k , err := td .IamAdmin .Projects .ServiceAccounts .Keys .Get (keyName ).Do ()
121
+
122
+ if k != nil {
123
+ t .Fatalf ("expected error as revoked key was deleted, instead got key: %v" , k )
124
+ }
125
+ if err == nil || ! isGoogleAccountKeyNotFoundErr (err ) {
126
+ t .Fatalf ("expected 404 error from getting deleted key, instead got error: %v" , err )
127
+ }
128
+
129
+ // Cleanup: Delete role set
130
+ testRoleSetDelete (t , td , rsName , sa .Name )
131
+ verifyProjectBindingsRemoved (t , td , sa .Email , testRoles )
132
+ }
133
+
134
+ func TestSecrets_GenerateKeyTTLOverride (t * testing.T ) {
135
+ secretType := SecretTypeKey
136
+ rsName := "test-genkey"
137
+
138
+ td := setupTest (t , "1h" , "2h" )
139
+ defer cleanup (t , td , rsName , testRoles )
140
+
141
+ projRes := fmt .Sprintf (testProjectResourceTemplate , td .Project )
142
+
143
+ // Create new role set
144
+ expectedBinds := ResourceBindings {projRes : testRoles }
145
+ bindsRaw , err := util .BindingsHCL (expectedBinds )
146
+ if err != nil {
147
+ t .Fatalf ("unable to convert resource bindings to HCL string: %v" , err )
148
+ }
149
+ testRoleSetCreate (t , td , rsName ,
150
+ map [string ]interface {}{
151
+ "secret_type" : secretType ,
152
+ "project" : td .Project ,
153
+ "bindings" : bindsRaw ,
154
+ })
155
+ sa := getRoleSetAccount (t , td , rsName )
156
+
157
+ // expect error for trying to read token from key roleset
158
+ testGetTokenFail (t , td , rsName )
159
+
160
+ // call the POST endpoint of /gcp/key/:roleset with updated TTL
161
+ creds , resp := testPostKey (t , td , rsName , "60s" )
162
+ if int (resp .Secret .LeaseTotal ().Seconds ()) != 60 {
163
+ t .Fatalf ("expected lease duration %d, got %d" , 60 , int (resp .Secret .LeaseTotal ().Seconds ()))
164
+ }
165
+
166
+ // Confirm calls with key work
167
+ keyHttpC := oauth2 .NewClient (context .Background (), creds .TokenSource )
168
+ checkSecretPermissions (t , td , keyHttpC )
169
+
170
+ keyName := resp .Secret .InternalData ["key_name" ].(string )
171
+ if keyName == "" {
172
+ t .Fatalf ("expected internal data to include key name" )
173
+ }
174
+
175
+ _ , err = td .IamAdmin .Projects .ServiceAccounts .Keys .Get (keyName ).Do ()
176
+ if err != nil {
177
+ t .Fatalf ("could not get key from given internal 'key_name': %v" , err )
178
+ }
179
+
180
+ testRenewSecretKey (t , td , resp .Secret )
181
+ testRevokeSecretKey (t , td , resp .Secret )
182
+
183
+ k , err := td .IamAdmin .Projects .ServiceAccounts .Keys .Get (keyName ).Do ()
184
+
185
+ if k != nil {
186
+ t .Fatalf ("expected error as revoked key was deleted, instead got key: %v" , k )
187
+ }
188
+ if err == nil || ! isGoogleAccountKeyNotFoundErr (err ) {
189
+ t .Fatalf ("expected 404 error from getting deleted key, instead got error: %v" , err )
190
+ }
191
+
192
+ // Cleanup: Delete role set
193
+ testRoleSetDelete (t , td , rsName , sa .Name )
194
+ verifyProjectBindingsRemoved (t , td , sa .Email , testRoles )
195
+ }
196
+
197
+ // TestSecrets_GenerateKeyMaxTTLCheck verifies the MaxTTL is set for the
198
+ // configured backend
199
+ func TestSecrets_GenerateKeyMaxTTLCheck (t * testing.T ) {
200
+ secretType := SecretTypeKey
201
+ rsName := "test-genkey"
202
+
203
+ td := setupTest (t , "1h" , "2h" )
204
+ defer cleanup (t , td , rsName , testRoles )
205
+
206
+ projRes := fmt .Sprintf (testProjectResourceTemplate , td .Project )
207
+
208
+ // Create new role set
209
+ expectedBinds := ResourceBindings {projRes : testRoles }
210
+ bindsRaw , err := util .BindingsHCL (expectedBinds )
211
+ if err != nil {
212
+ t .Fatalf ("unable to convert resource bindings to HCL string: %v" , err )
213
+ }
214
+ testRoleSetCreate (t , td , rsName ,
215
+ map [string ]interface {}{
216
+ "secret_type" : secretType ,
217
+ "project" : td .Project ,
218
+ "bindings" : bindsRaw ,
219
+ })
220
+ sa := getRoleSetAccount (t , td , rsName )
221
+
222
+ // expect error for trying to read token from key roleset
223
+ testGetTokenFail (t , td , rsName )
224
+
225
+ // call the POST endpoint of /gcp/key/:roleset with updated TTL
226
+ creds , resp := testPostKey (t , td , rsName , "60s" )
227
+ if int (resp .Secret .LeaseTotal ().Seconds ()) != 60 {
228
+ t .Fatalf ("expected lease duration %d, got %d" , 60 , int (resp .Secret .LeaseTotal ().Seconds ()))
229
+ }
230
+
231
+ if int (resp .Secret .LeaseOptions .MaxTTL .Hours ()) != 2 {
232
+ t .Fatalf ("expected max lease %d, got %d" , 2 , int (resp .Secret .LeaseOptions .MaxTTL .Hours ()))
233
+ }
99
234
100
235
// Confirm calls with key work
101
236
keyHttpC := oauth2 .NewClient (context .Background (), creds .TokenSource )
102
237
checkSecretPermissions (t , td , keyHttpC )
103
238
104
- keyName := secret .InternalData ["key_name" ].(string )
239
+ keyName := resp . Secret .InternalData ["key_name" ].(string )
105
240
if keyName == "" {
106
241
t .Fatalf ("expected internal data to include key name" )
107
242
}
@@ -111,8 +246,8 @@ func TestSecrets_GenerateKey(t *testing.T) {
111
246
t .Fatalf ("could not get key from given internal 'key_name': %v" , err )
112
247
}
113
248
114
- testRenewSecretKey (t , td , secret )
115
- testRevokeSecretKey (t , td , secret )
249
+ testRenewSecretKey (t , td , resp . Secret )
250
+ testRevokeSecretKey (t , td , resp . Secret )
116
251
117
252
k , err := td .IamAdmin .Projects .ServiceAccounts .Keys .Get (keyName ).Do ()
118
253
@@ -211,11 +346,18 @@ func testGetToken(t *testing.T, td *testData, rsName string) (token string) {
211
346
return tokenRaw .(string )
212
347
}
213
348
214
- func testGetKey (t * testing.T , td * testData , rsName string ) (* google.Credentials , * logical.Secret ) {
349
+ // testPostKey enables the POST call to /gcp/key/:roleset
350
+ func testPostKey (t * testing.T , td * testData , rsName , ttl string ) (* google.Credentials , * logical.Response ) {
351
+ data := map [string ]interface {}{}
352
+ if ttl != "" {
353
+ data ["ttl" ] = ttl
354
+ }
355
+
215
356
resp , err := td .B .HandleRequest (context .Background (), & logical.Request {
216
- Operation : logical .ReadOperation ,
357
+ Operation : logical .UpdateOperation ,
217
358
Path : fmt .Sprintf ("key/%s" , rsName ),
218
359
Storage : td .S ,
360
+ Data : data ,
219
361
})
220
362
221
363
if err != nil {
@@ -227,12 +369,33 @@ func testGetKey(t *testing.T, td *testData, rsName string) (*google.Credentials,
227
369
if resp == nil || resp .Secret == nil {
228
370
t .Fatalf ("expected response with secret, got response: %v" , resp )
229
371
}
230
- if resp .Secret .ExpirationTime ().Sub (resp .Secret .IssueTime ) > defaultLeaseTTLHr * time .Hour {
231
- t .Fatalf ("unexpected lease duration is longer than backend default" )
372
+
373
+ creds := getGoogleCredentials (t , resp .Data )
374
+ return creds , resp
375
+ }
376
+
377
+ func testGetKey (t * testing.T , td * testData , rsName string ) (* google.Credentials , * logical.Response ) {
378
+ data := map [string ]interface {}{}
379
+
380
+ resp , err := td .B .HandleRequest (context .Background (), & logical.Request {
381
+ Operation : logical .ReadOperation ,
382
+ Path : fmt .Sprintf ("key/%s" , rsName ),
383
+ Storage : td .S ,
384
+ Data : data ,
385
+ })
386
+
387
+ if err != nil {
388
+ t .Fatal (err )
389
+ }
390
+ if resp != nil && resp .IsError () {
391
+ t .Fatal (resp .Error ())
392
+ }
393
+ if resp == nil || resp .Secret == nil {
394
+ t .Fatalf ("expected response with secret, got response: %v" , resp )
232
395
}
233
396
234
397
creds := getGoogleCredentials (t , resp .Data )
235
- return creds , resp . Secret
398
+ return creds , resp
236
399
}
237
400
238
401
func testRenewSecretKey (t * testing.T , td * testData , sec * logical.Secret ) {
0 commit comments