@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,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
|
+
}
|