@drunk-pulumi/azure-components 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PulumiPlugin.yaml +1 -0
- package/README.md +1 -0
- package/ResourceBuilder.d.ts +54 -0
- package/ResourceBuilder.js +71 -0
- package/aks/AzKubernetes.d.ts +55 -0
- package/aks/AzKubernetes.js +288 -0
- package/aks/ContainerRegistry.d.ts +19 -0
- package/aks/ContainerRegistry.js +119 -0
- package/aks/helpers.d.ts +6 -0
- package/aks/helpers.js +52 -0
- package/aks/index.d.ts +3 -0
- package/aks/index.js +43 -0
- package/app/AppCert.d.ts +15 -0
- package/app/AppCert.js +74 -0
- package/app/AppConfig.d.ts +18 -0
- package/app/AppConfig.js +124 -0
- package/app/AppService.d.ts +69 -0
- package/app/AppService.js +122 -0
- package/app/IoTHub.d.ts +15 -0
- package/app/IoTHub.js +80 -0
- package/app/LogicApp.d.ts +19 -0
- package/app/LogicApp.js +77 -0
- package/app/SignalR.d.ts +45 -0
- package/app/SignalR.js +125 -0
- package/app/index.d.ts +6 -0
- package/app/index.js +23 -0
- package/azAd/AppRegistration.d.ts +52 -0
- package/azAd/AppRegistration.js +165 -0
- package/azAd/AzRole.d.ts +14 -0
- package/azAd/AzRole.js +72 -0
- package/azAd/CustomRoles.d.ts +10 -0
- package/azAd/CustomRoles.js +73 -0
- package/azAd/GroupRole.d.ts +29 -0
- package/azAd/GroupRole.js +107 -0
- package/azAd/RoleAssignment.d.ts +15 -0
- package/azAd/RoleAssignment.js +63 -0
- package/azAd/UserAssignedIdentity.d.ts +17 -0
- package/azAd/UserAssignedIdentity.js +76 -0
- package/azAd/helpers/graphBuiltIn.d.ts +14 -0
- package/azAd/helpers/graphBuiltIn.js +5134 -0
- package/azAd/helpers/index.d.ts +3 -0
- package/azAd/helpers/index.js +39 -0
- package/azAd/helpers/rolesBuiltIn.d.ts +90 -0
- package/azAd/helpers/rolesBuiltIn.js +18601 -0
- package/azAd/helpers/rsRoleDefinition.d.ts +62 -0
- package/azAd/helpers/rsRoleDefinition.js +120 -0
- package/azAd/index.d.ts +7 -0
- package/azAd/index.js +24 -0
- package/base/BaseComponent.d.ts +53 -0
- package/base/BaseComponent.js +98 -0
- package/base/BaseResourceComponent.d.ts +108 -0
- package/base/BaseResourceComponent.js +180 -0
- package/base/helpers.d.ts +12 -0
- package/base/helpers.js +29 -0
- package/base/index.d.ts +3 -0
- package/base/index.js +43 -0
- package/common/PGPGenerator.d.ts +26 -0
- package/common/PGPGenerator.js +72 -0
- package/common/RandomPassword.d.ts +21 -0
- package/common/RandomPassword.js +84 -0
- package/common/RandomString.d.ts +20 -0
- package/common/RandomString.js +74 -0
- package/common/ResourceLocker.d.ts +9 -0
- package/common/ResourceLocker.js +52 -0
- package/common/RsGroup.d.ts +20 -0
- package/common/RsGroup.js +85 -0
- package/common/SshGenerator.d.ts +17 -0
- package/common/SshGenerator.js +66 -0
- package/common/index.d.ts +5 -0
- package/common/index.js +22 -0
- package/database/AzSql.d.ts +71 -0
- package/database/AzSql.js +283 -0
- package/database/MySql.d.ts +35 -0
- package/database/MySql.js +181 -0
- package/database/Postgres.d.ts +32 -0
- package/database/Postgres.js +171 -0
- package/database/Redis.d.ts +26 -0
- package/database/Redis.js +125 -0
- package/database/helpers.d.ts +7 -0
- package/database/helpers.js +52 -0
- package/database/index.d.ts +5 -0
- package/database/index.js +45 -0
- package/helpers/Location/LocationBuiltIn.d.ts +6 -0
- package/helpers/Location/LocationBuiltIn.js +493 -0
- package/helpers/Location/index.d.ts +3 -0
- package/helpers/Location/index.js +25 -0
- package/helpers/autoTags.d.ts +1 -0
- package/helpers/autoTags.js +27 -0
- package/helpers/azureEnv.d.ts +21 -0
- package/helpers/azureEnv.js +102 -0
- package/helpers/configHelper.d.ts +5 -0
- package/helpers/configHelper.js +54 -0
- package/helpers/index.d.ts +4 -0
- package/helpers/index.js +41 -0
- package/helpers/rsHelpers.d.ts +18 -0
- package/helpers/rsHelpers.js +92 -0
- package/helpers/stackEnv.d.ts +4 -0
- package/helpers/stackEnv.js +54 -0
- package/index.d.ts +14 -0
- package/index.js +53 -0
- package/logs/Logs.d.ts +48 -0
- package/logs/Logs.js +154 -0
- package/logs/helpers.d.ts +1 -0
- package/logs/helpers.js +38 -0
- package/logs/index.d.ts +1 -0
- package/logs/index.js +18 -0
- package/package.json +34 -0
- package/services/Automation.d.ts +16 -0
- package/services/Automation.js +85 -0
- package/services/AzSearch.d.ts +20 -0
- package/services/AzSearch.js +113 -0
- package/services/ServiceBus.d.ts +42 -0
- package/services/ServiceBus.js +256 -0
- package/services/index.d.ts +3 -0
- package/services/index.js +20 -0
- package/storage/StorageAccount.d.ts +53 -0
- package/storage/StorageAccount.js +261 -0
- package/storage/helpers.d.ts +24 -0
- package/storage/helpers.js +89 -0
- package/storage/index.d.ts +2 -0
- package/storage/index.js +42 -0
- package/types.d.ts +125 -0
- package/types.js +3 -0
- package/vault/EncryptionKey.d.ts +21 -0
- package/vault/EncryptionKey.js +73 -0
- package/vault/KeyVault.d.ts +31 -0
- package/vault/KeyVault.js +110 -0
- package/vault/VaultSecret.d.ts +23 -0
- package/vault/VaultSecret.js +72 -0
- package/vault/VaultSecrets.d.ts +25 -0
- package/vault/VaultSecrets.js +31 -0
- package/vault/helpers.d.ts +1 -0
- package/vault/helpers.js +13 -0
- package/vault/index.d.ts +5 -0
- package/vault/index.js +45 -0
- package/vm/DiskEncryptionSet.d.ts +16 -0
- package/vm/DiskEncryptionSet.js +74 -0
- package/vm/VirtualMachine.d.ts +45 -0
- package/vm/VirtualMachine.js +192 -0
- package/vm/helpers.d.ts +16 -0
- package/vm/helpers.js +15 -0
- package/vm/index.d.ts +3 -0
- package/vm/index.js +43 -0
- package/vnet/AzCdn.d.ts +44 -0
- package/vnet/AzCdn.js +276 -0
- package/vnet/Basion.d.ts +19 -0
- package/vnet/Basion.js +78 -0
- package/vnet/DnsZone.d.ts +36 -0
- package/vnet/DnsZone.js +113 -0
- package/vnet/Firewall.d.ts +53 -0
- package/vnet/Firewall.js +136 -0
- package/vnet/FirewallPolicies/FirewallPolicyBuilder.d.ts +18 -0
- package/vnet/FirewallPolicies/FirewallPolicyBuilder.js +91 -0
- package/vnet/FirewallPolicies/commonPolicies.d.ts +10 -0
- package/vnet/FirewallPolicies/commonPolicies.js +55 -0
- package/vnet/FirewallPolicies/index.d.ts +0 -0
- package/vnet/FirewallPolicies/index.js +2 -0
- package/vnet/IpAddresses.d.ts +36 -0
- package/vnet/IpAddresses.js +74 -0
- package/vnet/NetworkPeering.d.ts +21 -0
- package/vnet/NetworkPeering.js +85 -0
- package/vnet/PrivateDnsZone.d.ts +38 -0
- package/vnet/PrivateDnsZone.js +111 -0
- package/vnet/PrivateEndpoint.d.ts +43 -0
- package/vnet/PrivateEndpoint.js +181 -0
- package/vnet/RouteTable.d.ts +22 -0
- package/vnet/RouteTable.js +75 -0
- package/vnet/VirtualNetwork.d.ts +99 -0
- package/vnet/VirtualNetwork.js +311 -0
- package/vnet/VpnGateway.d.ts +18 -0
- package/vnet/VpnGateway.js +90 -0
- package/vnet/helpers.d.ts +16 -0
- package/vnet/helpers.js +47 -0
- package/vnet/index.d.ts +13 -0
- package/vnet/index.js +53 -0
- package/vnet/securityRules/SecurityRuleBuilder.d.ts +12 -0
- package/vnet/securityRules/SecurityRuleBuilder.js +55 -0
- package/vnet/securityRules/commonRules.d.ts +9 -0
- package/vnet/securityRules/commonRules.js +94 -0
- package/vnet/securityRules/index.d.ts +2 -0
- package/vnet/securityRules/index.js +19 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as types from '../../types';
|
|
2
|
+
export type RsRoleDefinitionType = Record<types.GroupRoleTypes, string[]>;
|
|
3
|
+
declare const rsRoles: {
|
|
4
|
+
rsGroup: {
|
|
5
|
+
admin: string[];
|
|
6
|
+
contributor: string[];
|
|
7
|
+
readOnly: string[];
|
|
8
|
+
};
|
|
9
|
+
aks: {
|
|
10
|
+
readOnly: string[];
|
|
11
|
+
contributor: string[];
|
|
12
|
+
admin: string[];
|
|
13
|
+
};
|
|
14
|
+
iotHub: {
|
|
15
|
+
readOnly: string[];
|
|
16
|
+
contributor: string[];
|
|
17
|
+
admin: string[];
|
|
18
|
+
};
|
|
19
|
+
keyVault: {
|
|
20
|
+
readOnly: string[];
|
|
21
|
+
contributor: string[];
|
|
22
|
+
admin: string[];
|
|
23
|
+
};
|
|
24
|
+
storage: {
|
|
25
|
+
readOnly: string[];
|
|
26
|
+
contributor: string[];
|
|
27
|
+
admin: string[];
|
|
28
|
+
};
|
|
29
|
+
containerRegistry: {
|
|
30
|
+
readOnly: string[];
|
|
31
|
+
contributor: string[];
|
|
32
|
+
admin: string[];
|
|
33
|
+
};
|
|
34
|
+
appConfig: {
|
|
35
|
+
readOnly: string[];
|
|
36
|
+
contributor: string[];
|
|
37
|
+
admin: never[];
|
|
38
|
+
};
|
|
39
|
+
serviceBus: {
|
|
40
|
+
readOnly: string[];
|
|
41
|
+
contributor: string[];
|
|
42
|
+
admin: string[];
|
|
43
|
+
};
|
|
44
|
+
signalR: {
|
|
45
|
+
readOnly: string[];
|
|
46
|
+
contributor: string[];
|
|
47
|
+
admin: string[];
|
|
48
|
+
};
|
|
49
|
+
redis: {
|
|
50
|
+
readOnly: never[];
|
|
51
|
+
contributor: string[];
|
|
52
|
+
admin: never[];
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export type RsRoleDefinitionObject = {
|
|
56
|
+
[K in keyof typeof rsRoles]: RsRoleDefinitionType & {
|
|
57
|
+
getReadOnly: () => RsRoleDefinitionType;
|
|
58
|
+
getContributor: () => RsRoleDefinitionType;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export declare const rsRoleDefinitions: RsRoleDefinitionObject;
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rsRoleDefinitions = void 0;
|
|
4
|
+
const rsRoles = {
|
|
5
|
+
rsGroup: {
|
|
6
|
+
admin: ['Owner'],
|
|
7
|
+
contributor: ['Contributor'],
|
|
8
|
+
readOnly: ['Reader'],
|
|
9
|
+
},
|
|
10
|
+
aks: {
|
|
11
|
+
readOnly: ['Azure Kubernetes Service RBAC Reader', 'Azure Kubernetes Service Cluster User Role'],
|
|
12
|
+
contributor: ['Azure Kubernetes Service RBAC Writer', 'Azure Kubernetes Service Cluster User Role'],
|
|
13
|
+
admin: ['Azure Kubernetes Service RBAC Cluster Admin'],
|
|
14
|
+
},
|
|
15
|
+
iotHub: {
|
|
16
|
+
readOnly: ['IoT Hub Data Reader'],
|
|
17
|
+
contributor: ['IoT Hub Data Contributor'],
|
|
18
|
+
admin: ['IoT Hub Registry Contributor', 'IoT Hub Twin Contributor'],
|
|
19
|
+
},
|
|
20
|
+
keyVault: {
|
|
21
|
+
readOnly: [
|
|
22
|
+
'Key Vault Crypto Service Encryption User',
|
|
23
|
+
'Key Vault Crypto Service Release User',
|
|
24
|
+
'Key Vault Secrets User',
|
|
25
|
+
'Key Vault Crypto User',
|
|
26
|
+
'Key Vault Certificate User',
|
|
27
|
+
'Key Vault Reader',
|
|
28
|
+
],
|
|
29
|
+
contributor: [
|
|
30
|
+
'Key Vault Certificates Officer',
|
|
31
|
+
'Key Vault Crypto Officer',
|
|
32
|
+
'Key Vault Secrets Officer',
|
|
33
|
+
'Key Vault Contributor',
|
|
34
|
+
],
|
|
35
|
+
admin: ['Key Vault Administrator', 'Key Vault Data Access Administrator'],
|
|
36
|
+
},
|
|
37
|
+
storage: {
|
|
38
|
+
readOnly: [
|
|
39
|
+
'Storage Blob Data Reader',
|
|
40
|
+
'Storage File Data SMB Share Reader',
|
|
41
|
+
'Storage Queue Data Reader',
|
|
42
|
+
'Storage Table Data Reader',
|
|
43
|
+
],
|
|
44
|
+
contributor: [
|
|
45
|
+
'Storage Account Backup Contributor',
|
|
46
|
+
'Storage Account Contributor',
|
|
47
|
+
'Storage Account Encryption Scope Contributor Role',
|
|
48
|
+
'Storage Blob Data Contributor',
|
|
49
|
+
'Storage File Data Privileged Reader',
|
|
50
|
+
'Storage File Data SMB Share Contributor',
|
|
51
|
+
'Storage File Data SMB Share Elevated Contributor',
|
|
52
|
+
'Storage Queue Data Contributor',
|
|
53
|
+
'Storage Queue Data Message Processor',
|
|
54
|
+
'Storage Queue Data Message Sender',
|
|
55
|
+
'Storage Table Data Contributor',
|
|
56
|
+
],
|
|
57
|
+
admin: [
|
|
58
|
+
'Storage Account Key Operator Service Role',
|
|
59
|
+
'Storage Blob Data Owner',
|
|
60
|
+
'Storage File Data Privileged Contributor',
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
containerRegistry: {
|
|
64
|
+
readOnly: [
|
|
65
|
+
//'ACR Registry Catalog Lister',
|
|
66
|
+
'ACR Repository Reader',
|
|
67
|
+
'AcrQuarantineReader',
|
|
68
|
+
//'AcrPull',
|
|
69
|
+
],
|
|
70
|
+
contributor: [
|
|
71
|
+
'AcrImageSigner',
|
|
72
|
+
'AcrPull',
|
|
73
|
+
'AcrPush',
|
|
74
|
+
//'ACR Repository Contributor',
|
|
75
|
+
//'ACR Repository Writer',
|
|
76
|
+
//'AcrQuarantineWriter',
|
|
77
|
+
],
|
|
78
|
+
admin: ['AcrDelete'],
|
|
79
|
+
},
|
|
80
|
+
appConfig: {
|
|
81
|
+
readOnly: ['App Configuration Data Reader'],
|
|
82
|
+
contributor: ['App Configuration Data Owner'],
|
|
83
|
+
admin: [],
|
|
84
|
+
},
|
|
85
|
+
serviceBus: {
|
|
86
|
+
readOnly: ['Azure Service Bus Data Receiver'],
|
|
87
|
+
contributor: ['Azure Service Bus Data Sender'],
|
|
88
|
+
admin: ['Azure Service Bus Data Owner'],
|
|
89
|
+
},
|
|
90
|
+
signalR: {
|
|
91
|
+
readOnly: ['SignalR REST API Reader'],
|
|
92
|
+
contributor: ['SignalR App Server'],
|
|
93
|
+
admin: ['SignalR REST API Owner'],
|
|
94
|
+
},
|
|
95
|
+
redis: {
|
|
96
|
+
readOnly: [],
|
|
97
|
+
contributor: ['Redis Cache Contributor'],
|
|
98
|
+
admin: [],
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
function getRsRoleDefinitions() {
|
|
102
|
+
return Object.entries(rsRoles).reduce((acc, [key, roles]) => {
|
|
103
|
+
acc[key] = {
|
|
104
|
+
...roles,
|
|
105
|
+
getReadOnly: () => ({
|
|
106
|
+
admin: [],
|
|
107
|
+
contributor: [],
|
|
108
|
+
readOnly: roles.readOnly,
|
|
109
|
+
}),
|
|
110
|
+
getContributor: () => ({
|
|
111
|
+
admin: [],
|
|
112
|
+
contributor: roles.contributor,
|
|
113
|
+
readOnly: roles.readOnly,
|
|
114
|
+
}),
|
|
115
|
+
};
|
|
116
|
+
return acc;
|
|
117
|
+
}, {});
|
|
118
|
+
}
|
|
119
|
+
exports.rsRoleDefinitions = getRsRoleDefinitions();
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNSb2xlRGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hekFkL2hlbHBlcnMvcnNSb2xlRGVmaW5pdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFNLE9BQU8sR0FBRztJQUNkLE9BQU8sRUFBRTtRQUNQLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUNoQixXQUFXLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDNUIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO0tBQ3JCO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsUUFBUSxFQUFFLENBQUMsc0NBQXNDLEVBQUUsNENBQTRDLENBQUM7UUFDaEcsV0FBVyxFQUFFLENBQUMsc0NBQXNDLEVBQUUsNENBQTRDLENBQUM7UUFDbkcsS0FBSyxFQUFFLENBQUMsNkNBQTZDLENBQUM7S0FDdkQ7SUFDRCxNQUFNLEVBQUU7UUFDTixRQUFRLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztRQUNqQyxXQUFXLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztRQUN6QyxLQUFLLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSwwQkFBMEIsQ0FBQztLQUNwRTtJQUNELFFBQVEsRUFBRTtRQUNSLFFBQVEsRUFBRTtZQUNSLDBDQUEwQztZQUMxQyx1Q0FBdUM7WUFDdkMsd0JBQXdCO1lBQ3hCLHVCQUF1QjtZQUN2Qiw0QkFBNEI7WUFDNUIsa0JBQWtCO1NBQ25CO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsZ0NBQWdDO1lBQ2hDLDBCQUEwQjtZQUMxQiwyQkFBMkI7WUFDM0IsdUJBQXVCO1NBQ3hCO1FBQ0QsS0FBSyxFQUFFLENBQUMseUJBQXlCLEVBQUUscUNBQXFDLENBQUM7S0FDMUU7SUFDRCxPQUFPLEVBQUU7UUFDUCxRQUFRLEVBQUU7WUFDUiwwQkFBMEI7WUFDMUIsb0NBQW9DO1lBQ3BDLDJCQUEyQjtZQUMzQiwyQkFBMkI7U0FDNUI7UUFDRCxXQUFXLEVBQUU7WUFDWCxvQ0FBb0M7WUFDcEMsNkJBQTZCO1lBQzdCLG1EQUFtRDtZQUNuRCwrQkFBK0I7WUFDL0IscUNBQXFDO1lBQ3JDLHlDQUF5QztZQUN6QyxrREFBa0Q7WUFDbEQsZ0NBQWdDO1lBQ2hDLHNDQUFzQztZQUN0QyxtQ0FBbUM7WUFDbkMsZ0NBQWdDO1NBQ2pDO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsMkNBQTJDO1lBQzNDLHlCQUF5QjtZQUN6QiwwQ0FBMEM7U0FDM0M7S0FDRjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFFBQVEsRUFBRTtZQUNSLGdDQUFnQztZQUNoQyx1QkFBdUI7WUFDdkIscUJBQXFCO1lBQ3JCLFlBQVk7U0FDYjtRQUNELFdBQVcsRUFBRTtZQUNYLGdCQUFnQjtZQUNoQixTQUFTO1lBQ1QsU0FBUztZQUVULCtCQUErQjtZQUMvQiwwQkFBMEI7WUFDMUIsd0JBQXdCO1NBQ3pCO1FBQ0QsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDO0tBQ3JCO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsUUFBUSxFQUFFLENBQUMsK0JBQStCLENBQUM7UUFDM0MsV0FBVyxFQUFFLENBQUMsOEJBQThCLENBQUM7UUFDN0MsS0FBSyxFQUFFLEVBQUU7S0FDVjtJQUNELFVBQVUsRUFBRTtRQUNWLFFBQVEsRUFBRSxDQUFDLGlDQUFpQyxDQUFDO1FBQzdDLFdBQVcsRUFBRSxDQUFDLCtCQUErQixDQUFDO1FBQzlDLEtBQUssRUFBRSxDQUFDLDhCQUE4QixDQUFDO0tBQ3hDO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsUUFBUSxFQUFFLENBQUMseUJBQXlCLENBQUM7UUFDckMsV0FBVyxFQUFFLENBQUMsb0JBQW9CLENBQUM7UUFDbkMsS0FBSyxFQUFFLENBQUMsd0JBQXdCLENBQUM7S0FDbEM7SUFDRCxLQUFLLEVBQUU7UUFDTCxRQUFRLEVBQUUsRUFBRTtRQUNaLFdBQVcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO1FBQ3hDLEtBQUssRUFBRSxFQUFFO0tBQ1Y7Q0FDRixDQUFDO0FBUUYsU0FBUyxvQkFBb0I7SUFDM0IsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQzFELEdBQUcsQ0FBQyxHQUEyQixDQUFDLEdBQUc7WUFDakMsR0FBRyxLQUFLO1lBQ1IsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ2xCLEtBQUssRUFBRSxFQUFFO2dCQUNULFdBQVcsRUFBRSxFQUFFO2dCQUNmLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTthQUN6QixDQUFDO1lBQ0YsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3JCLEtBQUssRUFBRSxFQUFFO2dCQUNULFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2FBQ3pCLENBQUM7U0FDSCxDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBNEIsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFWSxRQUFBLGlCQUFpQixHQUFHLG9CQUFvQixFQUFFLENBQUMifQ==
|
package/azAd/index.d.ts
ADDED
package/azAd/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./helpers"), exports);
|
|
18
|
+
__exportStar(require("./AppRegistration"), exports);
|
|
19
|
+
__exportStar(require("./AzRole"), exports);
|
|
20
|
+
__exportStar(require("./CustomRoles"), exports);
|
|
21
|
+
__exportStar(require("./GroupRole"), exports);
|
|
22
|
+
__exportStar(require("./RoleAssignment"), exports);
|
|
23
|
+
__exportStar(require("./UserAssignedIdentity"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXpBZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCO0FBQzFCLG9EQUFrQztBQUNsQywyQ0FBeUI7QUFDekIsZ0RBQThCO0FBQzlCLDhDQUE0QjtBQUM1QixtREFBaUM7QUFDakMseURBQXVDIn0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
2
|
+
/**
|
|
3
|
+
* BaseComponent serves as an abstract foundation class for Pulumi resource components.
|
|
4
|
+
* It provides core functionality and structure for creating custom infrastructure components.
|
|
5
|
+
*
|
|
6
|
+
* @template TArgs - Generic type parameter extending pulumi.Inputs to define component arguments
|
|
7
|
+
* @extends pulumi.ComponentResource<TArgs>
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @template TArgs - Generic type parameter extending pulumi.Inputs
|
|
11
|
+
* @example
|
|
12
|
+
* // Add usage example here
|
|
13
|
+
* const component = new MyComponent('name', args);
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class BaseComponent<TArgs extends pulumi.Inputs> extends pulumi.ComponentResource<TArgs> {
|
|
16
|
+
readonly name: string;
|
|
17
|
+
protected readonly args: TArgs;
|
|
18
|
+
protected readonly opts?: pulumi.ComponentResourceOptions | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new instance of BaseComponent
|
|
21
|
+
* @param type - The resource type identifier for this component
|
|
22
|
+
* @param name - Unique name for this component instance
|
|
23
|
+
* @param args - Configuration arguments for this component
|
|
24
|
+
* @param opts - Optional Pulumi resource options to control component behavior
|
|
25
|
+
*/
|
|
26
|
+
constructor(type: string, name: string, args: TArgs, opts?: pulumi.ComponentResourceOptions | undefined);
|
|
27
|
+
/**
|
|
28
|
+
* Registers component outputs with the Pulumi engine.
|
|
29
|
+
* This method should be overridden by derived classes to ensure proper output registration.
|
|
30
|
+
* @param outputs - The outputs to register for this component
|
|
31
|
+
*/
|
|
32
|
+
protected registerOutputs(outputs: pulumi.Inputs | pulumi.Output<pulumi.Inputs>): void;
|
|
33
|
+
/**
|
|
34
|
+
* Abstract method that must be implemented by derived classes to expose component outputs.
|
|
35
|
+
* This method should return all relevant outputs that consumers of the component might need.
|
|
36
|
+
* @returns An object containing the component's outputs, either as direct values or Pulumi outputs
|
|
37
|
+
*/
|
|
38
|
+
abstract getOutputs(): pulumi.Inputs | pulumi.Output<pulumi.Inputs>;
|
|
39
|
+
/**
|
|
40
|
+
* Utility method to selectively extract specific properties from the component instance.
|
|
41
|
+
* Useful for creating a subset of component properties for downstream consumption.
|
|
42
|
+
*
|
|
43
|
+
* @template K - Generic type parameter constrained to keys of the component instance
|
|
44
|
+
* @param keys - Array of property names to extract from the component
|
|
45
|
+
* @returns A new object containing only the requested properties from the component
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const component = new MyComponent();
|
|
49
|
+
* const subset = component.PickOutputs('name', 'id');
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
PickOutputs<K extends keyof this>(...keys: K[]): Pick<this, K>;
|
|
53
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BaseComponent = void 0;
|
|
37
|
+
const pulumi = __importStar(require("@pulumi/pulumi"));
|
|
38
|
+
const helpers_1 = require("./helpers");
|
|
39
|
+
/**
|
|
40
|
+
* BaseComponent serves as an abstract foundation class for Pulumi resource components.
|
|
41
|
+
* It provides core functionality and structure for creating custom infrastructure components.
|
|
42
|
+
*
|
|
43
|
+
* @template TArgs - Generic type parameter extending pulumi.Inputs to define component arguments
|
|
44
|
+
* @extends pulumi.ComponentResource<TArgs>
|
|
45
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* @template TArgs - Generic type parameter extending pulumi.Inputs
|
|
48
|
+
* @example
|
|
49
|
+
* // Add usage example here
|
|
50
|
+
* const component = new MyComponent('name', args);
|
|
51
|
+
*/
|
|
52
|
+
class BaseComponent extends pulumi.ComponentResource {
|
|
53
|
+
name;
|
|
54
|
+
args;
|
|
55
|
+
opts;
|
|
56
|
+
/**
|
|
57
|
+
* Creates a new instance of BaseComponent
|
|
58
|
+
* @param type - The resource type identifier for this component
|
|
59
|
+
* @param name - Unique name for this component instance
|
|
60
|
+
* @param args - Configuration arguments for this component
|
|
61
|
+
* @param opts - Optional Pulumi resource options to control component behavior
|
|
62
|
+
*/
|
|
63
|
+
constructor(type, name, args, opts) {
|
|
64
|
+
super((0, helpers_1.getComponentResourceType)(type), name, args, opts);
|
|
65
|
+
this.name = name;
|
|
66
|
+
this.args = args;
|
|
67
|
+
this.opts = opts;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Registers component outputs with the Pulumi engine.
|
|
71
|
+
* This method should be overridden by derived classes to ensure proper output registration.
|
|
72
|
+
* @param outputs - The outputs to register for this component
|
|
73
|
+
*/
|
|
74
|
+
registerOutputs(outputs) {
|
|
75
|
+
super.registerOutputs(outputs);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Utility method to selectively extract specific properties from the component instance.
|
|
79
|
+
* Useful for creating a subset of component properties for downstream consumption.
|
|
80
|
+
*
|
|
81
|
+
* @template K - Generic type parameter constrained to keys of the component instance
|
|
82
|
+
* @param keys - Array of property names to extract from the component
|
|
83
|
+
* @returns A new object containing only the requested properties from the component
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const component = new MyComponent();
|
|
87
|
+
* const subset = component.PickOutputs('name', 'id');
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
PickOutputs(...keys) {
|
|
91
|
+
return keys.reduce((acc, key) => {
|
|
92
|
+
acc[key] = this[key];
|
|
93
|
+
return acc;
|
|
94
|
+
}, {});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.BaseComponent = BaseComponent;
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL0Jhc2VDb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXlDO0FBQ3pDLHVDQUFxRDtBQUVyRDs7Ozs7O0dBTUc7QUFDSDs7Ozs7R0FLRztBQUNILE1BQXNCLGFBQTJDLFNBQVEsTUFBTSxDQUFDLGlCQUF3QjtJQVVwRjtJQUNHO0lBQ0E7SUFYckI7Ozs7OztPQU1HO0lBQ0gsWUFDRSxJQUFZLEVBQ0ksSUFBWSxFQUNULElBQVcsRUFDWCxJQUFzQztRQUV6RCxLQUFLLENBQUMsSUFBQSxrQ0FBd0IsRUFBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBSnhDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDVCxTQUFJLEdBQUosSUFBSSxDQUFPO1FBQ1gsU0FBSSxHQUFKLElBQUksQ0FBa0M7SUFHM0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxlQUFlLENBQUMsT0FBcUQ7UUFDN0UsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBU0Q7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksV0FBVyxDQUF1QixHQUFHLElBQVM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzlCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBSSxJQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBbUIsQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQXBERCxzQ0FvREMifQ==
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
2
|
+
import { RandomPassword, RandomPasswordArgs } from '../common/RandomPassword';
|
|
3
|
+
import { RandomString, RandomStringArgs } from '../common/RandomString';
|
|
4
|
+
import { ResourceLocker } from '../common/ResourceLocker';
|
|
5
|
+
import * as types from '../types';
|
|
6
|
+
import { EncryptionKey } from '../vault/EncryptionKey';
|
|
7
|
+
import { VaultSecretResult } from '../vault/VaultSecrets';
|
|
8
|
+
import { BaseComponent } from './BaseComponent';
|
|
9
|
+
/**
|
|
10
|
+
* Base interface for resource component arguments that combines vault information
|
|
11
|
+
* and Azure AD group role requirements.
|
|
12
|
+
*
|
|
13
|
+
* This interface extends:
|
|
14
|
+
* - WithVaultInfo: Provides Azure Key Vault configuration
|
|
15
|
+
* - WithGroupRolesArgs: Defines Azure AD group role assignments
|
|
16
|
+
*/
|
|
17
|
+
export interface BaseArgs extends types.WithVaultInfo, types.WithGroupRolesArgs {
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extended interface that includes resource group input parameters
|
|
21
|
+
* alongside base vault and role requirements
|
|
22
|
+
*/
|
|
23
|
+
export interface CommonBaseArgs extends BaseArgs, types.WithResourceGroupInputs {
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* BaseResourceComponent serves as a foundational abstract class for Azure resource management
|
|
27
|
+
* with integrated Key Vault capabilities. It provides:
|
|
28
|
+
*
|
|
29
|
+
* Key Features:
|
|
30
|
+
* - Automated secret management with Azure Key Vault integration
|
|
31
|
+
* - Resource group handling and organization
|
|
32
|
+
* - Managed identity role assignments
|
|
33
|
+
* - Resource locking capabilities
|
|
34
|
+
* - Random string/password generation
|
|
35
|
+
* - Encryption key management
|
|
36
|
+
*
|
|
37
|
+
* This component is designed to be extended by specific Azure resource implementations
|
|
38
|
+
* that require secure secret management and standardized resource organization.
|
|
39
|
+
*
|
|
40
|
+
* @template TArgs - Type parameter extending BaseArgs to define required component arguments
|
|
41
|
+
*/
|
|
42
|
+
export declare abstract class BaseResourceComponent<TArgs extends BaseArgs> extends BaseComponent<TArgs> {
|
|
43
|
+
private readonly type;
|
|
44
|
+
readonly name: string;
|
|
45
|
+
protected readonly args: TArgs;
|
|
46
|
+
protected readonly opts?: pulumi.ComponentResourceOptions | undefined;
|
|
47
|
+
private _secrets;
|
|
48
|
+
private _vaultSecretsCreated;
|
|
49
|
+
vaultSecrets?: {
|
|
50
|
+
[key: string]: VaultSecretResult;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Creates a new instance of BaseResourceComponent
|
|
54
|
+
* @param type - The type of the resource component
|
|
55
|
+
* @param name - The unique name of the resource component
|
|
56
|
+
* @param args - Arguments containing vault and resource group information
|
|
57
|
+
* @param opts - Optional component resource options
|
|
58
|
+
*/
|
|
59
|
+
constructor(type: string, name: string, args: TArgs, opts?: pulumi.ComponentResourceOptions | undefined);
|
|
60
|
+
/**
|
|
61
|
+
* Internal method to handle post-creation secret management
|
|
62
|
+
* Creates vault secrets if any secrets were added during component creation
|
|
63
|
+
*/
|
|
64
|
+
private postCreated;
|
|
65
|
+
/**
|
|
66
|
+
* Adds a single secret to the component
|
|
67
|
+
* Can be called multiple times to add different secrets
|
|
68
|
+
* @param name - The name of the secret
|
|
69
|
+
* @param value - The value to be stored in the secret
|
|
70
|
+
*/
|
|
71
|
+
protected addSecret(name: string, value: pulumi.Input<string>): void;
|
|
72
|
+
/**
|
|
73
|
+
* Adds multiple secrets to the component at once
|
|
74
|
+
* Should only be called once as it replaces existing secrets
|
|
75
|
+
* @param secrets - Object containing secret name-value pairs
|
|
76
|
+
*/
|
|
77
|
+
protected addSecrets(secrets: {
|
|
78
|
+
[key: string]: pulumi.Input<string>;
|
|
79
|
+
}): void;
|
|
80
|
+
/**
|
|
81
|
+
* Overwrote this method with no parameters as it will be provided by calling getOutputs method.
|
|
82
|
+
*/
|
|
83
|
+
protected registerOutputs(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Creates a new encryption key in the Azure Key Vault
|
|
86
|
+
* @returns A new EncryptionKey instance if vaultInfo is provided, undefined otherwise
|
|
87
|
+
*/
|
|
88
|
+
protected getEncryptionKey({ name, keySize }?: {
|
|
89
|
+
name?: string;
|
|
90
|
+
keySize?: 2048 | 3072 | 4096;
|
|
91
|
+
}): EncryptionKey;
|
|
92
|
+
/**
|
|
93
|
+
* Generates a new random password with predefined settings
|
|
94
|
+
* @returns A new RandomPassword instance with 20 characters length, yearly rotation policy, and no special characters
|
|
95
|
+
*/
|
|
96
|
+
protected createPassword(props?: RandomPasswordArgs): RandomPassword;
|
|
97
|
+
protected createRandomString(props?: RandomStringArgs): RandomString;
|
|
98
|
+
protected lockFromDeleting(resource: pulumi.CustomResource): ResourceLocker;
|
|
99
|
+
/**
|
|
100
|
+
* Adds a managed identity to a specified Azure AD group role
|
|
101
|
+
* @param type - The type of group role to add the identity to (from GroupRoleTypes enum)
|
|
102
|
+
* @param identity - A Pulumi output containing the managed identity with its principal ID
|
|
103
|
+
* @returns A new GroupMember resource if successful, undefined if groupRoles not configured or identity invalid
|
|
104
|
+
*/
|
|
105
|
+
addIdentityToRole(type: types.GroupRoleTypes, identity: pulumi.Input<{
|
|
106
|
+
principalId: pulumi.Input<string>;
|
|
107
|
+
} | undefined>): pulumi.OutputInstance<import("@pulumi/azuread/groupMember").GroupMember | undefined> | undefined;
|
|
108
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BaseResourceComponent = void 0;
|
|
37
|
+
const azAd = __importStar(require("@pulumi/azuread"));
|
|
38
|
+
const pulumi = __importStar(require("@pulumi/pulumi"));
|
|
39
|
+
const RandomPassword_1 = require("../common/RandomPassword");
|
|
40
|
+
const RandomString_1 = require("../common/RandomString");
|
|
41
|
+
const ResourceLocker_1 = require("../common/ResourceLocker");
|
|
42
|
+
const EncryptionKey_1 = require("../vault/EncryptionKey");
|
|
43
|
+
const VaultSecrets_1 = require("../vault/VaultSecrets");
|
|
44
|
+
const BaseComponent_1 = require("./BaseComponent");
|
|
45
|
+
const helpers_1 = require("./helpers");
|
|
46
|
+
/**
|
|
47
|
+
* BaseResourceComponent serves as a foundational abstract class for Azure resource management
|
|
48
|
+
* with integrated Key Vault capabilities. It provides:
|
|
49
|
+
*
|
|
50
|
+
* Key Features:
|
|
51
|
+
* - Automated secret management with Azure Key Vault integration
|
|
52
|
+
* - Resource group handling and organization
|
|
53
|
+
* - Managed identity role assignments
|
|
54
|
+
* - Resource locking capabilities
|
|
55
|
+
* - Random string/password generation
|
|
56
|
+
* - Encryption key management
|
|
57
|
+
*
|
|
58
|
+
* This component is designed to be extended by specific Azure resource implementations
|
|
59
|
+
* that require secure secret management and standardized resource organization.
|
|
60
|
+
*
|
|
61
|
+
* @template TArgs - Type parameter extending BaseArgs to define required component arguments
|
|
62
|
+
*/
|
|
63
|
+
class BaseResourceComponent extends BaseComponent_1.BaseComponent {
|
|
64
|
+
type;
|
|
65
|
+
name;
|
|
66
|
+
args;
|
|
67
|
+
opts;
|
|
68
|
+
_secrets = {};
|
|
69
|
+
_vaultSecretsCreated = false;
|
|
70
|
+
vaultSecrets;
|
|
71
|
+
/**
|
|
72
|
+
* Creates a new instance of BaseResourceComponent
|
|
73
|
+
* @param type - The type of the resource component
|
|
74
|
+
* @param name - The unique name of the resource component
|
|
75
|
+
* @param args - Arguments containing vault and resource group information
|
|
76
|
+
* @param opts - Optional component resource options
|
|
77
|
+
*/
|
|
78
|
+
constructor(type, name, args, opts) {
|
|
79
|
+
super((0, helpers_1.getComponentResourceType)(type), name, args, opts);
|
|
80
|
+
this.type = type;
|
|
81
|
+
this.name = name;
|
|
82
|
+
this.args = args;
|
|
83
|
+
this.opts = opts;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Internal method to handle post-creation secret management
|
|
87
|
+
* Creates vault secrets if any secrets were added during component creation
|
|
88
|
+
*/
|
|
89
|
+
postCreated() {
|
|
90
|
+
const { vaultInfo } = this.args;
|
|
91
|
+
if (Object.keys(this._secrets).length <= 0 || !vaultInfo)
|
|
92
|
+
return;
|
|
93
|
+
if (this._vaultSecretsCreated)
|
|
94
|
+
return;
|
|
95
|
+
const se = {};
|
|
96
|
+
for (const key in this._secrets) {
|
|
97
|
+
se[key] = {
|
|
98
|
+
value: this._secrets[key],
|
|
99
|
+
contentType: `${this.type} ${key}`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
this._vaultSecretsCreated = true;
|
|
103
|
+
const rs = new VaultSecrets_1.VaultSecrets(this.name, {
|
|
104
|
+
vaultInfo,
|
|
105
|
+
secrets: se,
|
|
106
|
+
}, { dependsOn: this.opts?.dependsOn, parent: this });
|
|
107
|
+
this.vaultSecrets = rs.results;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Adds a single secret to the component
|
|
111
|
+
* Can be called multiple times to add different secrets
|
|
112
|
+
* @param name - The name of the secret
|
|
113
|
+
* @param value - The value to be stored in the secret
|
|
114
|
+
*/
|
|
115
|
+
addSecret(name, value) {
|
|
116
|
+
this._secrets[name] = value;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Adds multiple secrets to the component at once
|
|
120
|
+
* Should only be called once as it replaces existing secrets
|
|
121
|
+
* @param secrets - Object containing secret name-value pairs
|
|
122
|
+
*/
|
|
123
|
+
addSecrets(secrets) {
|
|
124
|
+
this._secrets = { ...this._secrets, ...secrets };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Overwrote this method with no parameters as it will be provided by calling getOutputs method.
|
|
128
|
+
*/
|
|
129
|
+
registerOutputs() {
|
|
130
|
+
this.postCreated();
|
|
131
|
+
super.registerOutputs({ ...this.getOutputs(), vaultSecrets: this.vaultSecrets });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Creates a new encryption key in the Azure Key Vault
|
|
135
|
+
* @returns A new EncryptionKey instance if vaultInfo is provided, undefined otherwise
|
|
136
|
+
*/
|
|
137
|
+
getEncryptionKey({ name, keySize } = { keySize: 4096 }) {
|
|
138
|
+
if (!this.args.vaultInfo) {
|
|
139
|
+
throw new Error(`VaultInfo is required for encryption key creation in component ${this.name}`);
|
|
140
|
+
}
|
|
141
|
+
return new EncryptionKey_1.EncryptionKey(name ? `${this.name}-${name}` : this.name, { vaultInfo: this.args.vaultInfo, keySize }, { dependsOn: this.opts?.dependsOn, parent: this });
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Generates a new random password with predefined settings
|
|
145
|
+
* @returns A new RandomPassword instance with 20 characters length, yearly rotation policy, and no special characters
|
|
146
|
+
*/
|
|
147
|
+
createPassword(props = { length: 20, policy: 'yearly', options: { special: false } }) {
|
|
148
|
+
return new RandomPassword_1.RandomPassword(this.name, props, { parent: this });
|
|
149
|
+
}
|
|
150
|
+
createRandomString(props = { type: 'string', length: 10, options: { special: false } }) {
|
|
151
|
+
return new RandomString_1.RandomString(this.name, props, { parent: this });
|
|
152
|
+
}
|
|
153
|
+
lockFromDeleting(resource) {
|
|
154
|
+
return new ResourceLocker_1.ResourceLocker(`${this.name}-lock`, {
|
|
155
|
+
resource,
|
|
156
|
+
level: 'CanNotDelete',
|
|
157
|
+
}, { dependsOn: resource, parent: this });
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Adds a managed identity to a specified Azure AD group role
|
|
161
|
+
* @param type - The type of group role to add the identity to (from GroupRoleTypes enum)
|
|
162
|
+
* @param identity - A Pulumi output containing the managed identity with its principal ID
|
|
163
|
+
* @returns A new GroupMember resource if successful, undefined if groupRoles not configured or identity invalid
|
|
164
|
+
*/
|
|
165
|
+
addIdentityToRole(type, identity) {
|
|
166
|
+
const { groupRoles } = this.args;
|
|
167
|
+
if (!groupRoles)
|
|
168
|
+
return;
|
|
169
|
+
return pulumi.output(identity).apply((i) => {
|
|
170
|
+
if (!i?.principalId)
|
|
171
|
+
return;
|
|
172
|
+
return new azAd.GroupMember(`${this.name}-${type}-${i.principalId}`, {
|
|
173
|
+
groupObjectId: groupRoles[type].objectId,
|
|
174
|
+
memberObjectId: i.principalId,
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.BaseResourceComponent = BaseResourceComponent;
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVJlc291cmNlQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvQmFzZVJlc291cmNlQ29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUF3QztBQUN4Qyx1REFBeUM7QUFDekMsNkRBQThFO0FBQzlFLHlEQUF3RTtBQUN4RSw2REFBMEQ7QUFFMUQsMERBQXVEO0FBRXZELHdEQUF3RTtBQUN4RSxtREFBZ0Q7QUFDaEQsdUNBQXFEO0FBa0JyRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQXNCLHFCQUE4QyxTQUFRLDZCQUFvQjtJQWEzRTtJQUNEO0lBQ0c7SUFDQTtJQWZiLFFBQVEsR0FBNEMsRUFBRSxDQUFDO0lBQ3ZELG9CQUFvQixHQUFZLEtBQUssQ0FBQztJQUN2QyxZQUFZLENBQXdDO0lBRTNEOzs7Ozs7T0FNRztJQUNILFlBQ21CLElBQVksRUFDYixJQUFZLEVBQ1QsSUFBVyxFQUNYLElBQXNDO1FBRXpELEtBQUssQ0FBQyxJQUFBLGtDQUF3QixFQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFMdkMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNiLFNBQUksR0FBSixJQUFJLENBQVE7UUFDVCxTQUFJLEdBQUosSUFBSSxDQUFPO1FBQ1gsU0FBSSxHQUFKLElBQUksQ0FBa0M7SUFHM0QsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFdBQVc7UUFDakIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDakUsSUFBSSxJQUFJLENBQUMsb0JBQW9CO1lB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
|