@webda/azure 0.0.0-stage → 4.0.0-beta.13

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 (68) hide show
  1. package/LICENSE +166 -0
  2. package/README.md +248 -2
  3. package/lib/auth.d.ts +30 -0
  4. package/lib/auth.d.ts.map +1 -0
  5. package/lib/auth.js +70 -0
  6. package/lib/auth.js.map +1 -0
  7. package/lib/deployers/arm.service.d.ts +108 -0
  8. package/lib/deployers/arm.service.d.ts.map +1 -0
  9. package/lib/deployers/arm.service.js +280 -0
  10. package/lib/deployers/arm.service.js.map +1 -0
  11. package/lib/deployers/containerapps.service.d.ts +156 -0
  12. package/lib/deployers/containerapps.service.d.ts.map +1 -0
  13. package/lib/deployers/containerapps.service.js +455 -0
  14. package/lib/deployers/containerapps.service.js.map +1 -0
  15. package/lib/deployers/functions-entrypoint.d.ts +48 -0
  16. package/lib/deployers/functions-entrypoint.d.ts.map +1 -0
  17. package/lib/deployers/functions-entrypoint.js +78 -0
  18. package/lib/deployers/functions-entrypoint.js.map +1 -0
  19. package/lib/deployers/functions.service.d.ts +66 -0
  20. package/lib/deployers/functions.service.d.ts.map +1 -0
  21. package/lib/deployers/functions.service.js +322 -0
  22. package/lib/deployers/functions.service.js.map +1 -0
  23. package/lib/deployers/functionspackager.service.d.ts +43 -0
  24. package/lib/deployers/functionspackager.service.d.ts.map +1 -0
  25. package/lib/deployers/functionspackager.service.js +151 -0
  26. package/lib/deployers/functionspackager.service.js.map +1 -0
  27. package/lib/index.d.ts +15 -0
  28. package/lib/index.d.ts.map +1 -0
  29. package/lib/index.js +18 -0
  30. package/lib/index.js.map +1 -0
  31. package/lib/services/azure-parameters.d.ts +41 -0
  32. package/lib/services/azure-parameters.d.ts.map +1 -0
  33. package/lib/services/azure-parameters.js +43 -0
  34. package/lib/services/azure-parameters.js.map +1 -0
  35. package/lib/services/blob.service.d.ts +157 -0
  36. package/lib/services/blob.service.d.ts.map +1 -0
  37. package/lib/services/blob.service.js +428 -0
  38. package/lib/services/blob.service.js.map +1 -0
  39. package/lib/services/contributors.d.ts +47 -0
  40. package/lib/services/contributors.d.ts.map +1 -0
  41. package/lib/services/contributors.js +2 -0
  42. package/lib/services/contributors.js.map +1 -0
  43. package/lib/services/cosmos.service.d.ts +211 -0
  44. package/lib/services/cosmos.service.d.ts.map +1 -0
  45. package/lib/services/cosmos.service.js +554 -0
  46. package/lib/services/cosmos.service.js.map +1 -0
  47. package/lib/services/functionserver.service.d.ts +42 -0
  48. package/lib/services/functionserver.service.d.ts.map +1 -0
  49. package/lib/services/functionserver.service.js +223 -0
  50. package/lib/services/functionserver.service.js.map +1 -0
  51. package/lib/services/keyvault.service.d.ts +91 -0
  52. package/lib/services/keyvault.service.d.ts.map +1 -0
  53. package/lib/services/keyvault.service.js +225 -0
  54. package/lib/services/keyvault.service.js.map +1 -0
  55. package/lib/services/monitorlogger.service.d.ts +66 -0
  56. package/lib/services/monitorlogger.service.d.ts.map +1 -0
  57. package/lib/services/monitorlogger.service.js +131 -0
  58. package/lib/services/monitorlogger.service.js.map +1 -0
  59. package/lib/services/servicebus.service.d.ts +128 -0
  60. package/lib/services/servicebus.service.d.ts.map +1 -0
  61. package/lib/services/servicebus.service.js +324 -0
  62. package/lib/services/servicebus.service.js.map +1 -0
  63. package/lib/template.d.ts +53 -0
  64. package/lib/template.d.ts.map +1 -0
  65. package/lib/template.js +74 -0
  66. package/lib/template.js.map +1 -0
  67. package/package.json +77 -3
  68. package/webda.module.json +1817 -0
@@ -0,0 +1,280 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import { ResourceManagementClient } from "@azure/arm-resources";
36
+ import { DeploymentsClient } from "@azure/arm-resourcesdeployments";
37
+ import { Command, SecretString, useApplication, useCore, WebdaError } from "@webda/core";
38
+ import { ContainerDeployer, ContainerDeployerParameters } from "@webda/oci";
39
+ import { mkdirSync, writeFileSync } from "node:fs";
40
+ import { dirname, resolve } from "node:path";
41
+ import { AzureAuth } from "../auth.js";
42
+ import { loadAzureParameters } from "../services/azure-parameters.js";
43
+ import { armValue, createAzureTemplate, resourceId } from "../template.js";
44
+ /** Shared ARM and OCI parameters used by Azure deployment units. */
45
+ export class AzureArmDeployerParameters extends ContainerDeployerParameters {
46
+ constructor() {
47
+ super(...arguments);
48
+ this.location = "westeurope";
49
+ this.createResourceGroup = false;
50
+ this.resourceTags = { "webda-deployment": "${deployment}", "webda-version": "${git.version}" };
51
+ this.customResources = [];
52
+ }
53
+ /**
54
+ * Perform load.
55
+ * @override
56
+ */
57
+ load(params = {}) {
58
+ super.load(params);
59
+ return loadAzureParameters(this);
60
+ }
61
+ }
62
+ /**
63
+ * Restore secret wrappers after deployment variable expansion serializes their masked values.
64
+ * @param original - Original parameters retaining secret wrappers
65
+ * @param resolved - Parameters after deployment variable expansion
66
+ * @returns The restore secrets result
67
+ */
68
+ function restoreSecrets(original, resolved) {
69
+ if (original instanceof SecretString)
70
+ return original;
71
+ if (original && typeof original === "object" && resolved && typeof resolved === "object") {
72
+ for (const key of Object.keys(original))
73
+ if (Object.prototype.hasOwnProperty.call(resolved, key))
74
+ resolved[key] = restoreSecrets(original[key], resolved[key]);
75
+ }
76
+ return resolved;
77
+ }
78
+ /** Shared template collection and ARM deployment. SDK clients are created only when deploying. */
79
+ let AzureArmDeployer = (() => {
80
+ var _a;
81
+ let _classSuper = ContainerDeployer;
82
+ let _instanceExtraInitializers = [];
83
+ let _generate_decorators;
84
+ return _a = class AzureArmDeployer extends _classSuper {
85
+ constructor() {
86
+ super(...arguments);
87
+ this.resources = __runInitializers(this, _instanceExtraInitializers);
88
+ this.template = createAzureTemplate();
89
+ this.secretValues = new Map();
90
+ this.contributedEnv = {};
91
+ this.roles = [];
92
+ }
93
+ /**
94
+ * Perform get resolved parameters.
95
+ * @override
96
+ */
97
+ getResolvedParameters() {
98
+ return restoreSecrets(this.parameters, super.getResolvedParameters());
99
+ }
100
+ /**
101
+ * Resolve the deployment scope and reset template state.
102
+ */
103
+ prepare() {
104
+ this.resources = this.getResolvedParameters();
105
+ if (!this.resources.resourceGroup || !this.resources.subscriptionId)
106
+ throw new WebdaError.BadRequest("Azure deployment requires resourceGroup and subscriptionId (or AZURE_SUBSCRIPTION_ID)");
107
+ this.template = createAzureTemplate();
108
+ this.secretValues.clear();
109
+ this.contributedEnv = {};
110
+ this.roles = [];
111
+ }
112
+ /**
113
+ * Merge deployment tags with resource tags.
114
+ * @param tags - Resource-specific tags
115
+ * @returns The default tags result
116
+ */
117
+ getDefaultTags(tags = {}) {
118
+ return { ...this.resources.resourceTags, ...tags };
119
+ }
120
+ /**
121
+ * Return the managed identity resource identifier.
122
+ * @returns The identity resource id result
123
+ */
124
+ getIdentityResourceId() {
125
+ return this.getAppResourceId();
126
+ }
127
+ /**
128
+ * Add a secret without placing its value in the serializable template.
129
+ * @param value - Value to convert or protect
130
+ * @returns The secure parameter result
131
+ */
132
+ secureParameter(value) {
133
+ const name = `secret${this.secretValues.size}`;
134
+ this.template.parameters[name] = { type: "secureString" };
135
+ this.secretValues.set(name, value);
136
+ return `[parameters('${name}')]`;
137
+ }
138
+ /**
139
+ * Merge service resources, environment and roles. Conflicting contributions are rejected.
140
+ */
141
+ Resources() {
142
+ for (const service of Object.values(useCore().getServices())) {
143
+ if (service === this || typeof service?.getAzureResources !== "function")
144
+ continue;
145
+ const contribution = service.getAzureResources(this);
146
+ for (const resource of contribution.resources ?? [])
147
+ this.addResource(resource);
148
+ for (const [name, value] of Object.entries(contribution.env ?? {})) {
149
+ if (name in this.contributedEnv && JSON.stringify(this.contributedEnv[name]) !== JSON.stringify(value))
150
+ throw new WebdaError.BadRequest(`Conflicting Azure environment contribution: ${name}`);
151
+ this.contributedEnv[name] = value;
152
+ }
153
+ for (const [name, value] of Object.entries(contribution.outputs ?? {})) {
154
+ if (name in this.template.outputs)
155
+ throw new WebdaError.BadRequest(`Conflicting Azure output: ${name}`);
156
+ this.template.outputs[name] = value;
157
+ }
158
+ this.roles.push(...(contribution.roleAssignments ?? []));
159
+ }
160
+ const custom = this.resources.customResources;
161
+ for (const resource of Array.isArray(custom) ? custom : Object.values(custom))
162
+ this.addResource(resource);
163
+ }
164
+ /**
165
+ * Add a resource, rejecting conflicting declarations.
166
+ * @param resource - ARM resource declaration
167
+ */
168
+ addResource(resource) {
169
+ if (resource.properties?.principalId === this.getAppPrincipalId()) {
170
+ resource.dependsOn = [...new Set([...(resource.dependsOn ?? []), this.getIdentityResourceId()])];
171
+ }
172
+ const previous = this.template.resources.find(item => item.type === resource.type && item.name === resource.name);
173
+ if (previous) {
174
+ if (JSON.stringify(previous) !== JSON.stringify(resource))
175
+ throw new WebdaError.BadRequest(`Conflicting Azure resource: ${resource.type}/${resource.name}`);
176
+ return;
177
+ }
178
+ this.template.resources.push(resource);
179
+ }
180
+ /**
181
+ * Grant every contributed role to one application or job identity.
182
+ * @param principalId - ARM principal identifier expression
183
+ * @param identityResourceId - Resource providing the managed identity
184
+ */
185
+ grantRoles(principalId = this.getAppPrincipalId(), identityResourceId = this.getIdentityResourceId()) {
186
+ for (const role of this.roles) {
187
+ const dependsOn = [identityResourceId];
188
+ // Explicit dependency when the scoped resource is created in this template.
189
+ for (const resource of this.template.resources) {
190
+ if (typeof resource.type !== "string" || typeof resource.name !== "string" || resource.name.startsWith("["))
191
+ continue;
192
+ const names = resource.name.split("/"), types = resource.type.split("/");
193
+ const absolute = `/subscriptions/${this.resources.subscriptionId}/resourceGroups/${this.resources.resourceGroup}/providers/${types[0]}/${names.map((name, index) => `${types[index + 1]}/${name}`).join("/")}`;
194
+ const id = resourceId(resource.type, ...names);
195
+ if (role.scope === id || role.scope === absolute)
196
+ dependsOn.push(id);
197
+ }
198
+ this.addResource({
199
+ type: "Microsoft.Authorization/roleAssignments",
200
+ apiVersion: "2022-04-01",
201
+ name: `[guid(${armValue(role.scope)}, ${armValue(role.roleDefinitionId)}, ${armValue(principalId)})]`,
202
+ scope: role.scope,
203
+ dependsOn,
204
+ properties: { roleDefinitionId: role.roleDefinitionId, principalId, principalType: "ServicePrincipal" }
205
+ });
206
+ }
207
+ }
208
+ /**
209
+ * Write a reviewable ARM template; this command never builds, pushes or deploys.
210
+ * @param output - Optional template output path
211
+ * @returns Generated ARM template
212
+ */
213
+ async generate(output) {
214
+ const template = this.generateTemplate();
215
+ this.writeTemplate(output);
216
+ return template;
217
+ }
218
+ /** Save the current template with secure parameters left as references.
219
+ * @param output - Optional template output path
220
+ */
221
+ writeTemplate(output) {
222
+ const target = output ?? this.resources.templateOutput;
223
+ if (target) {
224
+ const path = resolve(useApplication().applicationPath, target);
225
+ mkdirSync(dirname(path), { recursive: true });
226
+ writeFileSync(path, JSON.stringify(this.template, null, 2) + "\n");
227
+ }
228
+ }
229
+ /**
230
+ * Deploy the ARM template with secure parameter values.
231
+ * @returns Deployment outputs
232
+ */
233
+ async sendTemplate() {
234
+ const p = this.resources, credential = new AzureAuth(p).getCredential();
235
+ const name = p.deploymentName ?? `webda-${this.getName()}-${Date.now()}`;
236
+ const client = new DeploymentsClient(credential, p.subscriptionId);
237
+ this.log("INFO", "Deploying Azure resources", p.resourceGroup, name);
238
+ const parameters = Object.fromEntries([...this.secretValues].map(([key, value]) => [
239
+ key,
240
+ { value: value instanceof SecretString ? value.getValue() : value }
241
+ ]));
242
+ try {
243
+ if (p.createResourceGroup)
244
+ await new ResourceManagementClient(credential, p.subscriptionId).resourceGroups.createOrUpdate(p.resourceGroup, { location: p.location, tags: this.getDefaultTags() });
245
+ const deployment = await client.deployments
246
+ .createOrUpdate(p.resourceGroup, name, {
247
+ properties: { mode: "Incremental", template: this.template, parameters }
248
+ })
249
+ .pollUntilDone();
250
+ return deployment.properties?.outputs ?? {};
251
+ }
252
+ catch {
253
+ const failed = [];
254
+ try {
255
+ for await (const operation of client.deploymentOperations.list(p.resourceGroup, name)) {
256
+ if (operation.properties?.provisioningState === "Failed") {
257
+ // Status messages may echo secure parameters; report only Azure's structured error code.
258
+ const code = operation.properties.statusMessage?.error?.code;
259
+ if (typeof code === "string" && /^[A-Za-z0-9_.-]{1,100}$/.test(code))
260
+ failed.push(code);
261
+ }
262
+ }
263
+ }
264
+ catch {
265
+ /* Deployment diagnostics can be unavailable when authorization itself failed. */
266
+ }
267
+ throw new WebdaError.CodeError("AZURE_DEPLOYMENT_FAILED", `Azure deployment failed${failed.length ? ` (${[...new Set(failed)].join(", ")})` : ""}; inspect deployment operations in the Azure portal`);
268
+ }
269
+ }
270
+ },
271
+ (() => {
272
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
273
+ _generate_decorators = [Command("azure template", { description: "Generate an ARM template without deploying" })];
274
+ __esDecorate(_a, null, _generate_decorators, { kind: "method", name: "generate", static: false, private: false, access: { has: obj => "generate" in obj, get: obj => obj.generate }, metadata: _metadata }, null, _instanceExtraInitializers);
275
+ if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
276
+ })(),
277
+ _a;
278
+ })();
279
+ export { AzureArmDeployer };
280
+ //# sourceMappingURL=arm.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arm.service.js","sources":["../../src/deployers/arm.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import { Deployer, SecretString } from "@webda/core";
2
+ import { AzureTemplate } from "../template.js";
3
+ import { AzureArmDeployer, AzureArmDeployerParameters, AzureDeployResult } from "./arm.service.js";
4
+ export declare const AZURE_SECTIONS: readonly ["LogAnalytics", "ManagedEnvironment", "ContainerApp", "Jobs", "Resources"];
5
+ /** Azure Container Apps unit parameters. Image tags and Azure resource tags are separate. */
6
+ export declare class AzureContainerAppsDeployerParameters extends AzureArmDeployerParameters {
7
+ registry?: string;
8
+ registryAuth: "aad" | "identity" | "none";
9
+ containerApp: {
10
+ name?: string;
11
+ cpu?: number;
12
+ memory?: string;
13
+ minReplicas?: number;
14
+ maxReplicas?: number;
15
+ ingress?: false | {
16
+ external?: boolean;
17
+ targetPort?: number;
18
+ transport?: string;
19
+ };
20
+ env?: Record<string, string | {
21
+ secretRef: string;
22
+ }>;
23
+ probes?: Record<string, any>[];
24
+ scaleRules?: Record<string, any>[];
25
+ };
26
+ environment: {
27
+ name?: string;
28
+ id?: string;
29
+ };
30
+ logAnalytics: false | {
31
+ name?: string;
32
+ retentionInDays?: number;
33
+ };
34
+ secrets: Record<string, string | SecretString | {
35
+ keyVaultUrl: string;
36
+ identity: string;
37
+ }>;
38
+ customDomains: {
39
+ name: string;
40
+ certificateId?: string;
41
+ bindingType?: string;
42
+ validationMethod?: "CNAME" | "HTTP";
43
+ }[];
44
+ crons: boolean;
45
+ }
46
+ /** Build an OCI image and deploy its immutable digest to Azure Container Apps.
47
+ * @WebdaModda
48
+ */
49
+ export declare class AzureContainerAppsDeployer extends AzureArmDeployer<AzureContainerAppsDeployerParameters> implements Deployer {
50
+ static Parameters: typeof AzureContainerAppsDeployerParameters;
51
+ protected image: string;
52
+ /**
53
+ * Write the generated ARM template for review.
54
+ * @param output - Optional template output path
55
+ * @returns Generated ARM template
56
+ */
57
+ generate(output?: string): Promise<AzureTemplate>;
58
+ /**
59
+ * Perform get resolved parameters.
60
+ * @override
61
+ */
62
+ getResolvedParameters(): AzureContainerAppsDeployerParameters;
63
+ /**
64
+ * Return the application resource identifier.
65
+ * @returns The app resource id result
66
+ */
67
+ getAppResourceId(): string;
68
+ /**
69
+ * Return the managed identity resource identifier.
70
+ * @returns The identity resource id result
71
+ */
72
+ protected getIdentityResourceId(): string;
73
+ /**
74
+ * Return the ARM expression for the application principal.
75
+ * @returns The app principal id result
76
+ */
77
+ getAppPrincipalId(): string;
78
+ /**
79
+ * Return the managed environment resource identifier.
80
+ * @returns The environment id result
81
+ */
82
+ protected environmentId(): string;
83
+ /**
84
+ * Describe the application managed identity.
85
+ * @returns The identity result
86
+ */
87
+ protected identity(): {
88
+ type: string;
89
+ userAssignedIdentities: {
90
+ [x: string]: {};
91
+ };
92
+ };
93
+ /**
94
+ * Build the runtime environment from contributors and explicit overrides.
95
+ * @returns The env result
96
+ */
97
+ protected env(): {
98
+ name: string;
99
+ value: string;
100
+ }[];
101
+ /**
102
+ * Convert configured secrets to secure parameters or Key Vault references.
103
+ * @returns The secrets result
104
+ */
105
+ protected secrets(): ({
106
+ keyVaultUrl: string;
107
+ identity: string;
108
+ name: string;
109
+ } | {
110
+ name: string;
111
+ value: string;
112
+ })[];
113
+ /**
114
+ * Configure managed identity image pulls.
115
+ * @returns The registries result
116
+ */
117
+ protected registries(): {
118
+ server: string;
119
+ identity: string;
120
+ }[];
121
+ /**
122
+ * Generate the deployment template without contacting Azure.
123
+ * @param image - Immutable container image reference
124
+ * @returns ARM template without secret values
125
+ */
126
+ generateTemplate(image?: string): AzureTemplate;
127
+ /**
128
+ * Add the optional Log Analytics workspace.
129
+ */
130
+ LogAnalytics(): void;
131
+ /**
132
+ * Add the Container Apps managed environment.
133
+ */
134
+ ManagedEnvironment(): void;
135
+ /**
136
+ * Add the application and its scaling and ingress settings.
137
+ */
138
+ ContainerApp(): void;
139
+ /** Issue managed certificates after hostname registration, then bind them in a nested deployment. */
140
+ ManagedCertificates(): void;
141
+ /**
142
+ * Export declared crons as scheduled jobs, each running `cron run --id` on its operation.
143
+ */
144
+ Jobs(): void;
145
+ /**
146
+ * Publish the OCI image using the selected registry authentication.
147
+ * @returns The push result
148
+ */
149
+ push(): Promise<string>;
150
+ /**
151
+ * Publish and deploy the application, returning its endpoints.
152
+ * @returns The deploy result
153
+ */
154
+ deploy(): Promise<AzureDeployResult>;
155
+ }
156
+ //# sourceMappingURL=containerapps.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerapps.service.d.ts","sources":["../../src/deployers/containerapps.service.ts"],"names":[],"mappings":"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"}