@highstate/yandex 0.18.0 → 0.20.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.
- package/dist/{chunk-MK37EG4O.js → chunk-ISIWD2MZ.js} +5 -5
- package/dist/chunk-ISIWD2MZ.js.map +1 -0
- package/dist/connection/index.js +18 -9
- package/dist/connection/index.js.map +1 -1
- package/dist/disk/index.js +9 -5
- package/dist/disk/index.js.map +1 -1
- package/dist/existing-image/index.js +15 -7
- package/dist/existing-image/index.js.map +1 -1
- package/dist/highstate.manifest.json +5 -4
- package/dist/instance-group/index.js +204 -0
- package/dist/instance-group/index.js.map +1 -0
- package/dist/virtual-machine/index.js +29 -11
- package/dist/virtual-machine/index.js.map +1 -1
- package/package.json +10 -9
- package/dist/chunk-MK37EG4O.js.map +0 -1
|
@@ -2,12 +2,12 @@ import { toPromise, output } from '@highstate/pulumi';
|
|
|
2
2
|
import { Provider } from '@highstate/yandex-sdk';
|
|
3
3
|
|
|
4
4
|
// src/provider.ts
|
|
5
|
-
async function createProvider(connection) {
|
|
5
|
+
async function createProvider(connection, cloudId) {
|
|
6
6
|
return await toPromise(
|
|
7
7
|
output(connection).apply((connection2) => {
|
|
8
8
|
return new Provider(connection2.cloudId, {
|
|
9
|
-
serviceAccountKeyFile: connection2.
|
|
10
|
-
cloudId: connection2.cloudId,
|
|
9
|
+
serviceAccountKeyFile: connection2.authorizedKeyJson.value,
|
|
10
|
+
cloudId: cloudId ?? connection2.cloudId,
|
|
11
11
|
folderId: connection2.defaultFolderId,
|
|
12
12
|
zone: connection2.defaultZone,
|
|
13
13
|
regionId: connection2.regionId
|
|
@@ -17,5 +17,5 @@ async function createProvider(connection) {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export { createProvider };
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
21
|
-
//# sourceMappingURL=chunk-
|
|
20
|
+
//# sourceMappingURL=chunk-ISIWD2MZ.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-ISIWD2MZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider.ts"],"names":["connection"],"mappings":";;;;AAKA,eAAsB,cAAA,CACpB,YACA,OAAA,EACmB;AACnB,EAAA,OAAO,MAAM,SAAA;AAAA,IACX,MAAA,CAAO,UAAU,CAAA,CAAE,KAAA,CAAM,CAAAA,WAAAA,KAAc;AACrC,MAAA,OAAO,IAAI,QAAA,CAASA,WAAAA,CAAW,OAAA,EAAS;AAAA,QACtC,qBAAA,EAAuBA,YAAW,iBAAA,CAAkB,KAAA;AAAA,QACpD,OAAA,EAAS,WAAWA,WAAAA,CAAW,OAAA;AAAA,QAC/B,UAAUA,WAAAA,CAAW,eAAA;AAAA,QACrB,MAAMA,WAAAA,CAAW,WAAA;AAAA,QACjB,UAAUA,WAAAA,CAAW;AAAA,OACtB,CAAA;AAAA,IACH,CAAC;AAAA,GACH;AACF","file":"chunk-ISIWD2MZ.js","sourcesContent":["import type { yandex } from \"@highstate/library\"\nimport type { Input } from \"@highstate/pulumi\"\nimport { output, toPromise } from \"@highstate/pulumi\"\nimport { Provider } from \"@highstate/yandex-sdk\"\n\nexport async function createProvider(\n connection: yandex.Connection,\n cloudId?: Input<string>,\n): Promise<Provider> {\n return await toPromise(\n output(connection).apply(connection => {\n return new Provider(connection.cloudId, {\n serviceAccountKeyFile: connection.authorizedKeyJson.value,\n cloudId: cloudId ?? connection.cloudId,\n folderId: connection.defaultFolderId,\n zone: connection.defaultZone,\n regionId: connection.regionId,\n })\n }),\n )\n}\n"]}
|
package/dist/connection/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { yandex } from '@highstate/library';
|
|
2
|
-
import { forUnit, toPromise,
|
|
2
|
+
import { forUnit, toPromise, makeEntityOutput } from '@highstate/pulumi';
|
|
3
3
|
import { Provider, getIamServiceAccount, getResourcemanagerFolder } from '@highstate/yandex-sdk';
|
|
4
4
|
|
|
5
5
|
// src/connection/index.ts
|
|
6
6
|
var { args, secrets, outputs } = forUnit(yandex.connection);
|
|
7
|
-
var serviceAccountKeyFileString = await toPromise(secrets.
|
|
7
|
+
var serviceAccountKeyFileString = await toPromise(secrets.authorizedKeyJson);
|
|
8
8
|
var keyFileData = JSON.parse(serviceAccountKeyFileString);
|
|
9
9
|
var serviceAccountId = keyFileData.service_account_id;
|
|
10
10
|
var provider = new Provider("yandex", {
|
|
@@ -20,17 +20,26 @@ var folder = await getResourcemanagerFolder({ folderId: serviceAccount.folderId
|
|
|
20
20
|
if (!folder.cloudId) {
|
|
21
21
|
throw new Error("Could not determine cloud ID from folder");
|
|
22
22
|
}
|
|
23
|
-
var connection =
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
var connection = makeEntityOutput({
|
|
24
|
+
entity: yandex.connectionEntity,
|
|
25
|
+
identity: keyFileData.service_account_id,
|
|
26
|
+
meta: {
|
|
27
|
+
title: serviceAccount.name,
|
|
28
|
+
description: `Authorized as SA "${serviceAccount.name}" (ID: ${serviceAccount.id}) in folder "${folder.name}" (ID: ${folder.id})`
|
|
29
|
+
},
|
|
30
|
+
value: {
|
|
31
|
+
authorizedKeyJson: secrets.authorizedKeyJson,
|
|
32
|
+
cloudId: folder.cloudId,
|
|
33
|
+
defaultFolderId: serviceAccount.folderId,
|
|
34
|
+
defaultZone: args.region.defaultZone,
|
|
35
|
+
regionId: args.region.id,
|
|
36
|
+
serviceAccountId: serviceAccount.id
|
|
37
|
+
}
|
|
29
38
|
});
|
|
30
39
|
var connection_default = outputs({
|
|
31
40
|
connection,
|
|
32
41
|
$statusFields: {
|
|
33
|
-
|
|
42
|
+
defaultCloudId: {
|
|
34
43
|
meta: {
|
|
35
44
|
icon: "mdi:cloud"
|
|
36
45
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/connection/index.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/connection/index.ts"],"names":[],"mappings":";;;;;AAIA,IAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAQ,GAAI,OAAA,CAAQ,OAAO,UAAU,CAAA;AAO5D,IAAM,2BAAA,GAA8B,MAAM,SAAA,CAAU,OAAA,CAAQ,iBAAiB,CAAA;AAC7E,IAAM,WAAA,GAAqC,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACjF,IAAM,mBAAmB,WAAA,CAAY,kBAAA;AAGrC,IAAM,QAAA,GAAW,IAAI,QAAA,CAAS,QAAA,EAAU;AAAA,EACtC,qBAAA,EAAuB,2BAAA;AAAA,EACvB,IAAA,EAAM,KAAK,MAAA,CAAO,WAAA;AAAA,EAClB,QAAA,EAAU,KAAK,MAAA,CAAO;AACxB,CAAC,CAAA;AAGD,IAAM,iBAAiB,MAAM,oBAAA;AAAA,EAC3B,EAAE,gBAAA,EAAmC;AAAA,EACrC,EAAE,QAAA;AACJ,CAAA;AAGA,IAAM,MAAA,GAAS,MAAM,wBAAA,CAAyB,EAAE,QAAA,EAAU,eAAe,QAAA,EAAS,EAAG,EAAE,QAAA,EAAU,CAAA;AACjG,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,EAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAC5D;AAEA,IAAM,aAAa,gBAAA,CAAiB;AAAA,EAClC,QAAQ,MAAA,CAAO,gBAAA;AAAA,EACf,UAAU,WAAA,CAAY,kBAAA;AAAA,EACtB,IAAA,EAAM;AAAA,IACJ,OAAO,cAAA,CAAe,IAAA;AAAA,IACtB,WAAA,EAAa,CAAA,kBAAA,EAAqB,cAAA,CAAe,IAAI,CAAA,OAAA,EAAU,cAAA,CAAe,EAAE,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAI,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,GAChI;AAAA,EACA,KAAA,EAAO;AAAA,IACL,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,IAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,iBAAiB,cAAA,CAAe,QAAA;AAAA,IAChC,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,IACzB,QAAA,EAAU,KAAK,MAAA,CAAO,EAAA;AAAA,IACtB,kBAAkB,cAAA,CAAe;AAAA;AAErC,CAAC,CAAA;AAED,IAAO,qBAAQ,OAAA,CAAQ;AAAA,EACrB,UAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,OAAO,UAAA,CAAW;AAAA,KACpB;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,OAAO,UAAA,CAAW;AAAA;AACpB;AAEJ,CAAC","file":"index.js","sourcesContent":["import { yandex } from \"@highstate/library\"\nimport { forUnit, makeEntityOutput, toPromise } from \"@highstate/pulumi\"\nimport { getIamServiceAccount, getResourcemanagerFolder, Provider } from \"@highstate/yandex-sdk\"\n\nconst { args, secrets, outputs } = forUnit(yandex.connection)\n\n// parse service account key file to extract service account ID\ntype ServiceAccountKeyFile = {\n service_account_id: string\n}\n\nconst serviceAccountKeyFileString = await toPromise(secrets.authorizedKeyJson)\nconst keyFileData: ServiceAccountKeyFile = JSON.parse(serviceAccountKeyFileString)\nconst serviceAccountId = keyFileData.service_account_id\n\n// create provider for auto-discovery\nconst provider = new Provider(\"yandex\", {\n serviceAccountKeyFile: serviceAccountKeyFileString,\n zone: args.region.defaultZone,\n regionId: args.region.id,\n})\n\n// auto-discover service account details to get folder and cloud\nconst serviceAccount = await getIamServiceAccount(\n { serviceAccountId: serviceAccountId },\n { provider },\n)\n\n// auto-discover cloud ID from folder\nconst folder = await getResourcemanagerFolder({ folderId: serviceAccount.folderId }, { provider })\nif (!folder.cloudId) {\n throw new Error(\"Could not determine cloud ID from folder\")\n}\n\nconst connection = makeEntityOutput({\n entity: yandex.connectionEntity,\n identity: keyFileData.service_account_id,\n meta: {\n title: serviceAccount.name,\n description: `Authorized as SA \"${serviceAccount.name}\" (ID: ${serviceAccount.id}) in folder \"${folder.name}\" (ID: ${folder.id})`,\n },\n value: {\n authorizedKeyJson: secrets.authorizedKeyJson,\n cloudId: folder.cloudId,\n defaultFolderId: serviceAccount.folderId,\n defaultZone: args.region.defaultZone,\n regionId: args.region.id,\n serviceAccountId: serviceAccount.id,\n },\n})\n\nexport default outputs({\n connection,\n\n $statusFields: {\n defaultCloudId: {\n meta: {\n icon: \"mdi:cloud\",\n },\n value: connection.cloudId,\n },\n defaultFolderId: {\n meta: {\n icon: \"mdi:folder\",\n },\n value: connection.defaultFolderId,\n },\n },\n})\n"]}
|
package/dist/disk/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createProvider } from '../chunk-
|
|
1
|
+
import { createProvider } from '../chunk-ISIWD2MZ.js';
|
|
2
2
|
import { yandex } from '@highstate/library';
|
|
3
|
-
import { forUnit, getResourceComment } from '@highstate/pulumi';
|
|
3
|
+
import { forUnit, getResourceComment, makeEntityOutput } from '@highstate/pulumi';
|
|
4
4
|
import { ComputeDisk } from '@highstate/yandex-sdk';
|
|
5
5
|
|
|
6
6
|
var { name, args, inputs, outputs } = forUnit(yandex.disk);
|
|
@@ -18,9 +18,13 @@ var disk = new ComputeDisk(
|
|
|
18
18
|
{ provider, protect: true }
|
|
19
19
|
);
|
|
20
20
|
var disk_default = outputs({
|
|
21
|
-
disk: {
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
disk: makeEntityOutput({
|
|
22
|
+
entity: yandex.diskEntity,
|
|
23
|
+
identity: disk.id,
|
|
24
|
+
value: {
|
|
25
|
+
id: disk.id
|
|
26
|
+
}
|
|
27
|
+
}),
|
|
24
28
|
$statusFields: {
|
|
25
29
|
id: disk.id
|
|
26
30
|
}
|
package/dist/disk/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/disk/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,OAAO,IAAI,CAAA;AAE3D,IAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAEvD,IAAM,QAAA,GAAW,KAAK,QAAA,IAAY,IAAA;AAElC,IAAM,OAAO,IAAI,WAAA;AAAA,EACf,MAAA;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,aAAa,kBAAA,EAAmB;AAAA,IAChC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,EAAE,QAAA,EAAU,OAAA,EAAS,IAAA;AACvB,CAAA;AAEA,IAAO,eAAQ,OAAA,CAAQ;AAAA,EACrB,IAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/disk/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,OAAO,IAAI,CAAA;AAE3D,IAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAEvD,IAAM,QAAA,GAAW,KAAK,QAAA,IAAY,IAAA;AAElC,IAAM,OAAO,IAAI,WAAA;AAAA,EACf,MAAA;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,aAAa,kBAAA,EAAmB;AAAA,IAChC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,EAAE,QAAA,EAAU,OAAA,EAAS,IAAA;AACvB,CAAA;AAEA,IAAO,eAAQ,OAAA,CAAQ;AAAA,EACrB,MAAM,gBAAA,CAAiB;AAAA,IACrB,QAAQ,MAAA,CAAO,UAAA;AAAA,IACf,UAAU,IAAA,CAAK,EAAA;AAAA,IACf,KAAA,EAAO;AAAA,MACL,IAAI,IAAA,CAAK;AAAA;AACX,GACD,CAAA;AAAA,EAED,aAAA,EAAe;AAAA,IACb,IAAI,IAAA,CAAK;AAAA;AAEb,CAAC","file":"index.js","sourcesContent":["import { yandex } from \"@highstate/library\"\nimport { forUnit, getResourceComment, makeEntityOutput } from \"@highstate/pulumi\"\nimport { ComputeDisk } from \"@highstate/yandex-sdk\"\nimport { createProvider } from \"../provider\"\n\nconst { name, args, inputs, outputs } = forUnit(yandex.disk)\n\nconst provider = await createProvider(inputs.connection)\n\nconst diskName = args.diskName ?? name\n\nconst disk = new ComputeDisk(\n \"disk\",\n {\n name: diskName,\n description: getResourceComment(),\n type: args.type,\n size: args.size,\n allowRecreate: false,\n },\n { provider, protect: true },\n)\n\nexport default outputs({\n disk: makeEntityOutput({\n entity: yandex.diskEntity,\n identity: disk.id,\n value: {\n id: disk.id,\n },\n }),\n\n $statusFields: {\n id: disk.id,\n },\n})\n"]}
|
|
@@ -1,17 +1,25 @@
|
|
|
1
|
-
import { createProvider } from '../chunk-
|
|
1
|
+
import { createProvider } from '../chunk-ISIWD2MZ.js';
|
|
2
2
|
import { yandex } from '@highstate/library';
|
|
3
|
-
import { forUnit } from '@highstate/pulumi';
|
|
3
|
+
import { forUnit, makeEntityOutput } from '@highstate/pulumi';
|
|
4
4
|
import { getComputeImage } from '@highstate/yandex-sdk';
|
|
5
5
|
|
|
6
6
|
var { args, inputs, outputs } = forUnit(yandex.existingImage);
|
|
7
7
|
var provider = await createProvider(inputs.connection);
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
var ycImage = await getComputeImage({ imageId: args.id }, { provider });
|
|
9
|
+
var image = makeEntityOutput({
|
|
10
|
+
entity: yandex.imageEntity,
|
|
11
|
+
identity: ycImage.id,
|
|
12
|
+
meta: {
|
|
13
|
+
title: ycImage.name
|
|
12
14
|
},
|
|
15
|
+
value: {
|
|
16
|
+
id: ycImage.id
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var existing_image_default = outputs({
|
|
20
|
+
image,
|
|
13
21
|
$statusFields: {
|
|
14
|
-
name:
|
|
22
|
+
name: ycImage.name
|
|
15
23
|
}
|
|
16
24
|
});
|
|
17
25
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/existing-image/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,OAAO,aAAa,CAAA;AAE9D,IAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAEvD,IAAM,
|
|
1
|
+
{"version":3,"sources":["../../src/existing-image/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,OAAO,aAAa,CAAA;AAE9D,IAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAEvD,IAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,EAAE,OAAA,EAAS,KAAK,EAAA,EAAG,EAAG,EAAE,QAAA,EAAU,CAAA;AAExE,IAAM,QAAQ,gBAAA,CAAiB;AAAA,EAC7B,QAAQ,MAAA,CAAO,WAAA;AAAA,EACf,UAAU,OAAA,CAAQ,EAAA;AAAA,EAClB,IAAA,EAAM;AAAA,IACJ,OAAO,OAAA,CAAQ;AAAA,GACjB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAI,OAAA,CAAQ;AAAA;AAEhB,CAAC,CAAA;AAED,IAAO,yBAAQ,OAAA,CAAQ;AAAA,EACrB,KAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,MAAM,OAAA,CAAQ;AAAA;AAElB,CAAC","file":"index.js","sourcesContent":["import { yandex } from \"@highstate/library\"\nimport { forUnit, makeEntityOutput } from \"@highstate/pulumi\"\nimport { getComputeImage } from \"@highstate/yandex-sdk\"\nimport { createProvider } from \"../provider\"\n\nconst { args, inputs, outputs } = forUnit(yandex.existingImage)\n\nconst provider = await createProvider(inputs.connection)\n\nconst ycImage = await getComputeImage({ imageId: args.id }, { provider })\n\nconst image = makeEntityOutput({\n entity: yandex.imageEntity,\n identity: ycImage.id,\n meta: {\n title: ycImage.name,\n },\n value: {\n id: ycImage.id,\n },\n})\n\nexport default outputs({\n image,\n $statusFields: {\n name: ycImage.name,\n },\n})\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"sourceHashes": {
|
|
3
|
-
"./dist/connection/index.js":
|
|
4
|
-
"./dist/disk/index.js":
|
|
5
|
-
"./dist/existing-image/index.js":
|
|
6
|
-
"./dist/virtual-machine/index.js":
|
|
3
|
+
"./dist/connection/index.js": 1714431882,
|
|
4
|
+
"./dist/disk/index.js": 3931067747,
|
|
5
|
+
"./dist/existing-image/index.js": 2980200400,
|
|
6
|
+
"./dist/virtual-machine/index.js": 2819876153,
|
|
7
|
+
"./dist/instance-group/index.js": 3438885092
|
|
7
8
|
}
|
|
8
9
|
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { createProvider } from '../chunk-ISIWD2MZ.js';
|
|
2
|
+
import { generateSshPrivateKey, sshPrivateKeyToKeyPair, generatePassword, parseEndpoint, createServerBundle, l3EndpointToString } from '@highstate/common';
|
|
3
|
+
import { trimIndentation } from '@highstate/contract';
|
|
4
|
+
import { yandex } from '@highstate/library';
|
|
5
|
+
import { forUnit, toPromise, interpolate, getResourceComment } from '@highstate/pulumi';
|
|
6
|
+
import { getVpcSubnet, KmsSymmetricKey, ComputeDisk, VpcAddress, ComputeInstanceGroup } from '@highstate/yandex-sdk';
|
|
7
|
+
|
|
8
|
+
var { name, args, getSecret, inputs, outputs } = forUnit(yandex.instanceGroup);
|
|
9
|
+
var groupName = args.groupName ?? name;
|
|
10
|
+
var provider = await createProvider(inputs.connection, args.cloudId);
|
|
11
|
+
var sshKeyPair = inputs.sshKeyPair ?? getSecret("sshPrivateKey", generateSshPrivateKey).apply(sshPrivateKeyToKeyPair);
|
|
12
|
+
var rootPassword = getSecret("rootPassword", generatePassword);
|
|
13
|
+
var subnetId = args.network.subnetId;
|
|
14
|
+
if (!subnetId) {
|
|
15
|
+
const defaultSubnetName = await toPromise(interpolate`default-${inputs.connection.defaultZone}`);
|
|
16
|
+
const subnet = await getVpcSubnet(
|
|
17
|
+
{
|
|
18
|
+
folderId: await toPromise(inputs.connection.defaultFolderId),
|
|
19
|
+
name: defaultSubnetName
|
|
20
|
+
},
|
|
21
|
+
{ provider }
|
|
22
|
+
);
|
|
23
|
+
if (!subnet.id) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
`Could not find default subnet '${defaultSubnetName}' in zone ${inputs.connection.defaultZone}`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
subnetId = subnet.id;
|
|
29
|
+
}
|
|
30
|
+
var encryptionKeyId;
|
|
31
|
+
if (args.bootDisk.encrypted) {
|
|
32
|
+
const encryptionKey = new KmsSymmetricKey(
|
|
33
|
+
"encryption-key",
|
|
34
|
+
{
|
|
35
|
+
name: groupName,
|
|
36
|
+
description: getResourceComment(),
|
|
37
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId
|
|
38
|
+
},
|
|
39
|
+
{ provider }
|
|
40
|
+
);
|
|
41
|
+
encryptionKeyId = encryptionKey.id;
|
|
42
|
+
}
|
|
43
|
+
var disks = Array.from({ length: args.size }, (_, i) => {
|
|
44
|
+
return new ComputeDisk(
|
|
45
|
+
`disk-${i + 1}`,
|
|
46
|
+
{
|
|
47
|
+
name: `${groupName}-${i + 1}`,
|
|
48
|
+
type: args.bootDisk.type,
|
|
49
|
+
size: args.bootDisk.size,
|
|
50
|
+
imageId: inputs.image.id,
|
|
51
|
+
allowRecreate: false,
|
|
52
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId,
|
|
53
|
+
zone: inputs.connection.defaultZone,
|
|
54
|
+
kmsKeyId: encryptionKeyId
|
|
55
|
+
},
|
|
56
|
+
{ provider, ignoreChanges: ["imageId"] }
|
|
57
|
+
);
|
|
58
|
+
});
|
|
59
|
+
var internalAddresses = Array.from({ length: args.size }, (_, i) => {
|
|
60
|
+
return new VpcAddress(
|
|
61
|
+
`internal-address-${i + 1}`,
|
|
62
|
+
{
|
|
63
|
+
name: `${groupName}-internal-${i + 1}`,
|
|
64
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId,
|
|
65
|
+
description: getResourceComment(),
|
|
66
|
+
internalIpv4Address: {
|
|
67
|
+
subnetId
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{ provider }
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
var publicAddresses;
|
|
74
|
+
if (args.network.assignPublicIp && args.network.reservePublicIp) {
|
|
75
|
+
publicAddresses = Array.from({ length: args.size }, (_, i) => {
|
|
76
|
+
return new VpcAddress(
|
|
77
|
+
`address-${i + 1}`,
|
|
78
|
+
{
|
|
79
|
+
name: `${groupName}-${i + 1}`,
|
|
80
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId,
|
|
81
|
+
description: getResourceComment(),
|
|
82
|
+
externalIpv4Address: {
|
|
83
|
+
zoneId: inputs.connection.defaultZone
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{ provider }
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
var userData = interpolate`
|
|
91
|
+
#cloud-config
|
|
92
|
+
hostname: ${groupName}-{instance.index}
|
|
93
|
+
users:
|
|
94
|
+
- name: root
|
|
95
|
+
ssh-authorized-keys:
|
|
96
|
+
- ${sshKeyPair.publicKey}
|
|
97
|
+
sudo: ALL=(ALL) NOPASSWD:ALL
|
|
98
|
+
`.apply(trimIndentation);
|
|
99
|
+
var instanceGroup = new ComputeInstanceGroup(
|
|
100
|
+
"instance-group",
|
|
101
|
+
{
|
|
102
|
+
name: groupName,
|
|
103
|
+
description: getResourceComment(),
|
|
104
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId,
|
|
105
|
+
allocationPolicy: {
|
|
106
|
+
zones: [inputs.connection.defaultZone]
|
|
107
|
+
},
|
|
108
|
+
deployPolicy: {
|
|
109
|
+
maxExpansion: 0,
|
|
110
|
+
maxUnavailable: 1
|
|
111
|
+
},
|
|
112
|
+
scalePolicy: {
|
|
113
|
+
fixedScale: {
|
|
114
|
+
size: args.size
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
instanceTemplate: {
|
|
118
|
+
name: `${groupName}-{instance.index}`,
|
|
119
|
+
description: getResourceComment(),
|
|
120
|
+
platformId: args.platformId,
|
|
121
|
+
resources: {
|
|
122
|
+
cores: args.resources.cores,
|
|
123
|
+
memory: args.resources.memory,
|
|
124
|
+
coreFraction: args.resources.coreFraction
|
|
125
|
+
},
|
|
126
|
+
schedulingPolicy: {
|
|
127
|
+
preemptible: args.preemptible
|
|
128
|
+
},
|
|
129
|
+
bootDisk: {
|
|
130
|
+
diskId: `{disk_{instance.index}}`
|
|
131
|
+
},
|
|
132
|
+
networkInterfaces: [
|
|
133
|
+
{
|
|
134
|
+
subnetIds: [subnetId],
|
|
135
|
+
ipAddress: `{internal_address_{instance.index}}`,
|
|
136
|
+
nat: args.network.assignPublicIp,
|
|
137
|
+
natIpAddress: publicAddresses ? `{address_{instance.index}}` : void 0
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
metadata: {
|
|
141
|
+
"user-data": userData
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
variables: {
|
|
145
|
+
...Object.fromEntries(disks.map((_, i) => [`disk_${i + 1}`, disks[i].id])),
|
|
146
|
+
...Object.fromEntries(
|
|
147
|
+
internalAddresses.map((_, i) => [
|
|
148
|
+
`internal_address_${i + 1}`,
|
|
149
|
+
internalAddresses[i].internalIpv4Address.apply((a) => a.address)
|
|
150
|
+
])
|
|
151
|
+
),
|
|
152
|
+
...publicAddresses ? Object.fromEntries(
|
|
153
|
+
publicAddresses.map((_, i) => [
|
|
154
|
+
`address_${i + 1}`,
|
|
155
|
+
publicAddresses[i].externalIpv4Address.apply((a) => a.address)
|
|
156
|
+
])
|
|
157
|
+
) : {}
|
|
158
|
+
},
|
|
159
|
+
serviceAccountId: inputs.connection.serviceAccountId
|
|
160
|
+
},
|
|
161
|
+
{ provider }
|
|
162
|
+
);
|
|
163
|
+
var terminals = [];
|
|
164
|
+
var instances = await toPromise(instanceGroup.instances);
|
|
165
|
+
var servers = await toPromise(
|
|
166
|
+
instances.map(async (instance, i) => {
|
|
167
|
+
const firstInterface = instance.networkInterfaces[0];
|
|
168
|
+
const publicIp = args.network.assignPublicIp ? firstInterface?.natIpAddress : firstInterface?.ipAddress;
|
|
169
|
+
if (!publicIp) {
|
|
170
|
+
throw new Error("No IP address assigned to instance");
|
|
171
|
+
}
|
|
172
|
+
const endpoint = parseEndpoint(publicIp, 3);
|
|
173
|
+
const { server, terminal } = await createServerBundle({
|
|
174
|
+
name: `${groupName}-${i + 1}`,
|
|
175
|
+
endpoints: [endpoint],
|
|
176
|
+
sshArgs: args.ssh,
|
|
177
|
+
sshPassword: rootPassword,
|
|
178
|
+
sshKeyPair
|
|
179
|
+
});
|
|
180
|
+
if (terminal) {
|
|
181
|
+
const rawTerminal = await toPromise(terminal);
|
|
182
|
+
terminals.push({
|
|
183
|
+
...rawTerminal,
|
|
184
|
+
name: `ssh-${i + 1}`,
|
|
185
|
+
meta: {
|
|
186
|
+
title: `Shell (${i + 1})`
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return server;
|
|
191
|
+
})
|
|
192
|
+
);
|
|
193
|
+
var instance_group_default = outputs({
|
|
194
|
+
servers,
|
|
195
|
+
$statusFields: {
|
|
196
|
+
id: instanceGroup.id,
|
|
197
|
+
endpoints: servers.flatMap((server) => server.endpoints).map(l3EndpointToString)
|
|
198
|
+
},
|
|
199
|
+
$terminals: terminals
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
export { instance_group_default as default };
|
|
203
|
+
//# sourceMappingURL=index.js.map
|
|
204
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/instance-group/index.ts"],"names":[],"mappings":";;;;;;;AAoBA,IAAM,EAAE,MAAM,IAAA,EAAM,SAAA,EAAW,QAAQ,OAAA,EAAQ,GAAI,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA;AAE/E,IAAM,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AAEpC,IAAM,WAAW,MAAM,cAAA,CAAe,MAAA,CAAO,UAAA,EAAY,KAAK,OAAO,CAAA;AAErE,IAAM,UAAA,GACJ,OAAO,UAAA,IACP,SAAA,CAAU,iBAAiB,qBAAqB,CAAA,CAAE,MAAM,sBAAsB,CAAA;AAEhF,IAAM,YAAA,GAAe,SAAA,CAAU,cAAA,EAAgB,gBAAgB,CAAA;AAG/D,IAAI,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA;AAC5B,IAAI,CAAC,QAAA,EAAU;AACb,EAAA,MAAM,oBAAoB,MAAM,SAAA,CAAU,sBAAsB,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,CAAE,CAAA;AAC/F,EAAA,MAAM,SAAS,MAAM,YAAA;AAAA,IACnB;AAAA,MACE,QAAA,EAAU,MAAM,SAAA,CAAU,MAAA,CAAO,WAAW,eAAe,CAAA;AAAA,MAC3D,IAAA,EAAM;AAAA,KACR;AAAA,IACA,EAAE,QAAA;AAAS,GACb;AAEA,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,+BAAA,EAAkC,iBAAiB,CAAA,UAAA,EAAa,MAAA,CAAO,WAAW,WAAW,CAAA;AAAA,KAC/F;AAAA,EACF;AAEA,EAAA,QAAA,GAAW,MAAA,CAAO,EAAA;AACpB;AAGA,IAAI,eAAA;AACJ,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,EAAA,MAAM,gBAAgB,IAAI,eAAA;AAAA,IACxB,gBAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,aAAa,kBAAA,EAAmB;AAAA,MAChC,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,UAAA,CAAW;AAAA,KAC/C;AAAA,IACA,EAAE,QAAA;AAAS,GACb;AAEA,EAAA,eAAA,GAAkB,aAAA,CAAc,EAAA;AAClC;AAGA,IAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAK,IAAA,EAAK,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AACxD,EAAA,OAAO,IAAI,WAAA;AAAA,IACT,CAAA,KAAA,EAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,IACb;AAAA,MACE,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA;AAAA,MAC3B,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,MACpB,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,MACpB,OAAA,EAAS,OAAO,KAAA,CAAM,EAAA;AAAA,MACtB,aAAA,EAAe,KAAA;AAAA,MACf,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,UAAA,CAAW,eAAA;AAAA,MAC7C,IAAA,EAAM,OAAO,UAAA,CAAW,WAAA;AAAA,MACxB,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,EAAE,QAAA,EAAU,aAAA,EAAe,CAAC,SAAS,CAAA;AAAE,GACzC;AACF,CAAC,CAAA;AAGD,IAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAK,IAAA,EAAK,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AACpE,EAAA,OAAO,IAAI,UAAA;AAAA,IACT,CAAA,iBAAA,EAAoB,IAAI,CAAC,CAAA,CAAA;AAAA,IACzB;AAAA,MACE,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,UAAA,EAAa,IAAI,CAAC,CAAA,CAAA;AAAA,MACpC,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,UAAA,CAAW,eAAA;AAAA,MAC7C,aAAa,kBAAA,EAAmB;AAAA,MAChC,mBAAA,EAAqB;AAAA,QACnB;AAAA;AACF,KACF;AAAA,IACA,EAAE,QAAA;AAAS,GACb;AACF,CAAC,CAAA;AAGD,IAAI,eAAA;AAEJ,IAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,IAAkB,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAC/D,EAAA,eAAA,GAAkB,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,KAAK,IAAA,EAAK,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5D,IAAA,OAAO,IAAI,UAAA;AAAA,MACT,CAAA,QAAA,EAAW,IAAI,CAAC,CAAA,CAAA;AAAA,MAChB;AAAA,QACE,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA;AAAA,QAC3B,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,UAAA,CAAW,eAAA;AAAA,QAC7C,aAAa,kBAAA,EAAmB;AAAA,QAChC,mBAAA,EAAqB;AAAA,UACnB,MAAA,EAAQ,OAAO,UAAA,CAAW;AAAA;AAC5B,OACF;AAAA,MACA,EAAE,QAAA;AAAS,KACb;AAAA,EACF,CAAC,CAAA;AACH;AAGA,IAAM,QAAA,GAAW,WAAA;AAAA;AAAA,YAAA,EAEH,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAIX,WAAW,SAAS;AAAA;AAAA,CAAA,CAE9B,MAAM,eAAe,CAAA;AAEvB,IAAM,gBAAgB,IAAI,oBAAA;AAAA,EACxB,gBAAA;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,aAAa,kBAAA,EAAmB;AAAA,IAChC,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,UAAA,CAAW,eAAA;AAAA,IAE7C,gBAAA,EAAkB;AAAA,MAChB,KAAA,EAAO,CAAC,MAAA,CAAO,UAAA,CAAW,WAAW;AAAA,KACvC;AAAA,IAEA,YAAA,EAAc;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,cAAA,EAAgB;AAAA,KAClB;AAAA,IAEA,WAAA,EAAa;AAAA,MACX,UAAA,EAAY;AAAA,QACV,MAAM,IAAA,CAAK;AAAA;AACb,KACF;AAAA,IAEA,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,GAAG,SAAS,CAAA,iBAAA,CAAA;AAAA,MAClB,aAAa,kBAAA,EAAmB;AAAA,MAChC,YAAY,IAAA,CAAK,UAAA;AAAA,MAEjB,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,KAAK,SAAA,CAAU,KAAA;AAAA,QACtB,MAAA,EAAQ,KAAK,SAAA,CAAU,MAAA;AAAA,QACvB,YAAA,EAAc,KAAK,SAAA,CAAU;AAAA,OAC/B;AAAA,MAEA,gBAAA,EAAkB;AAAA,QAChB,aAAa,IAAA,CAAK;AAAA,OACpB;AAAA,MAEA,QAAA,EAAU;AAAA,QACR,MAAA,EAAQ,CAAA,uBAAA;AAAA,OACV;AAAA,MAEA,iBAAA,EAAmB;AAAA,QACjB;AAAA,UACE,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,UACpB,SAAA,EAAW,CAAA,mCAAA,CAAA;AAAA,UACX,GAAA,EAAK,KAAK,OAAA,CAAQ,cAAA;AAAA,UAClB,YAAA,EAAc,kBAAkB,CAAA,0BAAA,CAAA,GAA+B;AAAA;AACjE,OACF;AAAA,MAEA,QAAA,EAAU;AAAA,QACR,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IAEA,SAAA,EAAW;AAAA,MACT,GAAG,MAAA,CAAO,WAAA,CAAY,MAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAC,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAAA,MACzE,GAAG,MAAA,CAAO,WAAA;AAAA,QACR,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAAA,UAC9B,CAAA,iBAAA,EAAoB,IAAI,CAAC,CAAA,CAAA;AAAA,UACzB,kBAAkB,CAAC,CAAA,CAAE,oBAAoB,KAAA,CAAM,CAAA,CAAA,KAAK,EAAG,OAAO;AAAA,SAC/D;AAAA,OACH;AAAA,MACA,GAAI,kBACA,MAAA,CAAO,WAAA;AAAA,QACL,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAAA,UAC5B,CAAA,QAAA,EAAW,IAAI,CAAC,CAAA,CAAA;AAAA,UAChB,gBAAgB,CAAC,CAAA,CAAE,oBAAoB,KAAA,CAAM,CAAA,CAAA,KAAK,EAAG,OAAO;AAAA,SAC7D;AAAA,UAEH;AAAC,KACP;AAAA,IAEA,gBAAA,EAAkB,OAAO,UAAA,CAAW;AAAA,GACtC;AAAA,EACA,EAAE,QAAA;AACJ,CAAA;AAEA,IAAM,YAA4B,EAAC;AACnC,IAAM,SAAA,GAAY,MAAM,SAAA,CAAU,aAAA,CAAc,SAAS,CAAA;AAEzD,IAAM,UAAU,MAAM,SAAA;AAAA,EACpB,SAAA,CAAU,GAAA,CAAI,OAAO,QAAA,EAAU,CAAA,KAAM;AAEnC,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,iBAAA,CAAkB,CAAC,CAAA;AACnD,IAAA,MAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,cAAA,GAC1B,cAAA,EAAgB,eAChB,cAAA,EAAgB,SAAA;AAEpB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,QAAA,EAAU,CAAC,CAAA;AAE1C,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,MAAM,kBAAA,CAAmB;AAAA,MACpD,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA;AAAA,MAC3B,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,MACpB,SAAS,IAAA,CAAK,GAAA;AAAA,MACd,WAAA,EAAa,YAAA;AAAA,MACb;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,QAAQ,CAAA;AAE5C,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,GAAG,WAAA;AAAA,QACH,IAAA,EAAM,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,QAClB,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA;AACxB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC;AACH,CAAA;AAEA,IAAO,yBAAQ,OAAA,CAAQ;AAAA,EACrB,OAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAI,aAAA,CAAc,EAAA;AAAA,IAClB,SAAA,EAAW,QAAQ,OAAA,CAAQ,CAAA,MAAA,KAAU,OAAO,SAAS,CAAA,CAAE,IAAI,kBAAkB;AAAA,GAC/E;AAAA,EAEA,UAAA,EAAY;AACd,CAAC","file":"index.js","sourcesContent":["import {\n createServerBundle,\n generatePassword,\n generateSshPrivateKey,\n l3EndpointToString,\n parseEndpoint,\n sshPrivateKeyToKeyPair,\n} from \"@highstate/common\"\nimport { trimIndentation, type UnitTerminal } from \"@highstate/contract\"\nimport { yandex } from \"@highstate/library\"\nimport { forUnit, getResourceComment, interpolate, type Output, toPromise } from \"@highstate/pulumi\"\nimport {\n ComputeDisk,\n ComputeInstanceGroup,\n getVpcSubnet,\n KmsSymmetricKey,\n VpcAddress,\n} from \"@highstate/yandex-sdk\"\nimport { createProvider } from \"../provider\"\n\nconst { name, args, getSecret, inputs, outputs } = forUnit(yandex.instanceGroup)\n\nconst groupName = args.groupName ?? name\n\nconst provider = await createProvider(inputs.connection, args.cloudId)\n\nconst sshKeyPair =\n inputs.sshKeyPair ??\n getSecret(\"sshPrivateKey\", generateSshPrivateKey).apply(sshPrivateKeyToKeyPair)\n\nconst rootPassword = getSecret(\"rootPassword\", generatePassword)\n\n// auto-discover subnet if not specified\nlet subnetId = args.network.subnetId\nif (!subnetId) {\n const defaultSubnetName = await toPromise(interpolate`default-${inputs.connection.defaultZone}`)\n const subnet = await getVpcSubnet(\n {\n folderId: await toPromise(inputs.connection.defaultFolderId),\n name: defaultSubnetName,\n },\n { provider },\n )\n\n if (!subnet.id) {\n throw new Error(\n `Could not find default subnet '${defaultSubnetName}' in zone ${inputs.connection.defaultZone}`,\n )\n }\n\n subnetId = subnet.id\n}\n\n// create single key for all disks in the group\nlet encryptionKeyId: Output<string> | undefined\nif (args.bootDisk.encrypted) {\n const encryptionKey = new KmsSymmetricKey(\n \"encryption-key\",\n {\n name: groupName,\n description: getResourceComment(),\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n },\n { provider },\n )\n\n encryptionKeyId = encryptionKey.id\n}\n\n// create the disk for each instance in the group\nconst disks = Array.from({ length: args.size }, (_, i) => {\n return new ComputeDisk(\n `disk-${i + 1}`,\n {\n name: `${groupName}-${i + 1}`,\n type: args.bootDisk.type,\n size: args.bootDisk.size,\n imageId: inputs.image.id,\n allowRecreate: false,\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n zone: inputs.connection.defaultZone,\n kmsKeyId: encryptionKeyId,\n },\n { provider, ignoreChanges: [\"imageId\"] },\n )\n})\n\n// create internal IPs for each instance in the group\nconst internalAddresses = Array.from({ length: args.size }, (_, i) => {\n return new VpcAddress(\n `internal-address-${i + 1}`,\n {\n name: `${groupName}-internal-${i + 1}`,\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n description: getResourceComment(),\n internalIpv4Address: {\n subnetId,\n },\n },\n { provider },\n )\n})\n\n// create public IPs if needed\nlet publicAddresses: VpcAddress[] | undefined\n\nif (args.network.assignPublicIp && args.network.reservePublicIp) {\n publicAddresses = Array.from({ length: args.size }, (_, i) => {\n return new VpcAddress(\n `address-${i + 1}`,\n {\n name: `${groupName}-${i + 1}`,\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n description: getResourceComment(),\n externalIpv4Address: {\n zoneId: inputs.connection.defaultZone,\n },\n },\n { provider },\n )\n })\n}\n\n// create cloud-init user data\nconst userData = interpolate`\n #cloud-config\n hostname: ${groupName}-{instance.index}\n users:\n - name: root\n ssh-authorized-keys:\n - ${sshKeyPair.publicKey}\n sudo: ALL=(ALL) NOPASSWD:ALL\n`.apply(trimIndentation)\n\nconst instanceGroup = new ComputeInstanceGroup(\n \"instance-group\",\n {\n name: groupName,\n description: getResourceComment(),\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n\n allocationPolicy: {\n zones: [inputs.connection.defaultZone],\n },\n\n deployPolicy: {\n maxExpansion: 0,\n maxUnavailable: 1,\n },\n\n scalePolicy: {\n fixedScale: {\n size: args.size,\n },\n },\n\n instanceTemplate: {\n name: `${groupName}-{instance.index}`,\n description: getResourceComment(),\n platformId: args.platformId,\n\n resources: {\n cores: args.resources.cores,\n memory: args.resources.memory,\n coreFraction: args.resources.coreFraction,\n },\n\n schedulingPolicy: {\n preemptible: args.preemptible,\n },\n\n bootDisk: {\n diskId: `{disk_{instance.index}}`,\n },\n\n networkInterfaces: [\n {\n subnetIds: [subnetId],\n ipAddress: `{internal_address_{instance.index}}`,\n nat: args.network.assignPublicIp,\n natIpAddress: publicAddresses ? `{address_{instance.index}}` : undefined,\n },\n ],\n\n metadata: {\n \"user-data\": userData,\n },\n },\n\n variables: {\n ...Object.fromEntries(disks.map((_, i) => [`disk_${i + 1}`, disks[i].id])),\n ...Object.fromEntries(\n internalAddresses.map((_, i) => [\n `internal_address_${i + 1}`,\n internalAddresses[i].internalIpv4Address.apply(a => a!.address),\n ]),\n ),\n ...(publicAddresses\n ? Object.fromEntries(\n publicAddresses.map((_, i) => [\n `address_${i + 1}`,\n publicAddresses[i].externalIpv4Address.apply(a => a!.address),\n ]),\n )\n : {}),\n },\n\n serviceAccountId: inputs.connection.serviceAccountId,\n },\n { provider },\n)\n\nconst terminals: UnitTerminal[] = []\nconst instances = await toPromise(instanceGroup.instances)\n\nconst servers = await toPromise(\n instances.map(async (instance, i) => {\n // get the IP address\n const firstInterface = instance.networkInterfaces[0]\n const publicIp = args.network.assignPublicIp\n ? firstInterface?.natIpAddress\n : firstInterface?.ipAddress\n\n if (!publicIp) {\n throw new Error(\"No IP address assigned to instance\")\n }\n\n const endpoint = parseEndpoint(publicIp, 3)\n\n const { server, terminal } = await createServerBundle({\n name: `${groupName}-${i + 1}`,\n endpoints: [endpoint],\n sshArgs: args.ssh,\n sshPassword: rootPassword,\n sshKeyPair,\n })\n\n if (terminal) {\n const rawTerminal = await toPromise(terminal)\n\n terminals.push({\n ...rawTerminal,\n name: `ssh-${i + 1}`,\n meta: {\n title: `Shell (${i + 1})`,\n },\n })\n }\n\n return server\n }),\n)\n\nexport default outputs({\n servers,\n\n $statusFields: {\n id: instanceGroup.id,\n endpoints: servers.flatMap(server => server.endpoints).map(l3EndpointToString),\n },\n\n $terminals: terminals,\n})\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { createProvider } from '../chunk-
|
|
2
|
-
import {
|
|
1
|
+
import { createProvider } from '../chunk-ISIWD2MZ.js';
|
|
2
|
+
import { generateSshPrivateKey, sshPrivateKeyToKeyPair, generatePassword, parseEndpoint, createServerBundle, l3EndpointToString } from '@highstate/common';
|
|
3
3
|
import { trimIndentation } from '@highstate/contract';
|
|
4
4
|
import { yandex } from '@highstate/library';
|
|
5
5
|
import { forUnit, toPromise, interpolate, getResourceComment } from '@highstate/pulumi';
|
|
6
|
-
import { getVpcSubnet, ComputeDisk, VpcAddress, ComputeInstance } from '@highstate/yandex-sdk';
|
|
6
|
+
import { getVpcSubnet, KmsSymmetricKey, ComputeDisk, VpcAddress, ComputeInstance } from '@highstate/yandex-sdk';
|
|
7
7
|
|
|
8
8
|
var { name, args, getSecret, inputs, outputs } = forUnit(yandex.virtualMachine);
|
|
9
9
|
var vmName = args.vmName ?? name;
|
|
10
|
-
var provider = await createProvider(inputs.connection);
|
|
11
|
-
var sshKeyPair = inputs.sshKeyPair ??
|
|
10
|
+
var provider = await createProvider(inputs.connection, args.cloudId);
|
|
11
|
+
var sshKeyPair = inputs.sshKeyPair ?? getSecret("sshPrivateKey", generateSshPrivateKey).apply(sshPrivateKeyToKeyPair);
|
|
12
12
|
var rootPassword = getSecret("rootPassword", generatePassword);
|
|
13
13
|
var subnetId = args.network.subnetId;
|
|
14
14
|
if (!subnetId) {
|
|
@@ -27,6 +27,19 @@ if (!subnetId) {
|
|
|
27
27
|
}
|
|
28
28
|
subnetId = subnet.id;
|
|
29
29
|
}
|
|
30
|
+
var encryptionKeyId;
|
|
31
|
+
if (args.bootDisk.encrypted) {
|
|
32
|
+
const encryptionKey = new KmsSymmetricKey(
|
|
33
|
+
"encryption-key",
|
|
34
|
+
{
|
|
35
|
+
name: vmName,
|
|
36
|
+
description: getResourceComment(),
|
|
37
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId
|
|
38
|
+
},
|
|
39
|
+
{ provider }
|
|
40
|
+
);
|
|
41
|
+
encryptionKeyId = encryptionKey.id;
|
|
42
|
+
}
|
|
30
43
|
var disk = new ComputeDisk(
|
|
31
44
|
"disk",
|
|
32
45
|
{
|
|
@@ -35,8 +48,9 @@ var disk = new ComputeDisk(
|
|
|
35
48
|
size: args.bootDisk.size,
|
|
36
49
|
imageId: inputs.image.id,
|
|
37
50
|
allowRecreate: false,
|
|
38
|
-
folderId: inputs.connection.defaultFolderId,
|
|
39
|
-
zone: inputs.connection.defaultZone
|
|
51
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId,
|
|
52
|
+
zone: inputs.connection.defaultZone,
|
|
53
|
+
kmsKeyId: encryptionKeyId
|
|
40
54
|
},
|
|
41
55
|
{ provider, ignoreChanges: ["imageId"] }
|
|
42
56
|
);
|
|
@@ -49,12 +63,13 @@ var userData = interpolate`
|
|
|
49
63
|
- ${sshKeyPair.publicKey}
|
|
50
64
|
sudo: ALL=(ALL) NOPASSWD:ALL
|
|
51
65
|
`.apply(trimIndentation);
|
|
52
|
-
var
|
|
66
|
+
var publicAddress;
|
|
53
67
|
if (args.network.assignPublicIp && args.network.reservePublicIp) {
|
|
54
|
-
|
|
68
|
+
publicAddress = new VpcAddress(
|
|
55
69
|
"address",
|
|
56
70
|
{
|
|
57
71
|
name: vmName,
|
|
72
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId,
|
|
58
73
|
description: getResourceComment(),
|
|
59
74
|
externalIpv4Address: {
|
|
60
75
|
zoneId: inputs.connection.defaultZone
|
|
@@ -68,7 +83,7 @@ var instance = new ComputeInstance(
|
|
|
68
83
|
{
|
|
69
84
|
name: vmName,
|
|
70
85
|
description: getResourceComment(),
|
|
71
|
-
folderId: inputs.connection.defaultFolderId,
|
|
86
|
+
folderId: args.folderId ?? inputs.connection.defaultFolderId,
|
|
72
87
|
zone: inputs.connection.defaultZone,
|
|
73
88
|
platformId: args.platformId,
|
|
74
89
|
allowStoppingForUpdate: true,
|
|
@@ -77,6 +92,9 @@ var instance = new ComputeInstance(
|
|
|
77
92
|
memory: args.resources.memory,
|
|
78
93
|
coreFraction: args.resources.coreFraction
|
|
79
94
|
},
|
|
95
|
+
schedulingPolicy: {
|
|
96
|
+
preemptible: args.preemptible
|
|
97
|
+
},
|
|
80
98
|
bootDisk: {
|
|
81
99
|
diskId: disk.id
|
|
82
100
|
},
|
|
@@ -84,7 +102,7 @@ var instance = new ComputeInstance(
|
|
|
84
102
|
{
|
|
85
103
|
subnetId,
|
|
86
104
|
nat: args.network.assignPublicIp,
|
|
87
|
-
natIpAddress:
|
|
105
|
+
natIpAddress: publicAddress ? publicAddress.externalIpv4Address.apply((a) => a.address) : void 0
|
|
88
106
|
}
|
|
89
107
|
],
|
|
90
108
|
metadata: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/virtual-machine/index.ts"],"names":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/virtual-machine/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n createServerBundle,\n generatePassword,\n generateSshPrivateKey,\n l3EndpointToString,\n parseEndpoint,\n sshPrivateKeyToKeyPair,\n} from \"@highstate/common\"\nimport { trimIndentation } from \"@highstate/contract\"\nimport { yandex } from \"@highstate/library\"\nimport { forUnit, getResourceComment, interpolate, type Output, toPromise } from \"@highstate/pulumi\"\nimport {\n ComputeDisk,\n ComputeInstance,\n getVpcSubnet,\n KmsSymmetricKey,\n VpcAddress,\n} from \"@highstate/yandex-sdk\"\nimport { createProvider } from \"../provider\"\n\nconst { name, args, getSecret, inputs, outputs } = forUnit(yandex.virtualMachine)\n\nconst vmName = args.vmName ?? name\n\nconst provider = await createProvider(inputs.connection, args.cloudId)\n\nconst sshKeyPair =\n inputs.sshKeyPair ??\n getSecret(\"sshPrivateKey\", generateSshPrivateKey).apply(sshPrivateKeyToKeyPair)\n\nconst rootPassword = getSecret(\"rootPassword\", generatePassword)\n\n// auto-discover subnet if not specified\nlet subnetId = args.network.subnetId\nif (!subnetId) {\n const defaultSubnetName = await toPromise(interpolate`default-${inputs.connection.defaultZone}`)\n const subnet = await getVpcSubnet(\n {\n folderId: await toPromise(inputs.connection.defaultFolderId),\n name: defaultSubnetName,\n },\n { provider },\n )\n\n if (!subnet.id) {\n throw new Error(\n `Could not find default subnet '${defaultSubnetName}' in zone ${inputs.connection.defaultZone}`,\n )\n }\n\n subnetId = subnet.id\n}\n\n// create key for disk\nlet encryptionKeyId: Output<string> | undefined\nif (args.bootDisk.encrypted) {\n const encryptionKey = new KmsSymmetricKey(\n \"encryption-key\",\n {\n name: vmName,\n description: getResourceComment(),\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n },\n { provider },\n )\n\n encryptionKeyId = encryptionKey.id\n}\n\n// create the disk\nconst disk = new ComputeDisk(\n \"disk\",\n {\n name: vmName,\n type: args.bootDisk.type,\n size: args.bootDisk.size,\n imageId: inputs.image.id,\n allowRecreate: false,\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n zone: inputs.connection.defaultZone,\n kmsKeyId: encryptionKeyId,\n },\n { provider, ignoreChanges: [\"imageId\"] },\n)\n\n// create cloud-init user data\nconst userData = interpolate`\n #cloud-config\n hostname: ${vmName}\n users:\n - name: root\n ssh-authorized-keys:\n - ${sshKeyPair.publicKey}\n sudo: ALL=(ALL) NOPASSWD:ALL\n`.apply(trimIndentation)\n\nlet publicAddress: VpcAddress | undefined\n\nif (args.network.assignPublicIp && args.network.reservePublicIp) {\n publicAddress = new VpcAddress(\n \"address\",\n {\n name: vmName,\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n description: getResourceComment(),\n externalIpv4Address: {\n zoneId: inputs.connection.defaultZone,\n },\n },\n { provider },\n )\n}\n\n// create the instance\nconst instance = new ComputeInstance(\n \"virtual-machine\",\n {\n name: vmName,\n description: getResourceComment(),\n folderId: args.folderId ?? inputs.connection.defaultFolderId,\n zone: inputs.connection.defaultZone,\n platformId: args.platformId,\n allowStoppingForUpdate: true,\n\n resources: {\n cores: args.resources.cores,\n memory: args.resources.memory,\n coreFraction: args.resources.coreFraction,\n },\n\n schedulingPolicy: {\n preemptible: args.preemptible,\n },\n\n bootDisk: {\n diskId: disk.id,\n },\n\n networkInterfaces: [\n {\n subnetId: subnetId,\n nat: args.network.assignPublicIp,\n natIpAddress: publicAddress\n ? publicAddress.externalIpv4Address.apply(a => a!.address)\n : undefined,\n },\n ],\n\n metadata: {\n \"user-data\": userData,\n },\n },\n { provider, ignoreChanges: [\"bootDisk\"] },\n)\n\n// get the IP address\nconst publicIp = await toPromise(\n instance.networkInterfaces.apply(ni => {\n const firstInterface = ni[0]\n return args.network.assignPublicIp ? firstInterface?.natIpAddress : firstInterface?.ipAddress\n }),\n)\n\nif (!publicIp) {\n throw new Error(\"No IP address assigned to instance\")\n}\n\nconst endpoint = parseEndpoint(publicIp, 3)\n\nconst { server, terminal } = await createServerBundle({\n name: vmName,\n endpoints: [endpoint],\n sshArgs: args.ssh,\n sshPassword: rootPassword,\n sshKeyPair,\n})\n\nexport default outputs({\n server,\n\n $statusFields: {\n id: instance.id,\n endpoints: [l3EndpointToString(endpoint)],\n hostname: server.hostname,\n },\n\n $terminals: [terminal],\n})\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@highstate/yandex",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"./connection": "./dist/connection/index.js",
|
|
10
10
|
"./disk": "./dist/disk/index.js",
|
|
11
11
|
"./existing-image": "./dist/existing-image/index.js",
|
|
12
|
-
"./virtual-machine": "./dist/virtual-machine/index.js"
|
|
12
|
+
"./virtual-machine": "./dist/virtual-machine/index.js",
|
|
13
|
+
"./instance-group": "./dist/instance-group/index.js"
|
|
13
14
|
},
|
|
14
15
|
"publishConfig": {
|
|
15
16
|
"access": "public"
|
|
@@ -20,17 +21,17 @@
|
|
|
20
21
|
]
|
|
21
22
|
},
|
|
22
23
|
"dependencies": {
|
|
23
|
-
"@pulumi/pulumi": "3.
|
|
24
|
-
"@highstate/
|
|
25
|
-
"@highstate/
|
|
26
|
-
"@highstate/
|
|
27
|
-
"@highstate/
|
|
28
|
-
"@highstate/
|
|
24
|
+
"@pulumi/pulumi": "3.220.0",
|
|
25
|
+
"@highstate/contract": "0.20.0",
|
|
26
|
+
"@highstate/common": "0.20.0",
|
|
27
|
+
"@highstate/library": "0.20.0",
|
|
28
|
+
"@highstate/yandex-sdk": "0.19.1",
|
|
29
|
+
"@highstate/pulumi": "0.20.0"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
32
|
"@biomejs/biome": "2.2.0",
|
|
32
33
|
"@typescript/native-preview": "^7.0.0-dev.20250920.1",
|
|
33
|
-
"@highstate/cli": "0.
|
|
34
|
+
"@highstate/cli": "0.20.0"
|
|
34
35
|
},
|
|
35
36
|
"repository": {
|
|
36
37
|
"url": "https://github.com/highstate-io/highstate"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.ts"],"names":["connection"],"mappings":";;;;AAKA,eAAsB,eAAe,UAAA,EAAyD;AAC5F,EAAA,OAAO,MAAM,SAAA;AAAA,IACX,MAAA,CAAO,UAAU,CAAA,CAAE,KAAA,CAAM,CAAAA,WAAAA,KAAc;AACrC,MAAA,OAAO,IAAI,QAAA,CAASA,WAAAA,CAAW,OAAA,EAAS;AAAA,QACtC,uBAAuBA,WAAAA,CAAW,qBAAA;AAAA,QAClC,SAASA,WAAAA,CAAW,OAAA;AAAA,QACpB,UAAUA,WAAAA,CAAW,eAAA;AAAA,QACrB,MAAMA,WAAAA,CAAW,WAAA;AAAA,QACjB,UAAUA,WAAAA,CAAW;AAAA,OACtB,CAAA;AAAA,IACH,CAAC;AAAA,GACH;AACF","file":"chunk-MK37EG4O.js","sourcesContent":["import type { yandex } from \"@highstate/library\"\nimport type { Input } from \"@highstate/pulumi\"\nimport { output, toPromise } from \"@highstate/pulumi\"\nimport { Provider } from \"@highstate/yandex-sdk\"\n\nexport async function createProvider(connection: Input<yandex.Connection>): Promise<Provider> {\n return await toPromise(\n output(connection).apply(connection => {\n return new Provider(connection.cloudId, {\n serviceAccountKeyFile: connection.serviceAccountKeyFile,\n cloudId: connection.cloudId,\n folderId: connection.defaultFolderId,\n zone: connection.defaultZone,\n regionId: connection.regionId,\n })\n }),\n )\n}\n"]}
|