@highstate/yandex 0.11.7 → 0.12.1
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 +21 -0
- package/dist/chunk-MK37EG4O.js.map +1 -0
- package/dist/connection/index.js +10 -23
- package/dist/connection/index.js.map +1 -1
- package/dist/disk/index.js +31 -0
- package/dist/disk/index.js.map +1 -0
- package/dist/existing-image/index.js +20 -0
- package/dist/existing-image/index.js.map +1 -0
- package/dist/highstate.manifest.json +4 -2
- package/dist/virtual-machine/index.js +48 -57
- package/dist/virtual-machine/index.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { toPromise, output } from '@highstate/pulumi';
|
|
2
|
+
import { Provider } from '@highstate/yandex-sdk';
|
|
3
|
+
|
|
4
|
+
// src/provider.ts
|
|
5
|
+
async function createProvider(connection) {
|
|
6
|
+
return await toPromise(
|
|
7
|
+
output(connection).apply((connection2) => {
|
|
8
|
+
return new Provider(connection2.cloudId, {
|
|
9
|
+
serviceAccountKeyFile: connection2.serviceAccountKeyFile,
|
|
10
|
+
cloudId: connection2.cloudId,
|
|
11
|
+
folderId: connection2.defaultFolderId,
|
|
12
|
+
zone: connection2.defaultZone,
|
|
13
|
+
regionId: connection2.regionId
|
|
14
|
+
});
|
|
15
|
+
})
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { createProvider };
|
|
20
|
+
//# sourceMappingURL=chunk-MK37EG4O.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-MK37EG4O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
package/dist/connection/index.js
CHANGED
|
@@ -9,51 +9,38 @@ var keyFileData = JSON.parse(serviceAccountKeyFileString);
|
|
|
9
9
|
var serviceAccountId = keyFileData.service_account_id;
|
|
10
10
|
var provider = new Provider("yandex", {
|
|
11
11
|
serviceAccountKeyFile: serviceAccountKeyFileString,
|
|
12
|
-
zone: args.defaultZone,
|
|
13
|
-
regionId: args.
|
|
12
|
+
zone: args.region.defaultZone,
|
|
13
|
+
regionId: args.region.id
|
|
14
14
|
});
|
|
15
15
|
var serviceAccount = await getIamServiceAccount(
|
|
16
|
-
{
|
|
17
|
-
serviceAccountId
|
|
18
|
-
},
|
|
19
|
-
{ provider }
|
|
20
|
-
);
|
|
21
|
-
var folder = await getResourcemanagerFolder(
|
|
22
|
-
{
|
|
23
|
-
folderId: serviceAccount.folderId
|
|
24
|
-
},
|
|
16
|
+
{ serviceAccountId },
|
|
25
17
|
{ provider }
|
|
26
18
|
);
|
|
19
|
+
var folder = await getResourcemanagerFolder({ folderId: serviceAccount.folderId }, { provider });
|
|
27
20
|
if (!folder.cloudId) {
|
|
28
21
|
throw new Error("Could not determine cloud ID from folder");
|
|
29
22
|
}
|
|
30
|
-
var
|
|
23
|
+
var connection = output({
|
|
31
24
|
serviceAccountKeyFile: secrets.serviceAccountKeyFile,
|
|
32
25
|
cloudId: folder.cloudId,
|
|
33
26
|
defaultFolderId: serviceAccount.folderId,
|
|
34
|
-
defaultZone: args.defaultZone,
|
|
35
|
-
regionId: args.
|
|
27
|
+
defaultZone: args.region.defaultZone,
|
|
28
|
+
regionId: args.region.id
|
|
36
29
|
});
|
|
37
30
|
var connection_default = outputs({
|
|
38
|
-
|
|
31
|
+
connection,
|
|
39
32
|
$statusFields: {
|
|
40
33
|
cloudId: {
|
|
41
34
|
meta: {
|
|
42
35
|
icon: "mdi:cloud"
|
|
43
36
|
},
|
|
44
|
-
value:
|
|
37
|
+
value: connection.cloudId
|
|
45
38
|
},
|
|
46
39
|
defaultFolderId: {
|
|
47
40
|
meta: {
|
|
48
41
|
icon: "mdi:folder"
|
|
49
42
|
},
|
|
50
|
-
value:
|
|
51
|
-
},
|
|
52
|
-
defaultZone: {
|
|
53
|
-
meta: {
|
|
54
|
-
icon: "mdi:map-marker"
|
|
55
|
-
},
|
|
56
|
-
value: yandexCloud.defaultZone
|
|
43
|
+
value: connection.defaultFolderId
|
|
57
44
|
}
|
|
58
45
|
}
|
|
59
46
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/connection/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAQ,GAAI,OAAA,CAAQ,OAAO,UAAU,CAAA;
|
|
1
|
+
{"version":3,"sources":["../../src/connection/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAQ,GAAI,OAAA,CAAQ,OAAO,UAAU,CAAA;AAO5D,IAAM,2BAAA,GAA8B,MAAM,SAAA,CAAU,OAAA,CAAQ,qBAAqB,CAAA;AACjF,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,aAAwC,MAAA,CAAO;AAAA,EACnD,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,EAC/B,SAAS,MAAA,CAAO,OAAA;AAAA,EAChB,iBAAiB,cAAA,CAAe,QAAA;AAAA,EAChC,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,EACzB,QAAA,EAAU,KAAK,MAAA,CAAO;AACxB,CAAC,CAAA;AAED,IAAO,qBAAQ,OAAA,CAAQ;AAAA,EACrB,UAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS;AAAA,MACP,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 type { Output } from \"@highstate/pulumi\"\nimport { yandex } from \"@highstate/library\"\nimport { forUnit, output, 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.serviceAccountKeyFile)\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: Output<yandex.Connection> = output({\n serviceAccountKeyFile: secrets.serviceAccountKeyFile,\n cloudId: folder.cloudId,\n defaultFolderId: serviceAccount.folderId,\n defaultZone: args.region.defaultZone,\n regionId: args.region.id,\n})\n\nexport default outputs({\n connection,\n\n $statusFields: {\n cloudId: {\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"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createProvider } from '../chunk-MK37EG4O.js';
|
|
2
|
+
import { yandex } from '@highstate/library';
|
|
3
|
+
import { forUnit, getResourceComment } from '@highstate/pulumi';
|
|
4
|
+
import { ComputeDisk } from '@highstate/yandex-sdk';
|
|
5
|
+
|
|
6
|
+
var { name, args, inputs, outputs } = forUnit(yandex.disk);
|
|
7
|
+
var provider = await createProvider(inputs.connection);
|
|
8
|
+
var diskName = args.diskName ?? name;
|
|
9
|
+
var disk = new ComputeDisk(
|
|
10
|
+
"disk",
|
|
11
|
+
{
|
|
12
|
+
name: diskName,
|
|
13
|
+
description: getResourceComment(),
|
|
14
|
+
type: args.type,
|
|
15
|
+
size: args.size,
|
|
16
|
+
allowRecreate: false
|
|
17
|
+
},
|
|
18
|
+
{ provider, protect: true }
|
|
19
|
+
);
|
|
20
|
+
var disk_default = outputs({
|
|
21
|
+
disk: {
|
|
22
|
+
id: disk.id
|
|
23
|
+
},
|
|
24
|
+
$statusFields: {
|
|
25
|
+
id: disk.id
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export { disk_default as default };
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,EAAM;AAAA,IACJ,IAAI,IAAA,CAAK;AAAA,GACX;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAI,IAAA,CAAK;AAAA;AAEb,CAAC","file":"index.js","sourcesContent":["import { yandex } from \"@highstate/library\"\nimport { forUnit, getResourceComment } 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: {\n id: disk.id,\n },\n $statusFields: {\n id: disk.id,\n },\n})\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createProvider } from '../chunk-MK37EG4O.js';
|
|
2
|
+
import { yandex } from '@highstate/library';
|
|
3
|
+
import { forUnit } from '@highstate/pulumi';
|
|
4
|
+
import { getComputeImage } from '@highstate/yandex-sdk';
|
|
5
|
+
|
|
6
|
+
var { args, inputs, outputs } = forUnit(yandex.existingImage);
|
|
7
|
+
var provider = await createProvider(inputs.connection);
|
|
8
|
+
var image = await getComputeImage({ imageId: args.id }, { provider });
|
|
9
|
+
var existing_image_default = outputs({
|
|
10
|
+
image: {
|
|
11
|
+
id: image.id
|
|
12
|
+
},
|
|
13
|
+
$statusFields: {
|
|
14
|
+
name: image.name
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export { existing_image_default as default };
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,KAAA,GAAQ,MAAM,eAAA,CAAgB,EAAE,OAAA,EAAS,KAAK,EAAA,EAAG,EAAG,EAAE,QAAA,EAAU,CAAA;AAEtE,IAAO,yBAAQ,OAAA,CAAQ;AAAA,EACrB,KAAA,EAAO;AAAA,IACL,IAAI,KAAA,CAAM;AAAA,GACZ;AAAA,EACA,aAAA,EAAe;AAAA,IACb,MAAM,KAAA,CAAM;AAAA;AAEhB,CAAC","file":"index.js","sourcesContent":["import { yandex } from \"@highstate/library\"\nimport { forUnit } 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 image = await getComputeImage({ imageId: args.id }, { provider })\n\nexport default outputs({\n image: {\n id: image.id,\n },\n $statusFields: {\n name: image.name,\n },\n})\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"sourceHashes": {
|
|
3
|
-
"./dist/connection/index.js":
|
|
4
|
-
"./dist/
|
|
3
|
+
"./dist/connection/index.js": 1919699404,
|
|
4
|
+
"./dist/disk/index.js": 2143346297,
|
|
5
|
+
"./dist/existing-image/index.js": 3556777208,
|
|
6
|
+
"./dist/virtual-machine/index.js": 2177041071
|
|
5
7
|
}
|
|
6
8
|
}
|
|
@@ -1,87 +1,77 @@
|
|
|
1
|
+
import { createProvider } from '../chunk-MK37EG4O.js';
|
|
1
2
|
import { sshPrivateKeyToKeyPair, generateSshPrivateKey, generatePassword, parseL3Endpoint, createServerBundle, l3EndpointToString } from '@highstate/common';
|
|
3
|
+
import { trimIndentation } from '@highstate/contract';
|
|
2
4
|
import { yandex } from '@highstate/library';
|
|
3
|
-
import { forUnit, toPromise, interpolate, getResourceComment
|
|
4
|
-
import {
|
|
5
|
+
import { forUnit, toPromise, interpolate, getResourceComment } from '@highstate/pulumi';
|
|
6
|
+
import { getVpcSubnet, ComputeDisk, VpcAddress, ComputeInstance } from '@highstate/yandex-sdk';
|
|
5
7
|
|
|
6
|
-
// src/virtual-machine/index.ts
|
|
7
|
-
async function createProvider(cloud) {
|
|
8
|
-
return await toPromise(
|
|
9
|
-
output(cloud).apply((cloudConfig) => {
|
|
10
|
-
return new Provider("yandex", {
|
|
11
|
-
token: cloudConfig.token,
|
|
12
|
-
serviceAccountKeyFile: cloudConfig.serviceAccountKeyFile,
|
|
13
|
-
cloudId: cloudConfig.cloudId,
|
|
14
|
-
folderId: cloudConfig.defaultFolderId,
|
|
15
|
-
zone: cloudConfig.defaultZone,
|
|
16
|
-
regionId: cloudConfig.regionId
|
|
17
|
-
});
|
|
18
|
-
})
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// src/virtual-machine/index.ts
|
|
23
8
|
var { name, args, getSecret, inputs, outputs } = forUnit(yandex.virtualMachine);
|
|
24
|
-
var
|
|
9
|
+
var vmName = args.vmName ?? name;
|
|
10
|
+
var provider = await createProvider(inputs.connection);
|
|
25
11
|
var sshKeyPair = inputs.sshKeyPair ?? sshPrivateKeyToKeyPair(getSecret("sshPrivateKey", generateSshPrivateKey));
|
|
26
12
|
var rootPassword = getSecret("rootPassword", generatePassword);
|
|
27
|
-
var image = await getComputeImage(
|
|
28
|
-
{
|
|
29
|
-
family: args.disk.imageFamily
|
|
30
|
-
},
|
|
31
|
-
{ provider }
|
|
32
|
-
);
|
|
33
13
|
var subnetId = args.network.subnetId;
|
|
34
14
|
if (!subnetId) {
|
|
35
|
-
const defaultSubnetName = await toPromise(interpolate`default-${inputs.
|
|
15
|
+
const defaultSubnetName = await toPromise(interpolate`default-${inputs.connection.defaultZone}`);
|
|
36
16
|
const subnet = await getVpcSubnet(
|
|
37
17
|
{
|
|
38
|
-
folderId: await toPromise(inputs.
|
|
18
|
+
folderId: await toPromise(inputs.connection.defaultFolderId),
|
|
39
19
|
name: defaultSubnetName
|
|
40
20
|
},
|
|
41
21
|
{ provider }
|
|
42
22
|
);
|
|
43
23
|
if (!subnet.id) {
|
|
44
24
|
throw new Error(
|
|
45
|
-
`Could not find default subnet '${defaultSubnetName}' in zone ${inputs.
|
|
25
|
+
`Could not find default subnet '${defaultSubnetName}' in zone ${inputs.connection.defaultZone}`
|
|
46
26
|
);
|
|
47
27
|
}
|
|
48
28
|
subnetId = subnet.id;
|
|
49
29
|
}
|
|
50
30
|
var disk = new ComputeDisk(
|
|
51
|
-
|
|
31
|
+
"disk",
|
|
52
32
|
{
|
|
53
|
-
name:
|
|
54
|
-
type: args.
|
|
55
|
-
size: args.
|
|
56
|
-
imageId: image.id,
|
|
33
|
+
name: vmName,
|
|
34
|
+
type: args.bootDisk.type,
|
|
35
|
+
size: args.bootDisk.size,
|
|
36
|
+
imageId: inputs.image.id,
|
|
57
37
|
allowRecreate: false,
|
|
58
|
-
folderId: inputs.
|
|
59
|
-
zone: inputs.
|
|
38
|
+
folderId: inputs.connection.defaultFolderId,
|
|
39
|
+
zone: inputs.connection.defaultZone
|
|
60
40
|
},
|
|
61
41
|
{ provider, ignoreChanges: ["imageId"] }
|
|
62
42
|
);
|
|
63
|
-
var userData = interpolate
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
${
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
43
|
+
var userData = interpolate`
|
|
44
|
+
#cloud-config
|
|
45
|
+
hostname: ${vmName}
|
|
46
|
+
users:
|
|
47
|
+
- name: root
|
|
48
|
+
ssh-authorized-keys:
|
|
49
|
+
- ${sshKeyPair.publicKey}
|
|
50
|
+
sudo: ALL=(ALL) NOPASSWD:ALL
|
|
51
|
+
`.apply(trimIndentation);
|
|
52
|
+
var address;
|
|
53
|
+
if (args.network.assignPublicIp && args.network.reservePublicIp) {
|
|
54
|
+
address = new VpcAddress(
|
|
55
|
+
"address",
|
|
56
|
+
{
|
|
57
|
+
name: vmName,
|
|
58
|
+
description: getResourceComment(),
|
|
59
|
+
externalIpv4Address: {
|
|
60
|
+
zoneId: inputs.connection.defaultZone
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{ provider }
|
|
64
|
+
);
|
|
65
|
+
}
|
|
77
66
|
var instance = new ComputeInstance(
|
|
78
|
-
|
|
67
|
+
"virtual-machine",
|
|
79
68
|
{
|
|
80
|
-
name,
|
|
69
|
+
name: vmName,
|
|
81
70
|
description: getResourceComment(),
|
|
82
|
-
folderId: inputs.
|
|
83
|
-
zone: inputs.
|
|
71
|
+
folderId: inputs.connection.defaultFolderId,
|
|
72
|
+
zone: inputs.connection.defaultZone,
|
|
84
73
|
platformId: args.platformId,
|
|
74
|
+
allowStoppingForUpdate: true,
|
|
85
75
|
resources: {
|
|
86
76
|
cores: args.resources.cores,
|
|
87
77
|
memory: args.resources.memory,
|
|
@@ -93,7 +83,8 @@ var instance = new ComputeInstance(
|
|
|
93
83
|
networkInterfaces: [
|
|
94
84
|
{
|
|
95
85
|
subnetId,
|
|
96
|
-
nat: args.network.assignPublicIp
|
|
86
|
+
nat: args.network.assignPublicIp,
|
|
87
|
+
natIpAddress: address ? address.externalIpv4Address.apply((a) => a.address) : void 0
|
|
97
88
|
}
|
|
98
89
|
],
|
|
99
90
|
metadata: {
|
|
@@ -113,17 +104,17 @@ if (!publicIp) {
|
|
|
113
104
|
}
|
|
114
105
|
var endpoint = parseL3Endpoint(publicIp);
|
|
115
106
|
var { server, terminal } = await createServerBundle({
|
|
116
|
-
name,
|
|
107
|
+
name: vmName,
|
|
117
108
|
endpoints: [endpoint],
|
|
118
109
|
sshArgs: args.ssh,
|
|
119
110
|
sshPassword: rootPassword,
|
|
120
|
-
sshPrivateKey: sshKeyPair.privateKey,
|
|
121
111
|
sshKeyPair
|
|
122
112
|
});
|
|
123
113
|
var virtual_machine_default = outputs({
|
|
124
114
|
server,
|
|
125
115
|
endpoints: [endpoint],
|
|
126
116
|
$statusFields: {
|
|
117
|
+
id: instance.id,
|
|
127
118
|
endpoints: [l3EndpointToString(endpoint)],
|
|
128
119
|
hostname: server.hostname
|
|
129
120
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/
|
|
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 parseL3Endpoint,\n sshPrivateKeyToKeyPair,\n} from \"@highstate/common\"\nimport { trimIndentation } from \"@highstate/contract\"\nimport { yandex } from \"@highstate/library\"\nimport { forUnit, getResourceComment, interpolate, toPromise } from \"@highstate/pulumi\"\nimport { ComputeDisk, ComputeInstance, getVpcSubnet, VpcAddress } 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)\n\nconst sshKeyPair =\n inputs.sshKeyPair ?? sshPrivateKeyToKeyPair(getSecret(\"sshPrivateKey\", generateSshPrivateKey))\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 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: inputs.connection.defaultFolderId,\n zone: inputs.connection.defaultZone,\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 address: VpcAddress | undefined\n\nif (args.network.assignPublicIp && args.network.reservePublicIp) {\n address = new VpcAddress(\n \"address\",\n {\n name: vmName,\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: 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 bootDisk: {\n diskId: disk.id,\n },\n\n networkInterfaces: [\n {\n subnetId: subnetId,\n nat: args.network.assignPublicIp,\n natIpAddress: address ? address.externalIpv4Address.apply(a => a!.address) : 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 = parseL3Endpoint(publicIp)\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 endpoints: [endpoint],\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,12 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@highstate/yandex",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
7
7
|
],
|
|
8
8
|
"exports": {
|
|
9
9
|
"./connection": "./dist/connection/index.js",
|
|
10
|
+
"./disk": "./dist/disk/index.js",
|
|
11
|
+
"./existing-image": "./dist/existing-image/index.js",
|
|
10
12
|
"./virtual-machine": "./dist/virtual-machine/index.js"
|
|
11
13
|
},
|
|
12
14
|
"publishConfig": {
|
|
@@ -14,6 +16,7 @@
|
|
|
14
16
|
},
|
|
15
17
|
"dependencies": {
|
|
16
18
|
"@highstate/common": "^0.10.0",
|
|
19
|
+
"@highstate/contract": "^0.10.0",
|
|
17
20
|
"@highstate/library": "^0.10.0",
|
|
18
21
|
"@highstate/pulumi": "^0.10.0",
|
|
19
22
|
"@highstate/yandex-sdk": "^0.10.0",
|