@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.
Files changed (386) hide show
  1. package/Aks/Helper.d.ts +43 -0
  2. package/Aks/Helper.js +72 -0
  3. package/Aks/Identity.d.ts +14 -0
  4. package/Aks/Identity.js +32 -0
  5. package/Aks/VmSetAutoScale/index.d.ts +16 -0
  6. package/Aks/VmSetAutoScale/index.js +132 -0
  7. package/Aks/VmSetMonitor/index.d.ts +12 -0
  8. package/Aks/VmSetMonitor/index.js +67 -0
  9. package/Aks/index.d.ts +100 -0
  10. package/Aks/index.js +558 -0
  11. package/Apim/ApiProduct/Api.d.ts +35 -0
  12. package/Apim/ApiProduct/Api.js +131 -0
  13. package/Apim/ApiProduct/OpenApi.d.ts +85 -0
  14. package/Apim/ApiProduct/OpenApi.js +3 -0
  15. package/Apim/ApiProduct/PolicyBuilder.d.ts +79 -0
  16. package/Apim/ApiProduct/PolicyBuilder.js +361 -0
  17. package/Apim/ApiProduct/Product.d.ts +8 -0
  18. package/Apim/ApiProduct/Product.js +63 -0
  19. package/Apim/ApiProduct/SwaggerHelper.d.ts +6 -0
  20. package/Apim/ApiProduct/SwaggerHelper.js +44 -0
  21. package/Apim/ApiProduct/index.d.ts +9 -0
  22. package/Apim/ApiProduct/index.js +22 -0
  23. package/Apim/Helpers.d.ts +0 -0
  24. package/Apim/Helpers.js +2 -0
  25. package/Apim/HookProxy/index.d.ts +20 -0
  26. package/Apim/HookProxy/index.js +27 -0
  27. package/Apim/index.d.ts +22 -0
  28. package/Apim/index.js +118 -0
  29. package/Apps/LogicApp.d.ts +12 -0
  30. package/Apps/LogicApp.js +19 -0
  31. package/Automation/AutoAccount.d.ts +5 -0
  32. package/Automation/AutoAccount.js +20 -0
  33. package/AzAd/B2C.d.ts +9 -0
  34. package/AzAd/B2C.js +38 -0
  35. package/AzAd/ConditionalPolicies/index.d.ts +0 -0
  36. package/AzAd/ConditionalPolicies/index.js +2 -0
  37. package/AzAd/EnvRoles.d.ts +12 -0
  38. package/AzAd/EnvRoles.js +62 -0
  39. package/AzAd/GraphDefinition.d.ts +14 -0
  40. package/AzAd/GraphDefinition.js +5136 -0
  41. package/AzAd/Group.d.ts +29 -0
  42. package/AzAd/Group.js +70 -0
  43. package/AzAd/Helper.d.ts +18 -0
  44. package/AzAd/Helper.js +37 -0
  45. package/AzAd/Identities/AzDevOps.d.ts +23 -0
  46. package/AzAd/Identities/AzDevOps.js +61 -0
  47. package/AzAd/Identities/AzUserAdRevertSync.d.ts +14 -0
  48. package/AzAd/Identities/AzUserAdRevertSync.js +18 -0
  49. package/AzAd/Identity.d.ts +51 -0
  50. package/AzAd/Identity.js +133 -0
  51. package/AzAd/ManagedIdentity.d.ts +6 -0
  52. package/AzAd/ManagedIdentity.js +23 -0
  53. package/AzAd/Role.d.ts +19 -0
  54. package/AzAd/Role.js +25 -0
  55. package/AzAd/RoleAssignment.d.ts +79 -0
  56. package/AzAd/RoleAssignment.js +48 -0
  57. package/AzAd/RolesBuiltIn.d.ts +62 -0
  58. package/AzAd/RolesBuiltIn.js +13841 -0
  59. package/Cdn/index.d.ts +11 -0
  60. package/Cdn/index.js +47 -0
  61. package/Certificate/index.d.ts +41 -0
  62. package/Certificate/index.js +156 -0
  63. package/Certificate/p12.d.ts +5 -0
  64. package/Certificate/p12.js +37 -0
  65. package/Common/AppConfigs/dotnetConfig.d.ts +15 -0
  66. package/Common/AppConfigs/dotnetConfig.js +20 -0
  67. package/Common/AutoTags.d.ts +1 -0
  68. package/Common/AutoTags.js +24 -0
  69. package/Common/AzureEnv.d.ts +37 -0
  70. package/Common/AzureEnv.js +94 -0
  71. package/Common/ConfigHelper.d.ts +5 -0
  72. package/Common/ConfigHelper.js +14 -0
  73. package/Common/GlobalEnv.d.ts +14 -0
  74. package/Common/GlobalEnv.js +38 -0
  75. package/Common/Helpers.d.ts +10 -0
  76. package/Common/Helpers.js +30 -0
  77. package/Common/Location.d.ts +4 -0
  78. package/Common/Location.js +23 -0
  79. package/Common/LocationBuiltIn.d.ts +81 -0
  80. package/Common/LocationBuiltIn.js +1925 -0
  81. package/Common/Naming/index.d.ts +62 -0
  82. package/Common/Naming/index.js +146 -0
  83. package/Common/ResourceEnv.d.ts +16 -0
  84. package/Common/ResourceEnv.js +29 -0
  85. package/Common/StackEnv.d.ts +4 -0
  86. package/Common/StackEnv.js +22 -0
  87. package/Common/index.d.ts +5 -0
  88. package/Common/index.js +9 -0
  89. package/ContainerRegistry/Helper.d.ts +23 -0
  90. package/ContainerRegistry/Helper.js +47 -0
  91. package/ContainerRegistry/index.d.ts +28 -0
  92. package/ContainerRegistry/index.js +103 -0
  93. package/Core/Helper.d.ts +16 -0
  94. package/Core/Helper.js +37 -0
  95. package/Core/KeyGenetators.d.ts +33 -0
  96. package/Core/KeyGenetators.js +66 -0
  97. package/Core/Locker.d.ts +13 -0
  98. package/Core/Locker.js +14 -0
  99. package/Core/Random.d.ts +40 -0
  100. package/Core/Random.js +83 -0
  101. package/Core/ResourceCreator.d.ts +17 -0
  102. package/Core/ResourceCreator.js +48 -0
  103. package/Core/ResourceGroup.d.ts +13 -0
  104. package/Core/ResourceGroup.js +45 -0
  105. package/CosmosDb/index.d.ts +33 -0
  106. package/CosmosDb/index.js +129 -0
  107. package/CustomRoles/index.d.ts +5 -0
  108. package/CustomRoles/index.js +27 -0
  109. package/IOT/Hub/index.d.ts +32 -0
  110. package/IOT/Hub/index.js +208 -0
  111. package/KeyVault/CustomHelper.d.ts +35 -0
  112. package/KeyVault/CustomHelper.js +40 -0
  113. package/KeyVault/Helper.d.ts +33 -0
  114. package/KeyVault/Helper.js +58 -0
  115. package/KeyVault/VaultAccess.d.ts +15 -0
  116. package/KeyVault/VaultAccess.js +47 -0
  117. package/KeyVault/VaultPermissions.d.ts +26 -0
  118. package/KeyVault/VaultPermissions.js +169 -0
  119. package/KeyVault/index.d.ts +28 -0
  120. package/KeyVault/index.js +136 -0
  121. package/KubeX/AcrSecret.d.ts +15 -0
  122. package/KubeX/AcrSecret.js +31 -0
  123. package/KubeX/Apps/AstroPage.d.ts +12 -0
  124. package/KubeX/Apps/AstroPage.js +33 -0
  125. package/KubeX/Apps/KafKa.d.ts +6 -0
  126. package/KubeX/Apps/KafKa.js +13 -0
  127. package/KubeX/Apps/Nobelium.d.ts +13 -0
  128. package/KubeX/Apps/Nobelium.js +37 -0
  129. package/KubeX/Apps/Wikijs.d.ts +30 -0
  130. package/KubeX/Apps/Wikijs.js +54 -0
  131. package/KubeX/Apps/WordPress.d.ts +24 -0
  132. package/KubeX/Apps/WordPress.js +55 -0
  133. package/KubeX/Apps/YarpProxy/index.d.ts +17 -0
  134. package/KubeX/Apps/YarpProxy/index.js +107 -0
  135. package/KubeX/Apps/YarpProxy/type.d.ts +55 -0
  136. package/KubeX/Apps/YarpProxy/type.js +3 -0
  137. package/KubeX/CertHelper.d.ts +1 -0
  138. package/KubeX/CertHelper.js +9 -0
  139. package/KubeX/CertImports.d.ts +19 -0
  140. package/KubeX/CertImports.js +70 -0
  141. package/KubeX/CloudFlare/CertCreator.d.ts +19 -0
  142. package/KubeX/CloudFlare/CertCreator.js +90 -0
  143. package/KubeX/CloudFlare/CertImports.d.ts +17 -0
  144. package/KubeX/CloudFlare/CertImports.js +34 -0
  145. package/KubeX/CloudFlare/DynamicDns.d.ts +21 -0
  146. package/KubeX/CloudFlare/DynamicDns.js +39 -0
  147. package/KubeX/CloudFlare/Tunnel-Helm.d.ts +17 -0
  148. package/KubeX/CloudFlare/Tunnel-Helm.js +12 -0
  149. package/KubeX/CloudFlare/Tunnel.d.ts +23 -0
  150. package/KubeX/CloudFlare/Tunnel.js +54 -0
  151. package/KubeX/CloudFlare/index.d.ts +13 -0
  152. package/KubeX/CloudFlare/index.js +36 -0
  153. package/KubeX/Clusters/K3s/AutoUpgradeController/index.d.ts +6 -0
  154. package/KubeX/Clusters/K3s/AutoUpgradeController/index.js +60 -0
  155. package/KubeX/ConfigSecret.d.ts +24 -0
  156. package/KubeX/ConfigSecret.js +38 -0
  157. package/KubeX/Core/CertManager/index.d.ts +24 -0
  158. package/KubeX/Core/CertManager/index.js +96 -0
  159. package/KubeX/Core/KsCertSecret.d.ts +12 -0
  160. package/KubeX/Core/KsCertSecret.js +22 -0
  161. package/KubeX/Core/KsSecret.d.ts +9 -0
  162. package/KubeX/Core/KsSecret.js +12 -0
  163. package/KubeX/Core/LoadBalancer/MetalLB.d.ts +7 -0
  164. package/KubeX/Core/LoadBalancer/MetalLB.js +21 -0
  165. package/KubeX/Core/Monitoring/index.d.ts +22 -0
  166. package/KubeX/Core/Monitoring/index.js +322 -0
  167. package/KubeX/Core/Namespace.d.ts +12 -0
  168. package/KubeX/Core/Namespace.js +41 -0
  169. package/KubeX/Core/Nginx/index.d.ts +60 -0
  170. package/KubeX/Core/Nginx/index.js +109 -0
  171. package/KubeX/Core/OAuthProxy/index.d.ts +0 -0
  172. package/KubeX/Core/OAuthProxy/index.js +3 -0
  173. package/KubeX/Core/ResourceQuota.d.ts +12 -0
  174. package/KubeX/Core/ResourceQuota.js +13 -0
  175. package/KubeX/Core/SecurityRules.d.ts +34 -0
  176. package/KubeX/Core/SecurityRules.js +93 -0
  177. package/KubeX/Core/StorageClass/azureBlob.d.ts +20 -0
  178. package/KubeX/Core/StorageClass/azureBlob.js +77 -0
  179. package/KubeX/Core/StorageClass/azureFile.d.ts +17 -0
  180. package/KubeX/Core/StorageClass/azureFile.js +45 -0
  181. package/KubeX/Core/StorageClass/index.d.ts +13 -0
  182. package/KubeX/Core/StorageClass/index.js +25 -0
  183. package/KubeX/Core/index.d.ts +57 -0
  184. package/KubeX/Core/index.js +94 -0
  185. package/KubeX/Databases/MariaDb.d.ts +11 -0
  186. package/KubeX/Databases/MariaDb.js +39 -0
  187. package/KubeX/Databases/MySql.V2.d.ts +11 -0
  188. package/KubeX/Databases/MySql.V2.js +40 -0
  189. package/KubeX/Databases/MySql.d.ts +13 -0
  190. package/KubeX/Databases/MySql.js +55 -0
  191. package/KubeX/Databases/PostgreSql/PostgreSQL-HA.d.ts +10 -0
  192. package/KubeX/Databases/PostgreSql/PostgreSQL-HA.js +47 -0
  193. package/KubeX/Databases/PostgreSql/PostgreSQL.d.ts +10 -0
  194. package/KubeX/Databases/PostgreSql/PostgreSQL.js +51 -0
  195. package/KubeX/Databases/PostgreSql/PostgreSql.v1.d.ts +13 -0
  196. package/KubeX/Databases/PostgreSql/PostgreSql.v1.js +56 -0
  197. package/KubeX/Databases/PostgreSql/index.d.ts +17 -0
  198. package/KubeX/Databases/PostgreSql/index.js +6 -0
  199. package/KubeX/Databases/RedisCache.d.ts +14 -0
  200. package/KubeX/Databases/RedisCache.js +65 -0
  201. package/KubeX/Databases/SqlServer.d.ts +15 -0
  202. package/KubeX/Databases/SqlServer.js +77 -0
  203. package/KubeX/Deployment/PodAutoscaler.d.ts +14 -0
  204. package/KubeX/Deployment/PodAutoscaler.js +51 -0
  205. package/KubeX/Deployment/index.d.ts +136 -0
  206. package/KubeX/Deployment/index.js +306 -0
  207. package/KubeX/Helpers.d.ts +4 -0
  208. package/KubeX/Helpers.js +17 -0
  209. package/KubeX/Ingress/AppGatewayIngress.d.ts +2 -0
  210. package/KubeX/Ingress/AppGatewayIngress.js +4 -0
  211. package/KubeX/Ingress/Conts.d.ts +13 -0
  212. package/KubeX/Ingress/Conts.js +18 -0
  213. package/KubeX/Ingress/NginxIngress.d.ts +3 -0
  214. package/KubeX/Ingress/NginxIngress.js +186 -0
  215. package/KubeX/Ingress/NginxProxy.d.ts +21 -0
  216. package/KubeX/Ingress/NginxProxy.js +43 -0
  217. package/KubeX/Ingress/TraefikIngress/CustomHeader.d.ts +15 -0
  218. package/KubeX/Ingress/TraefikIngress/CustomHeader.js +15 -0
  219. package/KubeX/Ingress/TraefikIngress/index.d.ts +11 -0
  220. package/KubeX/Ingress/TraefikIngress/index.js +95 -0
  221. package/KubeX/Ingress/index.d.ts +5 -0
  222. package/KubeX/Ingress/index.js +12 -0
  223. package/KubeX/Ingress/type.d.ts +82 -0
  224. package/KubeX/Ingress/type.js +3 -0
  225. package/KubeX/Providers/index.d.ts +8 -0
  226. package/KubeX/Providers/index.js +15 -0
  227. package/KubeX/Storage/Longhorn/index.d.ts +15 -0
  228. package/KubeX/Storage/Longhorn/index.js +54 -0
  229. package/KubeX/Storage/index.d.ts +25 -0
  230. package/KubeX/Storage/index.js +79 -0
  231. package/KubeX/Tools/AWS/LocalStack.d.ts +7 -0
  232. package/KubeX/Tools/AWS/LocalStack.js +29 -0
  233. package/KubeX/Tools/AWS/S3.d.ts +6 -0
  234. package/KubeX/Tools/AWS/S3.js +44 -0
  235. package/KubeX/Tools/AWS/index.d.ts +7 -0
  236. package/KubeX/Tools/AWS/index.js +14 -0
  237. package/KubeX/Tools/AppHealthzMonitor.d.ts +18 -0
  238. package/KubeX/Tools/AppHealthzMonitor.js +52 -0
  239. package/KubeX/Tools/ArgoCD/index.d.ts +17 -0
  240. package/KubeX/Tools/ArgoCD/index.js +131 -0
  241. package/KubeX/Tools/Dapr/Storage.d.ts +66 -0
  242. package/KubeX/Tools/Dapr/Storage.js +70 -0
  243. package/KubeX/Tools/Dapr/index.d.ts +10 -0
  244. package/KubeX/Tools/Dapr/index.js +31 -0
  245. package/KubeX/Tools/Echo-App.d.ts +3 -0
  246. package/KubeX/Tools/Echo-App.js +21 -0
  247. package/KubeX/Tools/Gitea/GiteaRepo.d.ts +72 -0
  248. package/KubeX/Tools/Gitea/GiteaRepo.js +184 -0
  249. package/KubeX/Tools/Gitea/GiteaRunner.d.ts +11 -0
  250. package/KubeX/Tools/Gitea/GiteaRunner.js +37 -0
  251. package/KubeX/Tools/Gitea/GiteaRunner.v1.d.ts +11 -0
  252. package/KubeX/Tools/Gitea/GiteaRunner.v1.js +123 -0
  253. package/KubeX/Tools/HarborRepo.d.ts +29 -0
  254. package/KubeX/Tools/HarborRepo.js +78 -0
  255. package/KubeX/Tools/HelloWorld.d.ts +3 -0
  256. package/KubeX/Tools/HelloWorld.js +21 -0
  257. package/KubeX/Tools/KubeCleanup.d.ts +9 -0
  258. package/KubeX/Tools/KubeCleanup.js +34 -0
  259. package/KubeX/Tools/NoIp.d.ts +13 -0
  260. package/KubeX/Tools/NoIp.js +24 -0
  261. package/KubeX/Tools/OpenLDAP/index.d.ts +12 -0
  262. package/KubeX/Tools/OpenLDAP/index.js +56 -0
  263. package/KubeX/Tools/OutlineVpn/index.d.ts +25 -0
  264. package/KubeX/Tools/OutlineVpn/index.js +256 -0
  265. package/KubeX/Tools/SqlPad.d.ts +29 -0
  266. package/KubeX/Tools/SqlPad.js +133 -0
  267. package/KubeX/Tools/ToolPod.d.ts +10 -0
  268. package/KubeX/Tools/ToolPod.js +40 -0
  269. package/KubeX/Tools/UptimeKuma.d.ts +6 -0
  270. package/KubeX/Tools/UptimeKuma.js +38 -0
  271. package/KubeX/Tools/index.d.ts +27 -0
  272. package/KubeX/Tools/index.js +35 -0
  273. package/KubeX/VairableResolvers/index.d.ts +15 -0
  274. package/KubeX/VairableResolvers/index.js +49 -0
  275. package/KubeX/kx/index.d.ts +114 -0
  276. package/KubeX/kx/index.js +423 -0
  277. package/KubeX/types.d.ts +49 -0
  278. package/KubeX/types.js +3 -0
  279. package/Logs/AppInsight.d.ts +16 -0
  280. package/Logs/AppInsight.js +48 -0
  281. package/Logs/Helpers.d.ts +50 -0
  282. package/Logs/Helpers.js +95 -0
  283. package/Logs/LogAnalytics.d.ts +17 -0
  284. package/Logs/LogAnalytics.js +54 -0
  285. package/Logs/WebTest.d.ts +13 -0
  286. package/Logs/WebTest.js +68 -0
  287. package/Logs/index.d.ts +42 -0
  288. package/Logs/index.js +69 -0
  289. package/MySql/index.d.ts +20 -0
  290. package/MySql/index.js +93 -0
  291. package/Postgresql/index.d.ts +20 -0
  292. package/Postgresql/index.js +93 -0
  293. package/ReadMe.md +36 -0
  294. package/RedisCache/index.d.ts +9 -0
  295. package/RedisCache/index.js +79 -0
  296. package/ServiceBus/ServiceBusHelper.d.ts +21 -0
  297. package/ServiceBus/ServiceBusHelper.js +35 -0
  298. package/ServiceBus/index.d.ts +98 -0
  299. package/ServiceBus/index.js +396 -0
  300. package/SignalR/index.d.ts +20 -0
  301. package/SignalR/index.js +114 -0
  302. package/Sql/Auditing.d.ts +0 -0
  303. package/Sql/Auditing.js +2 -0
  304. package/Sql/Helper.d.ts +9 -0
  305. package/Sql/Helper.js +11 -0
  306. package/Sql/SqlDb.d.ts +14 -0
  307. package/Sql/SqlDb.js +42 -0
  308. package/Sql/index.d.ts +44 -0
  309. package/Sql/index.js +236 -0
  310. package/Storage/CdnEndpoint.d.ts +12 -0
  311. package/Storage/CdnEndpoint.js +62 -0
  312. package/Storage/CdnRules.d.ts +6 -0
  313. package/Storage/CdnRules.js +134 -0
  314. package/Storage/Helper.d.ts +28 -0
  315. package/Storage/Helper.js +66 -0
  316. package/Storage/ManagementRules.d.ts +70 -0
  317. package/Storage/ManagementRules.js +32 -0
  318. package/Storage/index.d.ts +55 -0
  319. package/Storage/index.js +264 -0
  320. package/VM/index.d.ts +37 -0
  321. package/VM/index.js +138 -0
  322. package/VNet/Bastion.d.ts +8 -0
  323. package/VNet/Bastion.js +30 -0
  324. package/VNet/Firewall.d.ts +27 -0
  325. package/VNet/Firewall.js +87 -0
  326. package/VNet/FirewallPolicies/AksFirewallPolicy.d.ts +20 -0
  327. package/VNet/FirewallPolicies/AksFirewallPolicy.js +241 -0
  328. package/VNet/FirewallPolicies/CloudPCFirewallPolicy.d.ts +14 -0
  329. package/VNet/FirewallPolicies/CloudPCFirewallPolicy.js +303 -0
  330. package/VNet/FirewallPolicy.d.ts +28 -0
  331. package/VNet/FirewallPolicy.js +110 -0
  332. package/VNet/FirewallRules/AksFirewallRules.d.ts +24 -0
  333. package/VNet/FirewallRules/AksFirewallRules.js +250 -0
  334. package/VNet/FirewallRules/DefaultRules.d.ts +2 -0
  335. package/VNet/FirewallRules/DefaultRules.js +23 -0
  336. package/VNet/FirewallRules/types.d.ts +20 -0
  337. package/VNet/FirewallRules/types.js +5 -0
  338. package/VNet/GlobalNetworkPeering.d.ts +9 -0
  339. package/VNet/GlobalNetworkPeering.js +17 -0
  340. package/VNet/Helper.d.ts +33 -0
  341. package/VNet/Helper.js +86 -0
  342. package/VNet/IpAddress.d.ts +17 -0
  343. package/VNet/IpAddress.js +38 -0
  344. package/VNet/IpAddressPrefix.d.ts +22 -0
  345. package/VNet/IpAddressPrefix.js +42 -0
  346. package/VNet/NSGRules/AzADService.d.ts +10 -0
  347. package/VNet/NSGRules/AzADService.js +45 -0
  348. package/VNet/NetworkPeering.d.ts +10 -0
  349. package/VNet/NetworkPeering.js +29 -0
  350. package/VNet/PrivateDns.d.ts +33 -0
  351. package/VNet/PrivateDns.js +64 -0
  352. package/VNet/PrivateEndpoint.d.ts +9 -0
  353. package/VNet/PrivateEndpoint.js +71 -0
  354. package/VNet/PublicDns.d.ts +21 -0
  355. package/VNet/PublicDns.js +59 -0
  356. package/VNet/RouteTable.d.ts +13 -0
  357. package/VNet/RouteTable.js +23 -0
  358. package/VNet/SecurityGroup.d.ts +8 -0
  359. package/VNet/SecurityGroup.js +13 -0
  360. package/VNet/Subnet.d.ts +26 -0
  361. package/VNet/Subnet.js +48 -0
  362. package/VNet/VirtualWAN.d.ts +25 -0
  363. package/VNet/VirtualWAN.js +40 -0
  364. package/VNet/Vnet.d.ts +51 -0
  365. package/VNet/Vnet.js +196 -0
  366. package/VNet/index.d.ts +65 -0
  367. package/VNet/index.js +198 -0
  368. package/Web/AppCertOrder.d.ts +16 -0
  369. package/Web/AppCertOrder.js +34 -0
  370. package/Web/AppConfig.d.ts +16 -0
  371. package/Web/AppConfig.js +79 -0
  372. package/Web/AppGateway.d.ts +15 -0
  373. package/Web/AppGateway.js +32 -0
  374. package/Web/FuncApp.d.ts +12 -0
  375. package/Web/FuncApp.js +24 -0
  376. package/Web/Helpers.d.ts +6 -0
  377. package/Web/Helpers.js +36 -0
  378. package/Web/WebAppPlan.d.ts +7 -0
  379. package/Web/WebAppPlan.js +26 -0
  380. package/Web/types.d.ts +169 -0
  381. package/Web/types.js +3 -0
  382. package/package.json +34 -0
  383. package/types.d.ts +69 -0
  384. package/types.js +3 -0
  385. package/z_tests/_tools/Mocks.d.ts +2 -0
  386. package/z_tests/_tools/Mocks.js +47 -0
@@ -0,0 +1,396 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bus = require("@pulumi/azure-native/servicebus");
4
+ const ServiceBusHelper_1 = require("./ServiceBusHelper");
5
+ const AzureEnv_1 = require("../Common/AzureEnv");
6
+ const ResourceCreator_1 = require("../Core/ResourceCreator");
7
+ const Naming_1 = require("../Common/Naming");
8
+ const PrivateEndpoint_1 = require("../VNet/PrivateEndpoint");
9
+ const Locker_1 = require("../Core/Locker");
10
+ const CustomHelper_1 = require("../KeyVault/CustomHelper");
11
+ const Helper_1 = require("../KeyVault/Helper");
12
+ const duplicateDetectedTime = AzureEnv_1.isPrd ? 'P3D' : 'PT10M';
13
+ const defaultValues = {
14
+ maxDeliveryCount: 10,
15
+ enableBatchedOperations: true,
16
+ defaultMessageTtl: AzureEnv_1.isPrd ? 'P30D' : 'P1D',
17
+ defaultMessageTimeToLive: AzureEnv_1.isPrd ? 'P30D' : 'P1D',
18
+ deadLetteringOnMessageExpiration: true,
19
+ maxSizeInMegabytes: 1024,
20
+ lockDuration: 'PT1M',
21
+ //Auto delete subscription after 30 idle.
22
+ //autoDeleteOnIdle: 'P30D',
23
+ //enableExpress: true, this and requiresDuplicateDetection are not able to enabled together
24
+ };
25
+ const createAndStoreConnection = ({ namespaceName, topicName, queueName, connectionType, transportType = 'AmqpWebSockets', resourceGroupName, removeEntityPath, vaultInfo, dependsOn, }) => {
26
+ const name = (topicName || queueName);
27
+ const key = name
28
+ ? (0, ServiceBusHelper_1.getTopicOrQueueVaultName)({
29
+ fullName: name,
30
+ namespaceFullName: namespaceName,
31
+ connectionType,
32
+ })
33
+ : (0, ServiceBusHelper_1.getNamespaceVaultName)({
34
+ namespaceFullName: namespaceName,
35
+ connectionType,
36
+ });
37
+ const primaryName = `${key}-primary`;
38
+ const secondaryName = `${key}-secondary`;
39
+ const rights = connectionType == ServiceBusHelper_1.BusConnectionTypes.Manage
40
+ ? [
41
+ bus.AccessRights.Send,
42
+ bus.AccessRights.Listen,
43
+ bus.AccessRights.Manage,
44
+ ]
45
+ : connectionType == ServiceBusHelper_1.BusConnectionTypes.Send
46
+ ? [bus.AccessRights.Send]
47
+ : [bus.AccessRights.Listen];
48
+ const rule = topicName
49
+ ? new bus.TopicAuthorizationRule(key, {
50
+ authorizationRuleName: key,
51
+ topicName,
52
+ namespaceName,
53
+ resourceGroupName,
54
+ rights,
55
+ }, { dependsOn })
56
+ : queueName
57
+ ? new bus.QueueAuthorizationRule(key, {
58
+ authorizationRuleName: key,
59
+ queueName,
60
+ namespaceName,
61
+ resourceGroupName,
62
+ rights,
63
+ }, { dependsOn })
64
+ : new bus.NamespaceAuthorizationRule(key, {
65
+ authorizationRuleName: key,
66
+ namespaceName,
67
+ resourceGroupName,
68
+ rights,
69
+ }, { dependsOn });
70
+ rule.id.apply(async (id) => {
71
+ if (!id)
72
+ return;
73
+ const keys = await (topicName
74
+ ? bus.listTopicKeys({
75
+ authorizationRuleName: key,
76
+ namespaceName,
77
+ resourceGroupName,
78
+ topicName,
79
+ })
80
+ : queueName
81
+ ? bus.listQueueKeys({
82
+ authorizationRuleName: key,
83
+ namespaceName,
84
+ resourceGroupName,
85
+ queueName,
86
+ })
87
+ : bus.listNamespaceKeys({
88
+ authorizationRuleName: key,
89
+ namespaceName,
90
+ resourceGroupName,
91
+ }));
92
+ let primaryConn = removeEntityPath
93
+ ? keys.primaryConnectionString.replace(`;EntityPath=${name}`, '')
94
+ : keys.primaryConnectionString;
95
+ if (typeof transportType === 'string')
96
+ primaryConn += `;TransportType=${transportType};`;
97
+ (0, CustomHelper_1.addCustomSecret)({
98
+ name: primaryName,
99
+ value: primaryConn,
100
+ vaultInfo,
101
+ contentType: `ServiceBus ${namespaceName}/${name}`,
102
+ dependsOn: rule,
103
+ });
104
+ let secondConn = removeEntityPath
105
+ ? keys.secondaryConnectionString.replace(`;EntityPath=${name}`, '')
106
+ : keys.secondaryConnectionString;
107
+ if (typeof transportType === 'string')
108
+ secondConn += `;TransportType=${transportType};`;
109
+ (0, CustomHelper_1.addCustomSecret)({
110
+ name: secondaryName,
111
+ value: secondConn,
112
+ vaultInfo,
113
+ contentType: `ServiceBus ${namespaceName}/${name}`,
114
+ dependsOn: rule,
115
+ });
116
+ });
117
+ return { primaryName, secondaryName };
118
+ };
119
+ /** Topic creator */
120
+ const topicCreator = ({ group, namespaceFullName, subscriptions, shortName, vaultInfo, version, enableConnections, lock = true, dependsOn, options = {
121
+ duplicateDetectionHistoryTimeWindow: duplicateDetectedTime,
122
+ requiresDuplicateDetection: true,
123
+ enablePartitioning: true,
124
+ }, ...others }) => {
125
+ const topicName = (0, ServiceBusHelper_1.getTopicName)(shortName, version);
126
+ const topic = new bus.Topic(topicName, {
127
+ topicName,
128
+ namespaceName: namespaceFullName,
129
+ resourceGroupName: group.resourceGroupName,
130
+ ...defaultValues,
131
+ ...options,
132
+ }, { dependsOn });
133
+ if (lock) {
134
+ (0, Locker_1.default)({ name: topicName, resourceId: topic.id, dependsOn: topic });
135
+ }
136
+ let primaryConnectionKeys = undefined;
137
+ let secondaryConnectionKeys = undefined;
138
+ if (vaultInfo && enableConnections) {
139
+ //Send Key
140
+ primaryConnectionKeys = createAndStoreConnection({
141
+ topicName,
142
+ namespaceName: namespaceFullName,
143
+ resourceGroupName: group.resourceGroupName,
144
+ vaultInfo,
145
+ connectionType: ServiceBusHelper_1.BusConnectionTypes.Send,
146
+ dependsOn: topic,
147
+ ...others,
148
+ });
149
+ //Listen Key
150
+ secondaryConnectionKeys = createAndStoreConnection({
151
+ topicName,
152
+ namespaceName: namespaceFullName,
153
+ resourceGroupName: group.resourceGroupName,
154
+ vaultInfo,
155
+ connectionType: ServiceBusHelper_1.BusConnectionTypes.Listen,
156
+ dependsOn: topic,
157
+ ...others,
158
+ });
159
+ //Manage Key
160
+ // createAndStoreConnection({
161
+ // topicName,
162
+ // namespaceName: namespaceFullName,
163
+ // resourceGroupName: group.resourceGroupName,
164
+ // vaultInfo,
165
+ // connectionType: BusConnectionTypes.Manage,
166
+ // dependsOn: topic,
167
+ // ...others,
168
+ // });
169
+ }
170
+ let subs = undefined;
171
+ //Create Subscriptions
172
+ if (subscriptions) {
173
+ subs = subscriptions.map((s) => subscriptionCreator({
174
+ shortName: s.enableSession
175
+ ? `${s.shortName}-${shortName.toLocaleLowerCase()}v${version}-session`
176
+ : `${s.shortName}-${shortName.toLocaleLowerCase()}v${version}`,
177
+ namespaceFullName,
178
+ topicFullName: topic.name,
179
+ enableSession: s.enableSession,
180
+ group,
181
+ lock: false,
182
+ dependsOn: topic,
183
+ }));
184
+ }
185
+ return {
186
+ name: topicName,
187
+ topic,
188
+ subs,
189
+ vaultNames: { primaryConnectionKeys, secondaryConnectionKeys },
190
+ };
191
+ };
192
+ /** Subscription creator */
193
+ const subscriptionCreator = ({ group, shortName, topicFullName, namespaceFullName, enableSession, lock = true, dependsOn, }) => {
194
+ const name = (0, ServiceBusHelper_1.getSubscriptionName)(shortName);
195
+ const resource = new bus.Subscription(name, {
196
+ subscriptionName: name,
197
+ resourceGroupName: group.resourceGroupName,
198
+ topicName: topicFullName,
199
+ namespaceName: namespaceFullName,
200
+ requiresSession: enableSession,
201
+ ...defaultValues,
202
+ }, { dependsOn });
203
+ if (lock) {
204
+ (0, Locker_1.default)({ name, resourceId: resource.id, dependsOn: resource });
205
+ }
206
+ return {
207
+ name,
208
+ resource,
209
+ };
210
+ };
211
+ /** Queue creator */
212
+ const queueCreator = ({ group, namespaceFullName, shortName, vaultInfo, version, lock = true, enableConnections, options = {
213
+ requiresDuplicateDetection: false,
214
+ enablePartitioning: true,
215
+ }, dependsOn, ...others }) => {
216
+ const name = (0, ServiceBusHelper_1.getQueueName)(shortName, version);
217
+ const queue = new bus.Queue(name, {
218
+ queueName: name,
219
+ namespaceName: namespaceFullName,
220
+ resourceGroupName: group.resourceGroupName,
221
+ ...defaultValues,
222
+ ...options,
223
+ }, { dependsOn });
224
+ if (lock) {
225
+ (0, Locker_1.default)({ name, resourceId: queue.id, dependsOn: queue });
226
+ }
227
+ let primaryConnectionKeys = undefined;
228
+ let secondaryConnectionKeys = undefined;
229
+ if (vaultInfo && enableConnections) {
230
+ //Send Key
231
+ primaryConnectionKeys = createAndStoreConnection({
232
+ queueName: name,
233
+ namespaceName: namespaceFullName,
234
+ resourceGroupName: group.resourceGroupName,
235
+ vaultInfo,
236
+ connectionType: ServiceBusHelper_1.BusConnectionTypes.Send,
237
+ dependsOn: queue,
238
+ ...others,
239
+ });
240
+ //Listen Key
241
+ secondaryConnectionKeys = createAndStoreConnection({
242
+ queueName: name,
243
+ namespaceName: namespaceFullName,
244
+ resourceGroupName: group.resourceGroupName,
245
+ vaultInfo,
246
+ connectionType: ServiceBusHelper_1.BusConnectionTypes.Listen,
247
+ dependsOn: queue,
248
+ ...others,
249
+ });
250
+ //Manage Key
251
+ // createAndStoreConnection({
252
+ // queueName: name,
253
+ // namespaceName: namespaceFullName,
254
+ // resourceGroupName: group.resourceGroupName,
255
+ // vaultInfo,
256
+ // connectionType: BusConnectionTypes.Manage,
257
+ // dependsOn: queue,
258
+ // ...others,
259
+ // });
260
+ }
261
+ return {
262
+ name,
263
+ queue,
264
+ vaultNames: { primaryConnectionKeys, secondaryConnectionKeys },
265
+ };
266
+ };
267
+ /** Azure Bus creator */
268
+ exports.default = ({ name, group, topics, queues, drConfig, network = {}, vaultInfo, enableNamespaceConnections, enableTopicConnections, enableQueueConnections, sku = bus.SkuName.Basic, monitoring, ...others }) => {
269
+ name = (0, Naming_1.getServiceBusName)(name);
270
+ const { resource, locker, diagnostic } = (0, ResourceCreator_1.default)(bus.Namespace, {
271
+ namespaceName: name,
272
+ ...group,
273
+ sku: { name: sku, tier: sku },
274
+ tags: AzureEnv_1.defaultTags,
275
+ ...others,
276
+ monitoring: monitoring
277
+ ? {
278
+ ...monitoring,
279
+ logsCategories: ['OperationalLogs'],
280
+ }
281
+ : undefined,
282
+ });
283
+ const namespace = resource;
284
+ if (drConfig && sku === bus.SkuName.Premium) {
285
+ new bus.DisasterRecoveryConfig(name, {
286
+ namespaceName: namespace.name,
287
+ resourceGroupName: group.resourceGroupName,
288
+ ...drConfig,
289
+ });
290
+ }
291
+ let primaryConnectionKeys = undefined;
292
+ let secondaryConnectionKeys = undefined;
293
+ //Create Keys
294
+ if (vaultInfo && enableNamespaceConnections) {
295
+ //Send Key
296
+ // createAndStoreConnection({
297
+ // namespaceName: name,
298
+ // resourceGroupName: group.resourceGroupName,
299
+ // vaultInfo,
300
+ // connectionType: BusConnectionTypes.Send,
301
+ // dependsOn: resource,
302
+ // ...others,
303
+ // });
304
+ //Listen Key
305
+ primaryConnectionKeys = createAndStoreConnection({
306
+ namespaceName: name,
307
+ resourceGroupName: group.resourceGroupName,
308
+ vaultInfo,
309
+ connectionType: ServiceBusHelper_1.BusConnectionTypes.Listen,
310
+ dependsOn: resource,
311
+ ...others,
312
+ });
313
+ //Manage Key
314
+ secondaryConnectionKeys = createAndStoreConnection({
315
+ namespaceName: name,
316
+ resourceGroupName: group.resourceGroupName,
317
+ vaultInfo,
318
+ connectionType: ServiceBusHelper_1.BusConnectionTypes.Manage,
319
+ dependsOn: resource,
320
+ ...others,
321
+ });
322
+ }
323
+ //Create Topics and Queues
324
+ let tps = undefined;
325
+ if (topics) {
326
+ tps = topics.map((t) => topicCreator({
327
+ group,
328
+ namespaceFullName: name,
329
+ vaultInfo,
330
+ dependsOn: resource,
331
+ enableConnections: enableTopicConnections,
332
+ ...others,
333
+ ...t,
334
+ }));
335
+ }
336
+ let qes = undefined;
337
+ if (queues) {
338
+ qes = queues.map((q) => queueCreator({
339
+ group,
340
+ namespaceFullName: name,
341
+ vaultInfo,
342
+ dependsOn: resource,
343
+ enableConnections: enableQueueConnections,
344
+ ...others,
345
+ ...q,
346
+ }));
347
+ }
348
+ if (network && sku === bus.SkuName.Premium) {
349
+ if (!network.enablePrivateLink &&
350
+ (network.subnetId || network.whitelistIps)) {
351
+ new bus.NamespaceNetworkRuleSet(name, {
352
+ namespaceName: namespace.name,
353
+ ...group,
354
+ defaultAction: 'Deny',
355
+ ipRules: network.whitelistIps
356
+ ? network.whitelistIps.map((i) => ({
357
+ ipMask: i,
358
+ action: bus.NetworkRuleIPAction.Allow,
359
+ }))
360
+ : undefined,
361
+ virtualNetworkRules: network.subnetId
362
+ ? [
363
+ {
364
+ ignoreMissingVnetServiceEndpoint: false,
365
+ subnet: { id: network.subnetId },
366
+ },
367
+ ]
368
+ : undefined,
369
+ });
370
+ }
371
+ else if (network.enablePrivateLink && network.subnetId) {
372
+ (0, PrivateEndpoint_1.default)({
373
+ name: (0, Naming_1.getPrivateEndpointName)(name),
374
+ group,
375
+ subnetId: network.subnetId,
376
+ useGlobalDnsZone: network.useGlobalDnsZone,
377
+ resourceId: namespace.id,
378
+ linkServiceGroupIds: ['namespace'],
379
+ privateDnsZoneName: 'privatelink.servicebus.windows.net',
380
+ });
381
+ }
382
+ }
383
+ return {
384
+ name,
385
+ resource: namespace,
386
+ queues: qes,
387
+ topics: tps,
388
+ vaultNames: { primaryConnectionKeys, secondaryConnectionKeys },
389
+ getConnectionString: (name) => vaultInfo
390
+ ? (0, Helper_1.getSecret)({ name, nameFormatted: true, vaultInfo })
391
+ : undefined,
392
+ locker,
393
+ diagnostic,
394
+ };
395
+ };
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2VydmljZUJ1cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVEQUF1RDtBQWF2RCx5REFPNEI7QUFDNUIsaURBQXdEO0FBQ3hELDZEQUE4QztBQUM5Qyw2Q0FBNkU7QUFDN0UsNkRBQXNEO0FBQ3RELDJDQUFvQztBQUNwQywyREFBMkQ7QUFDM0QsK0NBQStDO0FBRy9DLE1BQU0scUJBQXFCLEdBQUcsZ0JBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFFdEQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQix1QkFBdUIsRUFBRSxJQUFJO0lBQzdCLGlCQUFpQixFQUFFLGdCQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSztJQUN6Qyx3QkFBd0IsRUFBRSxnQkFBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUs7SUFDaEQsZ0NBQWdDLEVBQUUsSUFBSTtJQUN0QyxrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLFlBQVksRUFBRSxNQUFNO0lBRXBCLHlDQUF5QztJQUN6QywyQkFBMkI7SUFDM0IsMkZBQTJGO0NBQzVGLENBQUM7QUFvQkYsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEVBQ2hDLGFBQWEsRUFDYixTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsRUFDZCxhQUFhLEdBQUcsZ0JBQWdCLEVBQ2hDLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFNBQVMsR0FDUSxFQUFFLEVBQUU7SUFDckIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFFLENBQUM7SUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSTtRQUNkLENBQUMsQ0FBQyxJQUFBLDJDQUF3QixFQUFDO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJ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
@@ -0,0 +1,20 @@
1
+ import * as native from '@pulumi/azure-native';
2
+ import * as pulumi from '@pulumi/pulumi';
3
+ import { BasicResourceArgs, KeyVaultInfo, PrivateLinkProps } from '../types';
4
+ interface ResourceSkuArgs {
5
+ capacity?: 1 | 2 | 5 | 10 | 20 | 50 | 100;
6
+ name: 'Standard_S1' | 'Free_F1';
7
+ tier?: 'Standard' | 'Free';
8
+ }
9
+ interface Props extends BasicResourceArgs {
10
+ vaultInfo?: KeyVaultInfo;
11
+ allowedOrigins?: pulumi.Input<pulumi.Input<string>[]>;
12
+ privateLink?: PrivateLinkProps;
13
+ kind?: native.signalrservice.ServiceKind;
14
+ sku?: pulumi.Input<ResourceSkuArgs>;
15
+ }
16
+ declare const _default: ({ name, group, vaultInfo, privateLink, kind, sku, allowedOrigins, }: Props) => {
17
+ signalR: import("@pulumi/azure-native/signalrservice/signalR").SignalR;
18
+ privateEndpoint: import("@pulumi/azure-native/network/privateEndpoint").PrivateEndpoint | undefined;
19
+ };
20
+ export default _default;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const native = require("@pulumi/azure-native");
4
+ const AzureEnv_1 = require("../Common/AzureEnv");
5
+ const Naming_1 = require("../Common/Naming");
6
+ const PrivateEndpoint_1 = require("../VNet/PrivateEndpoint");
7
+ const CustomHelper_1 = require("../KeyVault/CustomHelper");
8
+ exports.default = ({ name, group, vaultInfo, privateLink, kind = native.signalrservice.ServiceKind.SignalR, sku = {
9
+ name: 'Standard_S1',
10
+ tier: native.signalrservice.SignalRSkuTier.Standard,
11
+ capacity: 1,
12
+ }, allowedOrigins, }) => {
13
+ const privateEndpointName = (0, Naming_1.getPrivateEndpointName)(name);
14
+ name = (0, Naming_1.getSignalRName)(name);
15
+ const signalR = new native.signalrservice.SignalR(name, {
16
+ resourceName: name,
17
+ ...group,
18
+ kind,
19
+ cors: { allowedOrigins },
20
+ features: [
21
+ { flag: 'ServiceMode', value: 'Default' },
22
+ //{ flag: 'EnableConnectivityLogs', value: 'Default' },
23
+ ],
24
+ networkACLs: privateLink
25
+ ? {
26
+ defaultAction: native.signalrservice.ACLAction.Allow,
27
+ publicNetwork: AzureEnv_1.isDev
28
+ ? {
29
+ allow: [
30
+ native.signalrservice.SignalRRequestType.ClientConnection,
31
+ native.signalrservice.SignalRRequestType.ServerConnection,
32
+ native.signalrservice.SignalRRequestType.RESTAPI,
33
+ ],
34
+ //deny: [native.signalrservice.SignalRRequestType.RESTAPI],
35
+ }
36
+ : {
37
+ allow: [
38
+ native.signalrservice.SignalRRequestType.ClientConnection,
39
+ ],
40
+ deny: [
41
+ native.signalrservice.SignalRRequestType.ServerConnection,
42
+ native.signalrservice.SignalRRequestType.RESTAPI,
43
+ ],
44
+ },
45
+ privateEndpoints: [
46
+ {
47
+ name: privateEndpointName,
48
+ allow: [
49
+ native.signalrservice.SignalRRequestType.ClientConnection,
50
+ native.signalrservice.SignalRRequestType.ServerConnection,
51
+ native.signalrservice.SignalRRequestType.RESTAPI,
52
+ ],
53
+ },
54
+ ],
55
+ }
56
+ : undefined,
57
+ sku,
58
+ tags: AzureEnv_1.defaultTags,
59
+ });
60
+ let privateEndpoint = undefined;
61
+ if (privateLink) {
62
+ //The Private Zone will create in Dev and reuse for sandbox and prd.
63
+ privateEndpoint = (0, PrivateEndpoint_1.default)({
64
+ name: privateEndpointName,
65
+ group,
66
+ privateDnsZoneName: 'privatelink.service.signalr.net',
67
+ ...privateLink,
68
+ linkServiceGroupIds: ['signalr'],
69
+ resourceId: signalR.id,
70
+ });
71
+ }
72
+ if (vaultInfo) {
73
+ signalR.hostName.apply(async (h) => {
74
+ if (!h)
75
+ return;
76
+ const keys = await native.signalrservice.listSignalRKeys({
77
+ resourceName: name,
78
+ resourceGroupName: group.resourceGroupName,
79
+ });
80
+ (0, CustomHelper_1.addCustomSecret)({
81
+ name: `${name}-host`,
82
+ value: h,
83
+ vaultInfo,
84
+ contentType: 'SignalR',
85
+ });
86
+ (0, CustomHelper_1.addCustomSecret)({
87
+ name: `${name}-primaryKey`,
88
+ value: keys.primaryKey || '',
89
+ vaultInfo,
90
+ contentType: 'SignalR',
91
+ });
92
+ (0, CustomHelper_1.addCustomSecret)({
93
+ name: `${name}-primaryConnection`,
94
+ value: keys.primaryConnectionString || '',
95
+ vaultInfo,
96
+ contentType: 'SignalR',
97
+ });
98
+ (0, CustomHelper_1.addCustomSecret)({
99
+ name: `${name}-secondaryKey`,
100
+ value: keys.secondaryKey || '',
101
+ vaultInfo,
102
+ contentType: 'SignalR',
103
+ });
104
+ (0, CustomHelper_1.addCustomSecret)({
105
+ name: `${name}-secondaryConnection`,
106
+ value: keys.secondaryConnectionString || '',
107
+ vaultInfo,
108
+ contentType: 'SignalR',
109
+ });
110
+ });
111
+ }
112
+ return { signalR, privateEndpoint };
113
+ };
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2lnbmFsUi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUcvQyxpREFBd0Q7QUFDeEQsNkNBQTBFO0FBRTFFLDZEQUFzRDtBQUN0RCwyREFBMkQ7QUFnQjNELGtCQUFlLENBQUMsRUFDZCxJQUFJLEVBQ0osS0FBSyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsSUFBSSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFDaEQsR0FBRyxHQUFHO0lBQ0osSUFBSSxFQUFFLGFBQWE7SUFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVE7SUFDbkQsUUFBUSxFQUFFLENBQUM7Q0FDWixFQUNELGNBQWMsR0FDUixFQUFFLEVBQUU7SUFDVixNQUFNLG1CQUFtQixHQUFHLElBQUEsK0JBQXNCLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsSUFBSSxHQUFHLElBQUEsdUJBQWMsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUU1QixNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtRQUN0RCxZQUFZLEVBQUUsSUFBSTtRQUNsQixHQUFHLEtBQUs7UUFDUixJQUFJO1FBRUosSUFBSSxFQUFFLEVBQUUsY0FBYyxFQUFFO1FBQ3hCLFFBQVEsRUFBRTtZQUNSLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ3pDLHVEQUF1RDtTQUN4RDtRQUNELFdBQVcsRUFBRSxXQUFXO1lBQ3RCLENBQUMsQ0FBQztnQkFDRSxhQUFhLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSztnQkFDcEQsYUFBYSxFQUFFLGdCQUFLO29CQUNsQixDQUFDLENBQUM7d0JBQ0UsS0FBSyxFQUFFOzRCQUNM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
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVkaXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU3FsL0F1ZGl0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,9 @@
1
+ export declare const getSqlServerInfo: ({ name, groupName, }: {
2
+ name: string;
3
+ groupName: string;
4
+ }) => {
5
+ name: string;
6
+ group: {
7
+ resourceGroupName: string;
8
+ };
9
+ };
package/Sql/Helper.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSqlServerInfo = void 0;
4
+ const Naming_1 = require("../Common/Naming");
5
+ const getSqlServerInfo = ({ name, groupName, }) => {
6
+ const group = (0, Naming_1.getResourceGroupName)(groupName);
7
+ const sqlServerName = (0, Naming_1.getSqlServerName)(name);
8
+ return { name: sqlServerName, group: { resourceGroupName: group } };
9
+ };
10
+ exports.getSqlServerInfo = getSqlServerInfo;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1NxbC9IZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBFO0FBRW5FLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxFQUMvQixJQUFJLEVBQ0osU0FBUyxHQUlWLEVBQUUsRUFBRTtJQUNILE1BQU0sS0FBSyxHQUFHLElBQUEsNkJBQW9CLEVBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsTUFBTSxhQUFhLEdBQUcsSUFBQSx5QkFBZ0IsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUU3QyxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQVhXLFFBQUEsZ0JBQWdCLG9CQVczQiJ9
package/Sql/SqlDb.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import * as sql from '@pulumi/azure-native/sql';
2
+ import { BasicResourceArgs, BasicResourceResultProps } from '../types';
3
+ import { Input, Output, Resource } from '@pulumi/pulumi';
4
+ export type SqlDbSku = 'Basic' | 'S0' | 'S1' | 'S2' | 'S3' | 'P1' | 'P2' | 'P4' | 'P6' | 'P11';
5
+ export interface SqlDbProps extends BasicResourceArgs {
6
+ sqlServerName: Input<string>;
7
+ elasticPoolId?: Output<string>;
8
+ /**Provide this if elasticPoolId is not provided. Default is S0*/
9
+ sku?: SqlDbSku;
10
+ lock?: boolean;
11
+ dependsOn?: Input<Input<Resource>[]> | Input<Resource>;
12
+ }
13
+ declare const _default: ({ group, name, sqlServerName, elasticPoolId, sku, lock, dependsOn, }: SqlDbProps) => BasicResourceResultProps<sql.Database>;
14
+ export default _default;
package/Sql/SqlDb.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const sql = require("@pulumi/azure-native/sql");
4
+ const AzureEnv_1 = require("../Common/AzureEnv");
5
+ const Naming_1 = require("../Common/Naming");
6
+ const Locker_1 = require("../Core/Locker");
7
+ //https://blog.bredvid.no/handling-azure-managed-identity-access-to-azure-sql-in-an-azure-devops-pipeline-1e74e1beb10b
8
+ exports.default = ({ group, name, sqlServerName, elasticPoolId, sku = 'S0', lock, dependsOn, }) => {
9
+ name = (0, Naming_1.getSqlDbName)(name);
10
+ const sqlDb = new sql.Database(name, {
11
+ databaseName: name,
12
+ createMode: 'Default',
13
+ ...group,
14
+ serverName: sqlServerName,
15
+ elasticPoolId,
16
+ sku: elasticPoolId
17
+ ? undefined
18
+ : {
19
+ name: sku,
20
+ // tier: 'Basic',
21
+ // capacity: 5,
22
+ },
23
+ //zoneRedundant: isPrd,
24
+ requestedBackupStorageRedundancy: AzureEnv_1.isPrd ? 'Zone' : 'Local',
25
+ tags: AzureEnv_1.defaultTags,
26
+ }, { dependsOn });
27
+ if (lock) {
28
+ (0, Locker_1.default)({ name, resourceId: sqlDb.id, dependsOn: sqlDb });
29
+ }
30
+ //By Default is 7 Day
31
+ if (AzureEnv_1.isPrd) {
32
+ new sql.BackupShortTermRetentionPolicy(name, {
33
+ policyName: 'default',
34
+ serverName: sqlServerName,
35
+ ...group,
36
+ databaseName: sqlDb.name,
37
+ retentionDays: 7,
38
+ });
39
+ }
40
+ return { name, resource: sqlDb };
41
+ };
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FsRGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU3FsL1NxbERiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsZ0RBQWdEO0FBS2hELGlEQUF3RDtBQUN4RCw2Q0FBZ0Q7QUFDaEQsMkNBQW9DO0FBdUJwQyxzSEFBc0g7QUFDdEgsa0JBQWUsQ0FBQyxFQUNkLEtBQUssRUFDTCxJQUFJLEVBQ0osYUFBYSxFQUNiLGFBQWEsRUFDYixHQUFHLEdBQUcsSUFBSSxFQUNWLElBQUksRUFDSixTQUFTLEdBQ0UsRUFBMEMsRUFBRTtJQUN2RCxJQUFJLEdBQUcsSUFBQSxxQkFBWSxFQUFDLElBQUksQ0FBQyxDQUFDO0lBRTFCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FDNUIsSUFBSSxFQUNKO1FBQ0UsWUFBWSxFQUFFLElBQUk7UUFDbEIsVUFBVSxFQUFFLFNBQVM7UUFDckIsR0FBRyxLQUFLO1FBQ1IsVUFBVSxFQUFFLGFBQWE7UUFDekIsYUFBYTtRQUViLEdBQUcsRUFBRSxhQUFhO1lBQ2hCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxHQUFHO2dCQUNULGlCQUFpQjtnQkFDakIsZUFBZTthQUNoQjtRQUNMLHVCQUF1QjtRQUN2QixnQ0FBZ0MsRUFBRSxnQkFBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87UUFFMUQsSUFBSSxFQUFFLHNCQUFXO0tBQ2xCLEVBQ0QsRUFBRSxTQUFTLEVBQUUsQ0FDZCxDQUFDO0lBRUYsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLElBQUksZ0JBQUssRUFBRSxDQUFDO1FBQ1YsSUFBSSxHQUFHLENBQUMsOEJBQThCLENBQUMsSUFBSSxFQUFFO1lBQzNDLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLEdBQUcsS0FBSztZQUNSLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUN4QixhQUFhLEVBQUUsQ0FBQztTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDbkMsQ0FBQyxDQUFDIn0=