Skip to content

Commit 17158e5

Browse files
authored
[Key Vault Admin] Updates to the upsertRoleDefinition method and options (Azure#15342)
Updates to the upsertRoleDefinition method and options. This PR makes only the first parameter of `upsertRoleDefinition` required and moves all of the others to the options bag. Also adds relevant comments. Fixes Azure#15182
1 parent f046c5e commit 17158e5

File tree

9 files changed

+77
-37
lines changed

9 files changed

+77
-37
lines changed

sdk/keyvault/keyvault-admin/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@
9696
"@azure/core-paging": "^1.1.1",
9797
"@azure/core-tracing": "1.0.0-preview.11",
9898
"@azure/logger": "^1.0.0",
99+
"@types/uuid": "^8.0.0",
100+
"uuid": "^8.3.0",
99101
"tslib": "^2.0.0"
100102
},
101103
"devDependencies": {
@@ -116,7 +118,6 @@
116118
"@types/sinon": "^9.0.4",
117119
"@types/mocha": "^7.0.2",
118120
"@types/node": "^8.0.0",
119-
"@types/uuid": "^8.0.0",
120121
"assert": "^1.4.1",
121122
"chai": "^4.2.0",
122123
"chai-as-promised": "^7.1.1",
@@ -137,7 +138,6 @@
137138
"sinon": "^9.0.2",
138139
"source-map-support": "^0.5.9",
139140
"typescript": "~4.2.0",
140-
"uuid": "^8.3.0",
141141
"typedoc": "0.15.2"
142142
}
143143
}

sdk/keyvault/keyvault-admin/recordings/node/keyvaultaccesscontrolclient_role_definitions/recording_can_create_update_and_delete_a_role_definition_happy_path.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/keyvault/keyvault-admin/review/keyvault-admin.api.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class KeyVaultAccessControlClient {
4545
getRoleDefinition(roleScope: KeyVaultRoleScope, name: string, options?: GetRoleDefinitionOptions): Promise<KeyVaultRoleDefinition>;
4646
listRoleAssignments(roleScope: KeyVaultRoleScope, options?: ListRoleAssignmentsOptions): PagedAsyncIterableIterator<KeyVaultRoleAssignment>;
4747
listRoleDefinitions(roleScope: KeyVaultRoleScope, options?: ListRoleDefinitionsOptions): PagedAsyncIterableIterator<KeyVaultRoleDefinition>;
48-
upsertRoleDefinition(roleScope: KeyVaultRoleScope, name: string, permissions: KeyVaultPermission[], description?: string, options?: UpsertRoleDefinitionOptions): Promise<KeyVaultRoleDefinition>;
48+
upsertRoleDefinition(roleScope: KeyVaultRoleScope, options?: UpsertRoleDefinitionOptions): Promise<KeyVaultRoleDefinition>;
4949
readonly vaultUrl: string;
5050
}
5151

@@ -184,6 +184,11 @@ export type SUPPORTED_API_VERSIONS = "7.2";
184184

185185
// @public
186186
export interface UpsertRoleDefinitionOptions extends coreHttp.OperationOptions {
187+
assignableScopes?: KeyVaultRoleScope[];
188+
description?: string;
189+
permissions?: KeyVaultPermission[];
190+
roleDefinitionName?: string;
191+
roleName?: string;
187192
}
188193

189194

sdk/keyvault/keyvault-admin/samples-dev/accessControlHelloWorld.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ export async function main(): Promise<void> {
4040
]
4141
}
4242
];
43-
let roleDefinition = await client.upsertRoleDefinition(
44-
globalScope,
43+
let roleDefinition = await client.upsertRoleDefinition(globalScope, {
4544
roleDefinitionName,
45+
roleName: "Backup Manager",
4646
permissions,
47-
"Allow backup actions"
48-
);
47+
description: "Allow backup actions"
48+
});
4949
console.log(roleDefinition);
5050

5151
// This sample uses a custom role but you may assign one of the many built-in roles.

sdk/keyvault/keyvault-admin/samples/v4/javascript/accessControlHelloWorld.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@ async function main() {
4242
];
4343
let roleDefinition = await client.upsertRoleDefinition(
4444
globalScope,
45-
roleDefinitionName,
46-
permissions,
47-
"Allow backup actions"
45+
{
46+
roleDefinitionName,
47+
roleName: "Backup Manager",
48+
permissions,
49+
description: "Allow backup actions"
50+
}
4851
);
4952
console.log(roleDefinition);
5053

sdk/keyvault/keyvault-admin/samples/v4/typescript/src/accessControlHelloWorld.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@ export async function main(): Promise<void> {
4242
];
4343
let roleDefinition = await client.upsertRoleDefinition(
4444
globalScope,
45-
roleDefinitionName,
46-
permissions,
47-
"Allow backup actions"
45+
{
46+
roleDefinitionName,
47+
roleName: "Backup Manager",
48+
permissions,
49+
description: "Allow backup actions"
50+
}
4851
);
4952
console.log(roleDefinition);
5053

sdk/keyvault/keyvault-admin/src/accessControlClient.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
GetRoleAssignmentOptions,
3131
ListRoleDefinitionsPageSettings,
3232
ListRoleAssignmentsPageSettings,
33-
KeyVaultPermission,
3433
GetRoleDefinitionOptions,
3534
UpsertRoleDefinitionOptions,
3635
DeleteRoleDefinitionOptions
@@ -39,6 +38,7 @@ import {
3938
import { SDK_VERSION, LATEST_API_VERSION } from "./constants";
4039
import { mappings } from "./mappings";
4140
import { logger } from "./log";
41+
import { v4 as v4uuid } from "uuid";
4242

4343
const withTrace = createTraceFunction("Azure.KeyVault.Admin.KeyVaultAccessControlClient");
4444

@@ -453,22 +453,19 @@ export class KeyVaultAccessControlClient {
453453
*/
454454
public upsertRoleDefinition(
455455
roleScope: KeyVaultRoleScope,
456-
name: string,
457-
permissions: KeyVaultPermission[],
458-
description?: string,
459456
options: UpsertRoleDefinitionOptions = {}
460457
): Promise<KeyVaultRoleDefinition> {
461458
return withTrace("upsertRoleDefinition", options, async (updatedOptions) => {
462459
const response = await this.client.roleDefinitions.createOrUpdate(
463460
this.vaultUrl,
464461
roleScope,
465-
name,
462+
options.roleDefinitionName || v4uuid(),
466463
{
467464
properties: {
468-
description,
469-
permissions,
465+
description: options.description,
466+
permissions: options.permissions,
470467
assignableScopes: [roleScope],
471-
roleName: name,
468+
roleName: options.roleName,
472469
roleType: "CustomRole"
473470
}
474471
},

sdk/keyvault/keyvault-admin/src/accessControlModels.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,28 @@ export interface GetRoleDefinitionOptions extends coreHttp.OperationOptions {}
192192
/**
193193
* An interface representing optional parameters passed to {@link upsertRoleDefinition}.
194194
*/
195-
export interface UpsertRoleDefinitionOptions extends coreHttp.OperationOptions {}
195+
export interface UpsertRoleDefinitionOptions extends coreHttp.OperationOptions {
196+
/**
197+
* UUID used as the name of the role definition to create. If it's not provided, a new UUID will be generated.
198+
*/
199+
roleDefinitionName?: string;
200+
/**
201+
* Friendly display name for the role definition.
202+
*/
203+
roleName?: string;
204+
/**
205+
* Long-form description of the role definition.
206+
*/
207+
description?: string;
208+
/**
209+
* List of Key Vault permissions
210+
*/
211+
permissions?: KeyVaultPermission[];
212+
/**
213+
* List of assignable Key Vault role scopes
214+
*/
215+
assignableScopes?: KeyVaultRoleScope[];
216+
}
196217

197218
/**
198219
* An interface representing optional parameters passed to {@link deleteRoleDefinition}.

sdk/keyvault/keyvault-admin/test/public/accessControlClient.spec.ts

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,14 @@ describe("KeyVaultAccessControlClient", () => {
9191

9292
it("can create, update, and delete a role definition (happy path)", async function() {
9393
const name = generateFakeUUID();
94+
const roleName = "custom role definition name";
9495
const description = "custom role description";
95-
let roleDefinition: KeyVaultRoleDefinition = await client.upsertRoleDefinition(
96-
globalScope,
97-
name,
96+
let roleDefinition: KeyVaultRoleDefinition = await client.upsertRoleDefinition(globalScope, {
97+
roleDefinitionName: name,
98+
roleName,
9899
permissions,
99100
description
100-
);
101+
});
101102

102103
assert.equal(roleDefinition.name, name);
103104
assert.equal(roleDefinition.description, description);
@@ -115,12 +116,12 @@ describe("KeyVaultAccessControlClient", () => {
115116
notDataActions: ["Microsoft.KeyVault/managedHsm/keys/encrypt/action"]
116117
});
117118

118-
roleDefinition = await client.upsertRoleDefinition(
119-
globalScope,
120-
name,
119+
roleDefinition = await client.upsertRoleDefinition(globalScope, {
120+
roleDefinitionName: name,
121+
roleName,
121122
permissions,
122123
description
123-
);
124+
});
124125

125126
assert.equal(roleDefinition.id, id);
126127
assert.deepEqual(roleDefinition.permissions, permissions);
@@ -138,7 +139,13 @@ describe("KeyVaultAccessControlClient", () => {
138139

139140
describe("upsertRoleDefinition", function() {
140141
it("errors when name is not a valid guid", async function() {
141-
await assert.isRejected(client.upsertRoleDefinition(globalScope, "foo", []));
142+
await assert.isRejected(
143+
client.upsertRoleDefinition(globalScope, {
144+
roleDefinitionName: "foo unique value",
145+
roleName: "foo role definition name",
146+
permissions: []
147+
})
148+
);
142149
});
143150

144151
it("errors when updating a built-in role definition", async function() {
@@ -155,7 +162,11 @@ describe("KeyVaultAccessControlClient", () => {
155162
}
156163

157164
await assert.isRejected(
158-
client.upsertRoleDefinition(globalScope, builtInDefinition.name, permissions)
165+
client.upsertRoleDefinition(globalScope, {
166+
roleDefinitionName: builtInDefinition.name,
167+
roleName: builtInDefinition.roleName,
168+
permissions
169+
})
159170
);
160171
});
161172
});

0 commit comments

Comments
 (0)