@drunk-pulumi/azure 0.0.19
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/Aks/Helper.d.ts +43 -0
- package/Aks/Helper.js +72 -0
- package/Aks/Identity.d.ts +14 -0
- package/Aks/Identity.js +32 -0
- package/Aks/VmSetAutoScale/index.d.ts +16 -0
- package/Aks/VmSetAutoScale/index.js +132 -0
- package/Aks/VmSetMonitor/index.d.ts +12 -0
- package/Aks/VmSetMonitor/index.js +67 -0
- package/Aks/index.d.ts +100 -0
- package/Aks/index.js +558 -0
- package/Apim/ApiProduct/Api.d.ts +35 -0
- package/Apim/ApiProduct/Api.js +131 -0
- package/Apim/ApiProduct/OpenApi.d.ts +85 -0
- package/Apim/ApiProduct/OpenApi.js +3 -0
- package/Apim/ApiProduct/PolicyBuilder.d.ts +79 -0
- package/Apim/ApiProduct/PolicyBuilder.js +361 -0
- package/Apim/ApiProduct/Product.d.ts +8 -0
- package/Apim/ApiProduct/Product.js +63 -0
- package/Apim/ApiProduct/SwaggerHelper.d.ts +6 -0
- package/Apim/ApiProduct/SwaggerHelper.js +44 -0
- package/Apim/ApiProduct/index.d.ts +9 -0
- package/Apim/ApiProduct/index.js +22 -0
- package/Apim/Helpers.d.ts +0 -0
- package/Apim/Helpers.js +2 -0
- package/Apim/HookProxy/index.d.ts +20 -0
- package/Apim/HookProxy/index.js +27 -0
- package/Apim/index.d.ts +22 -0
- package/Apim/index.js +118 -0
- package/Apps/LogicApp.d.ts +12 -0
- package/Apps/LogicApp.js +19 -0
- package/Automation/AutoAccount.d.ts +5 -0
- package/Automation/AutoAccount.js +20 -0
- package/AzAd/B2C.d.ts +9 -0
- package/AzAd/B2C.js +38 -0
- package/AzAd/ConditionalPolicies/index.d.ts +0 -0
- package/AzAd/ConditionalPolicies/index.js +2 -0
- package/AzAd/EnvRoles.d.ts +12 -0
- package/AzAd/EnvRoles.js +62 -0
- package/AzAd/GraphDefinition.d.ts +14 -0
- package/AzAd/GraphDefinition.js +5136 -0
- package/AzAd/Group.d.ts +29 -0
- package/AzAd/Group.js +70 -0
- package/AzAd/Helper.d.ts +18 -0
- package/AzAd/Helper.js +37 -0
- package/AzAd/Identities/AzDevOps.d.ts +23 -0
- package/AzAd/Identities/AzDevOps.js +61 -0
- package/AzAd/Identities/AzUserAdRevertSync.d.ts +14 -0
- package/AzAd/Identities/AzUserAdRevertSync.js +18 -0
- package/AzAd/Identity.d.ts +51 -0
- package/AzAd/Identity.js +133 -0
- package/AzAd/ManagedIdentity.d.ts +6 -0
- package/AzAd/ManagedIdentity.js +23 -0
- package/AzAd/Role.d.ts +19 -0
- package/AzAd/Role.js +25 -0
- package/AzAd/RoleAssignment.d.ts +79 -0
- package/AzAd/RoleAssignment.js +48 -0
- package/AzAd/RolesBuiltIn.d.ts +62 -0
- package/AzAd/RolesBuiltIn.js +13841 -0
- package/Cdn/index.d.ts +11 -0
- package/Cdn/index.js +47 -0
- package/Certificate/index.d.ts +41 -0
- package/Certificate/index.js +156 -0
- package/Certificate/p12.d.ts +5 -0
- package/Certificate/p12.js +37 -0
- package/Common/AppConfigs/dotnetConfig.d.ts +15 -0
- package/Common/AppConfigs/dotnetConfig.js +20 -0
- package/Common/AutoTags.d.ts +1 -0
- package/Common/AutoTags.js +24 -0
- package/Common/AzureEnv.d.ts +37 -0
- package/Common/AzureEnv.js +94 -0
- package/Common/ConfigHelper.d.ts +5 -0
- package/Common/ConfigHelper.js +14 -0
- package/Common/GlobalEnv.d.ts +14 -0
- package/Common/GlobalEnv.js +38 -0
- package/Common/Helpers.d.ts +10 -0
- package/Common/Helpers.js +30 -0
- package/Common/Location.d.ts +4 -0
- package/Common/Location.js +23 -0
- package/Common/LocationBuiltIn.d.ts +81 -0
- package/Common/LocationBuiltIn.js +1925 -0
- package/Common/Naming/index.d.ts +62 -0
- package/Common/Naming/index.js +146 -0
- package/Common/ResourceEnv.d.ts +16 -0
- package/Common/ResourceEnv.js +29 -0
- package/Common/StackEnv.d.ts +4 -0
- package/Common/StackEnv.js +22 -0
- package/Common/index.d.ts +5 -0
- package/Common/index.js +9 -0
- package/ContainerRegistry/Helper.d.ts +23 -0
- package/ContainerRegistry/Helper.js +47 -0
- package/ContainerRegistry/index.d.ts +28 -0
- package/ContainerRegistry/index.js +103 -0
- package/Core/Helper.d.ts +16 -0
- package/Core/Helper.js +37 -0
- package/Core/KeyGenetators.d.ts +33 -0
- package/Core/KeyGenetators.js +66 -0
- package/Core/Locker.d.ts +13 -0
- package/Core/Locker.js +14 -0
- package/Core/Random.d.ts +40 -0
- package/Core/Random.js +83 -0
- package/Core/ResourceCreator.d.ts +17 -0
- package/Core/ResourceCreator.js +48 -0
- package/Core/ResourceGroup.d.ts +13 -0
- package/Core/ResourceGroup.js +45 -0
- package/CosmosDb/index.d.ts +33 -0
- package/CosmosDb/index.js +129 -0
- package/CustomRoles/index.d.ts +5 -0
- package/CustomRoles/index.js +27 -0
- package/IOT/Hub/index.d.ts +32 -0
- package/IOT/Hub/index.js +208 -0
- package/KeyVault/CustomHelper.d.ts +35 -0
- package/KeyVault/CustomHelper.js +40 -0
- package/KeyVault/Helper.d.ts +33 -0
- package/KeyVault/Helper.js +58 -0
- package/KeyVault/VaultAccess.d.ts +15 -0
- package/KeyVault/VaultAccess.js +47 -0
- package/KeyVault/VaultPermissions.d.ts +26 -0
- package/KeyVault/VaultPermissions.js +169 -0
- package/KeyVault/index.d.ts +28 -0
- package/KeyVault/index.js +136 -0
- package/KubeX/AcrSecret.d.ts +15 -0
- package/KubeX/AcrSecret.js +31 -0
- package/KubeX/Apps/AstroPage.d.ts +12 -0
- package/KubeX/Apps/AstroPage.js +33 -0
- package/KubeX/Apps/KafKa.d.ts +6 -0
- package/KubeX/Apps/KafKa.js +13 -0
- package/KubeX/Apps/Nobelium.d.ts +13 -0
- package/KubeX/Apps/Nobelium.js +37 -0
- package/KubeX/Apps/Wikijs.d.ts +30 -0
- package/KubeX/Apps/Wikijs.js +54 -0
- package/KubeX/Apps/WordPress.d.ts +24 -0
- package/KubeX/Apps/WordPress.js +55 -0
- package/KubeX/Apps/YarpProxy/index.d.ts +17 -0
- package/KubeX/Apps/YarpProxy/index.js +107 -0
- package/KubeX/Apps/YarpProxy/type.d.ts +55 -0
- package/KubeX/Apps/YarpProxy/type.js +3 -0
- package/KubeX/CertHelper.d.ts +1 -0
- package/KubeX/CertHelper.js +9 -0
- package/KubeX/CertImports.d.ts +19 -0
- package/KubeX/CertImports.js +70 -0
- package/KubeX/CloudFlare/CertCreator.d.ts +19 -0
- package/KubeX/CloudFlare/CertCreator.js +90 -0
- package/KubeX/CloudFlare/CertImports.d.ts +17 -0
- package/KubeX/CloudFlare/CertImports.js +34 -0
- package/KubeX/CloudFlare/DynamicDns.d.ts +21 -0
- package/KubeX/CloudFlare/DynamicDns.js +39 -0
- package/KubeX/CloudFlare/Tunnel-Helm.d.ts +17 -0
- package/KubeX/CloudFlare/Tunnel-Helm.js +12 -0
- package/KubeX/CloudFlare/Tunnel.d.ts +23 -0
- package/KubeX/CloudFlare/Tunnel.js +54 -0
- package/KubeX/CloudFlare/index.d.ts +13 -0
- package/KubeX/CloudFlare/index.js +36 -0
- package/KubeX/Clusters/K3s/AutoUpgradeController/index.d.ts +6 -0
- package/KubeX/Clusters/K3s/AutoUpgradeController/index.js +60 -0
- package/KubeX/ConfigSecret.d.ts +24 -0
- package/KubeX/ConfigSecret.js +38 -0
- package/KubeX/Core/CertManager/index.d.ts +24 -0
- package/KubeX/Core/CertManager/index.js +96 -0
- package/KubeX/Core/KsCertSecret.d.ts +12 -0
- package/KubeX/Core/KsCertSecret.js +22 -0
- package/KubeX/Core/KsSecret.d.ts +9 -0
- package/KubeX/Core/KsSecret.js +12 -0
- package/KubeX/Core/LoadBalancer/MetalLB.d.ts +7 -0
- package/KubeX/Core/LoadBalancer/MetalLB.js +21 -0
- package/KubeX/Core/Monitoring/index.d.ts +22 -0
- package/KubeX/Core/Monitoring/index.js +322 -0
- package/KubeX/Core/Namespace.d.ts +12 -0
- package/KubeX/Core/Namespace.js +41 -0
- package/KubeX/Core/Nginx/index.d.ts +60 -0
- package/KubeX/Core/Nginx/index.js +109 -0
- package/KubeX/Core/OAuthProxy/index.d.ts +0 -0
- package/KubeX/Core/OAuthProxy/index.js +3 -0
- package/KubeX/Core/ResourceQuota.d.ts +12 -0
- package/KubeX/Core/ResourceQuota.js +13 -0
- package/KubeX/Core/SecurityRules.d.ts +34 -0
- package/KubeX/Core/SecurityRules.js +93 -0
- package/KubeX/Core/StorageClass/azureBlob.d.ts +20 -0
- package/KubeX/Core/StorageClass/azureBlob.js +77 -0
- package/KubeX/Core/StorageClass/azureFile.d.ts +17 -0
- package/KubeX/Core/StorageClass/azureFile.js +45 -0
- package/KubeX/Core/StorageClass/index.d.ts +13 -0
- package/KubeX/Core/StorageClass/index.js +25 -0
- package/KubeX/Core/index.d.ts +57 -0
- package/KubeX/Core/index.js +94 -0
- package/KubeX/Databases/MariaDb.d.ts +11 -0
- package/KubeX/Databases/MariaDb.js +39 -0
- package/KubeX/Databases/MySql.V2.d.ts +11 -0
- package/KubeX/Databases/MySql.V2.js +40 -0
- package/KubeX/Databases/MySql.d.ts +13 -0
- package/KubeX/Databases/MySql.js +55 -0
- package/KubeX/Databases/PostgreSql/PostgreSQL-HA.d.ts +10 -0
- package/KubeX/Databases/PostgreSql/PostgreSQL-HA.js +47 -0
- package/KubeX/Databases/PostgreSql/PostgreSQL.d.ts +10 -0
- package/KubeX/Databases/PostgreSql/PostgreSQL.js +51 -0
- package/KubeX/Databases/PostgreSql/PostgreSql.v1.d.ts +13 -0
- package/KubeX/Databases/PostgreSql/PostgreSql.v1.js +56 -0
- package/KubeX/Databases/PostgreSql/index.d.ts +17 -0
- package/KubeX/Databases/PostgreSql/index.js +6 -0
- package/KubeX/Databases/RedisCache.d.ts +14 -0
- package/KubeX/Databases/RedisCache.js +65 -0
- package/KubeX/Databases/SqlServer.d.ts +15 -0
- package/KubeX/Databases/SqlServer.js +77 -0
- package/KubeX/Deployment/PodAutoscaler.d.ts +14 -0
- package/KubeX/Deployment/PodAutoscaler.js +51 -0
- package/KubeX/Deployment/index.d.ts +136 -0
- package/KubeX/Deployment/index.js +306 -0
- package/KubeX/Helpers.d.ts +4 -0
- package/KubeX/Helpers.js +17 -0
- package/KubeX/Ingress/AppGatewayIngress.d.ts +2 -0
- package/KubeX/Ingress/AppGatewayIngress.js +4 -0
- package/KubeX/Ingress/Conts.d.ts +13 -0
- package/KubeX/Ingress/Conts.js +18 -0
- package/KubeX/Ingress/NginxIngress.d.ts +3 -0
- package/KubeX/Ingress/NginxIngress.js +186 -0
- package/KubeX/Ingress/NginxProxy.d.ts +21 -0
- package/KubeX/Ingress/NginxProxy.js +43 -0
- package/KubeX/Ingress/TraefikIngress/CustomHeader.d.ts +15 -0
- package/KubeX/Ingress/TraefikIngress/CustomHeader.js +15 -0
- package/KubeX/Ingress/TraefikIngress/index.d.ts +11 -0
- package/KubeX/Ingress/TraefikIngress/index.js +95 -0
- package/KubeX/Ingress/index.d.ts +5 -0
- package/KubeX/Ingress/index.js +12 -0
- package/KubeX/Ingress/type.d.ts +82 -0
- package/KubeX/Ingress/type.js +3 -0
- package/KubeX/Providers/index.d.ts +8 -0
- package/KubeX/Providers/index.js +15 -0
- package/KubeX/Storage/Longhorn/index.d.ts +15 -0
- package/KubeX/Storage/Longhorn/index.js +54 -0
- package/KubeX/Storage/index.d.ts +25 -0
- package/KubeX/Storage/index.js +79 -0
- package/KubeX/Tools/AWS/LocalStack.d.ts +7 -0
- package/KubeX/Tools/AWS/LocalStack.js +29 -0
- package/KubeX/Tools/AWS/S3.d.ts +6 -0
- package/KubeX/Tools/AWS/S3.js +44 -0
- package/KubeX/Tools/AWS/index.d.ts +7 -0
- package/KubeX/Tools/AWS/index.js +14 -0
- package/KubeX/Tools/AppHealthzMonitor.d.ts +18 -0
- package/KubeX/Tools/AppHealthzMonitor.js +52 -0
- package/KubeX/Tools/ArgoCD/index.d.ts +17 -0
- package/KubeX/Tools/ArgoCD/index.js +131 -0
- package/KubeX/Tools/Dapr/Storage.d.ts +66 -0
- package/KubeX/Tools/Dapr/Storage.js +70 -0
- package/KubeX/Tools/Dapr/index.d.ts +10 -0
- package/KubeX/Tools/Dapr/index.js +31 -0
- package/KubeX/Tools/Echo-App.d.ts +3 -0
- package/KubeX/Tools/Echo-App.js +21 -0
- package/KubeX/Tools/Gitea/GiteaRepo.d.ts +72 -0
- package/KubeX/Tools/Gitea/GiteaRepo.js +184 -0
- package/KubeX/Tools/Gitea/GiteaRunner.d.ts +11 -0
- package/KubeX/Tools/Gitea/GiteaRunner.js +37 -0
- package/KubeX/Tools/Gitea/GiteaRunner.v1.d.ts +11 -0
- package/KubeX/Tools/Gitea/GiteaRunner.v1.js +123 -0
- package/KubeX/Tools/HarborRepo.d.ts +29 -0
- package/KubeX/Tools/HarborRepo.js +78 -0
- package/KubeX/Tools/HelloWorld.d.ts +3 -0
- package/KubeX/Tools/HelloWorld.js +21 -0
- package/KubeX/Tools/KubeCleanup.d.ts +9 -0
- package/KubeX/Tools/KubeCleanup.js +34 -0
- package/KubeX/Tools/NoIp.d.ts +13 -0
- package/KubeX/Tools/NoIp.js +24 -0
- package/KubeX/Tools/OpenLDAP/index.d.ts +12 -0
- package/KubeX/Tools/OpenLDAP/index.js +56 -0
- package/KubeX/Tools/OutlineVpn/index.d.ts +25 -0
- package/KubeX/Tools/OutlineVpn/index.js +256 -0
- package/KubeX/Tools/SqlPad.d.ts +29 -0
- package/KubeX/Tools/SqlPad.js +133 -0
- package/KubeX/Tools/ToolPod.d.ts +10 -0
- package/KubeX/Tools/ToolPod.js +40 -0
- package/KubeX/Tools/UptimeKuma.d.ts +6 -0
- package/KubeX/Tools/UptimeKuma.js +38 -0
- package/KubeX/Tools/index.d.ts +27 -0
- package/KubeX/Tools/index.js +35 -0
- package/KubeX/VairableResolvers/index.d.ts +15 -0
- package/KubeX/VairableResolvers/index.js +49 -0
- package/KubeX/kx/index.d.ts +114 -0
- package/KubeX/kx/index.js +423 -0
- package/KubeX/types.d.ts +49 -0
- package/KubeX/types.js +3 -0
- package/Logs/AppInsight.d.ts +16 -0
- package/Logs/AppInsight.js +48 -0
- package/Logs/Helpers.d.ts +50 -0
- package/Logs/Helpers.js +95 -0
- package/Logs/LogAnalytics.d.ts +17 -0
- package/Logs/LogAnalytics.js +54 -0
- package/Logs/WebTest.d.ts +13 -0
- package/Logs/WebTest.js +68 -0
- package/Logs/index.d.ts +42 -0
- package/Logs/index.js +69 -0
- package/MySql/index.d.ts +20 -0
- package/MySql/index.js +93 -0
- package/Postgresql/index.d.ts +20 -0
- package/Postgresql/index.js +93 -0
- package/ReadMe.md +36 -0
- package/RedisCache/index.d.ts +9 -0
- package/RedisCache/index.js +79 -0
- package/ServiceBus/ServiceBusHelper.d.ts +21 -0
- package/ServiceBus/ServiceBusHelper.js +35 -0
- package/ServiceBus/index.d.ts +98 -0
- package/ServiceBus/index.js +396 -0
- package/SignalR/index.d.ts +20 -0
- package/SignalR/index.js +114 -0
- package/Sql/Auditing.d.ts +0 -0
- package/Sql/Auditing.js +2 -0
- package/Sql/Helper.d.ts +9 -0
- package/Sql/Helper.js +11 -0
- package/Sql/SqlDb.d.ts +14 -0
- package/Sql/SqlDb.js +42 -0
- package/Sql/index.d.ts +44 -0
- package/Sql/index.js +236 -0
- package/Storage/CdnEndpoint.d.ts +12 -0
- package/Storage/CdnEndpoint.js +62 -0
- package/Storage/CdnRules.d.ts +6 -0
- package/Storage/CdnRules.js +134 -0
- package/Storage/Helper.d.ts +28 -0
- package/Storage/Helper.js +66 -0
- package/Storage/ManagementRules.d.ts +70 -0
- package/Storage/ManagementRules.js +32 -0
- package/Storage/index.d.ts +55 -0
- package/Storage/index.js +264 -0
- package/VM/index.d.ts +37 -0
- package/VM/index.js +138 -0
- package/VNet/Bastion.d.ts +8 -0
- package/VNet/Bastion.js +30 -0
- package/VNet/Firewall.d.ts +27 -0
- package/VNet/Firewall.js +87 -0
- package/VNet/FirewallPolicies/AksFirewallPolicy.d.ts +20 -0
- package/VNet/FirewallPolicies/AksFirewallPolicy.js +241 -0
- package/VNet/FirewallPolicies/CloudPCFirewallPolicy.d.ts +14 -0
- package/VNet/FirewallPolicies/CloudPCFirewallPolicy.js +303 -0
- package/VNet/FirewallPolicy.d.ts +28 -0
- package/VNet/FirewallPolicy.js +110 -0
- package/VNet/FirewallRules/AksFirewallRules.d.ts +24 -0
- package/VNet/FirewallRules/AksFirewallRules.js +250 -0
- package/VNet/FirewallRules/DefaultRules.d.ts +2 -0
- package/VNet/FirewallRules/DefaultRules.js +23 -0
- package/VNet/FirewallRules/types.d.ts +20 -0
- package/VNet/FirewallRules/types.js +5 -0
- package/VNet/GlobalNetworkPeering.d.ts +9 -0
- package/VNet/GlobalNetworkPeering.js +17 -0
- package/VNet/Helper.d.ts +33 -0
- package/VNet/Helper.js +86 -0
- package/VNet/IpAddress.d.ts +17 -0
- package/VNet/IpAddress.js +38 -0
- package/VNet/IpAddressPrefix.d.ts +22 -0
- package/VNet/IpAddressPrefix.js +42 -0
- package/VNet/NSGRules/AzADService.d.ts +10 -0
- package/VNet/NSGRules/AzADService.js +45 -0
- package/VNet/NetworkPeering.d.ts +10 -0
- package/VNet/NetworkPeering.js +29 -0
- package/VNet/PrivateDns.d.ts +33 -0
- package/VNet/PrivateDns.js +64 -0
- package/VNet/PrivateEndpoint.d.ts +9 -0
- package/VNet/PrivateEndpoint.js +71 -0
- package/VNet/PublicDns.d.ts +21 -0
- package/VNet/PublicDns.js +59 -0
- package/VNet/RouteTable.d.ts +13 -0
- package/VNet/RouteTable.js +23 -0
- package/VNet/SecurityGroup.d.ts +8 -0
- package/VNet/SecurityGroup.js +13 -0
- package/VNet/Subnet.d.ts +26 -0
- package/VNet/Subnet.js +48 -0
- package/VNet/VirtualWAN.d.ts +25 -0
- package/VNet/VirtualWAN.js +40 -0
- package/VNet/Vnet.d.ts +51 -0
- package/VNet/Vnet.js +196 -0
- package/VNet/index.d.ts +65 -0
- package/VNet/index.js +198 -0
- package/Web/AppCertOrder.d.ts +16 -0
- package/Web/AppCertOrder.js +34 -0
- package/Web/AppConfig.d.ts +16 -0
- package/Web/AppConfig.js +79 -0
- package/Web/AppGateway.d.ts +15 -0
- package/Web/AppGateway.js +32 -0
- package/Web/FuncApp.d.ts +12 -0
- package/Web/FuncApp.js +24 -0
- package/Web/Helpers.d.ts +6 -0
- package/Web/Helpers.js +36 -0
- package/Web/WebAppPlan.d.ts +7 -0
- package/Web/WebAppPlan.js +26 -0
- package/Web/types.d.ts +169 -0
- package/Web/types.js +3 -0
- package/package.json +34 -0
- package/types.d.ts +69 -0
- package/types.js +3 -0
- package/z_tests/_tools/Mocks.d.ts +2 -0
- package/z_tests/_tools/Mocks.js +47 -0
package/IOT/Hub/index.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Naming_1 = require("../../Common/Naming");
|
|
4
|
+
const devices = require("@pulumi/azure-native/devices");
|
|
5
|
+
const AzureEnv_1 = require("../../Common/AzureEnv");
|
|
6
|
+
const Locker_1 = require("../../Core/Locker");
|
|
7
|
+
const RoleAssignment_1 = require("../../AzAd/RoleAssignment");
|
|
8
|
+
const Group_1 = require("../../AzAd/Group");
|
|
9
|
+
const CustomHelper_1 = require("../../KeyVault/CustomHelper");
|
|
10
|
+
exports.default = async ({ name, group, auth, sku = { name: 'F1', capacity: 1 }, storage, serviceBus, dependsOn, vaultInfo, lock, }) => {
|
|
11
|
+
const hubName = (0, Naming_1.getIotHubName)(name);
|
|
12
|
+
const busQueueEndpointName = 'busQueue';
|
|
13
|
+
const busTopicEndpointName = 'busTopic';
|
|
14
|
+
const storageMessageEndpointName = 'hubStorage';
|
|
15
|
+
const storageEventEndpointName = 'hubEventStorage';
|
|
16
|
+
const routeEndpoints = new Array();
|
|
17
|
+
const storageEndpoints = new Array();
|
|
18
|
+
if (storage?.connectionString && storage?.messageContainerName) {
|
|
19
|
+
routeEndpoints.push(storageMessageEndpointName);
|
|
20
|
+
storageEndpoints.push({
|
|
21
|
+
name: storageMessageEndpointName,
|
|
22
|
+
resourceGroup: group.resourceGroupName,
|
|
23
|
+
subscriptionId: AzureEnv_1.subscriptionId,
|
|
24
|
+
connectionString: storage.connectionString,
|
|
25
|
+
containerName: storage.messageContainerName,
|
|
26
|
+
encoding: 'avro', // 'avroDeflate' and 'avro'
|
|
27
|
+
batchFrequencyInSeconds: 60, //60 to 720
|
|
28
|
+
fileNameFormat: '{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}', //Must have all these {iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm} but order and delimiter can be changed.
|
|
29
|
+
maxChunkSizeInBytes: 300 * 1024 * 1024, // 10485760(10MB) and 524288000(500MB). Default value is 314572800(300MB).
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (storage?.connectionString && storage?.eventContainerName) {
|
|
33
|
+
storageEndpoints.push({
|
|
34
|
+
name: storageEventEndpointName,
|
|
35
|
+
resourceGroup: group.resourceGroupName,
|
|
36
|
+
subscriptionId: AzureEnv_1.subscriptionId,
|
|
37
|
+
connectionString: storage.connectionString,
|
|
38
|
+
containerName: storage.eventContainerName,
|
|
39
|
+
encoding: 'avro', // 'avroDeflate' and 'avro'
|
|
40
|
+
batchFrequencyInSeconds: 60, //60 to 720
|
|
41
|
+
fileNameFormat: '{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}', //Must have all these {iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm} but order and delimiter can be changed.
|
|
42
|
+
maxChunkSizeInBytes: 300 * 1024 * 1024, // 10485760(10MB) and 524288000(500MB). Default value is 314572800(300MB).
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (serviceBus?.queueMessageConnectionString)
|
|
46
|
+
routeEndpoints.push(busQueueEndpointName);
|
|
47
|
+
if (serviceBus?.topicMessageConnectionString)
|
|
48
|
+
routeEndpoints.push(busTopicEndpointName);
|
|
49
|
+
const routes = routeEndpoints.map((r) => ({
|
|
50
|
+
name: `routeMessageTo${r}`,
|
|
51
|
+
source: devices.RoutingSource.DeviceMessages,
|
|
52
|
+
endpointNames: [r],
|
|
53
|
+
isEnabled: true,
|
|
54
|
+
condition: 'true',
|
|
55
|
+
}));
|
|
56
|
+
if (storage?.eventContainerName) {
|
|
57
|
+
routes.push({
|
|
58
|
+
name: `routeMessageTo${storageEventEndpointName}`,
|
|
59
|
+
source: devices.RoutingSource.DeviceLifecycleEvents,
|
|
60
|
+
endpointNames: [storageEventEndpointName],
|
|
61
|
+
isEnabled: true,
|
|
62
|
+
condition: 'true',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const hub = new devices.IotHubResource(hubName, {
|
|
66
|
+
resourceName: hubName,
|
|
67
|
+
...group,
|
|
68
|
+
sku,
|
|
69
|
+
tags: AzureEnv_1.defaultTags,
|
|
70
|
+
properties: {
|
|
71
|
+
//authorizationPolicies: [{}],
|
|
72
|
+
//cloudToDevice:{}
|
|
73
|
+
//comments
|
|
74
|
+
enableFileUploadNotifications: Boolean(storage?.fileContainerName),
|
|
75
|
+
storageEndpoints: storage?.fileContainerName
|
|
76
|
+
? {
|
|
77
|
+
$default: {
|
|
78
|
+
connectionString: storage.connectionString,
|
|
79
|
+
containerName: storage.fileContainerName,
|
|
80
|
+
sasTtlAsIso8601: 'PT1H',
|
|
81
|
+
},
|
|
82
|
+
}
|
|
83
|
+
: undefined,
|
|
84
|
+
//eventHubEndpoints: {},
|
|
85
|
+
features: devices.Capabilities.None,
|
|
86
|
+
//ipFilterRules: {},
|
|
87
|
+
// networkRuleSets: {
|
|
88
|
+
// applyToBuiltInEventHubEndpoint: true,
|
|
89
|
+
// defaultAction: 'Deny',
|
|
90
|
+
// ipRules: [
|
|
91
|
+
// {
|
|
92
|
+
// action: 'Allow',
|
|
93
|
+
// filterName: 'rule1',
|
|
94
|
+
// ipMask: '131.117.159.53',
|
|
95
|
+
// },
|
|
96
|
+
// {
|
|
97
|
+
// action: 'Allow',
|
|
98
|
+
// filterName: 'rule2',
|
|
99
|
+
// ipMask: '157.55.59.128/25',
|
|
100
|
+
// },
|
|
101
|
+
// ],
|
|
102
|
+
// },
|
|
103
|
+
//privateEndpointConnections: {},
|
|
104
|
+
messagingEndpoints: {
|
|
105
|
+
fileNotifications: {
|
|
106
|
+
lockDurationAsIso8601: 'PT1M',
|
|
107
|
+
maxDeliveryCount: 10,
|
|
108
|
+
ttlAsIso8601: 'PT1H',
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
minTlsVersion: '1.2',
|
|
112
|
+
routing: {
|
|
113
|
+
endpoints: {
|
|
114
|
+
//eventHubs: [],
|
|
115
|
+
serviceBusQueues: serviceBus?.queueMessageConnectionString
|
|
116
|
+
? [
|
|
117
|
+
{
|
|
118
|
+
name: busQueueEndpointName,
|
|
119
|
+
connectionString: serviceBus.queueMessageConnectionString,
|
|
120
|
+
resourceGroup: group.resourceGroupName,
|
|
121
|
+
subscriptionId: AzureEnv_1.subscriptionId,
|
|
122
|
+
},
|
|
123
|
+
]
|
|
124
|
+
: undefined,
|
|
125
|
+
serviceBusTopics: serviceBus?.topicMessageConnectionString
|
|
126
|
+
? [
|
|
127
|
+
{
|
|
128
|
+
name: busTopicEndpointName,
|
|
129
|
+
connectionString: serviceBus.topicMessageConnectionString,
|
|
130
|
+
resourceGroup: group.resourceGroupName,
|
|
131
|
+
subscriptionId: AzureEnv_1.subscriptionId,
|
|
132
|
+
},
|
|
133
|
+
]
|
|
134
|
+
: undefined,
|
|
135
|
+
storageContainers: storageEndpoints,
|
|
136
|
+
},
|
|
137
|
+
fallbackRoute: {
|
|
138
|
+
name: `$fallback`,
|
|
139
|
+
condition: 'true',
|
|
140
|
+
isEnabled: true,
|
|
141
|
+
source: devices.RoutingSource.DeviceMessages,
|
|
142
|
+
endpointNames: storage?.eventContainerName
|
|
143
|
+
? [storageEventEndpointName]
|
|
144
|
+
: ['events'],
|
|
145
|
+
},
|
|
146
|
+
routes: routes,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
}, { dependsOn });
|
|
150
|
+
if (lock) {
|
|
151
|
+
(0, Locker_1.default)({ name, resourceId: hub.id, dependsOn: hub });
|
|
152
|
+
}
|
|
153
|
+
//Connection Strings
|
|
154
|
+
if (vaultInfo) {
|
|
155
|
+
hub.id.apply(async (id) => {
|
|
156
|
+
if (!id)
|
|
157
|
+
return;
|
|
158
|
+
const keys = await devices.listIotHubResourceKeys({
|
|
159
|
+
resourceGroupName: group.resourceGroupName,
|
|
160
|
+
resourceName: hubName,
|
|
161
|
+
});
|
|
162
|
+
return keys.value?.forEach((k) => {
|
|
163
|
+
const conn = `HostName=${hubName}.azure-devices.net;SharedAccessKeyName=${k.keyName};SharedAccessKey=${k.primaryKey}`;
|
|
164
|
+
return (0, CustomHelper_1.addCustomSecret)({
|
|
165
|
+
name: `${hubName}-${k.keyName}`,
|
|
166
|
+
value: conn,
|
|
167
|
+
vaultInfo,
|
|
168
|
+
contentType: 'IOT Hub',
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
//Roles
|
|
174
|
+
if (auth?.envRoleNames) {
|
|
175
|
+
const readOnlyGroup = await (0, Group_1.getAdGroup)(auth.envRoleNames.readOnly);
|
|
176
|
+
const contributorGroup = await (0, Group_1.getAdGroup)(auth.envRoleNames.contributor);
|
|
177
|
+
await (0, RoleAssignment_1.roleAssignment)({
|
|
178
|
+
name: `${name}-iot-readonly`,
|
|
179
|
+
principalId: readOnlyGroup.objectId,
|
|
180
|
+
principalType: 'Group',
|
|
181
|
+
roleName: 'IoT Hub Data Reader',
|
|
182
|
+
scope: hub.id,
|
|
183
|
+
});
|
|
184
|
+
await (0, RoleAssignment_1.roleAssignment)({
|
|
185
|
+
name: `${name}-iot-contributor`,
|
|
186
|
+
principalId: contributorGroup.objectId,
|
|
187
|
+
principalType: 'Group',
|
|
188
|
+
roleName: 'IoT Hub Data Contributor',
|
|
189
|
+
scope: hub.id,
|
|
190
|
+
});
|
|
191
|
+
await (0, RoleAssignment_1.roleAssignment)({
|
|
192
|
+
name: `${name}-iot-registry-admin`,
|
|
193
|
+
principalId: contributorGroup.objectId,
|
|
194
|
+
principalType: 'Group',
|
|
195
|
+
roleName: 'IoT Hub Registry Contributor',
|
|
196
|
+
scope: hub.id,
|
|
197
|
+
});
|
|
198
|
+
await (0, RoleAssignment_1.roleAssignment)({
|
|
199
|
+
name: `${name}-iot-twin-admin`,
|
|
200
|
+
principalId: contributorGroup.objectId,
|
|
201
|
+
principalType: 'Group',
|
|
202
|
+
roleName: 'IoT Hub Twin Contributor',
|
|
203
|
+
scope: hub.id,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return hub;
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvSU9UL0h1Yi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGdEQUFvRDtBQUNwRCx3REFBd0Q7QUFDeEQsb0RBQW9FO0FBRXBFLDhDQUF1QztBQUV2Qyw4REFBMkQ7QUFDM0QsNENBQThDO0FBQzlDLDhEQUE4RDtBQXVDOUQsa0JBQWUsS0FBSyxFQUFFLEVBQ3BCLElBQUksRUFDSixLQUFLLEVBQ0wsSUFBSSxFQUNKLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUNqQyxPQUFPLEVBQ1AsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxHQUNFLEVBQUUsRUFBRTtJQUNWLE1BQU0sT0FBTyxHQUFHLElBQUEsc0JBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQztJQUN4QyxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQztJQUN4QyxNQUFNLDBCQUEwQixHQUFHLFlBQVksQ0FBQztJQUNoRCxNQUFNLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDO0lBRW5ELE1BQU0sY0FBYyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBaUMsQ0FBQztJQUVwRSxJQUFJLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztRQUMvRCxjQUFjLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDaEQsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQ3BCLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDdEMsY0FBYyxFQUFkLHlCQUFjO1lBQ2QsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtZ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
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Input, Resource } from '@pulumi/pulumi';
|
|
2
|
+
import { VaultSecretResource } from '@drunk-pulumi/azure-providers/VaultSecret';
|
|
3
|
+
import { KeyVaultInfo } from '../types';
|
|
4
|
+
interface Props {
|
|
5
|
+
name: string;
|
|
6
|
+
/** The value of the secret. If Value is not provided the secret will be get from config*/
|
|
7
|
+
value?: Input<string>;
|
|
8
|
+
vaultInfo: KeyVaultInfo;
|
|
9
|
+
}
|
|
10
|
+
/**Add key vault secret from a value or from pulumi configuration secret. */
|
|
11
|
+
export declare const addVaultSecretFrom: ({ name, value, vaultInfo }: Props) => VaultSecretResource;
|
|
12
|
+
interface SecretProps {
|
|
13
|
+
name: string;
|
|
14
|
+
/**Use the name directly without applying naming format*/
|
|
15
|
+
formattedName?: boolean;
|
|
16
|
+
value: Input<string>;
|
|
17
|
+
vaultInfo: KeyVaultInfo;
|
|
18
|
+
contentType?: Input<string>;
|
|
19
|
+
ignoreChange?: boolean;
|
|
20
|
+
tags?: Input<{
|
|
21
|
+
[key: string]: string;
|
|
22
|
+
}>;
|
|
23
|
+
dependsOn?: Input<Resource> | Input<Input<Resource>[]>;
|
|
24
|
+
}
|
|
25
|
+
/** Add a secret to Key Vault. This will auto recover the deleted item and update with a new value if existed. */
|
|
26
|
+
export declare const addCustomSecret: ({ name, formattedName, vaultInfo, value, contentType, ignoreChange, tags, dependsOn, }: SecretProps) => VaultSecretResource;
|
|
27
|
+
interface MultiSecretProps extends Omit<SecretProps, 'value' | 'name'> {
|
|
28
|
+
items: Array<{
|
|
29
|
+
name: string;
|
|
30
|
+
value: Input<string>;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
/** Add multi secrets to Key Vault. This will auto recover the deleted item and update with a new value if existed. */
|
|
34
|
+
export declare const addCustomSecrets: ({ items, ...others }: MultiSecretProps) => VaultSecretResource[];
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addCustomSecrets = exports.addCustomSecret = exports.addVaultSecretFrom = void 0;
|
|
4
|
+
const pulumi_1 = require("@pulumi/pulumi");
|
|
5
|
+
const Naming_1 = require("../Common/Naming");
|
|
6
|
+
const VaultSecret_1 = require("@drunk-pulumi/azure-providers/VaultSecret");
|
|
7
|
+
const ConfigHelper_1 = require("../Common/ConfigHelper");
|
|
8
|
+
const Helpers_1 = require("../Common/Helpers");
|
|
9
|
+
/**Add key vault secret from a value or from pulumi configuration secret. */
|
|
10
|
+
const addVaultSecretFrom = ({ name, value, vaultInfo }) => {
|
|
11
|
+
if (!value)
|
|
12
|
+
value = (0, ConfigHelper_1.getSecret)(name);
|
|
13
|
+
if (!value)
|
|
14
|
+
throw new Error(`The value of "${name}" is not defined.`);
|
|
15
|
+
return (0, exports.addCustomSecret)({
|
|
16
|
+
name,
|
|
17
|
+
value,
|
|
18
|
+
vaultInfo,
|
|
19
|
+
contentType: 'config variables',
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
exports.addVaultSecretFrom = addVaultSecretFrom;
|
|
23
|
+
/** Add a secret to Key Vault. This will auto recover the deleted item and update with a new value if existed. */
|
|
24
|
+
const addCustomSecret = ({ name, formattedName, vaultInfo, value, contentType, ignoreChange, tags, dependsOn, }) => {
|
|
25
|
+
const n = formattedName ? name : (0, Naming_1.getSecretName)(name);
|
|
26
|
+
//This KeyVault Secret is not auto recovery the deleted one.
|
|
27
|
+
return new VaultSecret_1.VaultSecretResource((0, Helpers_1.replaceAll)(name, '.', '-'), {
|
|
28
|
+
name: (0, Helpers_1.replaceAll)(n, '.', '-'),
|
|
29
|
+
value: value ? (0, pulumi_1.output)(value).apply((v) => v || '') : '',
|
|
30
|
+
vaultInfo,
|
|
31
|
+
contentType: contentType || name,
|
|
32
|
+
ignoreChange,
|
|
33
|
+
tags,
|
|
34
|
+
}, { dependsOn });
|
|
35
|
+
};
|
|
36
|
+
exports.addCustomSecret = addCustomSecret;
|
|
37
|
+
/** Add multi secrets to Key Vault. This will auto recover the deleted item and update with a new value if existed. */
|
|
38
|
+
const addCustomSecrets = ({ items, ...others }) => items.map((i) => (0, exports.addCustomSecret)({ ...i, ...others }));
|
|
39
|
+
exports.addCustomSecrets = addCustomSecrets;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VzdG9tSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0tleVZhdWx0L0N1c3RvbUhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBeUQ7QUFDekQsNkNBQWlEO0FBQ2pELDJFQUFnRjtBQUVoRix5REFBbUQ7QUFDbkQsK0NBQStDO0FBUy9DLDRFQUE0RTtBQUNyRSxNQUFNLGtCQUFrQixHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBUyxFQUFFLEVBQUU7SUFDdEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxLQUFLLEdBQUcsSUFBQSx3QkFBUyxFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxLQUFLO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO0lBRXRFLE9BQU8sSUFBQSx1QkFBZSxFQUFDO1FBQ3JCLElBQUk7UUFDSixLQUFLO1FBQ0wsU0FBUztRQUNULFdBQVcsRUFBRSxrQkFBa0I7S0FDaEMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBVlcsUUFBQSxrQkFBa0Isc0JBVTdCO0FBZ0JGLGlIQUFpSDtBQUMxRyxNQUFNLGVBQWUsR0FBRyxDQUFDLEVBQzlCLElBQUksRUFDSixhQUFhLEVBQ2IsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsWUFBWSxFQUNaLElBQUksRUFDSixTQUFTLEdBQ0csRUFBRSxFQUFFO0lBQ2hCLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFhLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsNERBQTREO0lBQzVELE9BQU8sSUFBSSxpQ0FBbUIsQ0FDNUIsSUFBQSxvQkFBVSxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQzFCO1FBQ0UsSUFBSSxFQUFFLElBQUEsb0JBQVUsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUM3QixLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN2RCxTQUFTO1FBQ1QsV0FBVyxFQUFFLFdBQVcsSUFBSSxJQUFJO1FBQ2hDLFlBQVk7UUFDWixJQUFJO0tBQ0wsRUFDRCxFQUFFLFNBQVMsRUFBRSxDQUNkLENBQUM7QUFDSixDQUFDLENBQUM7QUF4QlcsUUFBQSxlQUFlLG1CQXdCMUI7QUFNRixzSEFBc0g7QUFDL0csTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFvQixFQUFFLEVBQUUsQ0FDekUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSx1QkFBZSxFQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFENUMsUUFBQSxnQkFBZ0Isb0JBQzRCIn0=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Input, Resource } from '@pulumi/pulumi';
|
|
2
|
+
import { KeyVaultInfo } from '../types';
|
|
3
|
+
type SecretProps = {
|
|
4
|
+
name: string;
|
|
5
|
+
value: Input<string>;
|
|
6
|
+
vaultInfo: KeyVaultInfo;
|
|
7
|
+
contentType?: Input<string>;
|
|
8
|
+
tags?: Input<{
|
|
9
|
+
[key: string]: Input<string>;
|
|
10
|
+
}>;
|
|
11
|
+
dependsOn?: Input<Resource> | Input<Input<Resource>[]>;
|
|
12
|
+
};
|
|
13
|
+
type GetVaultItemProps = {
|
|
14
|
+
name: string;
|
|
15
|
+
version?: string;
|
|
16
|
+
vaultInfo: KeyVaultInfo;
|
|
17
|
+
nameFormatted?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare const addKey: ({ name, vaultInfo, tags, dependsOn, }: Omit<SecretProps, 'value' | 'contentType'>) => import("@pulumi/azure-native/keyvault/key").Key;
|
|
20
|
+
/** Get Key */
|
|
21
|
+
export declare const getKey: ({ name, version, vaultInfo, nameFormatted, }: GetVaultItemProps) => Promise<import("@azure/keyvault-keys").KeyVaultKey | undefined>;
|
|
22
|
+
/** Get Secret */
|
|
23
|
+
export declare const getSecret: ({ name, version, vaultInfo, nameFormatted, }: GetVaultItemProps) => Promise<import("@azure/keyvault-secrets").KeyVaultSecret | undefined>;
|
|
24
|
+
interface KeyResult {
|
|
25
|
+
name: string;
|
|
26
|
+
/** The version may be empty if it is not found in the url */
|
|
27
|
+
version: string;
|
|
28
|
+
keyIdentityUrl: string;
|
|
29
|
+
vaultUrl: string;
|
|
30
|
+
}
|
|
31
|
+
/** Convert VaultId to VaultInfo */
|
|
32
|
+
export declare const parseKeyUrl: (keyUrl: string) => KeyResult;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseKeyUrl = exports.getSecret = exports.getKey = exports.addKey = void 0;
|
|
4
|
+
const keyvault = require("@pulumi/azure-native/keyvault");
|
|
5
|
+
const Naming_1 = require("../Common/Naming");
|
|
6
|
+
const Helpers_1 = require("../Common/Helpers");
|
|
7
|
+
const KeyVaultBase_1 = require("@drunk-pulumi/azure-providers/AzBase/KeyVaultBase");
|
|
8
|
+
const addKey = ({ name, vaultInfo, tags, dependsOn, }) => {
|
|
9
|
+
const n = (0, Naming_1.getSecretName)(name);
|
|
10
|
+
return new keyvault.Key((0, Helpers_1.replaceAll)(name, '.', '-'), {
|
|
11
|
+
keyName: n,
|
|
12
|
+
vaultName: vaultInfo.name,
|
|
13
|
+
...vaultInfo.group,
|
|
14
|
+
//https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.keyvault.webkey?view=azure-dotnet-legacy
|
|
15
|
+
properties: {
|
|
16
|
+
keySize: 2048,
|
|
17
|
+
kty: 'RSA',
|
|
18
|
+
keyOps: [
|
|
19
|
+
'decrypt',
|
|
20
|
+
'encrypt',
|
|
21
|
+
'sign',
|
|
22
|
+
'verify',
|
|
23
|
+
'wrapKey',
|
|
24
|
+
'unwrapKey',
|
|
25
|
+
],
|
|
26
|
+
//curveName: 'P512',
|
|
27
|
+
attributes: { enabled: true },
|
|
28
|
+
},
|
|
29
|
+
tags,
|
|
30
|
+
}, { dependsOn });
|
|
31
|
+
};
|
|
32
|
+
exports.addKey = addKey;
|
|
33
|
+
/** Get Key */
|
|
34
|
+
const getKey = async ({ name, version, vaultInfo, nameFormatted, }) => {
|
|
35
|
+
const n = nameFormatted ? name : (0, Naming_1.getSecretName)(name);
|
|
36
|
+
const client = (0, KeyVaultBase_1.getKeyVaultBase)(vaultInfo.name);
|
|
37
|
+
return client.getKey(n, version);
|
|
38
|
+
};
|
|
39
|
+
exports.getKey = getKey;
|
|
40
|
+
/** Get Secret */
|
|
41
|
+
const getSecret = async ({ name, version, vaultInfo, nameFormatted, }) => {
|
|
42
|
+
const n = nameFormatted ? name : (0, Naming_1.getSecretName)(name);
|
|
43
|
+
const client = (0, KeyVaultBase_1.getKeyVaultBase)(vaultInfo.name);
|
|
44
|
+
return client.getSecret(n, version);
|
|
45
|
+
};
|
|
46
|
+
exports.getSecret = getSecret;
|
|
47
|
+
/** Convert VaultId to VaultInfo */
|
|
48
|
+
const parseKeyUrl = (keyUrl) => {
|
|
49
|
+
const splits = keyUrl.split('/');
|
|
50
|
+
return {
|
|
51
|
+
keyIdentityUrl: keyUrl,
|
|
52
|
+
name: splits[4],
|
|
53
|
+
version: splits.length > 4 ? splits[5] : '',
|
|
54
|
+
vaultUrl: `https://${splits[2]}`,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
exports.parseKeyUrl = parseKeyUrl;
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0tleVZhdWx0L0hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwREFBMEQ7QUFJMUQsNkNBQWlEO0FBQ2pELCtDQUErQztBQUUvQyxvRkFBb0Y7QUF3QjdFLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFDckIsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxHQUNrQyxFQUFFLEVBQUU7SUFDL0MsTUFBTSxDQUFDLEdBQUcsSUFBQSxzQkFBYSxFQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlCLE9BQU8sSUFBSSxRQUFRLENBQUMsR0FBRyxDQUNyQixJQUFBLG9CQUFVLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFDMUI7UUFDRSxPQUFPLEVBQUUsQ0FBQztRQUNWLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSTtRQUN6QixHQUFHLFNBQVMsQ0FBQyxLQUFLO1FBQ2xCLHNHQUFzRztRQUN0RyxVQUFVLEVBQUU7WUFDVixPQUFPLEVBQUUsSUFBSTtZQUNiLEdBQUcsRUFBRSxLQUFLO1lBQ1YsTUFBTSxFQUFFO2dCQUNOLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxNQUFNO2dCQUNOLFFBQVE7Z0JBQ1IsU0FBUztnQkFDVCxXQUFXO2FBQ1o7WUFDRCxvQkFBb0I7WUFDcEIsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtTQUM5QjtRQUNELElBQUk7S0FDTCxFQUNELEVBQUUsU0FBUyxFQUFFLENBQ2QsQ0FBQztBQUNKLENBQUMsQ0FBQztBQWpDVyxRQUFBLE1BQU0sVUFpQ2pCO0FBRUYsY0FBYztBQUNQLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFBRSxFQUMzQixJQUFJLEVBQ0osT0FBTyxFQUNQLFNBQVMsRUFDVCxhQUFhLEdBQ0ssRUFBRSxFQUFFO0lBQ3RCLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFhLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBQSw4QkFBZSxFQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQVRXLFFBQUEsTUFBTSxVQVNqQjtBQUVGLGlCQUFpQjtBQUNWLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxFQUM5QixJQUFJLEVBQ0osT0FBTyxFQUNQLFNBQVMsRUFDVCxhQUFhLEdBQ0ssRUFBRSxFQUFFO0lBQ3RCLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFhLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBQSw4QkFBZSxFQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQVRXLFFBQUEsU0FBUyxhQVNwQjtBQVVGLG1DQUFtQztBQUM1QixNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQWMsRUFBYSxFQUFFO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsT0FBTztRQUNMLGNBQWMsRUFBRSxNQUFNO1FBQ3RCLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDM0MsUUFBUSxFQUFFLFdBQVcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQ2pDLENBQUM7QUFDSixDQUFDLENBQUM7QUFSVyxRQUFBLFdBQVcsZUFRdEIifQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EnvRoleNamesType } from '../AzAd/EnvRoles';
|
|
2
|
+
export type VaultAccessType = {
|
|
3
|
+
/** Grant permission of this group into Environment Roles groups*/
|
|
4
|
+
envRoleNames?: EnvRoleNamesType;
|
|
5
|
+
includeOrganization?: boolean;
|
|
6
|
+
};
|
|
7
|
+
interface Props {
|
|
8
|
+
name: string;
|
|
9
|
+
auth: VaultAccessType;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: ({ name, auth }: Props) => {
|
|
12
|
+
readOnlyGroup: import("@pulumi/pulumi").Output<import("@pulumi/pulumi").UnwrappedObject<import("@pulumi/azuread").GetGroupResult>> | import("@pulumi/pulumi").Output<import("@pulumi/azuread/group").Group>;
|
|
13
|
+
adminGroup: import("@pulumi/pulumi").Output<import("@pulumi/pulumi").UnwrappedObject<import("@pulumi/azuread").GetGroupResult>> | import("@pulumi/pulumi").Output<import("@pulumi/azuread/group").Group>;
|
|
14
|
+
};
|
|
15
|
+
export default _default;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Role_1 = require("../AzAd/Role");
|
|
4
|
+
const AzureEnv_1 = require("../Common/AzureEnv");
|
|
5
|
+
const Group_1 = require("../AzAd/Group");
|
|
6
|
+
exports.default = ({ name, auth }) => {
|
|
7
|
+
//Permission Groups
|
|
8
|
+
const readOnlyGroup = auth.envRoleNames
|
|
9
|
+
? (0, Group_1.getAdGroup)(auth.envRoleNames.readOnly)
|
|
10
|
+
: (0, Role_1.default)({
|
|
11
|
+
env: AzureEnv_1.currentEnv,
|
|
12
|
+
appName: `${name}-vault`,
|
|
13
|
+
roleName: 'ReadOnly',
|
|
14
|
+
includeOrganization: auth.includeOrganization,
|
|
15
|
+
});
|
|
16
|
+
const adminGroup = auth.envRoleNames
|
|
17
|
+
? (0, Group_1.getAdGroup)(auth.envRoleNames.contributor)
|
|
18
|
+
: (0, Role_1.default)({
|
|
19
|
+
env: AzureEnv_1.currentEnv,
|
|
20
|
+
appName: `${name}-vault`,
|
|
21
|
+
roleName: 'Admin',
|
|
22
|
+
includeOrganization: auth.includeOrganization,
|
|
23
|
+
});
|
|
24
|
+
//Add current service principal in
|
|
25
|
+
// if (auth.permissions == undefined) {
|
|
26
|
+
// auth.permissions = [
|
|
27
|
+
// // {
|
|
28
|
+
// // objectId: currentServicePrincipal,
|
|
29
|
+
// // permission: 'ReadWrite',
|
|
30
|
+
// // },
|
|
31
|
+
// ];
|
|
32
|
+
// }
|
|
33
|
+
//Add Permission to Groups
|
|
34
|
+
// auth.permissions.forEach(
|
|
35
|
+
// ({ objectId, applicationId, permission, ...others }, index) =>
|
|
36
|
+
// new azuread.GroupMember(`${name}-${permission}-${index}`, {
|
|
37
|
+
// groupObjectId:
|
|
38
|
+
// permission === 'ReadOnly'
|
|
39
|
+
// ? readOnlyGroup.objectId
|
|
40
|
+
// : adminGroup.objectId,
|
|
41
|
+
// memberObjectId: objectId ?? applicationId,
|
|
42
|
+
// ...others,
|
|
43
|
+
// })
|
|
44
|
+
// );
|
|
45
|
+
return { readOnlyGroup, adminGroup };
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmF1bHRBY2Nlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvS2V5VmF1bHQvVmF1bHRBY2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSx1Q0FBcUM7QUFDckMsaURBQWdEO0FBQ2hELHlDQUEyQztBQWUzQyxrQkFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBUyxFQUFFLEVBQUU7SUFDdkMsbUJBQW1CO0lBQ25CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZO1FBQ3JDLENBQUMsQ0FBQyxJQUFBLGtCQUFVLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDeEMsQ0FBQyxDQUFDLElBQUEsY0FBUyxFQUFDO1lBQ1IsR0FBRyxFQUFFLHFCQUFVO1lBQ2YsT0FBTyxFQUFFLEdBQUcsSUFBSSxRQUFRO1lBQ3hCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7U0FDOUMsQ0FBQyxDQUFDO0lBRVAsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVk7UUFDbEMsQ0FBQyxDQUFDLElBQUEsa0JBQVUsRUFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxDQUFDLENBQUMsSUFBQSxjQUFTLEVBQUM7WUFDUixHQUFHLEVBQUUscUJBQVU7WUFDZixPQUFPLEVBQUUsR0FBRyxJQUFJLFFBQVE7WUFDeEIsUUFBUSxFQUFFLE9BQU87WUFDakIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtTQUM5QyxDQUFDLENBQUM7SUFFUCxrQ0FBa0M7SUFDbEMsdUNBQXVDO0lBQ3ZDLHlCQUF5QjtJQUN6QixXQUFXO0lBQ1gsOENBQThDO0lBQzlDLG9DQUFvQztJQUNwQyxZQUFZO0lBQ1osT0FBTztJQUNQLElBQUk7SUFFSiwwQkFBMEI7SUFDMUIsNEJBQTRCO0lBQzVCLG1FQUFtRTtJQUNuRSxrRUFBa0U7SUFDbEUsdUJBQXVCO0lBQ3ZCLG9DQUFvQztJQUNwQyxxQ0FBcUM7SUFDckMsbUNBQW1DO0lBQ25DLG1EQUFtRDtJQUNuRCxtQkFBbUI7SUFDbkIsU0FBUztJQUNULEtBQUs7SUFFTCxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQ3ZDLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
2
|
+
import * as native from '@pulumi/azure-native';
|
|
3
|
+
export interface PermissionProps {
|
|
4
|
+
/** The object ID of a user, service principal or security group in the Azure Active Directory tenant for the vault. The object ID must be unique for the list of access policies. */
|
|
5
|
+
objectId: pulumi.Input<string>;
|
|
6
|
+
/** Application ID of the client making request on behalf of a principal */
|
|
7
|
+
applicationId?: pulumi.Input<string>;
|
|
8
|
+
permission: 'ReadOnly' | 'ReadWrite';
|
|
9
|
+
principalType?: native.authorization.PrincipalType;
|
|
10
|
+
}
|
|
11
|
+
export declare const grantVaultRbacPermission: ({ name, objectId, permission, scope, principalType, }: PermissionProps & {
|
|
12
|
+
name: string;
|
|
13
|
+
scope: pulumi.Input<string>;
|
|
14
|
+
}) => void;
|
|
15
|
+
export declare const KeyVaultAdminPolicy: {
|
|
16
|
+
certificates: string[];
|
|
17
|
+
keys: string[];
|
|
18
|
+
secrets: string[];
|
|
19
|
+
storage: string[];
|
|
20
|
+
};
|
|
21
|
+
export declare const KeyVaultReadOnlyPolicy: {
|
|
22
|
+
certificates: string[];
|
|
23
|
+
keys: string[];
|
|
24
|
+
secrets: string[];
|
|
25
|
+
storage: string[];
|
|
26
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KeyVaultReadOnlyPolicy = exports.KeyVaultAdminPolicy = exports.grantVaultRbacPermission = void 0;
|
|
4
|
+
const RoleAssignment_1 = require("../AzAd/RoleAssignment");
|
|
5
|
+
const grantVaultRbacPermission = ({ name, objectId, permission, scope, principalType = 'User', }) => {
|
|
6
|
+
const vn = `${name}-${permission}`.toLowerCase();
|
|
7
|
+
const defaultProps = {
|
|
8
|
+
principalId: objectId,
|
|
9
|
+
scope,
|
|
10
|
+
};
|
|
11
|
+
//ReadOnly
|
|
12
|
+
if (permission === 'ReadOnly') {
|
|
13
|
+
(0, RoleAssignment_1.roleAssignment)({
|
|
14
|
+
...defaultProps,
|
|
15
|
+
name: `${vn}-encrypt`,
|
|
16
|
+
roleName: 'Key Vault Crypto Service Encryption User',
|
|
17
|
+
principalType,
|
|
18
|
+
});
|
|
19
|
+
(0, RoleAssignment_1.roleAssignment)({
|
|
20
|
+
...defaultProps,
|
|
21
|
+
name: `${vn}-crypto`,
|
|
22
|
+
roleName: 'Key Vault Crypto User',
|
|
23
|
+
principalType,
|
|
24
|
+
});
|
|
25
|
+
(0, RoleAssignment_1.roleAssignment)({
|
|
26
|
+
...defaultProps,
|
|
27
|
+
name: `${vn}-secret`,
|
|
28
|
+
roleName: 'Key Vault Secrets User',
|
|
29
|
+
principalType,
|
|
30
|
+
});
|
|
31
|
+
//Read and Write
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
(0, RoleAssignment_1.roleAssignment)({
|
|
35
|
+
...defaultProps,
|
|
36
|
+
name: `${vn}-contributor`,
|
|
37
|
+
roleName: 'Key Vault Administrator',
|
|
38
|
+
principalType,
|
|
39
|
+
});
|
|
40
|
+
(0, RoleAssignment_1.roleAssignment)({
|
|
41
|
+
...defaultProps,
|
|
42
|
+
name: `${vn}-cert`,
|
|
43
|
+
roleName: 'Key Vault Certificates Officer',
|
|
44
|
+
principalType,
|
|
45
|
+
});
|
|
46
|
+
(0, RoleAssignment_1.roleAssignment)({
|
|
47
|
+
...defaultProps,
|
|
48
|
+
name: `${vn}-crypto`,
|
|
49
|
+
roleName: 'Key Vault Crypto Officer',
|
|
50
|
+
principalType,
|
|
51
|
+
});
|
|
52
|
+
(0, RoleAssignment_1.roleAssignment)({
|
|
53
|
+
...defaultProps,
|
|
54
|
+
name: `${vn}-secret`,
|
|
55
|
+
roleName: 'Key Vault Secrets Officer',
|
|
56
|
+
principalType,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.grantVaultRbacPermission = grantVaultRbacPermission;
|
|
61
|
+
exports.KeyVaultAdminPolicy = {
|
|
62
|
+
certificates: [
|
|
63
|
+
'Backup',
|
|
64
|
+
'Create',
|
|
65
|
+
'Delete',
|
|
66
|
+
'DeleteIssuers',
|
|
67
|
+
'Get',
|
|
68
|
+
'GetIssuers',
|
|
69
|
+
'Import',
|
|
70
|
+
'List',
|
|
71
|
+
'ManageContacts',
|
|
72
|
+
'ManageIssuers',
|
|
73
|
+
'Purge',
|
|
74
|
+
'Recover',
|
|
75
|
+
'Restore',
|
|
76
|
+
'SetIssuers',
|
|
77
|
+
'Update',
|
|
78
|
+
],
|
|
79
|
+
keys: [
|
|
80
|
+
'Backup',
|
|
81
|
+
'Create',
|
|
82
|
+
'Decrypt',
|
|
83
|
+
'Delete',
|
|
84
|
+
'Encrypt',
|
|
85
|
+
'Get',
|
|
86
|
+
'Import',
|
|
87
|
+
'List',
|
|
88
|
+
'Purge',
|
|
89
|
+
'Recover',
|
|
90
|
+
'Restore',
|
|
91
|
+
'Sign',
|
|
92
|
+
'UnwrapKey',
|
|
93
|
+
'Update',
|
|
94
|
+
'Verify',
|
|
95
|
+
'WrapKey',
|
|
96
|
+
],
|
|
97
|
+
secrets: [
|
|
98
|
+
'Backup',
|
|
99
|
+
'Delete',
|
|
100
|
+
'Get',
|
|
101
|
+
'List',
|
|
102
|
+
'Purge',
|
|
103
|
+
'Recover',
|
|
104
|
+
'Restore',
|
|
105
|
+
'Set',
|
|
106
|
+
],
|
|
107
|
+
storage: [
|
|
108
|
+
'Backup',
|
|
109
|
+
'Delete',
|
|
110
|
+
'DeleteSAS',
|
|
111
|
+
'Get',
|
|
112
|
+
'GetSAS',
|
|
113
|
+
'List',
|
|
114
|
+
'ListSAS',
|
|
115
|
+
'Purge',
|
|
116
|
+
'Recover',
|
|
117
|
+
'RegenerateKey',
|
|
118
|
+
'Restore',
|
|
119
|
+
'Set',
|
|
120
|
+
'SetSAS',
|
|
121
|
+
'Update',
|
|
122
|
+
],
|
|
123
|
+
};
|
|
124
|
+
exports.KeyVaultReadOnlyPolicy = {
|
|
125
|
+
certificates: ['Get', 'List'],
|
|
126
|
+
keys: [
|
|
127
|
+
'Get',
|
|
128
|
+
'List',
|
|
129
|
+
'Decrypt',
|
|
130
|
+
'Encrypt',
|
|
131
|
+
'Sign',
|
|
132
|
+
'UnwrapKey',
|
|
133
|
+
'Verify',
|
|
134
|
+
'WrapKey',
|
|
135
|
+
],
|
|
136
|
+
secrets: ['Get', 'List'],
|
|
137
|
+
storage: ['Get', 'List'],
|
|
138
|
+
};
|
|
139
|
+
// export const grantVaultAccessPolicy = ({
|
|
140
|
+
// name,
|
|
141
|
+
// objectId,
|
|
142
|
+
// permission,
|
|
143
|
+
// vaultInfo,
|
|
144
|
+
// }: PermissionProps & {
|
|
145
|
+
// name: string;
|
|
146
|
+
// vaultInfo: KeyVaultInfo;
|
|
147
|
+
// }) =>
|
|
148
|
+
// new vault.AccessPolicy(name, {
|
|
149
|
+
// keyVaultId: vaultInfo.id,
|
|
150
|
+
// objectId,
|
|
151
|
+
// tenantId,
|
|
152
|
+
// certificatePermissions:
|
|
153
|
+
// permission === 'ReadOnly'
|
|
154
|
+
// ? KeyVaultReadOnlyPolicy.certificates
|
|
155
|
+
// : KeyVaultAdminPolicy.certificates,
|
|
156
|
+
// keyPermissions:
|
|
157
|
+
// permission === 'ReadOnly'
|
|
158
|
+
// ? KeyVaultReadOnlyPolicy.keys
|
|
159
|
+
// : KeyVaultAdminPolicy.keys,
|
|
160
|
+
// secretPermissions:
|
|
161
|
+
// permission === 'ReadOnly'
|
|
162
|
+
// ? KeyVaultReadOnlyPolicy.secrets
|
|
163
|
+
// : KeyVaultAdminPolicy.secrets,
|
|
164
|
+
// storagePermissions:
|
|
165
|
+
// permission === 'ReadOnly'
|
|
166
|
+
// ? KeyVaultReadOnlyPolicy.storage
|
|
167
|
+
// : KeyVaultAdminPolicy.storage,
|
|
168
|
+
// });
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmF1bHRQZXJtaXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9LZXlWYXVsdC9WYXVsdFBlcm1pc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJEQUF3RDtBQVlqRCxNQUFNLHdCQUF3QixHQUFHLENBQUMsRUFDdkMsSUFBSSxFQUNKLFFBQVEsRUFDUixVQUFVLEVBQ1YsS0FBSyxFQUNMLGFBQWEsR0FBRyxNQUFNLEdBSXZCLEVBQUUsRUFBRTtJQUNILE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRWpELE1BQU0sWUFBWSxHQUFHO1FBQ25CLFdBQVcsRUFBRSxRQUFRO1FBQ3JCLEtBQUs7S0FDTixDQUFDO0lBRUYsVUFBVTtJQUNWLElBQUksVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzlCLElBQUEsK0JBQWMsRUFBQztZQUNiLEdBQUcsWUFBWTtZQUNmLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVTtZQUNyQixRQUFRLEVBQUUsMENBQTBDO1lBQ3BELGFBQWE7U0FDZCxDQUFDLENBQUM7UUFDSCxJQUFBLCtCQUFjLEVBQUM7WUFDYixHQUFHLFlBQVk7WUFDZixJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVM7WUFDcEIsUUFBUSxFQUFFLHVCQUF1QjtZQUNqQyxhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsSUFBQSwrQkFBYyxFQUFDO1lBQ2IsR0FBRyxZQUFZO1lBQ2YsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTO1lBQ3BCLFFBQVEsRUFBRSx3QkFBd0I7WUFDbEMsYUFBYTtTQUNkLENBQUMsQ0FBQztRQUNILGdCQUFnQjtJQUNsQixDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUEsK0JBQWMsRUFBQztZQUNiLEdBQUcsWUFBWTtZQUNmLElBQUksRUFBRSxHQUFHLEVBQUUsY0FBYztZQUN6QixRQUFRLEVBQUUseUJBQXlCO1lBQ25D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
|