@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.
@@ -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"]}
@@ -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.regionId
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 yandexCloud = output({
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.regionId
27
+ defaultZone: args.region.defaultZone,
28
+ regionId: args.region.id
36
29
  });
37
30
  var connection_default = outputs({
38
- yandexCloud,
31
+ connection,
39
32
  $statusFields: {
40
33
  cloudId: {
41
34
  meta: {
42
35
  icon: "mdi:cloud"
43
36
  },
44
- value: yandexCloud.cloudId
37
+ value: connection.cloudId
45
38
  },
46
39
  defaultFolderId: {
47
40
  meta: {
48
41
  icon: "mdi:folder"
49
42
  },
50
- value: yandexCloud.defaultFolderId
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;AAY5D,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,MAAM,IAAA,CAAK,WAAA;AAAA,EACX,UAAU,IAAA,CAAK;AACjB,CAAC,CAAA;AAGD,IAAM,iBAAiB,MAAM,oBAAA;AAAA,EAC3B;AAAA,IACE;AAAA,GACF;AAAA,EACA,EAAE,QAAA;AACJ,CAAA;AAGA,IAAM,SAAS,MAAM,wBAAA;AAAA,EACnB;AAAA,IACE,UAAU,cAAA,CAAe;AAAA,GAC3B;AAAA,EACA,EAAE,QAAA;AACJ,CAAA;AAEA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,EAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAC5D;AAEA,IAAM,cAAoC,MAAA,CAAO;AAAA,EAC/C,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,EAC/B,SAAS,MAAA,CAAO,OAAA;AAAA,EAChB,iBAAiB,cAAA,CAAe,QAAA;AAAA,EAChC,aAAa,IAAA,CAAK,WAAA;AAAA,EAClB,UAAU,IAAA,CAAK;AACjB,CAAC,CAAA;AAED,IAAO,qBAAQ,OAAA,CAAQ;AAAA,EACrB,WAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS;AAAA,MACP,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,OAAO,WAAA,CAAY;AAAA,KACrB;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,OAAO,WAAA,CAAY;AAAA,KACrB;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,OAAO,WAAA,CAAY;AAAA;AACrB;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\ninterface ServiceAccountKeyFile {\n id: string\n service_account_id: string\n created_at: string\n key_algorithm: string\n public_key: string\n private_key: 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.defaultZone,\n regionId: args.regionId,\n})\n\n// auto-discover service account details to get folder and cloud\nconst serviceAccount = await getIamServiceAccount(\n {\n serviceAccountId: serviceAccountId,\n },\n { provider },\n)\n\n// auto-discover cloud ID from folder\nconst folder = await getResourcemanagerFolder(\n {\n folderId: serviceAccount.folderId,\n },\n { provider },\n)\n\nif (!folder.cloudId) {\n throw new Error(\"Could not determine cloud ID from folder\")\n}\n\nconst yandexCloud: Output<yandex.Cloud> = output({\n serviceAccountKeyFile: secrets.serviceAccountKeyFile,\n cloudId: folder.cloudId,\n defaultFolderId: serviceAccount.folderId,\n defaultZone: args.defaultZone,\n regionId: args.regionId,\n})\n\nexport default outputs({\n yandexCloud,\n\n $statusFields: {\n cloudId: {\n meta: {\n icon: \"mdi:cloud\",\n },\n value: yandexCloud.cloudId,\n },\n defaultFolderId: {\n meta: {\n icon: \"mdi:folder\",\n },\n value: yandexCloud.defaultFolderId,\n },\n defaultZone: {\n meta: {\n icon: \"mdi:map-marker\",\n },\n value: yandexCloud.defaultZone,\n },\n },\n})\n"]}
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": 3747103172,
4
- "./dist/virtual-machine/index.js": 3181809809
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, output } from '@highstate/pulumi';
4
- import { getComputeImage, getVpcSubnet, ComputeDisk, ComputeInstance, Provider } from '@highstate/yandex-sdk';
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 provider = await createProvider(inputs.yandexCloud);
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.yandexCloud.defaultZone}`);
15
+ const defaultSubnetName = await toPromise(interpolate`default-${inputs.connection.defaultZone}`);
36
16
  const subnet = await getVpcSubnet(
37
17
  {
38
- folderId: await toPromise(inputs.yandexCloud.defaultFolderId),
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.yandexCloud.defaultZone}`
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
- name,
31
+ "disk",
52
32
  {
53
- name: `${name}-disk`,
54
- type: args.disk.type,
55
- size: args.disk.size,
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.yandexCloud.defaultFolderId,
59
- zone: inputs.yandexCloud.defaultZone
38
+ folderId: inputs.connection.defaultFolderId,
39
+ zone: inputs.connection.defaultZone
60
40
  },
61
41
  { provider, ignoreChanges: ["imageId"] }
62
42
  );
63
- var userData = interpolate`#cloud-config
64
- users:
65
- - name: root
66
- ssh-authorized-keys:
67
- - ${sshKeyPair.publicKey}
68
- sudo: ALL=(ALL) NOPASSWD:ALL
69
- ${Object.keys(args.metadata).length > 0 ? `
70
- write_files:
71
- ${Object.entries(args.metadata).map(
72
- ([key, value]) => ` - path: /tmp/${key}
73
- content: |
74
- ${value}`
75
- ).join("\n")}` : ""}
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
- name,
67
+ "virtual-machine",
79
68
  {
80
- name,
69
+ name: vmName,
81
70
  description: getResourceComment(),
82
- folderId: inputs.yandexCloud.defaultFolderId,
83
- zone: inputs.yandexCloud.defaultZone,
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/provider.ts","../../src/virtual-machine/index.ts"],"names":["toPromise"],"mappings":"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","file":"index.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(cloud: Input<yandex.Cloud>): Promise<Provider> {\n return await toPromise(\n output(cloud).apply(cloudConfig => {\n return new Provider(\"yandex\", {\n token: cloudConfig.token,\n serviceAccountKeyFile: cloudConfig.serviceAccountKeyFile,\n cloudId: cloudConfig.cloudId,\n folderId: cloudConfig.defaultFolderId,\n zone: cloudConfig.defaultZone,\n regionId: cloudConfig.regionId,\n })\n }),\n )\n}\n","import {\n createServerBundle,\n generatePassword,\n generateSshPrivateKey,\n l3EndpointToString,\n parseL3Endpoint,\n sshPrivateKeyToKeyPair,\n} from \"@highstate/common\"\nimport { yandex } from \"@highstate/library\"\nimport { forUnit, getResourceComment, interpolate, toPromise } from \"@highstate/pulumi\"\nimport { ComputeDisk, ComputeInstance, getComputeImage, getVpcSubnet } from \"@highstate/yandex-sdk\"\nimport { createProvider } from \"../provider\"\n\nconst { name, args, getSecret, inputs, outputs } = forUnit(yandex.virtualMachine)\n\nconst provider = await createProvider(inputs.yandexCloud)\n\nconst sshKeyPair =\n inputs.sshKeyPair ?? sshPrivateKeyToKeyPair(getSecret(\"sshPrivateKey\", generateSshPrivateKey))\n\nconst rootPassword = getSecret(\"rootPassword\", generatePassword)\n\n// get the image\nconst image = await getComputeImage(\n {\n family: args.disk.imageFamily,\n },\n { provider },\n)\n\n// auto-discover subnet if not specified\nlet subnetId = args.network.subnetId\nif (!subnetId) {\n const defaultSubnetName = await toPromise(interpolate`default-${inputs.yandexCloud.defaultZone}`)\n const subnet = await getVpcSubnet(\n {\n folderId: await toPromise(inputs.yandexCloud.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.yandexCloud.defaultZone}`,\n )\n }\n\n subnetId = subnet.id\n}\n\n// create the disk\nconst disk = new ComputeDisk(\n name,\n {\n name: `${name}-disk`,\n type: args.disk.type,\n size: args.disk.size,\n imageId: image.id,\n allowRecreate: false,\n folderId: inputs.yandexCloud.defaultFolderId,\n zone: inputs.yandexCloud.defaultZone,\n },\n { provider, ignoreChanges: [\"imageId\"] },\n)\n\n// create cloud-init user data\nconst userData = interpolate`#cloud-config\nusers:\n - name: root\n ssh-authorized-keys:\n - ${sshKeyPair.publicKey}\n sudo: ALL=(ALL) NOPASSWD:ALL\n${\n Object.keys(args.metadata).length > 0\n ? `\nwrite_files:\n${Object.entries(args.metadata)\n .map(\n ([key, value]) =>\n ` - path: /tmp/${key}\n content: |\n ${value}`,\n )\n .join(\"\\n\")}`\n : \"\"\n}\n`\n\n// create the instance\nconst instance = new ComputeInstance(\n name,\n {\n name,\n description: getResourceComment(),\n folderId: inputs.yandexCloud.defaultFolderId,\n zone: inputs.yandexCloud.defaultZone,\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 bootDisk: {\n diskId: disk.id,\n },\n\n networkInterfaces: [\n {\n subnetId: subnetId,\n nat: args.network.assignPublicIp,\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,\n endpoints: [endpoint],\n sshArgs: args.ssh,\n sshPassword: rootPassword,\n sshPrivateKey: sshKeyPair.privateKey,\n sshKeyPair,\n})\n\nexport default outputs({\n server,\n endpoints: [endpoint],\n\n $statusFields: {\n endpoints: [l3EndpointToString(endpoint)],\n hostname: server.hostname,\n },\n\n $terminals: [terminal],\n})\n"]}
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.11.7",
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",