@fnndsc/stratus 0.0.0 → 0.2.0

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 (134) hide show
  1. package/README.md +6 -1
  2. package/dist/args.d.ts +20 -6
  3. package/dist/args.js +45 -2
  4. package/dist/args.js.map +1 -1
  5. package/dist/backend.d.ts +35 -4
  6. package/dist/backend.js +77 -12
  7. package/dist/backend.js.map +1 -1
  8. package/dist/cloud/builder.d.ts +172 -0
  9. package/dist/cloud/builder.js +41 -0
  10. package/dist/cloud/builder.js.map +1 -0
  11. package/dist/cloud/driver.d.ts +149 -0
  12. package/dist/cloud/fake/builder.d.ts +147 -0
  13. package/dist/cloud/fake/builder.js +213 -0
  14. package/dist/cloud/fake/builder.js.map +1 -0
  15. package/dist/cloud/fake/driver.d.ts +73 -1
  16. package/dist/cloud/fake/driver.js +122 -0
  17. package/dist/cloud/fake/driver.js.map +1 -1
  18. package/dist/cloud/oci/api.d.ts +3 -2
  19. package/dist/cloud/oci/api.js +2 -0
  20. package/dist/cloud/oci/api.js.map +1 -1
  21. package/dist/cloud/oci/buildApi.d.ts +61 -0
  22. package/dist/cloud/oci/buildApi.js +132 -0
  23. package/dist/cloud/oci/buildApi.js.map +1 -0
  24. package/dist/cloud/oci/builder.d.ts +172 -0
  25. package/dist/cloud/oci/builder.js +370 -0
  26. package/dist/cloud/oci/builder.js.map +1 -0
  27. package/dist/cloud/oci/driver.d.ts +23 -2
  28. package/dist/cloud/oci/driver.js +107 -1
  29. package/dist/cloud/oci/driver.js.map +1 -1
  30. package/dist/cloud/oci/planRead.d.ts +38 -0
  31. package/dist/cloud/oci/planRead.js +67 -0
  32. package/dist/cloud/oci/planRead.js.map +1 -0
  33. package/dist/cloud/oci/prices.d.ts +22 -1
  34. package/dist/cloud/oci/prices.js +35 -0
  35. package/dist/cloud/oci/prices.js.map +1 -1
  36. package/dist/cloud/oci/resourceApi.d.ts +114 -0
  37. package/dist/cloud/oci/resourceApi.js +261 -0
  38. package/dist/cloud/oci/resourceApi.js.map +1 -0
  39. package/dist/cloud/oci/resourceMap.d.ts +44 -0
  40. package/dist/cloud/oci/resourceMap.js +70 -0
  41. package/dist/cloud/oci/resourceMap.js.map +1 -0
  42. package/dist/cloud/oci/rmApi.d.ts +74 -0
  43. package/dist/cloud/oci/rmApi.js +141 -0
  44. package/dist/cloud/oci/rmApi.js.map +1 -0
  45. package/dist/cloud/oci/stackVars.d.ts +49 -0
  46. package/dist/cloud/oci/stackVars.js +70 -0
  47. package/dist/cloud/oci/stackVars.js.map +1 -0
  48. package/dist/cluster/fakeKube.d.ts +43 -0
  49. package/dist/cluster/fakeKube.js +86 -0
  50. package/dist/cluster/fakeKube.js.map +1 -0
  51. package/dist/cluster/kube.d.ts +40 -0
  52. package/dist/cluster/kube.js +46 -0
  53. package/dist/cluster/kube.js.map +1 -0
  54. package/dist/cluster/kubeHttp.d.ts +16 -0
  55. package/dist/cluster/kubeHttp.js +86 -0
  56. package/dist/cluster/kubeHttp.js.map +1 -0
  57. package/dist/commands/build.d.ts +90 -0
  58. package/dist/commands/build.js +358 -0
  59. package/dist/commands/build.js.map +1 -0
  60. package/dist/commands/capacity.d.ts +37 -0
  61. package/dist/commands/capacity.js +93 -0
  62. package/dist/commands/capacity.js.map +1 -0
  63. package/dist/commands/domain.d.ts +45 -0
  64. package/dist/commands/domain.js +150 -0
  65. package/dist/commands/domain.js.map +1 -0
  66. package/dist/commands/spend.d.ts +22 -0
  67. package/dist/commands/spend.js +65 -0
  68. package/dist/commands/spend.js.map +1 -0
  69. package/dist/commands/teardown.d.ts +10 -0
  70. package/dist/commands/teardown.js +72 -0
  71. package/dist/commands/teardown.js.map +1 -0
  72. package/dist/commands/verify.d.ts +28 -0
  73. package/dist/commands/verify.js +98 -0
  74. package/dist/commands/verify.js.map +1 -0
  75. package/dist/domain/adopt.d.ts +60 -0
  76. package/dist/domain/adopt.js +143 -0
  77. package/dist/domain/adopt.js.map +1 -0
  78. package/dist/domain/sizing.d.ts +55 -0
  79. package/dist/domain/sizing.js +66 -0
  80. package/dist/domain/sizing.js.map +1 -0
  81. package/dist/domain/spec.d.ts +101 -0
  82. package/dist/domain/spec.js +191 -0
  83. package/dist/domain/spec.js.map +1 -0
  84. package/dist/domain/spend.d.ts +84 -0
  85. package/dist/domain/spend.js +109 -0
  86. package/dist/domain/spend.js.map +1 -0
  87. package/dist/domain/state.d.ts +149 -0
  88. package/dist/domain/state.js +182 -0
  89. package/dist/domain/state.js.map +1 -0
  90. package/dist/domain/steps.d.ts +82 -0
  91. package/dist/domain/steps.js +311 -0
  92. package/dist/domain/steps.js.map +1 -0
  93. package/dist/domain/teardown.d.ts +38 -0
  94. package/dist/domain/teardown.js +48 -0
  95. package/dist/domain/teardown.js.map +1 -0
  96. package/dist/domain/verify.d.ts +68 -0
  97. package/dist/domain/verify.js +216 -0
  98. package/dist/domain/verify.js.map +1 -0
  99. package/dist/domain/view.d.ts +24 -0
  100. package/dist/domain/view.js +38 -0
  101. package/dist/domain/view.js.map +1 -0
  102. package/dist/domains/harborOci.d.ts +75 -0
  103. package/dist/domains/harborOci.js +165 -0
  104. package/dist/domains/harborOci.js.map +1 -0
  105. package/dist/index.d.ts +7 -0
  106. package/dist/index.js +6 -0
  107. package/dist/index.js.map +1 -1
  108. package/dist/installer/assisted.d.ts +97 -0
  109. package/dist/installer/assisted.js +171 -0
  110. package/dist/installer/assisted.js.map +1 -0
  111. package/dist/installer/installer.d.ts +86 -0
  112. package/dist/installer/installer.js +15 -0
  113. package/dist/installer/installer.js.map +1 -0
  114. package/dist/prompt.d.ts +33 -0
  115. package/dist/prompt.js +46 -0
  116. package/dist/prompt.js.map +1 -0
  117. package/dist/session.d.ts +2 -0
  118. package/dist/session.js +4 -0
  119. package/dist/session.js.map +1 -1
  120. package/dist/stratus.js +75 -3
  121. package/dist/stratus.js.map +1 -1
  122. package/dist/vfs/domains.d.ts +39 -0
  123. package/dist/vfs/domains.js +128 -0
  124. package/dist/vfs/domains.js.map +1 -0
  125. package/dist/vfs/look.d.ts +10 -0
  126. package/dist/vfs/look.js +43 -8
  127. package/dist/vfs/look.js.map +1 -1
  128. package/dist/vfs/resources.d.ts +136 -0
  129. package/dist/vfs/resources.js +325 -0
  130. package/dist/vfs/resources.js.map +1 -0
  131. package/dist/vfs/tenancy.d.ts +15 -2
  132. package/dist/vfs/tenancy.js +53 -17
  133. package/dist/vfs/tenancy.js.map +1 -1
  134. package/package.json +14 -7
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @file The Kubernetes driver's beginning: a domain's cluster reached with its
3
+ * kubeconfig, over the Kubernetes API (docs/stratus.adoc, D3, D4). The same on
4
+ * every cloud. What `verify` needs is here; the tree's `cluster/` comes with
5
+ * step 5.
6
+ *
7
+ * @module
8
+ */
9
+ import { load } from 'js-yaml';
10
+ /** A Kubernetes API answer that was not a success. */
11
+ export class KubeError extends Error {
12
+ status;
13
+ /**
14
+ * @param status - The HTTP status.
15
+ * @param message - What the server said.
16
+ */
17
+ constructor(status, message) {
18
+ super(message);
19
+ this.status = status;
20
+ this.name = 'KubeError';
21
+ }
22
+ }
23
+ /**
24
+ * Reads a kubeconfig: the current context's cluster and user.
25
+ *
26
+ * @param text - The kubeconfig.
27
+ * @returns How to reach the cluster.
28
+ * @throws Error - When it names no cluster to reach.
29
+ */
30
+ export function kubeconfig_read(text) {
31
+ const config = (load(text) ?? {});
32
+ const context = config.contexts?.find((entry) => entry.name === config['current-context']) ?? config.contexts?.[0];
33
+ const cluster = config.clusters?.find((entry) => entry.name === context?.context.cluster) ?? config.clusters?.[0];
34
+ const user = config.users?.find((entry) => entry.name === context?.context.user) ?? config.users?.[0];
35
+ if (cluster === undefined || typeof cluster.cluster?.server !== 'string')
36
+ throw new Error('the kubeconfig names no cluster server');
37
+ const pem = (data) => (data === undefined ? null : Buffer.from(data, 'base64').toString('utf-8'));
38
+ return {
39
+ server: cluster.cluster.server.replace(/\/$/, ''),
40
+ ca: pem(cluster.cluster['certificate-authority-data']),
41
+ cert: pem(user?.user['client-certificate-data']),
42
+ key: pem(user?.user['client-key-data']),
43
+ token: user?.user.token ?? null,
44
+ };
45
+ }
46
+ //# sourceMappingURL=kube.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kube.js","sourceRoot":"","sources":["../../src/cluster/kube.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAe/B,sDAAsD;AACtD,MAAM,OAAO,SAAU,SAAQ,KAAK;IAKb;IAJrB;;;OAGG;IACH,YAAqB,MAAc,EAAE,OAAe;QAClD,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAsBD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAe,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5H,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3H,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/G,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACpI,MAAM,GAAG,GAAG,CAAC,IAAwB,EAAiB,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACrI,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACjD,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACtD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAChD,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACvC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;KAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type KubeAccess, type KubeApi } from './kube.js';
2
+ /**
3
+ * The Kubernetes API over HTTPS.
4
+ *
5
+ * @param access - How to reach the cluster.
6
+ * @returns The calls.
7
+ */
8
+ export declare function kubeApi_make(access: KubeAccess): KubeApi;
9
+ /**
10
+ * The HTTP status a URL answers with, trusting a CA beside the system's.
11
+ *
12
+ * @param url - The address.
13
+ * @param ca - A CA in PEM, or null.
14
+ * @returns The status.
15
+ */
16
+ export declare function httpsStatus_get(url: string, ca: string | null): Promise<number>;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @file The Kubernetes API over HTTPS with a kubeconfig's CA and client
3
+ * certificate. The wire only; what is asked and what the answers mean are in
4
+ * `domain/verify.ts`, tested over recorded answers.
5
+ *
6
+ * @module
7
+ */
8
+ import { request } from 'node:https';
9
+ import { KubeError } from './kube.js';
10
+ /** How long one call may take, in milliseconds. */
11
+ const KUBE_TIMEOUT_MS = 30_000;
12
+ /**
13
+ * One HTTPS call.
14
+ *
15
+ * @param access - How to reach the cluster.
16
+ * @param method - The method.
17
+ * @param path - The path.
18
+ * @param body - A JSON body, for a POST.
19
+ * @returns The status and text.
20
+ */
21
+ function call(access, method, path, body) {
22
+ const url = new URL(path, access.server);
23
+ const payload = body === undefined ? undefined : JSON.stringify(body);
24
+ return new Promise((resolve, reject) => {
25
+ const req = request(url, {
26
+ method,
27
+ timeout: KUBE_TIMEOUT_MS,
28
+ ...(access.ca !== null ? { ca: access.ca } : {}),
29
+ ...(access.cert !== null ? { cert: access.cert } : {}),
30
+ ...(access.key !== null ? { key: access.key } : {}),
31
+ headers: {
32
+ accept: 'application/json, */*',
33
+ ...(access.token !== null ? { authorization: `Bearer ${access.token}` } : {}),
34
+ ...(payload !== undefined ? { 'content-type': 'application/json', 'content-length': Buffer.byteLength(payload) } : {}),
35
+ },
36
+ }, (res) => {
37
+ const chunks = [];
38
+ res.on('data', (chunk) => { chunks.push(chunk); });
39
+ res.on('end', () => resolve({ status: res.statusCode ?? 0, text: Buffer.concat(chunks).toString('utf-8') }));
40
+ });
41
+ req.on('timeout', () => { req.destroy(new Error(`${url.host}: no answer in ${KUBE_TIMEOUT_MS / 1000}s`)); });
42
+ req.on('error', reject);
43
+ if (payload !== undefined)
44
+ req.write(payload);
45
+ req.end();
46
+ });
47
+ }
48
+ /**
49
+ * The Kubernetes API over HTTPS.
50
+ *
51
+ * @param access - How to reach the cluster.
52
+ * @returns The calls.
53
+ */
54
+ export function kubeApi_make(access) {
55
+ const ok = async (method, path, body) => {
56
+ const answer = await call(access, method, path, body);
57
+ if (answer.status < 200 || answer.status >= 300)
58
+ throw new KubeError(answer.status, `${method} ${path}: HTTP ${answer.status} ${answer.text.slice(0, 200)}`);
59
+ return answer.text;
60
+ };
61
+ return {
62
+ json_get: async (path) => JSON.parse(await ok('GET', path)),
63
+ text_get: (path) => ok('GET', path),
64
+ json_post: async (path, body) => JSON.parse(await ok('POST', path, body)),
65
+ delete: async (path) => { await ok('DELETE', path); },
66
+ };
67
+ }
68
+ /**
69
+ * The HTTP status a URL answers with, trusting a CA beside the system's.
70
+ *
71
+ * @param url - The address.
72
+ * @param ca - A CA in PEM, or null.
73
+ * @returns The status.
74
+ */
75
+ export function httpsStatus_get(url, ca) {
76
+ return new Promise((resolve, reject) => {
77
+ const req = request(url, { method: 'GET', timeout: KUBE_TIMEOUT_MS, ...(ca !== null ? { ca } : {}) }, (res) => {
78
+ res.resume();
79
+ res.on('end', () => resolve(res.statusCode ?? 0));
80
+ });
81
+ req.on('timeout', () => { req.destroy(new Error(`${url}: no answer in ${KUBE_TIMEOUT_MS / 1000}s`)); });
82
+ req.on('error', reject);
83
+ req.end();
84
+ });
85
+ }
86
+ //# sourceMappingURL=kubeHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubeHttp.js","sourceRoot":"","sources":["../../src/cluster/kubeHttp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type CommandEnvelope } from '@fnndsc/menu';
2
+ import { type JobRecord, type JobRunner } from '@fnndsc/brasa/core';
3
+ import type { CloudDriver } from '../cloud/driver.js';
4
+ import { type CloudBuilder } from '../cloud/builder.js';
5
+ import type { VerifyReach } from './verify.js';
6
+ import type { DomainTree } from '../vfs/domains.js';
7
+ import { type DomainStore } from '../domain/state.js';
8
+ import { type DomainSpec } from '../domain/spec.js';
9
+ import { type BuildDeps } from '../domain/steps.js';
10
+ /** What the build verbs read from the session. */
11
+ export interface BuildCommandContext {
12
+ readonly domains: DomainTree;
13
+ readonly store: DomainStore;
14
+ readonly driver: CloudDriver;
15
+ /** The session's region, or null when not connected. */
16
+ readonly region: () => string | null;
17
+ /** What the steps run over, or null when this cloud cannot build yet. */
18
+ readonly deps: BuildDeps | null;
19
+ /** The cloud's build half, for adopting and planning, or null when it has none. */
20
+ readonly builder: CloudBuilder | null;
21
+ /** How `verify` reaches a cluster; the network when absent. */
22
+ readonly verifyReach?: VerifyReach;
23
+ /** The DNS zone a new domain's names live under when `--base-domain` is not given. */
24
+ readonly baseDomain: string | null;
25
+ }
26
+ /**
27
+ * Reads `--name value` and `--name=value` pairs.
28
+ *
29
+ * @param words - The words.
30
+ * @param known - The options taken.
31
+ * @returns The options and the other words, or the word refused.
32
+ */
33
+ export declare function options_read(words: ReadonlyArray<string>, known: ReadonlyArray<string>): {
34
+ options: Map<string, string>;
35
+ rest: string[];
36
+ } | {
37
+ error: string;
38
+ };
39
+ /**
40
+ * A spec in a line.
41
+ *
42
+ * @param spec - The spec.
43
+ * @returns `E5 · plane 3 × 8 vCPU 24 GiB · …`.
44
+ */
45
+ export declare function spec_line(spec: DomainSpec): string;
46
+ /**
47
+ * `domain new <name> [options]`.
48
+ *
49
+ * @param context - The session.
50
+ * @param args - The words after `new`.
51
+ * @returns The envelope.
52
+ */
53
+ export declare function domainNew_run(context: BuildCommandContext, args: ReadonlyArray<string>): Promise<CommandEnvelope>;
54
+ /**
55
+ * `domain plan [<name>]`: the fit, the cost and the steps, read; the plan itself with the tier.
56
+ *
57
+ * @param context - The session.
58
+ * @param args - The words after `plan`.
59
+ * @returns The envelope.
60
+ */
61
+ export declare function domainPlan_run(context: BuildCommandContext, args: ReadonlyArray<string>): Promise<CommandEnvelope>;
62
+ /**
63
+ * Starts a job and follows it to its end.
64
+ *
65
+ * @param id - Its id in the build steps' source.
66
+ * @param label - What it is called.
67
+ * @param run - Its work.
68
+ * @returns Its record at the end, or why it did not start or end.
69
+ */
70
+ export declare function job_runFollowed(id: string, label: string, run: Parameters<JobRunner['job_start']>[3]): Promise<{
71
+ record: JobRecord;
72
+ } | {
73
+ error: string;
74
+ }>;
75
+ /**
76
+ * `domain build [<name>] [--through <step>]`.
77
+ *
78
+ * @param context - The session.
79
+ * @param args - The words after `build`.
80
+ * @returns The envelope.
81
+ */
82
+ export declare function domainBuild_run(context: BuildCommandContext, args: ReadonlyArray<string>): Promise<CommandEnvelope>;
83
+ /**
84
+ * `domain adopt <name> --from <checkout> [--stack-compartment <ocid>]`.
85
+ *
86
+ * @param context - The session.
87
+ * @param args - The words after `adopt`.
88
+ * @returns The envelope.
89
+ */
90
+ export declare function domainAdopt_run(context: BuildCommandContext, args: ReadonlyArray<string>): Promise<CommandEnvelope>;
@@ -0,0 +1,358 @@
1
+ /**
2
+ * @file `domain new`, `domain plan` and `domain build`: making a domain's
3
+ * spec, saying what it would take and cost, and building it (docs/stratus.adoc,
4
+ * D6, D7, D10).
5
+ *
6
+ * `domain new` writes the spec and nothing else. `domain plan` reads only,
7
+ * without the `tasks` tier: the fit per availability domain, the hourly cost
8
+ * from the price list, where the steps stand; it says by name that the
9
+ * infrastructure plan needs the tier. `domain build` starts the domain's run
10
+ * in the core's runner and follows it; the run stops before the first step
11
+ * that bills, and the command asks the operator, with the plan's counts and
12
+ * the cost, before it goes on. Ctrl-C stops following, not the build.
13
+ *
14
+ * @module
15
+ */
16
+ import chalk from 'chalk';
17
+ import { envelope_error, envelope_ok, taskState_isOver } from '@fnndsc/menu';
18
+ import { commandCancellation_enable, commandCancellation_signalGet, JobRefusal, repl_confirm, runner_get, sink_dataLine, surface_get, } from '@fnndsc/brasa/core';
19
+ import { planCounts_alter, planCounts_of, planCounts_words } from '../cloud/builder.js';
20
+ import { adoption_keep, adoptRun_make, checkout_read } from '../domain/adopt.js';
21
+ import { DOMAIN_NAME } from '../domain/state.js';
22
+ import { SPEC_DEFAULT, specOptions_apply } from '../domain/spec.js';
23
+ import { cost_words, familyShape_find, specCost_of, specFit_read } from '../domain/sizing.js';
24
+ import { BUILD_STEPS, buildJob_id, buildRun_make, FIRST_BILLING_STEP, planRun_make, stepNext_of, STEPS_SOURCE, STEPS_WRITTEN } from '../domain/steps.js';
25
+ /** The options `domain new` takes, each with a value. */
26
+ const NEW_OPTIONS = ['--family', '--plane', '--workers', '--data', '--database', '--queue', '--base-domain', '--compartment'];
27
+ /**
28
+ * Reads `--name value` and `--name=value` pairs.
29
+ *
30
+ * @param words - The words.
31
+ * @param known - The options taken.
32
+ * @returns The options and the other words, or the word refused.
33
+ */
34
+ export function options_read(words, known) {
35
+ const options = new Map();
36
+ const rest = [];
37
+ for (let i = 0; i < words.length; i++) {
38
+ const word = words[i];
39
+ if (!word.startsWith('-')) {
40
+ rest.push(word);
41
+ continue;
42
+ }
43
+ const name = word.includes('=') ? word.slice(0, word.indexOf('=')) : word;
44
+ if (!known.includes(name))
45
+ return { error: `${name}: unknown option` };
46
+ const value = word.includes('=') ? word.slice(word.indexOf('=') + 1) : words[++i];
47
+ if (value === undefined || value === '')
48
+ return { error: `${name} takes a value` };
49
+ options.set(name, value);
50
+ }
51
+ return { options, rest };
52
+ }
53
+ /**
54
+ * A spec in a line.
55
+ *
56
+ * @param spec - The spec.
57
+ * @returns `E5 · plane 3 × 8 vCPU 24 GiB · …`.
58
+ */
59
+ export function spec_line(spec) {
60
+ const workers = spec.workers.count === 0 ? 'workers 0 (compact)' : `workers ${spec.workers.count} × ${spec.workers.vcpu} vCPU ${spec.workers.ramGib} GiB`;
61
+ return `${spec.family} · plane ${spec.controlPlane.count} × ${spec.controlPlane.vcpu} vCPU ${spec.controlPlane.ramGib} GiB · ${workers} · ChRIS data ${spec.chris.dataGib} GiB`;
62
+ }
63
+ /**
64
+ * `domain new <name> [options]`.
65
+ *
66
+ * @param context - The session.
67
+ * @param args - The words after `new`.
68
+ * @returns The envelope.
69
+ */
70
+ export async function domainNew_run(context, args) {
71
+ const read = options_read(args, NEW_OPTIONS);
72
+ if ('error' in read)
73
+ return envelope_error('', undefined, `domain new: ${read.error} (${NEW_OPTIONS.join(', ')})\n`);
74
+ const [name, ...extra] = read.rest;
75
+ if (name === undefined || extra.length > 0)
76
+ return envelope_error('', undefined, 'domain new: usage: domain new <name> [--family E5] [--plane 3x8/24] [--workers 2x8/32] [--data GiB] [--base-domain zone] [--compartment ocid]\n');
77
+ if (!DOMAIN_NAME.test(name))
78
+ return envelope_error('', undefined, `domain new: ${name}: a domain's name is a DNS label: lower-case letters, digits and '-', starting with a letter, at most 54\n`);
79
+ if (context.domains.domain_read(name) !== null)
80
+ return envelope_error('', undefined, `domain new: ${name}: File exists\n`);
81
+ const region = context.region();
82
+ if (region === null)
83
+ return envelope_error('', undefined, 'domain new: not connected\n');
84
+ const baseDomain = read.options.get('--base-domain') ?? context.baseDomain;
85
+ if (baseDomain === null)
86
+ return envelope_error('', undefined, 'domain new: --base-domain <zone> is needed: the DNS zone the cluster\'s names live under\n');
87
+ const sized = specOptions_apply(SPEC_DEFAULT, new Map([...read.options].filter(([option]) => option !== '--base-domain' && option !== '--compartment')));
88
+ const compartmentId = read.options.get('--compartment');
89
+ if ('error' in sized)
90
+ return envelope_error('', undefined, `domain new: ${sized.error}\n`);
91
+ const record = { name, created: new Date().toISOString(), region, baseDomain, steps: {}, ids: {}, ...(compartmentId !== undefined ? { compartmentId } : {}) };
92
+ context.store.create(record, sized.spec);
93
+ const lines = [
94
+ `${chalk.bold(name)} ${name}.${baseDomain} spec written: ${context.store.folder_of(name)}/spec.yaml`,
95
+ ` ${spec_line(sized.spec)}`,
96
+ chalk.gray(`Nothing is made in the tenancy until domain build ${name}; domain plan ${name} says what it takes and costs.`),
97
+ ];
98
+ return envelope_ok(`${lines.join('\n')}\n`);
99
+ }
100
+ /**
101
+ * A built domain and its spec, or why the verb refuses it.
102
+ *
103
+ * @param context - The session.
104
+ * @param verb - The verb, for the refusal.
105
+ * @param name - The domain's name, or undefined for the only one.
106
+ * @returns The domain, its record and its spec, or the refusal.
107
+ */
108
+ function builtDomain_need(context, verb, name) {
109
+ const built = context.store.names_list();
110
+ const chosen = name ?? (built.length === 1 ? built[0] : undefined);
111
+ if (chosen === undefined)
112
+ return { error: `domain ${verb}: which domain? (${built.join(', ') || 'none built here; domain new <name>'})` };
113
+ const domain = context.domains.domain_read(chosen);
114
+ if (domain === null)
115
+ return { error: `domain ${verb}: ${chosen}: no such domain` };
116
+ if (domain.origin !== 'built')
117
+ return { error: `domain ${verb}: ${chosen}: read from a harbor-oci checkout, not built here; adopting it comes with domain adopt` };
118
+ const record = context.store.record_read(chosen);
119
+ const spec = context.store.spec_read(chosen);
120
+ if (record === null || spec === null || spec.spec === null)
121
+ return { error: `domain ${verb}: ${chosen}: its spec.yaml does not read${spec?.error !== undefined ? ` (${spec.error})` : ''}` };
122
+ return { domain, record, spec: spec.spec };
123
+ }
124
+ /**
125
+ * What a spec costs in this region, read now.
126
+ *
127
+ * @param context - The session.
128
+ * @param region - The region.
129
+ * @param spec - The spec.
130
+ * @returns The cost, or null when the family is not priced.
131
+ */
132
+ async function cost_read(context, region, spec) {
133
+ const shape = familyShape_find(await context.driver.shapes_list(region), spec.family);
134
+ const prices = await context.driver.prices_list();
135
+ return specCost_of(spec, shape, prices);
136
+ }
137
+ /**
138
+ * Whether the session may start jobs: the `tasks` tier.
139
+ *
140
+ * @returns True when granted.
141
+ */
142
+ function tasks_granted() {
143
+ return surface_get().capabilities.tasks === true;
144
+ }
145
+ /**
146
+ * `domain plan [<name>]`: the fit, the cost and the steps, read; the plan itself with the tier.
147
+ *
148
+ * @param context - The session.
149
+ * @param args - The words after `plan`.
150
+ * @returns The envelope.
151
+ */
152
+ export async function domainPlan_run(context, args) {
153
+ if (args.length > 1 || args.some((word) => word.startsWith('-')))
154
+ return envelope_error('', undefined, 'domain plan: usage: domain plan [<name>]\n');
155
+ const need = builtDomain_need(context, 'plan', args[0]);
156
+ if ('error' in need)
157
+ return envelope_error('', undefined, `${need.error}\n`);
158
+ const { domain, record, spec } = need;
159
+ const fits = await specFit_read(context.driver, record.region, domain.name, spec);
160
+ const cost = await cost_read(context, record.region, spec);
161
+ const lines = [`${chalk.bold(domain.name)} ${domain.cluster ?? ''}`, ` ${spec_line(spec)}`, `fit, ${spec.family} per availability domain (${record.region}):`];
162
+ for (const fit of fits) {
163
+ const room = (needed, free, unit) => `${needed} of ${free ?? '?'} ${unit}`;
164
+ const verdict = fit.fits === null ? chalk.gray('not said') : fit.fits ? chalk.cyan('fits') : chalk.red('does not fit');
165
+ lines.push(` ${fit.zone.padEnd(24)} ${fit.nodes.join(' ').padEnd(28)} ${room(fit.coresNeeded, fit.coresFree, 'cores')}, ${room(fit.memoryNeeded, fit.memoryFree, 'GiB')} ${verdict}`);
166
+ }
167
+ lines.push(`cost ${cost === null ? chalk.gray(`${spec.family} is not in the price list`) : chalk.yellow(cost_words(cost))}`);
168
+ const next = stepNext_of(record);
169
+ lines.push(`steps ${next === null ? 'every step done' : `next: ${next}`}`);
170
+ if (record.ids['stackRef'] !== undefined && tasks_granted() && context.builder !== null) {
171
+ const ran = await job_runFollowed(`${domain.name}-plan`, `plan ${domain.name}`, planRun_make(domain.name, context.builder, context.store));
172
+ if ('error' in ran)
173
+ return envelope_error('', undefined, `domain plan: ${ran.error}\n`);
174
+ }
175
+ else if (record.adopted !== undefined && record.ids['stackRef'] === undefined) {
176
+ lines.push(chalk.gray(`plan ${domain.name} is not in Resource Manager yet: domain adopt ${domain.name} --from ${record.adopted.from} with the tasks tier puts it there`));
177
+ }
178
+ const planText = context.store.file_read(domain.name, 'plan.json');
179
+ if (planText !== null) {
180
+ const counts = planCounts_of(JSON.parse(planText));
181
+ lines.push(`plan ${planCounts_words(counts)}${planCounts_alter(counts) ? chalk.red(' · an apply would touch what exists: refused unless allowed by name') : ''}`);
182
+ if (record.adopted !== undefined)
183
+ lines.push(chalk.gray(` adopted from ${record.adopted.from}: planned against, never built on`));
184
+ }
185
+ else if (!tasks_granted() && record.adopted === undefined) {
186
+ lines.push(chalk.gray('plan the infrastructure plan needs the tasks tier (stratus --host-control tasks): without it, nothing outside this host changes'));
187
+ }
188
+ else {
189
+ lines.push(chalk.gray(`plan not made yet: domain build ${domain.name} --through infra-plan makes it, and nothing it makes bills`));
190
+ }
191
+ return envelope_ok(`${lines.join('\n')}\n`);
192
+ }
193
+ /**
194
+ * Follows a run to its end, or until the operator stops following.
195
+ *
196
+ * @param runner - The runner.
197
+ * @param id - The run's job id.
198
+ * @returns Its record then.
199
+ */
200
+ async function run_follow(runner, id) {
201
+ commandCancellation_enable();
202
+ const signal = commandCancellation_signalGet();
203
+ return runner.job_follow(STEPS_SOURCE, id, (line) => sink_dataLine(line), signal);
204
+ }
205
+ /**
206
+ * Starts a job and follows it to its end.
207
+ *
208
+ * @param id - Its id in the build steps' source.
209
+ * @param label - What it is called.
210
+ * @param run - Its work.
211
+ * @returns Its record at the end, or why it did not start or end.
212
+ */
213
+ export async function job_runFollowed(id, label, run) {
214
+ const runner = runner_get();
215
+ if (runner === null)
216
+ return { error: 'this session runs no tasks' };
217
+ try {
218
+ runner.job_start(STEPS_SOURCE, id, label, run);
219
+ }
220
+ catch (error) {
221
+ return { error: error instanceof JobRefusal ? error.message : String(error) };
222
+ }
223
+ sink_dataLine(chalk.gray(`following /proc/${STEPS_SOURCE}/${id}; Ctrl-C stops following, not the task (wait ${id} follows it again)`));
224
+ const ended = await run_follow(runner, id);
225
+ if (ended === undefined)
226
+ return { error: `/proc/${STEPS_SOURCE}/${id}: gone` };
227
+ if (!taskState_isOver(ended.state))
228
+ return { error: `stopped following; /proc/${STEPS_SOURCE}/${id} goes on` };
229
+ if (ended.state !== 'done')
230
+ return { error: `${id}: ${ended.state}${ended.outcome !== undefined ? `: ${ended.outcome}` : ''}` };
231
+ return { record: ended };
232
+ }
233
+ /**
234
+ * The question before the first billing step.
235
+ *
236
+ * @param context - The session.
237
+ * @param name - The domain.
238
+ * @param record - Its state.
239
+ * @param spec - Its spec.
240
+ * @returns The question.
241
+ */
242
+ async function billing_question(context, name, record, spec) {
243
+ const planText = context.store.file_read(name, 'plan.json');
244
+ const created = planText === null ? 0 : planCounts_of(JSON.parse(planText)).create;
245
+ const cost = await cost_read(context, record.region, spec);
246
+ return `${FIRST_BILLING_STEP} creates ${created} resources. Billing starts at ${cost === null ? 'an unpriced rate' : cost_words(cost)}. Continue? [y/N]`;
247
+ }
248
+ /**
249
+ * `domain build [<name>] [--through <step>]`.
250
+ *
251
+ * @param context - The session.
252
+ * @param args - The words after `build`.
253
+ * @returns The envelope.
254
+ */
255
+ export async function domainBuild_run(context, args) {
256
+ const read = options_read(args, ['--through']);
257
+ if ('error' in read)
258
+ return envelope_error('', undefined, `domain build: ${read.error} (--through)\n`);
259
+ if (read.rest.length > 1)
260
+ return envelope_error('', undefined, 'domain build: usage: domain build [<name>] [--through <step>]\n');
261
+ const through = read.options.get('--through');
262
+ if (through !== undefined && !BUILD_STEPS.includes(through))
263
+ return envelope_error('', undefined, `domain build: --through ${through}: no such step (${BUILD_STEPS.join(' ')})\n`);
264
+ const need = builtDomain_need(context, 'build', read.rest[0]);
265
+ if ('error' in need)
266
+ return envelope_error('', undefined, `${need.error}\n`);
267
+ if (need.record.adopted !== undefined)
268
+ return envelope_error('', undefined, `domain build: ${need.domain.name}: adopted from ${need.record.adopted.from}: building on it is refused until it is allowed by name\n`);
269
+ if (context.deps === null)
270
+ return envelope_error('', undefined, 'domain build: this cloud\'s build steps are not written yet; stratus --fake builds over the fake cloud\n');
271
+ const runner = runner_get();
272
+ if (runner === null)
273
+ return envelope_error('', undefined, 'domain build: this session runs no tasks\n');
274
+ const name = need.domain.name;
275
+ const id = buildJob_id(name);
276
+ for (;;) {
277
+ const running = runner.job_get(STEPS_SOURCE, id);
278
+ if (running === undefined || taskState_isOver(running.state)) {
279
+ try {
280
+ runner.job_start(STEPS_SOURCE, id, `build ${name}`, buildRun_make(name, through, context.deps), { domain: name, ...(through !== undefined ? { through } : {}) });
281
+ }
282
+ catch (error) {
283
+ return envelope_error('', undefined, `domain build: ${error instanceof JobRefusal ? error.message : String(error)}\n`);
284
+ }
285
+ }
286
+ sink_dataLine(chalk.gray(`following /proc/${STEPS_SOURCE}/${id}; Ctrl-C stops following, not the build (wait ${id} follows it again)`));
287
+ const ended = await run_follow(runner, id);
288
+ if (ended === undefined)
289
+ return envelope_error('', undefined, `domain build: /proc/${STEPS_SOURCE}/${id}: gone\n`);
290
+ if (!taskState_isOver(ended.state))
291
+ return envelope_ok(`${chalk.gray(`stopped following; the build goes on (wait ${id})`)}\n`);
292
+ if (ended.state !== 'done')
293
+ return envelope_error('', undefined, `domain build: ${name}: ${ended.state}${ended.outcome !== undefined ? `: ${ended.outcome}` : ''}\n`);
294
+ const stoppedBefore = ended.data['stoppedBefore'];
295
+ const record = context.store.record_read(name);
296
+ if (stoppedBefore === FIRST_BILLING_STEP && record.billingAccepted === undefined && (through === undefined || BUILD_STEPS.indexOf(through) >= BUILD_STEPS.indexOf(FIRST_BILLING_STEP))) {
297
+ const yes = await repl_confirm(await billing_question(context, name, record, need.spec));
298
+ if (!yes)
299
+ return envelope_ok(`${chalk.gray(`stopped before ${FIRST_BILLING_STEP}; nothing bills (domain build ${name} asks again)`)}\n`);
300
+ context.store.record_update(name, (current) => { current.billingAccepted = new Date().toISOString(); });
301
+ continue;
302
+ }
303
+ const next = stepNext_of(record);
304
+ const summary = next === null
305
+ ? `${name}: every step done`
306
+ : !STEPS_WRITTEN.includes(next) ? `${name}: built through ${BUILD_STEPS[BUILD_STEPS.indexOf(next) - 1] ?? ''}; ${next} and after are not steps this session has yet`
307
+ : `${name}: done through ${BUILD_STEPS[BUILD_STEPS.indexOf(next) - 1] ?? ''}; next: ${next}`;
308
+ return envelope_ok(`${summary}\n`);
309
+ }
310
+ }
311
+ /**
312
+ * `domain adopt <name> --from <checkout> [--stack-compartment <ocid>]`.
313
+ *
314
+ * @param context - The session.
315
+ * @param args - The words after `adopt`.
316
+ * @returns The envelope.
317
+ */
318
+ export async function domainAdopt_run(context, args) {
319
+ const read = options_read(args, ['--from', '--stack-compartment']);
320
+ if ('error' in read)
321
+ return envelope_error('', undefined, `domain adopt: ${read.error} (--from, --stack-compartment)\n`);
322
+ const [name, ...extra] = read.rest;
323
+ const from = read.options.get('--from');
324
+ if (name === undefined || from === undefined || extra.length > 0)
325
+ return envelope_error('', undefined, 'domain adopt: usage: domain adopt <name> --from <harbor-oci checkout> [--stack-compartment <ocid>]\n');
326
+ if (!DOMAIN_NAME.test(name))
327
+ return envelope_error('', undefined, `domain adopt: ${name}: a domain's name is a DNS label\n`);
328
+ const checkout = checkout_read(name, from, new Date());
329
+ if ('error' in checkout)
330
+ return envelope_error('', undefined, `domain adopt: ${checkout.error}\n`);
331
+ const kept = context.store.record_read(name);
332
+ const lines = [];
333
+ if (kept === null) {
334
+ adoption_keep(context.store, checkout);
335
+ lines.push(`${chalk.bold(name)} ${name}.${checkout.record.baseDomain} adopted from ${from}`);
336
+ lines.push(` kept here: its ids (${Object.keys(checkout.record.ids).join(', ')}), its spec, its settings, its secrets (${checkout.secrets.map((secret) => secret.name).join(', ') || 'none'}) in ${context.store.folder_of(name)}`);
337
+ }
338
+ else if (kept.adopted === undefined) {
339
+ return envelope_error('', undefined, `domain adopt: ${name}: a domain of that name was built here\n`);
340
+ }
341
+ else if (kept.ids['stackRef'] !== undefined) {
342
+ return envelope_ok(`${name}: already adopted; its stack is ${kept.ids['stackRef']}\n`);
343
+ }
344
+ if (!tasks_granted()) {
345
+ lines.push(chalk.gray(` its stack and Terraform state go to Resource Manager with the tasks tier: domain adopt ${name} --from ${from} again, under stratus --host-control tasks`));
346
+ return envelope_ok(`${lines.join('\n')}\n`);
347
+ }
348
+ if (context.builder === null || context.builder.stack_adopt === undefined)
349
+ return envelope_error('', undefined, `domain adopt: ${lines.join('\n')}\nthis cloud cannot take a stack in yet\n`);
350
+ const compartment = read.options.get('--stack-compartment') ?? checkout.record.compartmentId ?? '';
351
+ for (const line of lines)
352
+ sink_dataLine(line);
353
+ const ran = await job_runFollowed(`${name}-adopt`, `adopt ${name}`, adoptRun_make(context.store, context.builder, name, checkout.variables, checkout.stateFile, compartment, checkout.stackVersion));
354
+ if ('error' in ran)
355
+ return envelope_error('', undefined, `domain adopt: ${ran.error}\n`);
356
+ return envelope_ok(`${name}: adopted; its stack is ${context.store.record_read(name)?.ids['stackRef'] ?? '?'} (domain plan ${name} plans against it)\n`);
357
+ }
358
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}