@drunk-pulumi/azure 0.0.37 → 0.0.38

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 (176) hide show
  1. package/Aks/Helper.d.ts +6 -11
  2. package/Aks/Helper.js +40 -65
  3. package/Aks/Identity.d.ts +3 -10
  4. package/Aks/Identity.js +9 -8
  5. package/Aks/index.d.ts +67 -71
  6. package/Aks/index.js +198 -314
  7. package/Apim/ApiProduct/PolicyBuilder.js +25 -27
  8. package/Apim/ApiProduct/SwaggerHelper.js +1 -3
  9. package/Apim/ApiProduct/index.d.ts +3 -3
  10. package/Apim/ApiProduct/index.js +1 -2
  11. package/Automation/index.d.ts +7 -0
  12. package/Automation/index.js +55 -0
  13. package/AzAd/EnvRoles.Consts.d.ts +12 -0
  14. package/AzAd/EnvRoles.Consts.js +125 -0
  15. package/AzAd/EnvRoles.d.ts +16 -15
  16. package/AzAd/EnvRoles.js +69 -47
  17. package/AzAd/GraphDefinition.d.ts +2 -2
  18. package/AzAd/GraphDefinition.js +3055 -3056
  19. package/AzAd/Helper.d.ts +24 -13
  20. package/AzAd/Helper.js +98 -25
  21. package/AzAd/Identities/AzDevOpsIdentity.d.ts +12 -0
  22. package/AzAd/Identities/AzDevOpsIdentity.js +32 -0
  23. package/AzAd/Identities/AzDevOpsManagedIdentity.d.ts +7 -0
  24. package/AzAd/Identities/AzDevOpsManagedIdentity.js +15 -0
  25. package/AzAd/Identities/AzUserAdRevertSync.d.ts +2 -9
  26. package/AzAd/Identities/AzUserAdRevertSync.js +4 -5
  27. package/AzAd/Identities/index.d.ts +3 -0
  28. package/AzAd/Identities/index.js +10 -0
  29. package/AzAd/Identity.d.ts +10 -22
  30. package/AzAd/Identity.js +50 -61
  31. package/AzAd/Role.d.ts +2 -3
  32. package/AzAd/Role.js +4 -5
  33. package/AzAd/RoleAssignment.d.ts +34 -5
  34. package/AzAd/RoleAssignment.js +2 -2
  35. package/AzAd/RoleDefinitions/JustInTimeRequestRole.d.ts +2 -0
  36. package/AzAd/RoleDefinitions/JustInTimeRequestRole.js +25 -0
  37. package/AzAd/RolesBuiltIn.d.ts +29 -0
  38. package/AzAd/RolesBuiltIn.js +13034 -8058
  39. package/AzAd/UserAssignedIdentity.d.ts +6 -0
  40. package/AzAd/UserAssignedIdentity.js +27 -0
  41. package/Builder/AksBuilder.d.ts +3 -0
  42. package/Builder/AksBuilder.js +95 -0
  43. package/Builder/VnetBuilder.d.ts +3 -0
  44. package/Builder/VnetBuilder.js +279 -0
  45. package/Builder/index.d.ts +2 -0
  46. package/Builder/index.js +8 -0
  47. package/Builder/types.d.ts +120 -0
  48. package/Builder/types.js +18 -0
  49. package/Certificate/index.d.ts +1 -1
  50. package/Certificate/index.js +26 -28
  51. package/Common/AutoTags.js +2 -2
  52. package/Common/AzureEnv.d.ts +4 -3
  53. package/Common/AzureEnv.js +31 -24
  54. package/Common/GlobalEnv.d.ts +1 -2
  55. package/Common/GlobalEnv.js +7 -7
  56. package/Common/Location.d.ts +3 -3
  57. package/Common/Location.js +22 -9
  58. package/Common/LocationBuiltIn.d.ts +6 -81
  59. package/Common/LocationBuiltIn.js +491 -1923
  60. package/Common/Naming/index.d.ts +6 -4
  61. package/Common/Naming/index.js +64 -60
  62. package/Common/ResourceEnv.d.ts +2 -2
  63. package/Common/ResourceEnv.js +11 -10
  64. package/Common/StackEnv.js +2 -9
  65. package/Core/KeyGenetators.d.ts +16 -20
  66. package/Core/KeyGenetators.js +17 -16
  67. package/Core/Random.d.ts +4 -4
  68. package/Core/Random.js +10 -10
  69. package/Core/ResourceGroup.d.ts +12 -6
  70. package/Core/ResourceGroup.js +12 -24
  71. package/IOT/Hub/index.d.ts +4 -8
  72. package/IOT/Hub/index.js +19 -54
  73. package/KeyVault/Helper.d.ts +8 -6
  74. package/KeyVault/Helper.js +13 -19
  75. package/KeyVault/index.d.ts +1 -3
  76. package/KeyVault/index.js +2 -26
  77. package/Logs/Helpers.d.ts +35 -25
  78. package/Logs/Helpers.js +33 -20
  79. package/Logs/LogAnalytics.d.ts +2 -2
  80. package/Logs/LogAnalytics.js +15 -6
  81. package/Logs/index.d.ts +3 -3
  82. package/Logs/index.js +4 -4
  83. package/MySql/index.d.ts +2 -3
  84. package/MySql/index.js +16 -19
  85. package/{ReadMe.md → README.md} +6 -1
  86. package/Sql/index.d.ts +15 -9
  87. package/Sql/index.js +39 -41
  88. package/Storage/CdnEndpoint.d.ts +2 -2
  89. package/Storage/CdnEndpoint.js +14 -15
  90. package/Storage/Helper.d.ts +2 -2
  91. package/Storage/Helper.js +6 -6
  92. package/Storage/ManagementRules.d.ts +5 -23
  93. package/Storage/ManagementRules.js +3 -3
  94. package/Storage/index.d.ts +3 -3
  95. package/Storage/index.js +28 -28
  96. package/VM/AzureDevOpsExtension.d.ts +16 -0
  97. package/VM/AzureDevOpsExtension.js +14 -0
  98. package/VM/Extension.d.ts +15 -0
  99. package/VM/Extension.js +13 -0
  100. package/VM/GlobalSchedule.d.ts +10 -0
  101. package/VM/GlobalSchedule.js +20 -0
  102. package/VM/index.d.ts +18 -18
  103. package/VM/index.js +94 -57
  104. package/VNet/Bastion.d.ts +4 -4
  105. package/VNet/Bastion.js +12 -8
  106. package/VNet/Firewall.d.ts +19 -12
  107. package/VNet/Firewall.js +59 -40
  108. package/VNet/FirewallPolicies/AksFirewallPolicy.d.ts +16 -16
  109. package/VNet/FirewallPolicies/AksFirewallPolicy.js +193 -220
  110. package/VNet/FirewallPolicies/CloudPCFirewallPolicy.d.ts +12 -10
  111. package/VNet/FirewallPolicies/CloudPCFirewallPolicy.js +170 -282
  112. package/VNet/FirewallPolicies/DefaultFirewallPolicy.d.ts +3 -0
  113. package/VNet/FirewallPolicies/DefaultFirewallPolicy.js +25 -0
  114. package/VNet/FirewallPolicies/index.d.ts +4 -0
  115. package/VNet/FirewallPolicies/index.js +10 -0
  116. package/VNet/FirewallPolicy.d.ts +14 -11
  117. package/VNet/FirewallPolicy.js +67 -74
  118. package/VNet/FirewallRules/AksFirewallRules.d.ts +4 -3
  119. package/VNet/FirewallRules/AksFirewallRules.js +101 -100
  120. package/VNet/Helper.d.ts +8 -4
  121. package/VNet/Helper.js +42 -35
  122. package/VNet/IpAddress.d.ts +6 -8
  123. package/VNet/IpAddress.js +6 -11
  124. package/VNet/IpAddressPrefix.d.ts +12 -9
  125. package/VNet/IpAddressPrefix.js +14 -13
  126. package/VNet/NSGRules/AppGatewaySecurityRule.d.ts +9 -0
  127. package/VNet/NSGRules/AppGatewaySecurityRule.js +46 -0
  128. package/VNet/NSGRules/AzADSecurityRule.d.ts +6 -0
  129. package/VNet/NSGRules/AzADSecurityRule.js +39 -0
  130. package/VNet/NSGRules/BastionSecurityRule.d.ts +9 -0
  131. package/VNet/NSGRules/BastionSecurityRule.js +93 -0
  132. package/VNet/NatGateway.d.ts +10 -0
  133. package/VNet/NatGateway.js +21 -0
  134. package/VNet/NetworkPeering.d.ts +7 -7
  135. package/VNet/NetworkPeering.js +29 -20
  136. package/VNet/PrivateDns.d.ts +8 -10
  137. package/VNet/PrivateDns.js +12 -14
  138. package/VNet/PrivateEndpoint.js +5 -2
  139. package/VNet/RouteTable.d.ts +7 -8
  140. package/VNet/RouteTable.js +6 -6
  141. package/VNet/SecurityGroup.d.ts +4 -4
  142. package/VNet/SecurityGroup.js +7 -3
  143. package/VNet/Subnet.d.ts +10 -7
  144. package/VNet/Subnet.js +4 -3
  145. package/VNet/VPNGateway.d.ts +13 -0
  146. package/VNet/VPNGateway.js +73 -0
  147. package/VNet/VirtualWAN.d.ts +7 -10
  148. package/VNet/VirtualWAN.js +1 -1
  149. package/VNet/Vnet.d.ts +29 -23
  150. package/VNet/Vnet.js +58 -121
  151. package/VNet/index.d.ts +17 -18
  152. package/VNet/index.js +41 -54
  153. package/VNet/types.d.ts +94 -0
  154. package/VNet/types.js +3 -0
  155. package/Web/types.d.ts +2 -134
  156. package/package.json +8 -8
  157. package/types.d.ts +22 -8
  158. package/z_tests/_tools/Mocks.js +12 -13
  159. package/Automation/AutoAccount.d.ts +0 -5
  160. package/Automation/AutoAccount.js +0 -18
  161. package/AzAd/Identities/AzDevOps.d.ts +0 -23
  162. package/AzAd/Identities/AzDevOps.js +0 -61
  163. package/AzAd/KeyVaultRoles.d.ts +0 -8
  164. package/AzAd/KeyVaultRoles.js +0 -53
  165. package/AzAd/ManagedIdentity.d.ts +0 -6
  166. package/AzAd/ManagedIdentity.js +0 -20
  167. package/AzAd/UserIdentity.d.ts +0 -5
  168. package/AzAd/UserIdentity.js +0 -12
  169. package/Common/Naming/AzureRegions.d.ts +0 -4
  170. package/Common/Naming/AzureRegions.js +0 -49
  171. package/KeyVault/VaultPermissions.d.ts +0 -27
  172. package/KeyVault/VaultPermissions.js +0 -226
  173. package/VNet/FirewallRules/types.d.ts +0 -20
  174. package/VNet/FirewallRules/types.js +0 -5
  175. package/VNet/NSGRules/AzADService.d.ts +0 -10
  176. package/VNet/NSGRules/AzADService.js +0 -45
package/Aks/index.js CHANGED
@@ -11,11 +11,8 @@ const Identity_1 = require("./Identity");
11
11
  const StackEnv_1 = require("../Common/StackEnv");
12
12
  const Helpers_1 = require("../Logs/Helpers");
13
13
  const Naming_1 = require("../Common/Naming");
14
- const PrivateDns_1 = require("../VNet/PrivateDns");
15
- const Helper_1 = require("../VNet/Helper");
16
14
  const RoleAssignment_1 = require("../AzAd/RoleAssignment");
17
- const Group_1 = require("../AzAd/Group");
18
- const Helper_2 = require("./Helper");
15
+ const Helper_1 = require("./Helper");
19
16
  const CustomHelper_1 = require("../KeyVault/CustomHelper");
20
17
  const KeyVaultBase_1 = require("@drunk-pulumi/azure-providers/AzBase/KeyVaultBase");
21
18
  const autoScaleFor = ({ enableAutoScaling, nodeType, env, }) => {
@@ -24,11 +21,11 @@ const autoScaleFor = ({ enableAutoScaling, nodeType, env, }) => {
24
21
  let maxCount = 3;
25
22
  if (env === AzureEnv_1.Environments.Prd) {
26
23
  switch (nodeType) {
27
- case 'User':
24
+ case "User":
28
25
  maxCount = 5;
29
26
  break;
30
- case 'Default':
31
- case 'System':
27
+ case "Default":
28
+ case "System":
32
29
  default:
33
30
  maxCount = 3;
34
31
  break;
@@ -42,12 +39,13 @@ const autoScaleFor = ({ enableAutoScaling, nodeType, env, }) => {
42
39
  };
43
40
  };
44
41
  const defaultNodePoolProps = {
45
- availabilityZones: AzureEnv_1.isPrd ? ['1', '2', '3'] : undefined,
42
+ availabilityZones: AzureEnv_1.isPrd ? ["1", "2", "3"] : undefined,
46
43
  type: native.containerservice.AgentPoolType.VirtualMachineScaleSets,
47
- vmSize: 'Standard_B2s',
44
+ vmSize: "Standard_B2s",
48
45
  maxPods: 50,
49
46
  enableFIPS: false,
50
47
  enableNodePublicIP: false,
48
+ //enableEncryptionAtHost: false,
51
49
  enableUltraSSD: AzureEnv_1.isPrd,
52
50
  osDiskSizeGB: 128,
53
51
  osDiskType: native.containerservice.OSDiskType.Managed,
@@ -55,127 +53,84 @@ const defaultNodePoolProps = {
55
53
  environment: AzureEnv_1.currentEnv,
56
54
  stack: StackEnv_1.stack,
57
55
  },
58
- tags: {
59
- environment: AzureEnv_1.currentEnv,
60
- },
61
56
  };
62
57
  var VmSizes;
63
58
  (function (VmSizes) {
64
59
  /** 32G RAM - 4CPU - $221.92 */
65
- VmSizes["Standard_E4as_v4_221"] = "Standard_E4as_v4";
60
+ VmSizes["Standard_E4as_v4"] = "Standard_E4as_v4";
66
61
  /** 8G RAM - 2CPU - $77.38 */
67
- VmSizes["Standard_B2ms_77"] = "Standard_B2ms";
62
+ VmSizes["Standard_B2ms"] = "Standard_B2ms";
68
63
  /** 16G RAM - 4CPU - $154.03 */
69
- VmSizes["Standard_B4ms_154"] = "Standard_B4ms";
64
+ VmSizes["Standard_B4ms"] = "Standard_B4ms";
70
65
  /** 8G RAM - 2CPU - 87.60 */
71
- VmSizes["Standard_D2as_v4_87"] = "Standard_D2as_v4";
66
+ VmSizes["Standard_D2as_v4"] = "Standard_D2as_v4";
72
67
  /** 8G RAM - 2CPU - 87.60 */
73
- VmSizes["Standard_D2s_v3_87"] = "Standard_D2s_v3";
68
+ VmSizes["Standard_D2s_v3"] = "Standard_D2s_v3";
69
+ /** 8G RAM - 4CPU - 182.5 */
70
+ VmSizes["Standard_D4s_v3"] = "Standard_D4s_v3";
74
71
  /** 16G RAM - 4CPU - $175.20 */
75
- VmSizes["Standard_D4as_v4_175"] = "Standard_D4as_v4";
72
+ VmSizes["Standard_D4as_v4"] = "Standard_D4as_v4";
76
73
  /** 4G RAM - 2CPU - $69.35 */
77
- VmSizes["Standard_A2_v2_69"] = "Standard_A2_v2";
74
+ VmSizes["Standard_A2_v2"] = "Standard_A2_v2";
78
75
  /** 8G RAM - 4CPU - $144.54 */
79
- VmSizes["Standard_A4_v2_144"] = "Standard_A4_v2";
76
+ VmSizes["Standard_A4_v2"] = "Standard_A4_v2";
80
77
  /** 32G RAM - 4CPU - $205.13 */
81
- VmSizes["Standard_A4m_v2_205"] = "Standard_A4m_v2";
78
+ VmSizes["Standard_A4m_v2"] = "Standard_A4m_v2";
82
79
  })(VmSizes || (exports.VmSizes = VmSizes = {}));
83
80
  //Using this to enable the preview feature https://azurecloudai.blog/2019/10/16/aks-enabling-and-using-preview-features-such-as-nodepools-using-cli/
84
- exports.default = async ({ group, nodeResourceGroup, name, linux,
85
- //kubernetesVersion,
86
- defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vaultInfo, featureFlags = { enableDiagnosticSetting: true }, addon = {
81
+ exports.default = async ({ group, name, linux, defaultNodePool, nodePools, network, logWpId, acr, aksAccess, vaultInfo, features = { enableDiagnosticSetting: true }, addon = {
87
82
  enableAzurePolicy: true,
88
- enableAzureKeyVault: true,
83
+ enableAzureKeyVault: false,
89
84
  enableKubeDashboard: false,
90
- }, tier = native.containerservice.ManagedClusterSKUTier.Free, lock = true, dependsOn = [], importFrom, }) => {
85
+ }, tier = native.containerservice.ManagedClusterSKUTier.Free, lock = true, dependsOn = [], importUri, ignoreChanges = [], }) => {
91
86
  const aksName = (0, Naming_1.getAksName)(name);
92
87
  const secretName = `${aksName}-config`;
93
88
  const acrScope = acr?.enable ? acr.id ?? AzureEnv_1.defaultScope : undefined;
94
- const disableLocalAccounts = vaultInfo
95
- ? await (0, KeyVaultBase_1.getKeyVaultBase)(vaultInfo.name).checkSecretExist(secretName)
96
- : false;
89
+ const nodeResourceGroup = (0, Naming_1.getResourceGroupName)(`${aksName}-nodes`);
90
+ const disableLocalAccounts = await (0, KeyVaultBase_1.getKeyVaultBase)(vaultInfo.name)
91
+ .checkSecretExist(secretName)
92
+ .catch(() => false);
97
93
  console.log(name, { disableLocalAccounts });
98
- nodeResourceGroup = nodeResourceGroup || `${aksName}-nodes`;
99
- // const appGateway =
100
- // addon.applicationGateway && network.outboundIpAddress
101
- // ? await AppGateway({
102
- // name,
103
- // group,
104
- // publicIpAddressId: network.outboundIpAddress.ipAddressId,
105
- // subnetId: addon.applicationGateway.gatewaySubnetId,
106
- // })
107
- // : undefined;
108
- // const podIdentity = featureFlags?.enablePodIdentity
109
- // ? ManagedIdentity({
110
- // name,
111
- // group,
112
- // lock,
113
- // })
114
- // : undefined;
115
- const serviceIdentity = featureFlags.createServicePrincipal
116
- ? (0, Identity_1.default)({
117
- name: aksName,
118
- vaultInfo,
119
- })
120
- : undefined;
121
- const adminGroup = aksAccess?.envRoleNames
122
- ? (0, Group_1.getAdGroup)(aksAccess.envRoleNames.admin)
123
- : undefined;
124
- const contributeGroup = aksAccess?.envRoleNames
125
- ? (0, Group_1.getAdGroup)(aksAccess.envRoleNames.contributor)
126
- : undefined;
127
- //const enableAzureRBAC = Boolean(aksAccess?.adminMembers && adminGroup);
94
+ ignoreChanges.push("privateLinkResources", "networkProfile", "linuxProfile");
95
+ const serviceIdentity = (0, Identity_1.default)({
96
+ name: aksName,
97
+ vaultInfo,
98
+ dependsOn,
99
+ });
128
100
  //=================Validate ===================================/
129
- if (!network?.subnetId) {
130
- console.error('Aks subnetId is required:', name);
131
- return undefined;
132
- }
133
- if (!linux?.sshKeys || !linux.sshKeys[0]) {
134
- console.error('Aks sshKeys is required:', name);
135
- return undefined;
136
- }
137
- //Private DNS Zone for Private CLuster
138
- const privateZone = aksAccess?.enablePrivateCluster
139
- ? (0, PrivateDns_1.default)({
140
- name: 'privatelink.southeastasia.azmk8s.io',
141
- group,
142
- vnetIds: [(0, pulumi_1.output)(network.subnetId).apply(Helper_1.getVnetIdFromSubnetId)],
143
- })
144
- : undefined;
101
+ // if (!linux?.sshKeys || !linux.sshKeys[0]) {
102
+ // console.error("Aks sshKeys is required:", name);
103
+ // return undefined;
104
+ // }
145
105
  //Create AKS Cluster
146
106
  const aks = new native.containerservice.ManagedCluster(aksName, {
147
107
  resourceName: aksName,
148
108
  ...group,
149
109
  nodeResourceGroup,
150
110
  dnsPrefix: aksName,
111
+ //fqdnSubdomain: '',
151
112
  //kubernetesVersion,
152
113
  apiServerAccessProfile: {
153
- authorizedIPRanges: aksAccess?.enablePrivateCluster
154
- ? []
114
+ authorizedIPRanges: features?.enablePrivateCluster
115
+ ? undefined
155
116
  : aksAccess?.authorizedIPRanges || [],
156
117
  disableRunCommand: true,
157
- enablePrivateCluster: aksAccess?.enablePrivateCluster,
158
- privateDNSZone: privateZone?.id,
118
+ enablePrivateCluster: features?.enablePrivateCluster,
119
+ enablePrivateClusterPublicFQDN: true,
120
+ privateDNSZone: "system",
159
121
  },
160
- //fqdnSubdomain: '',
161
122
  addonProfiles: {
162
123
  azureKeyvaultSecretsProvider: {
163
124
  config: addon.enableAzureKeyVault
164
125
  ? {
165
- enableSecretRotation: 'true',
126
+ enableSecretRotation: "true",
166
127
  }
167
128
  : undefined,
168
129
  enabled: Boolean(addon.enableAzureKeyVault),
169
130
  },
170
131
  azurePolicy: { enabled: Boolean(addon.enableAzurePolicy) },
171
132
  kubeDashboard: { enabled: Boolean(addon.enableKubeDashboard) },
172
- //If there is no public P address provided, the public app can access via HTTP app routing only and feature only support HTTP.
173
- //TO enable HTTPS support need to create a cluster with a public IP address.
174
- httpApplicationRouting: {
175
- enabled: !network.outboundIpAddress?.ipAddressId &&
176
- !network.enableFirewall &&
177
- !aksAccess?.enablePrivateCluster,
178
- },
133
+ httpApplicationRouting: { enabled: false },
179
134
  aciConnectorLinux: {
180
135
  enabled: Boolean(network.virtualHostSubnetName),
181
136
  config: network.virtualHostSubnetName
@@ -192,10 +147,10 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
192
147
  : undefined,
193
148
  },
194
149
  omsAgent: {
195
- enabled: Boolean(log?.logWpId),
196
- config: log
150
+ enabled: Boolean(logWpId),
151
+ config: logWpId
197
152
  ? {
198
- logAnalyticsWorkspaceResourceID: log.logWpId,
153
+ logAnalyticsWorkspaceResourceID: logWpId,
199
154
  }
200
155
  : undefined,
201
156
  },
@@ -204,26 +159,29 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
204
159
  name: native.containerservice.ManagedClusterSKUName.Base,
205
160
  tier,
206
161
  },
162
+ supportPlan: native.containerservice.KubernetesSupportPlan.KubernetesOfficial,
207
163
  agentPoolProfiles: [
208
164
  {
209
165
  ...defaultNodePoolProps,
210
166
  ...defaultNodePool,
211
167
  ...autoScaleFor({
212
168
  env: AzureEnv_1.currentEnv,
213
- nodeType: defaultNodePool.mode,
214
- enableAutoScaling: enableAutoScale,
169
+ nodeType: "System",
170
+ enableAutoScaling: features?.enableAutoScale,
171
+ // powerState: {
172
+ // code: "Running",
173
+ // },
174
+ // upgradeSettings: {
175
+ // maxSurge: "10%",
176
+ // },
215
177
  }),
216
- count: defaultNodePool.mode === 'System' ? 1 : 0,
217
- //orchestratorVersion: kubernetesVersion,
178
+ name: "defaultnodes",
179
+ mode: "System",
180
+ count: 1,
218
181
  vnetSubnetID: network.subnetId,
219
- kubeletDiskType: 'OS',
220
- osSKU: 'Ubuntu',
221
- osType: 'Linux',
222
- //upgradeSettings: {},
223
- tags: {
224
- ...defaultNodePoolProps.tags,
225
- mode: defaultNodePool.mode,
226
- },
182
+ kubeletDiskType: "OS",
183
+ osSKU: "Ubuntu",
184
+ osType: "Linux",
227
185
  },
228
186
  ],
229
187
  linuxProfile: linux
@@ -232,51 +190,54 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
232
190
  ssh: { publicKeys: linux.sshKeys.map((k) => ({ keyData: k })) },
233
191
  }
234
192
  : undefined,
193
+ //This is not inuse
194
+ windowsProfile: {
195
+ adminUsername: "azureuser",
196
+ enableCSIProxy: true,
197
+ },
235
198
  autoScalerProfile: {
236
- balanceSimilarNodeGroups: 'true',
237
- expander: 'random',
238
- maxEmptyBulkDelete: '10',
239
- maxGracefulTerminationSec: '600',
240
- maxNodeProvisionTime: '15m',
241
- maxTotalUnreadyPercentage: '45',
242
- newPodScaleUpDelay: '0s',
243
- okTotalUnreadyCount: '3',
244
- scaleDownDelayAfterAdd: '30m',
245
- scaleDownDelayAfterDelete: '60s',
246
- scaleDownDelayAfterFailure: '10m',
247
- scaleDownUnneededTime: '10m',
248
- scaleDownUnreadyTime: '20m',
249
- scaleDownUtilizationThreshold: '0.5',
250
- scanInterval: '60s',
251
- skipNodesWithLocalStorage: 'false',
252
- skipNodesWithSystemPods: 'true',
199
+ balanceSimilarNodeGroups: "true",
200
+ expander: "random",
201
+ maxEmptyBulkDelete: "10",
202
+ maxGracefulTerminationSec: "600",
203
+ maxNodeProvisionTime: "15m",
204
+ maxTotalUnreadyPercentage: "45",
205
+ newPodScaleUpDelay: "0s",
206
+ okTotalUnreadyCount: "3",
207
+ scaleDownDelayAfterAdd: "30m",
208
+ scaleDownDelayAfterDelete: "60s",
209
+ scaleDownDelayAfterFailure: "10m",
210
+ scaleDownUnneededTime: "10m",
211
+ scaleDownUnreadyTime: "20m",
212
+ scaleDownUtilizationThreshold: "0.5",
213
+ scanInterval: "60s",
214
+ skipNodesWithLocalStorage: "false",
215
+ skipNodesWithSystemPods: "true",
253
216
  },
254
217
  //Still under preview
255
218
  // workloadAutoScalerProfile: enableAutoScale
256
219
  // ? { keda: { enabled: true } }
257
220
  // : undefined,
258
- servicePrincipalProfile: serviceIdentity
259
- ? {
260
- clientId: serviceIdentity.clientId,
261
- secret: serviceIdentity.clientSecret,
262
- }
263
- : undefined,
221
+ //azureMonitorProfile: { metrics: { enabled } },
222
+ //Refer here for details https://learn.microsoft.com/en-us/azure/aks/use-managed-identity
223
+ //enablePodSecurityPolicy: true,
224
+ servicePrincipalProfile: {
225
+ clientId: serviceIdentity.clientId,
226
+ secret: serviceIdentity.clientSecret,
227
+ },
264
228
  securityProfile: {
265
- defender: AzureEnv_1.isPrd
229
+ defender: logWpId && AzureEnv_1.isPrd
266
230
  ? {
267
- logAnalyticsWorkspaceResourceId: log?.logWpId,
231
+ logAnalyticsWorkspaceResourceId: logWpId,
268
232
  securityMonitoring: { enabled: true },
269
233
  }
270
234
  : undefined,
271
235
  imageCleaner: { enabled: true, intervalHours: 24 },
272
236
  workloadIdentity: { enabled: false },
273
237
  },
274
- //azureMonitorProfile: { metrics: { enabled } },
275
- //Refer here for details https://learn.microsoft.com/en-us/azure/aks/use-managed-identity
276
- enablePodSecurityPolicy: false,
277
- podIdentityProfile: featureFlags.enablePodIdentity
238
+ podIdentityProfile: features.enablePodIdentity
278
239
  ? {
279
- enabled: featureFlags.enablePodIdentity,
240
+ enabled: features.enablePodIdentity,
280
241
  //Not allow pod to use kublet command
281
242
  allowNetworkPluginKubenet: false,
282
243
  }
@@ -284,28 +245,21 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
284
245
  identity: {
285
246
  type: native.containerservice.ResourceIdentityType.SystemAssigned,
286
247
  },
287
- // identityProfile: podIdentity
288
- // ? {
289
- // kubeletidentity: {
290
- // clientId: podIdentity.clientId,
291
- // objectId: podIdentity.principalId,
292
- // resourceId: podIdentity.id,
293
- // },
294
- // }
295
- // : undefined,
296
- //Preview Features
297
248
  autoUpgradeProfile: {
298
249
  upgradeChannel: native.containerservice.UpgradeChannel.Patch,
250
+ //nodeOSUpgradeChannel: "NodeImage",
299
251
  },
300
- //securityProfile:{},
301
252
  disableLocalAccounts,
302
253
  enableRBAC: true,
303
- aadProfile: {
304
- enableAzureRBAC: true,
305
- managed: true,
306
- adminGroupObjectIDs: adminGroup ? [adminGroup.objectId] : undefined,
307
- tenantID: AzureEnv_1.tenantId,
308
- },
254
+ aadProfile: aksAccess?.envRoles
255
+ ? {
256
+ enableAzureRBAC: true,
257
+ managed: true,
258
+ adminGroupObjectIDs: [aksAccess.envRoles.admin.objectId],
259
+ tenantID: AzureEnv_1.tenantId,
260
+ }
261
+ : undefined,
262
+ oidcIssuerProfile: { enabled: false },
309
263
  storageProfile: {
310
264
  blobCSIDriver: {
311
265
  enabled: true,
@@ -314,6 +268,7 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
314
268
  enabled: true,
315
269
  },
316
270
  fileCSIDriver: { enabled: true },
271
+ snapshotController: { enabled: true },
317
272
  },
318
273
  networkProfile: {
319
274
  networkMode: native.containerservice.NetworkMode.Transparent,
@@ -322,20 +277,17 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
322
277
  //dnsServiceIP: '10.0.0.10',
323
278
  //dockerBridgeCidr: '172.17.0.1/16',
324
279
  //serviceCidr: '10.0.0.0/16',
325
- outboundType: network.enableFirewall || aksAccess?.enablePrivateCluster
280
+ outboundType: features?.enablePrivateCluster || !network.outboundIpAddress
326
281
  ? native.containerservice.OutboundType.UserDefinedRouting
327
282
  : native.containerservice.OutboundType.LoadBalancer,
328
- loadBalancerSku: network.outboundIpAddress?.ipAddressId ||
329
- network.enableFirewall ||
330
- aksAccess?.enablePrivateCluster
331
- ? 'Standard'
332
- : 'Basic',
333
- loadBalancerProfile: network.outboundIpAddress &&
334
- !(network.enableFirewall || aksAccess?.enablePrivateCluster)
283
+ loadBalancerSku: "Standard",
284
+ loadBalancerProfile: network.outboundIpAddress
335
285
  ? {
336
- outboundIPs: {
337
- publicIPs: [{ id: network.outboundIpAddress.ipAddressId }],
338
- },
286
+ outboundIPs: network.outboundIpAddress.ipAddressId
287
+ ? {
288
+ publicIPs: [{ id: network.outboundIpAddress.ipAddressId }],
289
+ }
290
+ : undefined,
339
291
  outboundIPPrefixes: network.outboundIpAddress.ipAddressPrefixId
340
292
  ? {
341
293
  publicIPPrefixes: [
@@ -348,13 +300,28 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
348
300
  },
349
301
  }, {
350
302
  protect: lock,
351
- dependsOn: serviceIdentity
352
- ? [...dependsOn, serviceIdentity.resource]
353
- : dependsOn,
354
- import: importFrom,
303
+ dependsOn: serviceIdentity.resource,
304
+ import: importUri,
355
305
  deleteBeforeReplace: true,
356
- ignoreChanges: ['privateLinkResources', 'networkProfile', 'linuxProfile'],
306
+ ignoreChanges,
357
307
  });
308
+ new native.containerservice.MaintenanceConfiguration(`${aksName}-MaintenanceConfiguration`, {
309
+ configName: "default",
310
+ // notAllowedTime: [
311
+ // {
312
+ // end: "2020-11-30T12:00:00Z",
313
+ // start: "2020-11-26T03:00:00Z",
314
+ // },
315
+ // ],
316
+ ...group,
317
+ resourceName: aks.name,
318
+ timeInWeek: [
319
+ {
320
+ day: native.containerservice.WeekDay.Sunday,
321
+ hourSlots: [0, 23],
322
+ },
323
+ ],
324
+ }, { dependsOn: aks });
358
325
  if (lock) {
359
326
  (0, Locker_1.default)({ name: aksName, resource: aks });
360
327
  }
@@ -368,26 +335,21 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
368
335
  ...autoScaleFor({
369
336
  env: AzureEnv_1.currentEnv,
370
337
  nodeType: p.mode,
371
- enableAutoScaling: enableAutoScale,
338
+ enableAutoScaling: features.enableAutoScale,
372
339
  }),
373
- count: p.mode === 'System' ? 1 : 0,
340
+ count: p.mode === "System" ? 1 : 0,
374
341
  //orchestratorVersion: kubernetesVersion,
375
342
  vnetSubnetID: network.subnetId,
376
- kubeletDiskType: 'OS',
377
- osSKU: 'Ubuntu',
378
- osType: 'Linux',
379
- //upgradeSettings: {},
380
- tags: {
381
- ...defaultNodePoolProps.tags,
382
- mode: p.mode,
383
- },
343
+ kubeletDiskType: "OS",
344
+ osSKU: "Ubuntu",
345
+ osType: "Linux",
384
346
  }));
385
347
  }
386
348
  if (vaultInfo) {
387
349
  aks.id.apply(async (id) => {
388
350
  if (!id)
389
351
  return;
390
- const config = await (0, Helper_2.getAksConfig)({
352
+ const config = await (0, Helper_1.getAksConfig)({
391
353
  name: aksName,
392
354
  groupName: group.resourceGroupName,
393
355
  formattedName: true,
@@ -396,6 +358,7 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
396
358
  (0, CustomHelper_1.addCustomSecret)({
397
359
  name: secretName,
398
360
  value: config,
361
+ formattedName: true,
399
362
  dependsOn: aks,
400
363
  ignoreChange: true,
401
364
  contentType: name,
@@ -407,151 +370,72 @@ defaultNodePool, nodePools, enableAutoScale, network, log, acr, aksAccess, vault
407
370
  aks.id.apply(async (id) => {
408
371
  if (!id)
409
372
  return;
410
- //Admin
411
- if (adminGroup) {
412
- await Promise.all([
413
- {
414
- shortName: 'Admin-Contributor-Role',
415
- name: 'Azure Kubernetes Service Contributor Role',
416
- },
417
- {
418
- shortName: 'Admin-RBAC-Cluster-Admin',
419
- name: 'Azure Kubernetes Service RBAC Cluster Admin',
420
- },
421
- {
422
- shortName: 'Admin-Cluster-Admin-Role',
423
- name: 'Azure Kubernetes Service Cluster Admin Role',
424
- },
425
- {
426
- shortName: 'Admin-Cluster-Monitoring-User',
427
- name: 'Azure Kubernetes Service Cluster Monitoring User',
428
- },
429
- {
430
- shortName: 'Admin-Cluster-User-Role',
431
- name: 'Azure Kubernetes Service Cluster User Role',
432
- },
433
- ].map((r) => (0, RoleAssignment_1.roleAssignment)({
434
- name: `${name}-${r.shortName}`,
435
- principalId: adminGroup.objectId,
436
- principalType: 'Group',
437
- roleName: r.name,
438
- scope: id,
439
- })));
440
- }
441
- //Contributor
442
- if (contributeGroup) {
443
- await Promise.all([
444
- {
445
- shortName: 'Contributor-Contributor-Role',
446
- name: 'Azure Kubernetes Service Contributor Role',
447
- },
448
- {
449
- shortName: 'Contributor-RBAC-Admin',
450
- name: 'Azure Kubernetes Service RBAC Admin',
451
- },
452
- {
453
- shortName: 'Contributor-RBAC-Reader',
454
- name: 'Azure Kubernetes Service RBAC Reader',
455
- },
456
- {
457
- shortName: 'Contributor-RBAC-Writer',
458
- name: 'Azure Kubernetes Service RBAC Writer',
459
- },
460
- ].map((r) => (0, RoleAssignment_1.roleAssignment)({
461
- name: `${name}-${r.shortName}`,
462
- principalId: contributeGroup.objectId,
463
- principalType: 'Group',
464
- roleName: r.name,
465
- scope: id,
466
- })));
467
- }
373
+ //Grant Permission for Identity
374
+ pulumi
375
+ .all([aks.identity, aks.identityProfile, network.subnetId])
376
+ .apply(([identity, identityProfile, sId]) => {
377
+ if (acrScope && identityProfile && identityProfile["kubeletidentity"]) {
378
+ (0, RoleAssignment_1.roleAssignment)({
379
+ name: `${name}-aks-identity-profile-pull`,
380
+ principalId: identityProfile["kubeletidentity"].objectId,
381
+ principalType: "ServicePrincipal",
382
+ roleName: "AcrPull",
383
+ scope: acrScope,
384
+ });
385
+ if (vaultInfo) {
386
+ (0, CustomHelper_1.addCustomSecret)({
387
+ name: `${name}-identity-clientId`,
388
+ value: identityProfile["kubeletidentity"].clientId,
389
+ dependsOn: aks,
390
+ contentType: name,
391
+ vaultInfo,
392
+ });
393
+ }
394
+ }
395
+ if (network.subnetId && identity) {
396
+ (0, RoleAssignment_1.roleAssignment)({
397
+ name: `${name}-system-net`,
398
+ principalId: identity.principalId,
399
+ roleName: "Contributor",
400
+ principalType: "ServicePrincipal",
401
+ scope: (0, AzureEnv_1.getResourceIdFromInfo)({
402
+ group: (0, AzureEnv_1.parseResourceInfoFromId)(sId).group,
403
+ }),
404
+ });
405
+ }
406
+ });
468
407
  //Diagnostic
469
- if (featureFlags.enableDiagnosticSetting) {
408
+ if (features.enableDiagnosticSetting && logWpId) {
470
409
  (0, Helpers_1.createDiagnostic)({
471
410
  name,
472
411
  targetResourceId: id,
473
- ...log,
412
+ logWpId,
474
413
  logsCategories: [
475
- 'guard',
476
- 'kube-controller-manager',
477
- 'kube-audit-admin',
478
- 'kube-audit',
479
- 'kube-scheduler',
480
- 'cluster-autoscaler',
414
+ "guard",
415
+ "kube-controller-manager",
416
+ "kube-audit-admin",
417
+ "kube-audit",
418
+ "kube-scheduler",
419
+ "cluster-autoscaler",
481
420
  ],
421
+ dependsOn: aks,
482
422
  });
483
- }
484
- });
485
- //Grant Permission for Identity
486
- pulumi
487
- .all([aks.identity, aks.identityProfile, network.subnetId])
488
- .apply(([identity, identityProfile, sId]) => {
489
- console.log('Grant RBAC for cluster:', name);
490
- //Already assigned when creating the service
491
- // if (serviceIdentity?.principalId) {
492
- // await roleAssignment({
493
- // name: `${name}-aks-identity-acr-pull`,
494
- // principalId: serviceIdentity?.principalId,
495
- // principalType: 'ServicePrincipal',
496
- // roleName: 'AcrPull',
497
- // scope: defaultScope,
498
- // });
499
- // }
500
- if (acrScope && identityProfile && identityProfile['kubeletidentity']) {
501
- (0, RoleAssignment_1.roleAssignment)({
502
- name: `${name}-aks-identity-profile-pull`,
503
- principalId: identityProfile['kubeletidentity'].objectId,
504
- principalType: 'ServicePrincipal',
505
- roleName: 'AcrPull',
506
- scope: acrScope,
507
- });
508
- if (vaultInfo) {
509
- (0, CustomHelper_1.addCustomSecret)({
510
- name: `${name}-identity-clientId`,
511
- value: identityProfile['kubeletidentity'].clientId,
512
- dependsOn: aks,
513
- contentType: name,
514
- vaultInfo,
515
- });
516
- }
517
- }
518
- // if (identity?.principalId) {
519
- // await roleAssignment({
520
- // name: `${name}-system-acr-pull`,
521
- // principalId: identity.principalId,
522
- // principalType: 'ServicePrincipal',
523
- // roleName: 'AcrPull',
524
- // scope: defaultScope,
525
- // });
526
- // }
527
- if (network.subnetId && identity) {
528
- (0, RoleAssignment_1.roleAssignment)({
529
- name: `${name}-system-net`,
530
- principalId: identity.principalId,
531
- roleName: 'Contributor',
532
- principalType: 'ServicePrincipal',
533
- scope: (0, AzureEnv_1.getResourceIdFromInfo)({
534
- group: (0, AzureEnv_1.getResourceInfoFromId)(sId).group,
535
- }),
536
- });
537
- }
538
- if (privateZone && identity) {
539
- (0, RoleAssignment_1.roleAssignment)({
540
- name: `${name}-private-dns`,
541
- principalId: identity.principalId,
542
- roleName: 'Private DNS Zone Contributor',
543
- principalType: 'ServicePrincipal',
544
- scope: privateZone.id,
423
+ //Apply monitoring for VMScale Sets
424
+ (0, VmSetMonitor_1.default)({
425
+ group: { resourceGroupName: nodeResourceGroup },
426
+ logWpId,
427
+ vaultInfo,
428
+ dependsOn: aks,
545
429
  });
546
430
  }
547
431
  });
548
- //Apply monitoring for VMScale Sets
549
- (0, VmSetMonitor_1.default)({
550
- group: { resourceGroupName: nodeResourceGroup },
551
- ...log,
552
- vaultInfo,
553
- dependsOn: aks,
554
- });
555
- return { aks, serviceIdentity, adminGroup, privateZone };
432
+ return {
433
+ aks,
434
+ serviceIdentity,
435
+ disableLocalAccounts,
436
+ getKubeConfig: () => (0, pulumi_1.output)((0, KeyVaultBase_1.getKeyVaultBase)(vaultInfo.name)
437
+ .getSecret(secretName)
438
+ .then((s) => s.value)),
439
+ };
556
440
  };
557
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvQWtzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUErQztBQUMvQyx5Q0FBeUM7QUFDekMsMkNBQStDO0FBQy9DLGlEQUEyQztBQUUzQyxpREFRNEI7QUFDNUIsMkNBQW9DO0FBQ3BDLHlDQUE0QztBQUM1QyxpREFBMkM7QUFDM0MsNkNBQW1EO0FBQ25ELDZDQUE4QztBQUM5QyxtREFBNEM7QUFDNUMsMkNBQXVEO0FBQ3ZELDJEQUF3RDtBQUN4RCx5Q0FBMkM7QUFFM0MscUNBQXdDO0FBQ3hDLDJEQUEyRDtBQUUzRCxvRkFBb0Y7QUFFcEYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxFQUNwQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLEdBQUcsR0FLSixFQUFFLEVBQUU7SUFDSCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDcEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVqQixJQUFJLEdBQUcsS0FBSyx1QkFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxNQUFNO2dCQUNULFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTTtZQUVSLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxRQUFRLENBQUM7WUFDZDtnQkFDRSxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxpQkFBaUI7UUFDakIsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDcEQsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEQsUUFBUSxFQUFFLGlCQUFpQixDQUFD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
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvQWtzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUErQztBQUMvQyx5Q0FBeUM7QUFDekMsMkNBQXVEO0FBQ3ZELGlEQUEyQztBQUUzQyxpREFRNEI7QUFDNUIsMkNBQW9DO0FBQ3BDLHlDQUE0QztBQUM1QyxpREFBMkM7QUFDM0MsNkNBQW1EO0FBQ25ELDZDQUFvRTtBQUNwRSwyREFBd0Q7QUFFeEQscUNBQXdDO0FBQ3hDLDJEQUEyRDtBQUUzRCxvRkFBb0Y7QUFJcEYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxFQUNwQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLEdBQUcsR0FLSixFQUFFLEVBQUU7SUFDSCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDcEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVqQixJQUFJLEdBQUcsS0FBSyx1QkFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxNQUFNO2dCQUNULFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTTtZQUVSLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxRQUFRLENBQUM7WUFDZDtnQkFDRSxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE1BQU07UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxpQkFBaUI7UUFDakIsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDcEQsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEQsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FD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