@fnndsc/stratus 0.0.0-stage → 0.0.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 (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -2
  3. package/dist/args.d.ts +26 -0
  4. package/dist/args.js +43 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/backend.d.ts +40 -0
  7. package/dist/backend.js +38 -0
  8. package/dist/backend.js.map +1 -0
  9. package/dist/cache.d.ts +33 -0
  10. package/dist/cache.js +50 -0
  11. package/dist/cache.js.map +1 -0
  12. package/dist/cloud/driver.d.ts +140 -0
  13. package/dist/cloud/driver.js +18 -0
  14. package/dist/cloud/driver.js.map +1 -0
  15. package/dist/cloud/fake/driver.d.ts +55 -0
  16. package/dist/cloud/fake/driver.js +115 -0
  17. package/dist/cloud/fake/driver.js.map +1 -0
  18. package/dist/cloud/oci/api.d.ts +81 -0
  19. package/dist/cloud/oci/api.js +184 -0
  20. package/dist/cloud/oci/api.js.map +1 -0
  21. package/dist/cloud/oci/driver.d.ts +42 -0
  22. package/dist/cloud/oci/driver.js +131 -0
  23. package/dist/cloud/oci/driver.js.map +1 -0
  24. package/dist/cloud/oci/prices.d.ts +73 -0
  25. package/dist/cloud/oci/prices.js +105 -0
  26. package/dist/cloud/oci/prices.js.map +1 -0
  27. package/dist/index.d.ts +19 -0
  28. package/dist/index.js +20 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/names.d.ts +51 -0
  31. package/dist/names.js +53 -0
  32. package/dist/names.js.map +1 -0
  33. package/dist/session.d.ts +48 -0
  34. package/dist/session.js +128 -0
  35. package/dist/session.js.map +1 -0
  36. package/dist/stratus.d.ts +2 -0
  37. package/dist/stratus.js +90 -0
  38. package/dist/stratus.js.map +1 -0
  39. package/dist/vfs/look.d.ts +9 -0
  40. package/dist/vfs/look.js +60 -0
  41. package/dist/vfs/look.js.map +1 -0
  42. package/dist/vfs/tenancy.d.ts +94 -0
  43. package/dist/vfs/tenancy.js +393 -0
  44. package/dist/vfs/tenancy.js.map +1 -0
  45. package/package.json +63 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/cloud/fake/driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /** What the SDK says about the credential's tenancy. */
2
+ export interface OciTenancyRecord {
3
+ readonly id: string;
4
+ readonly name: string;
5
+ readonly description: string;
6
+ readonly homeRegionKey: string;
7
+ readonly freeformTags: Readonly<Record<string, string>>;
8
+ readonly definedTags: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
9
+ }
10
+ /** What the SDK says about a compartment. */
11
+ export interface OciCompartmentRecord {
12
+ readonly id: string;
13
+ readonly compartmentId: string;
14
+ readonly name: string;
15
+ readonly description: string;
16
+ readonly lifecycleState: string;
17
+ readonly timeCreated: string;
18
+ readonly freeformTags: Readonly<Record<string, string>>;
19
+ readonly definedTags: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
20
+ }
21
+ /** One limit value, as the Limits API lists it. */
22
+ export interface OciLimitValueRecord {
23
+ readonly name: string;
24
+ readonly scopeType: string;
25
+ readonly availabilityDomain: string | null;
26
+ readonly value: number;
27
+ }
28
+ /** A shape, as Compute lists it. */
29
+ export interface OciShapeRecord {
30
+ readonly shape: string;
31
+ readonly processorDescription: string;
32
+ readonly ocpus: number | null;
33
+ readonly memoryInGBs: number | null;
34
+ readonly gpus: number;
35
+ readonly isFlexible: boolean;
36
+ readonly ocpuOptions: {
37
+ readonly min: number;
38
+ readonly max: number;
39
+ } | null;
40
+ readonly memoryOptions: {
41
+ readonly minInGBs: number;
42
+ readonly maxInGBs: number;
43
+ } | null;
44
+ readonly quotaNames: ReadonlyArray<string>;
45
+ readonly raw: unknown;
46
+ }
47
+ /** The calls the driver makes. */
48
+ export interface OciApi {
49
+ /** The credential's tenancy id, user id and home region, read from the profile without a call. */
50
+ credential_get(): {
51
+ tenancyId: string;
52
+ userId: string;
53
+ region: string;
54
+ };
55
+ tenancy_get(tenancyId: string): Promise<OciTenancyRecord>;
56
+ userName_get(userId: string): Promise<string>;
57
+ compartments_list(parentId: string): Promise<OciCompartmentRecord[]>;
58
+ regionSubscriptions_list(tenancyId: string): Promise<string[]>;
59
+ availabilityDomains_list(region: string, tenancyId: string): Promise<string[]>;
60
+ limitServices_list(region: string, tenancyId: string): Promise<string[]>;
61
+ limitValues_list(region: string, tenancyId: string, service: string): Promise<OciLimitValueRecord[]>;
62
+ resourceAvailability_get(region: string, tenancyId: string, service: string, limitName: string, availabilityDomain?: string): Promise<{
63
+ used: number;
64
+ available: number;
65
+ } | null>;
66
+ shapes_list(region: string, tenancyId: string): Promise<OciShapeRecord[]>;
67
+ }
68
+ /** How the real API is reached. */
69
+ export interface OciApiOptions {
70
+ /** The profile's file; the SDK's default (`~/.oci/config`) when absent. */
71
+ readonly configFile?: string;
72
+ /** The profile; `DEFAULT` when absent. */
73
+ readonly profile?: string;
74
+ }
75
+ /**
76
+ * The real API over the SDK, authenticated by an API-key profile.
77
+ *
78
+ * @param options - The profile.
79
+ * @returns The API.
80
+ */
81
+ export declare function ociApi_make(options?: OciApiOptions): OciApi;
@@ -0,0 +1,184 @@
1
+ /**
2
+ * @file The OCI API as the driver uses it: a few calls, plain answers.
3
+ *
4
+ * The SDK's clients sit behind this interface so the driver can be tested
5
+ * against recorded answers (`tests/fixtures/oci/*.json`) and the SDK is
6
+ * loaded only here. Every call pages to the end; the driver never sees a
7
+ * page token. Only this folder may import an `oci-*` package
8
+ * (`lint:stratus-deps`).
9
+ *
10
+ * @module
11
+ */
12
+ import * as common from 'oci-common';
13
+ import * as identity from 'oci-identity';
14
+ import * as limits from 'oci-limits';
15
+ import * as core from 'oci-core';
16
+ /**
17
+ * Every item of a paged list call.
18
+ *
19
+ * @param page_get - Fetches one page, given the token of the previous (undefined first).
20
+ * @returns Every item, in order.
21
+ */
22
+ async function pages_drain(page_get) {
23
+ const items = [];
24
+ let token = undefined;
25
+ do {
26
+ const page = await page_get(token);
27
+ items.push(...page.items);
28
+ token = page.opcNextPage === '' ? undefined : page.opcNextPage;
29
+ } while (token !== undefined);
30
+ return items;
31
+ }
32
+ /** Tags as the SDK gives them, with absent ones as empty. */
33
+ function tags_of(freeform, defined) {
34
+ return { freeformTags: freeform ?? {}, definedTags: defined ?? {} };
35
+ }
36
+ /**
37
+ * The real API over the SDK, authenticated by an API-key profile.
38
+ *
39
+ * @param options - The profile.
40
+ * @returns The API.
41
+ */
42
+ export function ociApi_make(options = {}) {
43
+ const provider = new common.ConfigFileAuthenticationDetailsProvider(options.configFile, options.profile);
44
+ const clients = new Map();
45
+ const identityClient_for = (region) => {
46
+ const key = `identity/${region}`;
47
+ let client = clients.get(key);
48
+ if (client === undefined) {
49
+ client = new identity.IdentityClient({ authenticationDetailsProvider: provider });
50
+ client.regionId = region;
51
+ clients.set(key, client);
52
+ }
53
+ return client;
54
+ };
55
+ const limitsClient_for = (region) => {
56
+ const key = `limits/${region}`;
57
+ let client = clients.get(key);
58
+ if (client === undefined) {
59
+ client = new limits.LimitsClient({ authenticationDetailsProvider: provider });
60
+ client.regionId = region;
61
+ clients.set(key, client);
62
+ }
63
+ return client;
64
+ };
65
+ const computeClient_for = (region) => {
66
+ const key = `compute/${region}`;
67
+ let client = clients.get(key);
68
+ if (client === undefined) {
69
+ client = new core.ComputeClient({ authenticationDetailsProvider: provider });
70
+ client.regionId = region;
71
+ clients.set(key, client);
72
+ }
73
+ return client;
74
+ };
75
+ const homeRegion = provider.getRegion().regionId;
76
+ return {
77
+ credential_get: () => ({
78
+ tenancyId: provider.getTenantId(),
79
+ userId: provider.getUser(),
80
+ region: homeRegion,
81
+ }),
82
+ async tenancy_get(tenancyId) {
83
+ const answer = await identityClient_for(homeRegion).getTenancy({ tenancyId });
84
+ const tenancy = answer.tenancy;
85
+ return {
86
+ id: tenancy.id ?? tenancyId,
87
+ name: tenancy.name ?? '',
88
+ description: tenancy.description ?? '',
89
+ homeRegionKey: tenancy.homeRegionKey ?? '',
90
+ ...tags_of(tenancy.freeformTags, tenancy.definedTags),
91
+ };
92
+ },
93
+ async userName_get(userId) {
94
+ const answer = await identityClient_for(homeRegion).getUser({ userId });
95
+ return answer.user.name;
96
+ },
97
+ async compartments_list(parentId) {
98
+ const client = identityClient_for(homeRegion);
99
+ const items = await pages_drain(async (page) => {
100
+ const answer = await client.listCompartments({
101
+ compartmentId: parentId,
102
+ accessLevel: identity.requests.ListCompartmentsRequest.AccessLevel.Accessible,
103
+ sortBy: identity.requests.ListCompartmentsRequest.SortBy.Name,
104
+ sortOrder: identity.requests.ListCompartmentsRequest.SortOrder.Asc,
105
+ ...(page !== undefined ? { page } : {}),
106
+ });
107
+ return { items: answer.items, opcNextPage: answer.opcNextPage };
108
+ });
109
+ return items.map((compartment) => ({
110
+ id: compartment.id,
111
+ compartmentId: compartment.compartmentId,
112
+ name: compartment.name,
113
+ description: compartment.description,
114
+ lifecycleState: String(compartment.lifecycleState),
115
+ timeCreated: new Date(compartment.timeCreated).toISOString(),
116
+ ...tags_of(compartment.freeformTags, compartment.definedTags),
117
+ }));
118
+ },
119
+ async regionSubscriptions_list(tenancyId) {
120
+ const answer = await identityClient_for(homeRegion).listRegionSubscriptions({ tenancyId });
121
+ return answer.items
122
+ .filter((subscription) => String(subscription.status) === 'READY')
123
+ .map((subscription) => subscription.regionName)
124
+ .sort();
125
+ },
126
+ async availabilityDomains_list(region, tenancyId) {
127
+ const answer = await identityClient_for(region).listAvailabilityDomains({ compartmentId: tenancyId });
128
+ return answer.items.map((domain) => domain.name ?? '').filter((name) => name !== '').sort();
129
+ },
130
+ async limitServices_list(region, tenancyId) {
131
+ const client = limitsClient_for(region);
132
+ const items = await pages_drain(async (page) => {
133
+ const answer = await client.listServices({ compartmentId: tenancyId, ...(page !== undefined ? { page } : {}) });
134
+ return { items: answer.items, opcNextPage: answer.opcNextPage };
135
+ });
136
+ return items.map((service) => service.name ?? '').filter((name) => name !== '').sort();
137
+ },
138
+ async limitValues_list(region, tenancyId, service) {
139
+ const client = limitsClient_for(region);
140
+ const items = await pages_drain(async (page) => {
141
+ const answer = await client.listLimitValues({ compartmentId: tenancyId, serviceName: service, ...(page !== undefined ? { page } : {}) });
142
+ return { items: answer.items, opcNextPage: answer.opcNextPage };
143
+ });
144
+ return items.map((value) => ({
145
+ name: value.name ?? '',
146
+ scopeType: String(value.scopeType ?? ''),
147
+ availabilityDomain: value.availabilityDomain ?? null,
148
+ value: value.value ?? 0,
149
+ }));
150
+ },
151
+ async resourceAvailability_get(region, tenancyId, service, limitName, availabilityDomain) {
152
+ const answer = await limitsClient_for(region).getResourceAvailability({
153
+ serviceName: service,
154
+ limitName,
155
+ compartmentId: tenancyId,
156
+ ...(availabilityDomain !== undefined ? { availabilityDomain } : {}),
157
+ });
158
+ const availability = answer.resourceAvailability;
159
+ if (availability.used === undefined || availability.available === undefined)
160
+ return null;
161
+ return { used: availability.used, available: availability.available };
162
+ },
163
+ async shapes_list(region, tenancyId) {
164
+ const client = computeClient_for(region);
165
+ const items = await pages_drain(async (page) => {
166
+ const answer = await client.listShapes({ compartmentId: tenancyId, ...(page !== undefined ? { page } : {}) });
167
+ return { items: answer.items, opcNextPage: answer.opcNextPage };
168
+ });
169
+ return items.map((shape) => ({
170
+ shape: shape.shape,
171
+ processorDescription: shape.processorDescription ?? '',
172
+ ocpus: shape.ocpus ?? null,
173
+ memoryInGBs: shape.memoryInGBs ?? null,
174
+ gpus: shape.gpus ?? 0,
175
+ isFlexible: shape.isFlexible ?? false,
176
+ ocpuOptions: shape.ocpuOptions !== undefined ? { min: shape.ocpuOptions.min ?? 0, max: shape.ocpuOptions.max ?? 0 } : null,
177
+ memoryOptions: shape.memoryOptions !== undefined ? { minInGBs: shape.memoryOptions.minInGBs ?? 0, maxInGBs: shape.memoryOptions.maxInGBs ?? 0 } : null,
178
+ quotaNames: shape.quotaNames ?? [],
179
+ raw: shape,
180
+ }));
181
+ },
182
+ };
183
+ }
184
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/cloud/oci/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @file The OCI driver: Oracle Cloud Infrastructure as stratus's cloud.
3
+ *
4
+ * Containers are compartments, the root the tenancy; zones are availability
5
+ * domains; limits come from the Limits service and shapes from Compute,
6
+ * each asked in the region given; prices from Oracle's public list. The SDK
7
+ * is reached through `OciApi` (`api.ts`), so this file maps records and
8
+ * tests run it over recorded answers.
9
+ *
10
+ * @module
11
+ */
12
+ import type { CloudAvailability, CloudContainer, CloudDriver, CloudIdentity, CloudLimit, CloudPrice, CloudShape, CloudZone } from '../driver.js';
13
+ import type { OciApi, OciShapeRecord } from './api.js';
14
+ import { type JsonFetch } from './prices.js';
15
+ /** How the driver is made. */
16
+ export interface OciDriverOptions {
17
+ /** The API; the real one when absent. */
18
+ readonly api: OciApi;
19
+ /** How the price list is fetched; Node's fetch when absent. */
20
+ readonly fetchJson?: JsonFetch;
21
+ }
22
+ /** Tags flattened: freeform as `key`, defined as `namespace.key`. */
23
+ export declare function ociTags_flatten(freeform: Readonly<Record<string, string>>, defined: Readonly<Record<string, Readonly<Record<string, unknown>>>>): Record<string, string>;
24
+ /** A shape record as a shape. */
25
+ export declare function shape_ofRecord(record: OciShapeRecord): CloudShape;
26
+ /** Oracle Cloud Infrastructure as a cloud driver. */
27
+ export declare class OciDriver implements CloudDriver {
28
+ readonly cloud: string;
29
+ private readonly api;
30
+ private readonly fetchJson;
31
+ constructor(options: OciDriverOptions);
32
+ identity_get(): Promise<CloudIdentity>;
33
+ root_get(): Promise<CloudContainer>;
34
+ containers_list(parentId: string): Promise<CloudContainer[]>;
35
+ regions_list(): Promise<string[]>;
36
+ zones_list(region: string): Promise<CloudZone[]>;
37
+ limitServices_list(region: string): Promise<string[]>;
38
+ limits_list(region: string, service: string): Promise<CloudLimit[]>;
39
+ limitAvailability_get(region: string, service: string, name: string, zone?: string): Promise<CloudAvailability | null>;
40
+ shapes_list(region: string): Promise<CloudShape[]>;
41
+ prices_list(): Promise<CloudPrice[]>;
42
+ }
@@ -0,0 +1,131 @@
1
+ import { ociPrices_read, shapeTerms_get } from './prices.js';
2
+ /** Tags flattened: freeform as `key`, defined as `namespace.key`. */
3
+ export function ociTags_flatten(freeform, defined) {
4
+ const tags = {};
5
+ for (const [key, value] of Object.entries(freeform))
6
+ tags[key] = value;
7
+ for (const [namespace, keys] of Object.entries(defined)) {
8
+ for (const [key, value] of Object.entries(keys))
9
+ tags[`${namespace}.${key}`] = String(value);
10
+ }
11
+ return tags;
12
+ }
13
+ /** A compartment record as a container. */
14
+ function container_ofCompartment(record) {
15
+ return {
16
+ name: record.name,
17
+ id: record.id,
18
+ parentId: record.compartmentId,
19
+ state: record.lifecycleState.toLowerCase(),
20
+ created: record.timeCreated,
21
+ description: record.description,
22
+ tags: ociTags_flatten(record.freeformTags, record.definedTags),
23
+ noun: 'compartment',
24
+ raw: record,
25
+ };
26
+ }
27
+ /** The tenancy as the root container. */
28
+ function container_ofTenancy(record) {
29
+ return {
30
+ name: record.name,
31
+ id: record.id,
32
+ parentId: null,
33
+ state: 'active',
34
+ created: '',
35
+ description: record.description,
36
+ tags: ociTags_flatten(record.freeformTags, record.definedTags),
37
+ noun: 'tenancy',
38
+ raw: record,
39
+ };
40
+ }
41
+ /** A limit value as a limit at its scope. */
42
+ function limit_ofValue(service, record) {
43
+ const scope = record.scopeType.toUpperCase();
44
+ if (scope === 'AD' && record.availabilityDomain !== null) {
45
+ return { service, name: record.name, scope: 'zone', zone: record.availabilityDomain, value: record.value };
46
+ }
47
+ return { service, name: record.name, scope: scope === 'GLOBAL' ? 'global' : 'region', value: record.value };
48
+ }
49
+ /** A shape record as a shape. */
50
+ export function shape_ofRecord(record) {
51
+ const terms = shapeTerms_get(record.shape);
52
+ const cores = record.isFlexible && record.ocpuOptions !== null
53
+ ? { min: record.ocpuOptions.min * terms.vcpuPerOcpu, max: record.ocpuOptions.max * terms.vcpuPerOcpu }
54
+ : { min: (record.ocpus ?? 0) * terms.vcpuPerOcpu, max: (record.ocpus ?? 0) * terms.vcpuPerOcpu };
55
+ const memoryGib = record.isFlexible && record.memoryOptions !== null
56
+ ? { min: record.memoryOptions.minInGBs, max: record.memoryOptions.maxInGBs }
57
+ : { min: record.memoryInGBs ?? 0, max: record.memoryInGBs ?? 0 };
58
+ return {
59
+ name: record.shape,
60
+ family: terms.family,
61
+ flexible: record.isFlexible,
62
+ vcpuPerCore: terms.vcpuPerOcpu,
63
+ cores,
64
+ memoryGib,
65
+ processor: record.processorDescription,
66
+ gpus: record.gpus,
67
+ quotaNames: record.quotaNames,
68
+ raw: record.raw,
69
+ };
70
+ }
71
+ /** Oracle Cloud Infrastructure as a cloud driver. */
72
+ export class OciDriver {
73
+ cloud = 'oci';
74
+ api;
75
+ fetchJson;
76
+ constructor(options) {
77
+ this.api = options.api;
78
+ this.fetchJson = options.fetchJson;
79
+ }
80
+ async identity_get() {
81
+ const credential = this.api.credential_get();
82
+ const [tenancy, user] = await Promise.all([
83
+ this.api.tenancy_get(credential.tenancyId),
84
+ this.api.userName_get(credential.userId),
85
+ ]);
86
+ return { user, tenancy: tenancy.name, tenancyId: tenancy.id, homeRegion: credential.region };
87
+ }
88
+ async root_get() {
89
+ return container_ofTenancy(await this.api.tenancy_get(this.api.credential_get().tenancyId));
90
+ }
91
+ async containers_list(parentId) {
92
+ const records = await this.api.compartments_list(parentId);
93
+ return records
94
+ .filter((record) => record.lifecycleState.toUpperCase() !== 'DELETED')
95
+ .map(container_ofCompartment)
96
+ .sort((a, b) => a.name.localeCompare(b.name));
97
+ }
98
+ async regions_list() {
99
+ return this.api.regionSubscriptions_list(this.api.credential_get().tenancyId);
100
+ }
101
+ async zones_list(region) {
102
+ const names = await this.api.availabilityDomains_list(region, this.api.credential_get().tenancyId);
103
+ return names.map((name) => ({ name }));
104
+ }
105
+ async limitServices_list(region) {
106
+ return this.api.limitServices_list(region, this.api.credential_get().tenancyId);
107
+ }
108
+ async limits_list(region, service) {
109
+ const records = await this.api.limitValues_list(region, this.api.credential_get().tenancyId, service);
110
+ return records.map((record) => limit_ofValue(service, record));
111
+ }
112
+ async limitAvailability_get(region, service, name, zone) {
113
+ return this.api.resourceAvailability_get(region, this.api.credential_get().tenancyId, service, name, zone);
114
+ }
115
+ async shapes_list(region) {
116
+ const records = await this.api.shapes_list(region, this.api.credential_get().tenancyId);
117
+ const seen = new Set();
118
+ const shapes = [];
119
+ for (const record of records) {
120
+ if (seen.has(record.shape))
121
+ continue;
122
+ seen.add(record.shape);
123
+ shapes.push(shape_ofRecord(record));
124
+ }
125
+ return shapes.sort((a, b) => a.name.localeCompare(b.name));
126
+ }
127
+ async prices_list() {
128
+ return ociPrices_read(this.fetchJson);
129
+ }
130
+ }
131
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/cloud/oci/driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @file Oracle's public price list, read into prices per shape.
3
+ *
4
+ * Ported from `harbor-oci`'s `ocipricing.py`: the list is fetched once from
5
+ * Oracle's public API, pay-as-you-go prices are indexed by part number, and
6
+ * each flexible shape's family maps to its core and memory parts. OCI bills
7
+ * an OCPU, which is two vCPU on x86 and the newer Ampere shapes and one on
8
+ * the A1, so the vCPU price is the OCPU price over that ratio. List prices
9
+ * only; a tenancy's commitment discount is not applied.
10
+ *
11
+ * @module
12
+ */
13
+ import type { CloudPrice } from '../driver.js';
14
+ /** Where Oracle publishes its prices. */
15
+ export declare const PRICE_LIST_URL: string;
16
+ /** What the shape list does not say about a flexible shape. */
17
+ export interface ShapeTerms {
18
+ /** A neutral family name. */
19
+ readonly family: string;
20
+ /** vCPU per OCPU. */
21
+ readonly vcpuPerOcpu: number;
22
+ /** The price-list part number for an OCPU-hour. */
23
+ readonly ocpuPart: string;
24
+ /** The price-list part number for a GB-hour of memory. */
25
+ readonly memoryPart: string;
26
+ }
27
+ /** The flexible shapes and their terms, as `harbor-oci` tabled them. */
28
+ export declare const SHAPE_TERMS: Readonly<Record<string, ShapeTerms>>;
29
+ /**
30
+ * A neutral family name for a shape the table does not know: the shape
31
+ * without `VM.`, `Standard.` and `.Flex` (`VM.Standard.X9.Flex` is `X9`).
32
+ */
33
+ export declare function familyName_derive(shape: string): string;
34
+ /** The terms for a shape: the table's, or derived with two vCPU per OCPU and no parts. */
35
+ export declare function shapeTerms_get(shape: string): ShapeTerms;
36
+ /** One product as the price list writes it; only what is read is typed. */
37
+ interface PriceListItem {
38
+ readonly partNumber?: string;
39
+ readonly currencyCodeLocalizations?: ReadonlyArray<{
40
+ readonly currencyCode?: string;
41
+ readonly prices?: ReadonlyArray<{
42
+ readonly model?: string;
43
+ readonly value?: number | string;
44
+ }>;
45
+ }>;
46
+ }
47
+ /**
48
+ * The paid pay-as-you-go price per part number, in the currency read; the
49
+ * highest tier for tiered parts, as `harbor-oci` reads it.
50
+ *
51
+ * @param items - The `items` of the price list reply.
52
+ * @returns USD per the part's own metric.
53
+ */
54
+ export declare function partPrices_index(items: ReadonlyArray<PriceListItem>): Map<string, number>;
55
+ /**
56
+ * Prices per shape from part prices: the shapes whose parts the list holds.
57
+ *
58
+ * @param parts - Price per part number.
59
+ * @returns A price per shape, sorted by shape name.
60
+ */
61
+ export declare function shapePrices_map(parts: ReadonlyMap<string, number>): CloudPrice[];
62
+ /** Fetches a URL as JSON; injected so a test needs no network. */
63
+ export type JsonFetch = (url: string) => Promise<unknown>;
64
+ /** The default fetch: Node's, thirty seconds. */
65
+ export declare const jsonFetch_default: JsonFetch;
66
+ /**
67
+ * Oracle's list prices for the flexible shapes, per hour.
68
+ *
69
+ * @param fetchJson - How the list is fetched.
70
+ * @returns A price per shape the list prices.
71
+ */
72
+ export declare function ociPrices_read(fetchJson?: JsonFetch): Promise<CloudPrice[]>;
73
+ export {};
@@ -0,0 +1,105 @@
1
+ /** Where Oracle publishes its prices. */
2
+ export const PRICE_LIST_URL = 'https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/';
3
+ /** The price model read: paid, hourly. */
4
+ const PRICE_MODEL = 'PAY_AS_YOU_GO';
5
+ /** The currency read. */
6
+ const PRICE_CURRENCY = 'USD';
7
+ /** The flexible shapes and their terms, as `harbor-oci` tabled them. */
8
+ export const SHAPE_TERMS = {
9
+ 'VM.Standard.E3.Flex': { family: 'E3', vcpuPerOcpu: 2, ocpuPart: 'B92306', memoryPart: 'B92307' },
10
+ 'VM.Standard.E4.Flex': { family: 'E4', vcpuPerOcpu: 2, ocpuPart: 'B93113', memoryPart: 'B93114' },
11
+ 'VM.Standard.E5.Flex': { family: 'E5', vcpuPerOcpu: 2, ocpuPart: 'B97384', memoryPart: 'B97385' },
12
+ 'VM.Standard.E6.Flex': { family: 'E6', vcpuPerOcpu: 2, ocpuPart: 'B111129', memoryPart: 'B111130' },
13
+ 'VM.Standard.E6.Ax.Flex': { family: 'E6.Ax', vcpuPerOcpu: 2, ocpuPart: 'B112530', memoryPart: 'B112531' },
14
+ 'VM.Standard.A1.Flex': { family: 'A1', vcpuPerOcpu: 1, ocpuPart: 'B93297', memoryPart: 'B93298' },
15
+ 'VM.Standard.A2.Flex': { family: 'A2', vcpuPerOcpu: 2, ocpuPart: 'B109529', memoryPart: 'B109530' },
16
+ 'VM.Standard.A4.Flex': { family: 'A4', vcpuPerOcpu: 2, ocpuPart: 'B112145', memoryPart: 'B112146' },
17
+ 'VM.Standard.A4.Ax.Flex': { family: 'A4.Ax', vcpuPerOcpu: 2, ocpuPart: 'B112532', memoryPart: 'B112533' },
18
+ 'VM.Standard3.Flex': { family: 'Standard3', vcpuPerOcpu: 2, ocpuPart: 'B94176', memoryPart: 'B94177' },
19
+ 'VM.Standard4.Ax.Flex': { family: 'Standard4.Ax', vcpuPerOcpu: 2, ocpuPart: 'B112141', memoryPart: 'B112142' },
20
+ 'VM.Optimized3.Flex': { family: 'Optimized3', vcpuPerOcpu: 2, ocpuPart: 'B93311', memoryPart: 'B93312' },
21
+ 'VM.DenseIO.E4.Flex': { family: 'DenseIO.E4', vcpuPerOcpu: 2, ocpuPart: 'B93121', memoryPart: 'B93122' },
22
+ 'VM.DenseIO.E5.Flex': { family: 'DenseIO.E5', vcpuPerOcpu: 2, ocpuPart: 'B98202', memoryPart: 'B98203' },
23
+ 'VM.DenseIO.E6.Ax.Flex': { family: 'DenseIO.E6.Ax', vcpuPerOcpu: 2, ocpuPart: 'B112556', memoryPart: 'B112557' },
24
+ };
25
+ /**
26
+ * A neutral family name for a shape the table does not know: the shape
27
+ * without `VM.`, `Standard.` and `.Flex` (`VM.Standard.X9.Flex` is `X9`).
28
+ */
29
+ export function familyName_derive(shape) {
30
+ let name = shape;
31
+ if (name.startsWith('VM.'))
32
+ name = name.slice(3);
33
+ if (name.endsWith('.Flex'))
34
+ name = name.slice(0, -5);
35
+ if (name.startsWith('Standard.'))
36
+ name = name.slice(9);
37
+ return name;
38
+ }
39
+ /** The terms for a shape: the table's, or derived with two vCPU per OCPU and no parts. */
40
+ export function shapeTerms_get(shape) {
41
+ return SHAPE_TERMS[shape] ?? { family: familyName_derive(shape), vcpuPerOcpu: 2, ocpuPart: '', memoryPart: '' };
42
+ }
43
+ /**
44
+ * The paid pay-as-you-go price per part number, in the currency read; the
45
+ * highest tier for tiered parts, as `harbor-oci` reads it.
46
+ *
47
+ * @param items - The `items` of the price list reply.
48
+ * @returns USD per the part's own metric.
49
+ */
50
+ export function partPrices_index(items) {
51
+ const index = new Map();
52
+ for (const item of items) {
53
+ if (item.partNumber === undefined)
54
+ continue;
55
+ for (const localization of item.currencyCodeLocalizations ?? []) {
56
+ if (localization.currencyCode !== undefined && localization.currencyCode !== PRICE_CURRENCY)
57
+ continue;
58
+ const values = (localization.prices ?? [])
59
+ .filter((price) => price.model === PRICE_MODEL)
60
+ .map((price) => Number(price.value))
61
+ .filter((value) => Number.isFinite(value));
62
+ if (values.length > 0)
63
+ index.set(item.partNumber, Math.max(...values));
64
+ }
65
+ }
66
+ return index;
67
+ }
68
+ /**
69
+ * Prices per shape from part prices: the shapes whose parts the list holds.
70
+ *
71
+ * @param parts - Price per part number.
72
+ * @returns A price per shape, sorted by shape name.
73
+ */
74
+ export function shapePrices_map(parts) {
75
+ const prices = [];
76
+ for (const [shape, terms] of Object.entries(SHAPE_TERMS)) {
77
+ const ocpu = parts.get(terms.ocpuPart);
78
+ const memory = parts.get(terms.memoryPart);
79
+ if (ocpu === undefined || memory === undefined)
80
+ continue;
81
+ prices.push({ shape, vcpuHour: ocpu / terms.vcpuPerOcpu, gibHour: memory, currency: PRICE_CURRENCY });
82
+ }
83
+ return prices.sort((a, b) => a.shape.localeCompare(b.shape));
84
+ }
85
+ /** The default fetch: Node's, thirty seconds. */
86
+ export const jsonFetch_default = async (url) => {
87
+ const response = await fetch(url, { signal: AbortSignal.timeout(30_000) });
88
+ if (!response.ok)
89
+ throw new Error(`price list: ${response.status} ${response.statusText}`);
90
+ return response.json();
91
+ };
92
+ /**
93
+ * Oracle's list prices for the flexible shapes, per hour.
94
+ *
95
+ * @param fetchJson - How the list is fetched.
96
+ * @returns A price per shape the list prices.
97
+ */
98
+ export async function ociPrices_read(fetchJson = jsonFetch_default) {
99
+ const reply = await fetchJson(PRICE_LIST_URL);
100
+ const items = typeof reply === 'object' && reply !== null ? reply.items : undefined;
101
+ if (!Array.isArray(items))
102
+ throw new Error('price list: no items in the reply');
103
+ return shapePrices_map(partPrices_index(items));
104
+ }
105
+ //# sourceMappingURL=prices.js.map