@highstate/yandex 0.9.20

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,63 @@
1
+ import { yandex } from '@highstate/library';
2
+ import { forUnit, toPromise, output } from '@highstate/pulumi';
3
+ import { Provider, getIamServiceAccount, getResourcemanagerFolder } from '@highstate/yandex-sdk';
4
+
5
+ // src/connection/index.ts
6
+ var { args, secrets, outputs } = forUnit(yandex.connection);
7
+ var serviceAccountKeyFileString = await toPromise(secrets.serviceAccountKeyFile);
8
+ var keyFileData = JSON.parse(serviceAccountKeyFileString);
9
+ var serviceAccountId = keyFileData.service_account_id;
10
+ var provider = new Provider("yandex", {
11
+ serviceAccountKeyFile: serviceAccountKeyFileString,
12
+ zone: args.defaultZone,
13
+ regionId: args.regionId
14
+ });
15
+ var serviceAccount = await getIamServiceAccount(
16
+ {
17
+ serviceAccountId
18
+ },
19
+ { provider }
20
+ );
21
+ var folder = await getResourcemanagerFolder(
22
+ {
23
+ folderId: serviceAccount.folderId
24
+ },
25
+ { provider }
26
+ );
27
+ if (!folder.cloudId) {
28
+ throw new Error("Could not determine cloud ID from folder");
29
+ }
30
+ var yandexCloud = output({
31
+ serviceAccountKeyFile: secrets.serviceAccountKeyFile,
32
+ cloudId: folder.cloudId,
33
+ defaultFolderId: serviceAccount.folderId,
34
+ defaultZone: args.defaultZone,
35
+ regionId: args.regionId
36
+ });
37
+ var connection_default = outputs({
38
+ yandexCloud,
39
+ $statusFields: {
40
+ cloudId: {
41
+ meta: {
42
+ icon: "mdi:cloud"
43
+ },
44
+ value: yandexCloud.cloudId
45
+ },
46
+ defaultFolderId: {
47
+ meta: {
48
+ icon: "mdi:folder"
49
+ },
50
+ value: yandexCloud.defaultFolderId
51
+ },
52
+ defaultZone: {
53
+ meta: {
54
+ icon: "mdi:map-marker"
55
+ },
56
+ value: yandexCloud.defaultZone
57
+ }
58
+ }
59
+ });
60
+
61
+ export { connection_default as default };
62
+ //# sourceMappingURL=index.js.map
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 { Provider, getIamServiceAccount, getResourcemanagerFolder } 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"]}
@@ -0,0 +1,6 @@
1
+ {
2
+ "sourceHashes": {
3
+ "./dist/connection/index.js": 2754881099,
4
+ "./dist/virtual-machine/index.js": 53036058
5
+ }
6
+ }
@@ -0,0 +1,150 @@
1
+ import { sshPrivateKeyToKeyPair, generateSshPrivateKey, generatePassword, parseL3Endpoint, createServerBundle, l3EndpointToString } from '@highstate/common';
2
+ 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
+
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
+ var { name, args, getSecret, inputs, outputs } = forUnit(yandex.virtualMachine);
24
+ var provider = await createProvider(inputs.yandexCloud);
25
+ var sshKeyPair = inputs.sshKeyPair ?? sshPrivateKeyToKeyPair(getSecret("sshPrivateKey", generateSshPrivateKey));
26
+ var rootPassword = getSecret("rootPassword", generatePassword);
27
+ var image = await getComputeImage(
28
+ {
29
+ family: args.disk.imageFamily
30
+ },
31
+ { provider }
32
+ );
33
+ var subnetId = args.network.subnetId;
34
+ if (!subnetId) {
35
+ const defaultSubnetName = await toPromise(interpolate`default-${inputs.yandexCloud.defaultZone}`);
36
+ const subnet = await getVpcSubnet(
37
+ {
38
+ folderId: await toPromise(inputs.yandexCloud.defaultFolderId),
39
+ name: defaultSubnetName
40
+ },
41
+ { provider }
42
+ );
43
+ if (!subnet.id) {
44
+ throw new Error(
45
+ `Could not find default subnet '${defaultSubnetName}' in zone ${inputs.yandexCloud.defaultZone}`
46
+ );
47
+ }
48
+ subnetId = subnet.id;
49
+ }
50
+ var disk = new ComputeDisk(
51
+ name,
52
+ {
53
+ name: `${name}-disk`,
54
+ type: args.disk.type,
55
+ size: args.disk.size,
56
+ imageId: image.id,
57
+ folderId: inputs.yandexCloud.defaultFolderId,
58
+ zone: inputs.yandexCloud.defaultZone
59
+ },
60
+ { provider }
61
+ );
62
+ var userData = interpolate`#cloud-config
63
+ users:
64
+ - name: root
65
+ ssh-authorized-keys:
66
+ - ${sshKeyPair.publicKey}
67
+ sudo: ALL=(ALL) NOPASSWD:ALL
68
+ ${Object.keys(args.metadata).length > 0 ? `
69
+ write_files:
70
+ ${Object.entries(args.metadata).map(
71
+ ([key, value]) => ` - path: /tmp/${key}
72
+ content: |
73
+ ${value}`
74
+ ).join("\n")}` : ""}
75
+ `;
76
+ var instance = new ComputeInstance(
77
+ name,
78
+ {
79
+ name,
80
+ description: getResourceComment(),
81
+ folderId: inputs.yandexCloud.defaultFolderId,
82
+ zone: inputs.yandexCloud.defaultZone,
83
+ platformId: args.platformId,
84
+ resources: {
85
+ cores: args.resources.cores,
86
+ memory: args.resources.memory,
87
+ coreFraction: args.resources.coreFraction
88
+ },
89
+ bootDisk: {
90
+ diskId: disk.id
91
+ },
92
+ networkInterfaces: [
93
+ {
94
+ subnetId,
95
+ nat: args.network.assignPublicIp
96
+ }
97
+ ],
98
+ metadata: {
99
+ "user-data": userData
100
+ }
101
+ },
102
+ { provider, ignoreChanges: ["bootDisk"] }
103
+ );
104
+ var publicIp = await toPromise(
105
+ instance.networkInterfaces.apply((ni) => {
106
+ const firstInterface = ni[0];
107
+ return args.network.assignPublicIp ? firstInterface?.natIpAddress : firstInterface?.ipAddress;
108
+ })
109
+ );
110
+ if (!publicIp) {
111
+ throw new Error("No IP address assigned to instance");
112
+ }
113
+ var endpoint = parseL3Endpoint(publicIp);
114
+ var { server, terminal } = await createServerBundle({
115
+ name,
116
+ endpoints: [endpoint],
117
+ sshArgs: args.ssh,
118
+ sshPassword: rootPassword,
119
+ sshPrivateKey: sshKeyPair.privateKey,
120
+ sshKeyPair
121
+ });
122
+ var virtual_machine_default = outputs({
123
+ server,
124
+ endpoints: [endpoint],
125
+ $statusFields: {
126
+ endpoints: {
127
+ value: [l3EndpointToString(endpoint)]
128
+ },
129
+ hostname: {
130
+ value: server.hostname
131
+ },
132
+ platformId: {
133
+ meta: {
134
+ icon: "mdi:chip"
135
+ },
136
+ value: args.platformId
137
+ },
138
+ resources: {
139
+ meta: {
140
+ icon: "mdi:memory"
141
+ },
142
+ value: `${args.resources.cores} cores, ${args.resources.memory}GB RAM`
143
+ }
144
+ },
145
+ $terminals: [terminal]
146
+ });
147
+
148
+ export { virtual_machine_default as default };
149
+ //# sourceMappingURL=index.js.map
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 { Provider } from \"@highstate/yandex-sdk\"\nimport type { yandex } from \"@highstate/library\"\nimport type { Input } from \"@highstate/pulumi\"\nimport { output, toPromise } from \"@highstate/pulumi\"\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 { ComputeInstance, ComputeDisk, 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 folderId: inputs.yandexCloud.defaultFolderId,\n zone: inputs.yandexCloud.defaultZone,\n },\n { provider },\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: {\n value: [l3EndpointToString(endpoint)],\n },\n hostname: {\n value: server.hostname,\n },\n platformId: {\n meta: {\n icon: \"mdi:chip\",\n },\n value: args.platformId,\n },\n resources: {\n meta: {\n icon: \"mdi:memory\",\n },\n value: `${args.resources.cores} cores, ${args.resources.memory}GB RAM`,\n },\n },\n\n $terminals: [terminal],\n})\n"]}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@highstate/yandex",
3
+ "version": "0.9.20",
4
+ "type": "module",
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "exports": {
9
+ "./connection": "./dist/connection/index.js",
10
+ "./virtual-machine": "./dist/virtual-machine/index.js"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "scripts": {
16
+ "build": "highstate build",
17
+ "generate-sdks": "./scripts/generate-sdks.sh"
18
+ },
19
+ "dependencies": {
20
+ "@highstate/common": "^0.9.20",
21
+ "@highstate/library": "^0.9.20",
22
+ "@highstate/pulumi": "^0.9.20",
23
+ "@highstate/yandex-sdk": "^0.9.20",
24
+ "@pulumi/pulumi": "^3.184.0"
25
+ },
26
+ "devDependencies": {
27
+ "@highstate/cli": "^0.9.20"
28
+ },
29
+ "gitHead": "4bf9183450c2c6f51d6a99d77efc379ff5c7b7ef"
30
+ }