@drunk-pulumi/azure-components 1.0.4 → 1.0.5

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 (70) hide show
  1. package/ResourceBuilder.d.ts +5 -5
  2. package/ResourceBuilder.js +9 -8
  3. package/aks/AzKubernetes.d.ts +35 -12
  4. package/aks/AzKubernetes.js +216 -124
  5. package/aks/ContainerRegistry.js +2 -1
  6. package/aks/helpers.d.ts +6 -0
  7. package/aks/helpers.js +26 -5
  8. package/aks/types.d.ts +245 -0
  9. package/aks/types.js +3 -0
  10. package/apim/Apim.d.ts +6 -3
  11. package/apim/Apim.js +18 -16
  12. package/app/AppContainer.d.ts +91 -0
  13. package/app/AppContainer.js +141 -0
  14. package/app/AppContainerEnv.d.ts +68 -0
  15. package/app/AppContainerEnv.js +142 -0
  16. package/app/index.d.ts +2 -0
  17. package/app/index.js +3 -1
  18. package/azAd/AppRegistration.d.ts +9 -12
  19. package/azAd/AppRegistration.js +15 -12
  20. package/azAd/CloudflareAzIdentity.d.ts +10 -0
  21. package/azAd/CloudflareAzIdentity.js +61 -0
  22. package/azAd/GroupRole.d.ts +1 -1
  23. package/azAd/GroupRole.js +4 -5
  24. package/azAd/UserAssignedIdentity.js +6 -6
  25. package/azAd/helpers/rsRoleDefinition.js +2 -7
  26. package/azAd/index.d.ts +1 -0
  27. package/azAd/index.js +2 -1
  28. package/base/BaseResourceComponent.d.ts +1 -1
  29. package/base/BaseResourceComponent.js +5 -5
  30. package/base/helpers.js +2 -2
  31. package/database/Redis.d.ts +1 -4
  32. package/database/Redis.js +12 -4
  33. package/database/helpers.js +3 -3
  34. package/helpers/autoTags.js +4 -1
  35. package/helpers/index.d.ts +1 -0
  36. package/helpers/index.js +3 -2
  37. package/helpers/stackEnv.d.ts +2 -1
  38. package/helpers/stackEnv.js +4 -3
  39. package/helpers/zoneHelper.d.ts +24 -0
  40. package/helpers/zoneHelper.js +40 -0
  41. package/logs/Logs.d.ts +6 -16
  42. package/logs/Logs.js +4 -5
  43. package/package.json +7 -6
  44. package/services/ServiceBus.js +2 -1
  45. package/storage/StorageAccount.d.ts +4 -7
  46. package/storage/StorageAccount.js +16 -13
  47. package/types.d.ts +14 -3
  48. package/vault/helpers.d.ts +7 -4
  49. package/vault/helpers.js +11 -4
  50. package/vm/DiskEncryptionSet.js +3 -1
  51. package/vm/VirtualMachine.d.ts +5 -0
  52. package/vm/VirtualMachine.js +156 -41
  53. package/vnet/Basion.js +3 -1
  54. package/vnet/Firewall.d.ts +8 -13
  55. package/vnet/Firewall.js +8 -6
  56. package/vnet/FirewallPolicies/FirewallPolicyBuilder.js +24 -6
  57. package/vnet/FirewallPolicies/commonPolicies.d.ts +29 -2
  58. package/vnet/FirewallPolicies/commonPolicies.js +466 -20
  59. package/vnet/FirewallPolicies/index.d.ts +2 -0
  60. package/vnet/FirewallPolicies/index.js +18 -1
  61. package/vnet/IpAddresses.d.ts +1 -1
  62. package/vnet/IpAddresses.js +3 -2
  63. package/vnet/PrivateDnsZone.d.ts +4 -4
  64. package/vnet/PrivateDnsZone.js +17 -17
  65. package/vnet/PrivateEndpoint.d.ts +2 -5
  66. package/vnet/PrivateEndpoint.js +6 -1
  67. package/vnet/VirtualNetwork.d.ts +11 -5
  68. package/vnet/VirtualNetwork.js +31 -9
  69. package/vnet/helpers.d.ts +2 -0
  70. package/vnet/helpers.js +40 -2
package/aks/types.d.ts ADDED
@@ -0,0 +1,245 @@
1
+ export type AksOutputType = {
2
+ readonly id: string;
3
+ readonly location: string;
4
+ readonly name: string;
5
+ readonly tags: Tags;
6
+ readonly type: string;
7
+ readonly kind: string;
8
+ readonly properties: AksProperties;
9
+ readonly identity: AksTypeIdentity;
10
+ readonly sku: Sku;
11
+ readonly eTag: string;
12
+ };
13
+ export type AksTypeIdentity = {
14
+ readonly type: string;
15
+ readonly principalId: string;
16
+ readonly tenantId: string;
17
+ };
18
+ export type AksProperties = {
19
+ readonly provisioningState: string;
20
+ readonly powerState: PowerState;
21
+ readonly kubernetesVersion: string;
22
+ readonly currentKubernetesVersion: string;
23
+ readonly dnsPrefix: string;
24
+ readonly fqdn: string;
25
+ readonly azurePortalFQDN: string;
26
+ readonly privateFQDN: string;
27
+ readonly agentPoolProfiles: AgentPoolProfile[];
28
+ readonly linuxProfile: LinuxProfile;
29
+ readonly windowsProfile: WindowsProfile;
30
+ readonly servicePrincipalProfile: ServicePrincipalProfile;
31
+ readonly addonProfiles: AddonProfiles;
32
+ readonly nodeResourceGroup: string;
33
+ readonly enableRBAC: boolean;
34
+ readonly supportPlan: string;
35
+ readonly networkProfile: NetworkProfile;
36
+ readonly aadProfile: AadProfile;
37
+ readonly maxAgentPools: number;
38
+ readonly privateLinkResources: PrivateLinkResource[];
39
+ readonly apiServerAccessProfile: APIServerAccessProfile;
40
+ readonly diskEncryptionSetID: string;
41
+ readonly identityProfile: IdentityProfile;
42
+ readonly autoScalerProfile: AutoScalerProfile;
43
+ readonly autoUpgradeProfile: AutoUpgradeProfile;
44
+ readonly disableLocalAccounts: boolean;
45
+ readonly securityProfile: PropertiesSecurityProfile;
46
+ readonly storageProfile: StorageProfile;
47
+ readonly oidcIssuerProfile: OidcIssuerProfile;
48
+ readonly workloadAutoScalerProfile: WorkloadAutoScalerProfile;
49
+ readonly azureMonitorProfile: AzureMonitorProfile;
50
+ readonly resourceUID: string;
51
+ readonly metricsProfile: MetricsProfile;
52
+ readonly nodeProvisioningProfile: NodeProvisioningProfile;
53
+ readonly bootstrapProfile: BootstrapProfile;
54
+ };
55
+ export type AadProfile = {
56
+ readonly managed: boolean;
57
+ readonly adminGroupObjectIDs: string[];
58
+ readonly adminUsers: null;
59
+ readonly enableAzureRBAC: boolean;
60
+ readonly tenantID: string;
61
+ };
62
+ export type AddonProfiles = {
63
+ readonly aciConnectorLinux: AciConnectorLinux;
64
+ readonly azureKeyvaultSecretsProvider: AzureKeyvaultSecretsProvider;
65
+ readonly azurePolicy: AciConnectorLinux;
66
+ readonly httpApplicationRouting: AciConnectorLinux;
67
+ readonly kubeDashboard: AciConnectorLinux;
68
+ readonly omsAgent: AciConnectorLinux;
69
+ };
70
+ export type AciConnectorLinux = {
71
+ readonly enabled: boolean;
72
+ readonly config: AzureMonitorProfile | null;
73
+ };
74
+ export type AzureMonitorProfile = {};
75
+ export type AzureKeyvaultSecretsProvider = {
76
+ readonly enabled: boolean;
77
+ readonly config: Config;
78
+ readonly identity: KubeletidentityClass;
79
+ };
80
+ export type Config = {
81
+ readonly enableSecretRotation: string;
82
+ };
83
+ export type KubeletidentityClass = {
84
+ readonly resourceId: string;
85
+ readonly clientId: string;
86
+ readonly objectId: string;
87
+ };
88
+ export type AgentPoolProfile = {
89
+ readonly name: string;
90
+ readonly count: number;
91
+ readonly vmSize: string;
92
+ readonly osDiskSizeGB: number;
93
+ readonly osDiskType: string;
94
+ readonly kubeletDiskType: string;
95
+ readonly vnetSubnetID: string;
96
+ readonly maxPods: number;
97
+ readonly type: string;
98
+ readonly availabilityZones: string[];
99
+ readonly maxCount: number;
100
+ readonly minCount: number;
101
+ readonly enableAutoScaling: boolean;
102
+ readonly scaleDownMode: string;
103
+ readonly provisioningState: string;
104
+ readonly powerState: PowerState;
105
+ readonly orchestratorVersion: string;
106
+ readonly currentOrchestratorVersion: string;
107
+ readonly enableNodePublicIP: boolean;
108
+ readonly mode: string;
109
+ readonly enableEncryptionAtHost: boolean;
110
+ readonly enableUltraSSD: boolean;
111
+ readonly osType: string;
112
+ readonly osSKU: string;
113
+ readonly nodeImageVersion: string;
114
+ readonly upgradeSettings: UpgradeSettings;
115
+ readonly enableFIPS: boolean;
116
+ readonly securityProfile: AgentPoolProfileSecurityProfile;
117
+ readonly eTag: string;
118
+ };
119
+ export type PowerState = {
120
+ readonly code: string;
121
+ };
122
+ export type AgentPoolProfileSecurityProfile = {
123
+ readonly enableVTPM: boolean;
124
+ readonly enableSecureBoot: boolean;
125
+ };
126
+ export type UpgradeSettings = {
127
+ readonly maxSurge: string;
128
+ readonly maxUnavailable: string;
129
+ };
130
+ export type APIServerAccessProfile = {
131
+ readonly enablePrivateCluster: boolean;
132
+ readonly privateDNSZone: string;
133
+ readonly enablePrivateClusterPublicFQDN: boolean;
134
+ readonly disableRunCommand: boolean;
135
+ };
136
+ export type AutoScalerProfile = {
137
+ readonly 'balance-similar-node-groups': string;
138
+ readonly 'daemonset-eviction-for-empty-nodes': boolean;
139
+ readonly 'daemonset-eviction-for-occupied-nodes': boolean;
140
+ readonly expander: string;
141
+ readonly 'ignore-daemonsets-utilization': boolean;
142
+ readonly 'max-empty-bulk-delete': string;
143
+ readonly 'max-graceful-termination-sec': string;
144
+ readonly 'max-node-provision-time': string;
145
+ readonly 'max-total-unready-percentage': string;
146
+ readonly 'new-pod-scale-up-delay': string;
147
+ readonly 'ok-total-unready-count': string;
148
+ readonly 'scale-down-delay-after-add': string;
149
+ readonly 'scale-down-delay-after-delete': string;
150
+ readonly 'scale-down-delay-after-failure': string;
151
+ readonly 'scale-down-unneeded-time': string;
152
+ readonly 'scale-down-unready-time': string;
153
+ readonly 'scale-down-utilization-threshold': string;
154
+ readonly 'scan-interval': string;
155
+ readonly 'skip-nodes-with-local-storage': string;
156
+ readonly 'skip-nodes-with-system-pods': string;
157
+ };
158
+ export type AutoUpgradeProfile = {
159
+ readonly upgradeChannel: string;
160
+ readonly nodeOSUpgradeChannel: string;
161
+ };
162
+ export type BootstrapProfile = {
163
+ readonly artifactSource: string;
164
+ };
165
+ export type IdentityProfile = {
166
+ readonly kubeletidentity: KubeletidentityClass;
167
+ };
168
+ export type LinuxProfile = {
169
+ readonly adminUsername: string;
170
+ readonly ssh: SSH;
171
+ };
172
+ export type SSH = {
173
+ readonly publicKeys: PublicKey[];
174
+ };
175
+ export type PublicKey = {
176
+ readonly keyData: string;
177
+ };
178
+ export type MetricsProfile = {
179
+ readonly costAnalysis: OidcIssuerProfile;
180
+ };
181
+ export type OidcIssuerProfile = {
182
+ readonly enabled: boolean;
183
+ };
184
+ export type NetworkProfile = {
185
+ readonly networkPlugin: string;
186
+ readonly networkPluginMode: string;
187
+ readonly networkPolicy: string;
188
+ readonly networkDataplane: string;
189
+ readonly loadBalancerSku: string;
190
+ readonly loadBalancerProfile: LoadBalancerProfile;
191
+ readonly podCidr: string;
192
+ readonly serviceCidr: string;
193
+ readonly dnsServiceIP: string;
194
+ readonly outboundType: string;
195
+ readonly podCidrs: string[];
196
+ readonly serviceCidrs: string[];
197
+ readonly ipFamilies: string[];
198
+ };
199
+ export type LoadBalancerProfile = {
200
+ readonly backendPoolType: string;
201
+ };
202
+ export type NodeProvisioningProfile = {
203
+ readonly mode: string;
204
+ readonly defaultNodePools: string;
205
+ };
206
+ export type PrivateLinkResource = {
207
+ readonly id: string;
208
+ readonly name: string;
209
+ readonly type: string;
210
+ readonly groupId: string;
211
+ readonly requiredMembers: string[];
212
+ };
213
+ export type PropertiesSecurityProfile = {
214
+ readonly imageCleaner: ImageCleaner;
215
+ readonly workloadIdentity: OidcIssuerProfile;
216
+ };
217
+ export type ImageCleaner = {
218
+ readonly enabled: boolean;
219
+ readonly intervalHours: number;
220
+ };
221
+ export type ServicePrincipalProfile = {
222
+ readonly clientId: string;
223
+ };
224
+ export type StorageProfile = {
225
+ readonly diskCSIDriver: OidcIssuerProfile;
226
+ readonly fileCSIDriver: OidcIssuerProfile;
227
+ readonly snapshotController: OidcIssuerProfile;
228
+ };
229
+ export type WindowsProfile = {
230
+ readonly adminUsername: string;
231
+ readonly enableCSIProxy: boolean;
232
+ };
233
+ export type WorkloadAutoScalerProfile = {
234
+ readonly keda: OidcIssuerProfile;
235
+ readonly verticalPodAutoscaler: OidcIssuerProfile;
236
+ };
237
+ export type Sku = {
238
+ readonly name: string;
239
+ readonly tier: string;
240
+ };
241
+ export type Tags = {
242
+ readonly environment: string;
243
+ readonly organization: string;
244
+ readonly 'pulumi-project': string;
245
+ };
package/aks/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWtzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
package/apim/Apim.d.ts CHANGED
@@ -12,9 +12,12 @@ export interface ApimArgs extends CommonBaseArgs, types.WithUserAssignedIdentity
12
12
  customProperties?: string[];
13
13
  hostnameConfigurations?: Array<{
14
14
  hostName: pulumi.Input<string>;
15
- negotiateClientCertificate: boolean;
16
- defaultSslBinding: boolean;
17
- cert?: ApimCertType;
15
+ negotiateClientCertificate?: boolean;
16
+ defaultSslBinding?: boolean;
17
+ cert: {
18
+ vaultCertName: pulumi.Input<string>;
19
+ version?: pulumi.Input<string> | undefined;
20
+ };
18
21
  }>;
19
22
  additionalLocations?: inputs.apimanagement.AdditionalLocationArgs[] | undefined;
20
23
  certificates?: {
package/apim/Apim.js CHANGED
@@ -42,6 +42,7 @@ const base_1 = require("../base");
42
42
  const helpers_1 = require("../helpers");
43
43
  const azAd_1 = require("../azAd");
44
44
  const vnet_1 = require("../vnet");
45
+ const vault_1 = require("../vault");
45
46
  class Apim extends base_1.BaseResourceComponent {
46
47
  id;
47
48
  resourceName;
@@ -81,7 +82,7 @@ class Apim extends base_1.BaseResourceComponent {
81
82
  return { ...caCerts, ...rootCerts };
82
83
  }
83
84
  createApim() {
84
- const { defaultUAssignedId, groupRoles, rsGroup, sku, publisherName, publisherEmail, notificationSenderEmail, apiVersionConstraint, additionalLocations, hostnameConfigurations = [], customProperties = {}, zones, network, ...others } = this.args;
85
+ const { defaultUAssignedId, vaultInfo, groupRoles, rsGroup, sku, publisherName, publisherEmail, notificationSenderEmail, apiVersionConstraint, additionalLocations, hostnameConfigurations = [], customProperties = {}, zones, network, ...others } = this.args;
85
86
  return new apim.ApiManagementService(this.name, {
86
87
  ...rsGroup,
87
88
  ...others,
@@ -101,19 +102,20 @@ class Apim extends base_1.BaseResourceComponent {
101
102
  minApiVersion: '2019-12-01',
102
103
  },
103
104
  certificates: this.getCerts(),
104
- hostnameConfigurations: hostnameConfigurations.map((d) => {
105
- if (!d.cert)
106
- return {
107
- ...d,
108
- type: 'Proxy',
109
- };
110
- const cert = certHelpers.getCertOutputs(d.cert, this.args.vaultInfo);
111
- return cert.apply((c) => ({
112
- ...d,
113
- certificateSource: c.encodedCertificate,
114
- certificatePassword: c.certificatePassword,
105
+ hostnameConfigurations: hostnameConfigurations.map((config) => {
106
+ const { cert, ...props } = config;
107
+ return {
108
+ ...props,
109
+ certificateSource: apim.CertificateSource.KeyVault,
110
+ identityClientId: defaultUAssignedId?.clientId,
111
+ keyVaultId: vault_1.vaultHelpers.getVaultId({
112
+ name: cert.vaultCertName,
113
+ version: cert.version,
114
+ vaultInfo: vaultInfo,
115
+ type: 'secrets',
116
+ }),
115
117
  type: 'Proxy',
116
- }));
118
+ };
117
119
  }),
118
120
  //Only support when linking to a virtual network
119
121
  //publicIpAddressId: this._apimVnet ? this._ipAddressInstances[this.commonProps.name]?.id : undefined,
@@ -126,13 +128,13 @@ class Apim extends base_1.BaseResourceComponent {
126
128
  subnetResourceId: network?.vnetRules[0].subnetId,
127
129
  }
128
130
  : undefined,
129
- zones,
131
+ zones: helpers_1.zoneHelper.getDefaultZones(zones),
130
132
  //Only available for Premium
131
133
  additionalLocations: sku.name === 'Premium'
132
134
  ? additionalLocations?.map((a) => ({
133
135
  ...a,
134
136
  sku,
135
- zones,
137
+ zones: helpers_1.zoneHelper.getDefaultZones(zones),
136
138
  }))
137
139
  : undefined,
138
140
  customProperties: {
@@ -245,4 +247,4 @@ class Apim extends base_1.BaseResourceComponent {
245
247
  }
246
248
  }
247
249
  exports.Apim = Apim;
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGltL0FwaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUVBQTJEO0FBQzNELG9FQUFzRDtBQUV0RCx1REFBeUM7QUFHekMsK0NBQTZEO0FBQzdELGtDQUFnRTtBQUNoRSx3Q0FBaUQ7QUFDakQsa0NBQTBDO0FBQzFDLGtDQUEwQztBQW1EMUMsTUFBYSxJQUFLLFNBQVEsNEJBQStCO0lBQ3ZDLEVBQUUsQ0FBd0I7SUFDMUIsWUFBWSxDQUF3QjtJQUVwRCxZQUFZLElBQVksRUFBRSxJQUFjLEVBQUUsSUFBc0M7UUFDOUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUU5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPO1lBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRU8sUUFBUTtRQUNkLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU87WUFDbEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekUsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxTQUFTO1lBQ3RDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMvQixNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDckQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUM7WUFDSixDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxFQUNKLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsT0FBTyxFQUNQLEdBQUcsRUFDSCxhQUFhLEVBQ2IsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLHNCQUFzQixHQUFHLEVBQUUsRUFDM0IsZ0JBQWdCLEdBQUcsRUFBRSxFQUNyQixLQUFLLEVBQ0wsT0FBTyxFQUNQLEdBQUcsTUFBTSxFQUNWLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVkLE9BQU8sSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQ2xDLElBQUksQ0FBQyxJQUFJLEVBQ1Q7WUFDRSxHQUFHLE9BQU87WUFDVixHQUFHLE1BQU07WUFDVCxhQUFhLEVBQUUsYUFBYSxJQUFJLG1CQUFTLENBQUMsWUFBWTtZQUN0RCxjQUFjLEVBQUUsY0FBYyxJQUFJLHVDQUF1QztZQUN6RSx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSx1Q0FBdUM7WUFFM0YsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxrQkFBa0I7b0JBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCO29CQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWM7Z0JBRXhDLHNCQUFzQixFQUFFLGtCQUFrQjtvQkFDeEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxDQUFDLENBQUMsU0FBUzthQUNkO1lBQ0QsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRTtZQUVoRCxvQkFBb0IsRUFBRSxvQkFBb0IsSUFBSTtnQkFDNUMsYUFBYSxFQUFFLFlBQVk7YUFDNUI7WUFDRCxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUU3QixzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUNULE9BQU87d0JBQ0wsR0FBRyxDQUFDO3dCQUNKLElBQUksRUFBRSxPQUFPO3FCQUNkLENBQUM7Z0JBRUosTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDeEIsR0FBRyxDQUFDO29CQUNKLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxrQkFBa0I7b0JBQ3ZDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxtQkFBbUI7b0JBQzFDLElBQUksRUFBRSxPQUFPO2lCQUNkLENBQUMsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxDQUFDO1lBRUYsZ0RBQWdEO1lBQ2hELHNHQUFzRztZQUN0RywwRUFBMEU7WUFDMUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM3RyxZQUFZO1lBQ1osa0JBQWtCLEVBQUUsTUFBTTtZQUMxQiwyQkFBMkIsRUFBRSxPQUFPLEVBQUUsU0FBUztnQkFDN0MsQ0FBQyxDQUFDO29CQUNFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtpQkFDakQ7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7WUFFYixLQUFLO1lBQ0wsNEJBQTRCO1lBQzVCLG1CQUFtQixFQUNqQixHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVM7Z0JBQ3BCLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQy9CLEdBQUcsQ0FBQztvQkFDSixHQUFHO29CQUNILEtBQUs7aUJBQ04sQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxTQUFTO1lBRWYsZ0JBQWdCLEVBQUU7Z0JBQ2hCLHFFQUFxRSxFQUFFLE1BQU07Z0JBQzdFLCtFQUErRSxFQUFFLE9BQU87Z0JBQ3hGLCtFQUErRSxFQUFFLE9BQU87Z0JBQ3hGLCtFQUErRSxFQUFFLE9BQU87Z0JBQ3hGLEdBQUcsZ0JBQWdCO2FBQ3BCO1NBQ0YsRUFDRDtZQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVM7WUFDL0IsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixNQUFNLEVBQUUsSUFBSTtTQUNiLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxZQUFZLENBQUMsT0FBa0M7UUFDckQsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN4RCxJQUFJLGFBQWE7WUFBRSxPQUFPO1FBRTFCLE1BQU0sUUFBUSxHQUFHLElBQUksc0JBQWUsQ0FDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQ25CO1lBQ0UsU0FBUztTQUNWLEVBQ0QsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUMzRCxDQUFDO1FBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FDOUIsSUFBSSxDQUFDLElBQUksRUFDVDtZQUNFLEdBQUcsT0FBTztZQUNWLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSTtZQUN6QixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFhO1lBQ3BDLFNBQVMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFBLHFDQUFxQyxrQkFBUSxDQUFDLFFBQVEsR0FBRztZQUN0RixJQUFJLEVBQUUsS0FBSztZQUNYLG9CQUFvQixFQUFFLEtBQUs7WUFDM0IsY0FBYyxFQUFFLENBQUMsa0JBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbkMsWUFBWSxFQUFFLGtCQUFRLENBQUMsUUFBUTtTQUNoQyxFQUNELEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FDN0QsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxPQUFrQztRQUMxRCxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPO1FBRTNCLHlCQUF5QjtRQUN6Qix5Q0FBeUM7UUFDekMsZUFBZTtRQUNmLE1BQU07UUFDTixrQkFBa0I7UUFDbEIsaUNBQWlDO1FBQ2pDLHNCQUFzQjtRQUN0QixzQkFBc0I7UUFDdEIsd0JBQXdCO1FBQ3hCLGdDQUFnQztRQUNoQyx3QkFBd0I7UUFDeEIsK0NBQStDO1FBQy9DLFNBQVM7UUFDVCxPQUFPO1FBQ1AsZ0VBQWdFO1FBQ2hFLEtBQUs7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsT0FBa0M7UUFDekQsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVztZQUFFLE9BQU87UUFFbEMsT0FBTyxJQUFJLHNCQUFlLENBQ3hCLElBQUksQ0FBQyxJQUFJLEVBQ1Q7WUFDRSxHQUFHLE9BQU8sQ0FBQyxXQUFXO1lBQ3RCLE9BQU87WUFDUCxJQUFJLEVBQUUsT0FBTztZQUNiLFlBQVksRUFBRSxPQUFPO1NBQ3RCLEVBQ0QsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUFrQztRQUNsRCxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVO1lBQUUsT0FBTztRQUU5QixrQkFBa0I7UUFDbEIsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQ3BCLEdBQUcsSUFBSSxDQUFDLElBQUksVUFBVSxFQUN0QjtZQUNFLEdBQUcsT0FBTztZQUNWLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSTtZQUV6QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUI7WUFDL0MsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxhQUFhO1lBQ25DLFVBQVUsRUFBRSxJQUFLLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0IsV0FBVyxFQUFFO2dCQUNYLDJEQUEyRDtnQkFDM0Qsa0JBQWtCLEVBQUUsSUFBSyxDQUFDLFVBQVUsQ0FBQyxrQkFBbUI7YUFDekQ7U0FDRixFQUNELEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFTyxhQUFhLENBQUMsT0FBa0M7UUFDdEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFFOUIsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUNqQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osSUFBSSx5QkFBVyxDQUNiLENBQUMsQ0FBQyxJQUFJLEVBQ047WUFDRSxHQUFHLENBQUM7WUFDSixPQUFPO1lBQ1AsU0FBUztZQUNULFVBQVU7WUFDVixXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDekIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUM7U0FDNUMsRUFDRDtZQUNFLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLE1BQU0sRUFBRSxJQUFJO1NBQ2IsQ0FDRixDQUNKLENBQUM7SUFDSixDQUFDO0lBRU8sZUFBZSxDQUFDLE9BQWtDO1FBQ3hELE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFFakMsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDM0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1lBQzlCLEdBQUcsQ0FBQztZQUNKLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtTQUMzQixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWhSRCxvQkFnUkMifQ==
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGltL0FwaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUVBQTJEO0FBQzNELG9FQUFzRDtBQUV0RCx1REFBeUM7QUFHekMsK0NBQTZEO0FBQzdELGtDQUFnRTtBQUNoRSx3Q0FBNkQ7QUFFN0Qsa0NBQTBDO0FBQzFDLGtDQUEwQztBQUMxQyxvQ0FBd0M7QUFtRHhDLE1BQWEsSUFBSyxTQUFRLDRCQUErQjtJQUN2QyxFQUFFLENBQXdCO0lBQzFCLFlBQVksQ0FBd0I7SUFFcEQsWUFBWSxJQUFZLEVBQUUsSUFBYyxFQUFFLElBQXNDO1FBQzlFLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxVQUFVO1FBQ2YsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZ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
@@ -0,0 +1,91 @@
1
+ import * as app from '@pulumi/azure-native/app';
2
+ import * as inputs from '@pulumi/azure-native/types/input';
3
+ import * as pulumi from '@pulumi/pulumi';
4
+ import * as types from '../types';
5
+ import { BaseResourceComponent, CommonBaseArgs } from '../base';
6
+ /**
7
+ * Azure Container App component providing secure, serverless container execution
8
+ * with auto-scaling, ingress, and managed environment integration.
9
+ */
10
+ export interface AppContainerArgs extends CommonBaseArgs, types.WithUserAssignedIdentity, Partial<Pick<app.ContainerAppArgs, 'workloadProfileName' | 'extendedLocation'>> {
11
+ /** Resource ID of the Container Apps Managed Environment */
12
+ managedEnvironmentId: pulumi.Input<string>;
13
+ /** Container configuration */
14
+ template: {
15
+ /** Container definitions (at least one required) */
16
+ containers: Array<Partial<Pick<inputs.app.ContainerArgs, 'args' | 'command' | 'env' | 'probes' | 'volumeMounts' | 'resources' | 'imageType'>> & {
17
+ /** Container name */
18
+ name: string;
19
+ /** Container image (e.g., 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest') */
20
+ image: pulumi.Input<string>;
21
+ }>;
22
+ /** Init containers */
23
+ initContainers?: Array<Partial<Pick<inputs.app.InitContainerArgs, 'args' | 'command' | 'env' | 'volumeMounts' | 'resources'>> & {
24
+ name: string;
25
+ image: pulumi.Input<string>;
26
+ }>;
27
+ /** Scaling configuration */
28
+ scale?: Partial<Pick<inputs.app.ScaleArgs, 'cooldownPeriod' | 'pollingInterval'> & {
29
+ minReplicas?: number;
30
+ maxReplicas?: number;
31
+ rules?: pulumi.Input<pulumi.Input<inputs.app.ScaleRuleArgs>[]>;
32
+ }>;
33
+ /** Volume definitions */
34
+ volumes?: pulumi.Input<pulumi.Input<inputs.app.VolumeArgs>[]>;
35
+ /** Revision suffix */
36
+ revisionSuffix?: pulumi.Input<string>;
37
+ /** Service bindings */
38
+ serviceBinds?: pulumi.Input<pulumi.Input<inputs.app.ServiceBindArgs>[]>;
39
+ /** Graceful termination period (seconds) */
40
+ terminationGracePeriodSeconds?: pulumi.Input<number>;
41
+ };
42
+ /** Configuration settings */
43
+ configuration?: {
44
+ /** Revisions mode: 'Single' or 'Multiple' */
45
+ activeRevisionsMode?: app.ActiveRevisionsMode;
46
+ /** Ingress settings */
47
+ ingress?: Partial<Pick<inputs.app.IngressArgs, 'allowInsecure' | 'clientCertificateMode' | 'corsPolicy' | 'customDomains' | 'exposedPort' | 'ipSecurityRestrictions' | 'stickySessions' | 'targetPortHttpScheme' | 'transport' | 'additionalPortMappings'>> & {
48
+ /** Enable external ingress */
49
+ external?: boolean;
50
+ /** Target port */
51
+ targetPort?: number;
52
+ /** Traffic weights */
53
+ traffic?: pulumi.Input<pulumi.Input<inputs.app.TrafficWeightArgs>[]>;
54
+ };
55
+ /** Dapr configuration */
56
+ dapr?: Partial<Pick<inputs.app.DaprArgs, 'appHealth' | 'appId' | 'appPort' | 'appProtocol' | 'enableApiLogging' | 'httpMaxRequestSize' | 'httpReadBufferSize' | 'logLevel' | 'maxConcurrency'>> & {
57
+ enabled?: boolean;
58
+ };
59
+ /** Registry credentials */
60
+ registries?: pulumi.Input<pulumi.Input<inputs.app.RegistryCredentialsArgs>[]>;
61
+ /** Secrets for environment variables or registry auth */
62
+ secrets?: Array<{
63
+ name: string;
64
+ /** Plain value OR keyVaultUrl (prefer Key Vault) */
65
+ value?: pulumi.Input<string>;
66
+ keyVaultUrl?: pulumi.Input<string>;
67
+ identity?: pulumi.Input<string>;
68
+ }>;
69
+ /** Max inactive revisions */
70
+ maxInactiveRevisions?: pulumi.Input<number>;
71
+ };
72
+ }
73
+ export declare class AppContainer extends BaseResourceComponent<AppContainerArgs> {
74
+ readonly id: pulumi.Output<string>;
75
+ readonly resourceName: pulumi.Output<string>;
76
+ readonly fqdn: pulumi.Output<string | undefined>;
77
+ readonly latestRevisionName: pulumi.Output<string>;
78
+ readonly outboundIpAddresses: pulumi.Output<string[]>;
79
+ constructor(name: string, args: AppContainerArgs, opts?: pulumi.ComponentResourceOptions);
80
+ getOutputs(): {
81
+ resourceName: pulumi.Output<string>;
82
+ id: pulumi.Output<string>;
83
+ fqdn: pulumi.Output<string | undefined>;
84
+ latestRevisionName: pulumi.Output<string>;
85
+ outboundIpAddresses: pulumi.Output<string[]>;
86
+ vaultSecrets: {
87
+ [key: string]: import("..").VaultSecretResult;
88
+ } | undefined;
89
+ };
90
+ private createContainerApp;
91
+ }
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AppContainer = void 0;
37
+ const app = __importStar(require("@pulumi/azure-native/app"));
38
+ const base_1 = require("../base");
39
+ class AppContainer extends base_1.BaseResourceComponent {
40
+ id;
41
+ resourceName;
42
+ fqdn;
43
+ latestRevisionName;
44
+ outboundIpAddresses;
45
+ constructor(name, args, opts) {
46
+ super('AppContainer', name, args, opts);
47
+ const containerApp = this.createContainerApp();
48
+ this.id = containerApp.id;
49
+ this.resourceName = containerApp.name;
50
+ this.fqdn = containerApp.configuration.apply((c) => c?.ingress?.fqdn);
51
+ this.latestRevisionName = containerApp.latestRevisionName;
52
+ this.outboundIpAddresses = containerApp.outboundIpAddresses;
53
+ this.registerOutputs();
54
+ }
55
+ getOutputs() {
56
+ return {
57
+ resourceName: this.resourceName,
58
+ id: this.id,
59
+ fqdn: this.fqdn,
60
+ latestRevisionName: this.latestRevisionName,
61
+ outboundIpAddresses: this.outboundIpAddresses,
62
+ vaultSecrets: this.vaultSecrets,
63
+ };
64
+ }
65
+ createContainerApp() {
66
+ const { rsGroup, defaultUAssignedId, managedEnvironmentId, template, configuration, ...props } = this.args;
67
+ return new app.ContainerApp(this.name, {
68
+ ...props,
69
+ ...rsGroup,
70
+ managedEnvironmentId,
71
+ identity: {
72
+ type: defaultUAssignedId
73
+ ? app.ManagedServiceIdentityType.SystemAssigned_UserAssigned
74
+ : app.ManagedServiceIdentityType.SystemAssigned,
75
+ userAssignedIdentities: defaultUAssignedId ? [defaultUAssignedId.id] : undefined,
76
+ },
77
+ configuration: configuration
78
+ ? {
79
+ activeRevisionsMode: configuration.activeRevisionsMode ?? app.ActiveRevisionsMode.Single,
80
+ ingress: configuration.ingress
81
+ ? {
82
+ ...configuration.ingress,
83
+ external: configuration.ingress.external ?? false,
84
+ targetPort: configuration.ingress.targetPort ?? 80,
85
+ allowInsecure: configuration.ingress.allowInsecure ?? false,
86
+ traffic: configuration.ingress.traffic,
87
+ }
88
+ : undefined,
89
+ dapr: configuration.dapr?.enabled
90
+ ? {
91
+ ...configuration.dapr,
92
+ enabled: true,
93
+ }
94
+ : undefined,
95
+ registries: configuration.registries,
96
+ secrets: configuration.secrets?.map((s) => ({
97
+ name: s.name,
98
+ value: s.value,
99
+ keyVaultUrl: s.keyVaultUrl,
100
+ identity: s.identity,
101
+ })),
102
+ maxInactiveRevisions: configuration.maxInactiveRevisions,
103
+ }
104
+ : undefined,
105
+ template: {
106
+ containers: template.containers.map((c) => ({
107
+ ...c,
108
+ name: c.name,
109
+ image: c.image,
110
+ resources: c.resources ?? {
111
+ cpu: 0.25,
112
+ memory: '0.5Gi',
113
+ },
114
+ })),
115
+ initContainers: template.initContainers?.map((ic) => ({
116
+ ...ic,
117
+ name: ic.name,
118
+ image: ic.image,
119
+ })),
120
+ scale: template.scale
121
+ ? {
122
+ cooldownPeriod: template.scale.cooldownPeriod,
123
+ maxReplicas: template.scale.maxReplicas ?? 10,
124
+ minReplicas: template.scale.minReplicas ?? 0,
125
+ pollingInterval: template.scale.pollingInterval,
126
+ rules: template.scale.rules,
127
+ }
128
+ : {
129
+ minReplicas: 0,
130
+ maxReplicas: 10,
131
+ },
132
+ volumes: template.volumes,
133
+ revisionSuffix: template.revisionSuffix,
134
+ serviceBinds: template.serviceBinds,
135
+ terminationGracePeriodSeconds: template.terminationGracePeriodSeconds ?? 30,
136
+ },
137
+ }, { ...this.opts, parent: this, deletedWith: this });
138
+ }
139
+ }
140
+ exports.AppContainer = AppContainer;
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwQ29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC9BcHBDb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOERBQWdEO0FBS2hELGtDQUFnRTtBQWtIaEUsTUFBYSxZQUFhLFNBQVEsNEJBQXVDO0lBQ3ZELEVBQUUsQ0FBd0I7SUFDMUIsWUFBWSxDQUF3QjtJQUNwQyxJQUFJLENBQW9DO0lBQ3hDLGtCQUFrQixDQUF3QjtJQUMxQyxtQkFBbUIsQ0FBMEI7SUFFN0QsWUFBWSxJQUFZLEVBQUUsSUFBc0IsRUFBRSxJQUFzQztRQUN0RixLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFL0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUM7UUFDMUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztRQUU1RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPO1lBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENB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