@highstate/proxmox 0.12.0 → 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/existing-image/index.js +2 -2
- package/dist/existing-image/index.js.map +1 -1
- package/dist/highstate.manifest.json +4 -4
- package/dist/image/index.js +7 -7
- package/dist/image/index.js.map +1 -1
- package/dist/virtual-machine/index.js +6 -5
- package/dist/virtual-machine/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,10 +3,10 @@ import { proxmox } from '@highstate/library';
|
|
|
3
3
|
import { forUnit } from '@highstate/pulumi';
|
|
4
4
|
import { storage } from '@muhlba91/pulumi-proxmoxve';
|
|
5
5
|
|
|
6
|
-
var {
|
|
6
|
+
var { args, inputs, outputs } = forUnit(proxmox.existingImage);
|
|
7
7
|
var provider = await createProvider(inputs.proxmoxCluster);
|
|
8
8
|
var image = storage.File.get(
|
|
9
|
-
|
|
9
|
+
"image",
|
|
10
10
|
args.id,
|
|
11
11
|
{
|
|
12
12
|
datastoreId: inputs.proxmoxCluster.defaultDatastoreId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/existing-image/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,
|
|
1
|
+
{"version":3,"sources":["../../src/existing-image/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,QAAQ,aAAa,CAAA;AAE/D,IAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA;AAE3D,IAAM,KAAA,GAAQ,QAAQ,IAAA,CAAK,GAAA;AAAA,EACzB,OAAA;AAAA,EACA,IAAA,CAAK,EAAA;AAAA,EACL;AAAA,IACE,WAAA,EAAa,OAAO,cAAA,CAAe,kBAAA;AAAA,IACnC,QAAA,EAAU,OAAO,cAAA,CAAe;AAAA,GAClC;AAAA,EACA,EAAE,QAAA;AACJ,CAAA;AAEA,IAAO,yBAAQ,OAAA,CAAQ;AAAA,EACrB,KAAA,EAAO;AAAA,IACL,IAAI,KAAA,CAAM;AAAA;AAEd,CAAC","file":"index.js","sourcesContent":["import { proxmox } from \"@highstate/library\"\nimport { forUnit } from \"@highstate/pulumi\"\nimport { storage } from \"@muhlba91/pulumi-proxmoxve\"\nimport { createProvider } from \"../provider\"\n\nconst { args, inputs, outputs } = forUnit(proxmox.existingImage)\n\nconst provider = await createProvider(inputs.proxmoxCluster)\n\nconst image = storage.File.get(\n \"image\",\n args.id,\n {\n datastoreId: inputs.proxmoxCluster.defaultDatastoreId,\n nodeName: inputs.proxmoxCluster.defaultNodeName,\n },\n { provider },\n)\n\nexport default outputs({\n image: {\n id: image.id,\n },\n})\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"sourceHashes": {
|
|
3
|
-
"./dist/connection/index.js":
|
|
4
|
-
"./dist/virtual-machine/index.js":
|
|
5
|
-
"./dist/existing-image/index.js":
|
|
6
|
-
"./dist/image/index.js":
|
|
3
|
+
"./dist/connection/index.js": 4232638209,
|
|
4
|
+
"./dist/virtual-machine/index.js": 370177195,
|
|
5
|
+
"./dist/existing-image/index.js": 2452340512,
|
|
6
|
+
"./dist/image/index.js": 1766845648
|
|
7
7
|
}
|
|
8
8
|
}
|
package/dist/image/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { proxmox } from '@highstate/library';
|
|
|
4
4
|
import { forUnit, toPromise, output } from '@highstate/pulumi';
|
|
5
5
|
import { download } from '@muhlba91/pulumi-proxmoxve';
|
|
6
6
|
|
|
7
|
-
var {
|
|
7
|
+
var { args, inputs, outputs } = forUnit(proxmox.image);
|
|
8
8
|
var provider = await createProvider(inputs.proxmoxCluster);
|
|
9
9
|
var url = args.url;
|
|
10
10
|
var checksum = args.checksum;
|
|
@@ -20,7 +20,7 @@ if (!url) {
|
|
|
20
20
|
checksum = file2.content.checksum;
|
|
21
21
|
}
|
|
22
22
|
var file = new download.File(
|
|
23
|
-
|
|
23
|
+
"image",
|
|
24
24
|
{
|
|
25
25
|
contentType: "iso",
|
|
26
26
|
checksumAlgorithm: checksum?.algorithm,
|
|
@@ -28,11 +28,11 @@ var file = new download.File(
|
|
|
28
28
|
datastoreId: args.datastoreId ?? inputs.proxmoxCluster.defaultDatastoreId,
|
|
29
29
|
url,
|
|
30
30
|
nodeName: args.nodeName ?? inputs.proxmoxCluster.defaultNodeName,
|
|
31
|
-
fileName: output(url).apply(getNameByUrl).apply(([
|
|
31
|
+
fileName: output(url).apply(getNameByUrl).apply(([name, extension]) => {
|
|
32
32
|
if (checksum) {
|
|
33
|
-
return `${
|
|
33
|
+
return `${name}-${checksum.value}.${extension}`;
|
|
34
34
|
}
|
|
35
|
-
return `${
|
|
35
|
+
return `${name}.${extension}`;
|
|
36
36
|
})
|
|
37
37
|
},
|
|
38
38
|
{ provider }
|
|
@@ -43,9 +43,9 @@ function getNameByUrl(url2) {
|
|
|
43
43
|
if (!parts || parts.length < 2) {
|
|
44
44
|
throw new Error(`Cannot extract file name and extension from URL: ${url2}`);
|
|
45
45
|
}
|
|
46
|
-
const
|
|
46
|
+
const name = parts.slice(0, parts.length - 1).join(".");
|
|
47
47
|
const extension = parts[parts.length - 1];
|
|
48
|
-
return [
|
|
48
|
+
return [name, extension];
|
|
49
49
|
}
|
|
50
50
|
var image_default = outputs({
|
|
51
51
|
image: {
|
package/dist/image/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/image/index.ts"],"names":["file","
|
|
1
|
+
{"version":3,"sources":["../../src/image/index.ts"],"names":["file","url"],"mappings":";;;;;;AAMA,IAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAEvD,IAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA;AAE3D,IAAI,MAA0B,IAAA,CAAK,GAAA;AACnC,IAAI,WAAwC,IAAA,CAAK,QAAA;AAEjD,IAAI,CAAC,GAAA,EAAK;AACR,EAAA,MAAMA,KAAAA,GAAO,MAAM,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AACxC,EAAA,IAAI,CAACA,KAAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAIA,KAAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAmDA,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,EAC1F;AAEA,EAAA,GAAA,GAAM,kBAAA,CAAmBA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC9C,EAAA,QAAA,GAAWA,MAAK,OAAA,CAAQ,QAAA;AAC1B;AAEA,IAAM,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA;AAAA,EACxB,OAAA;AAAA,EACA;AAAA,IACE,WAAA,EAAa,KAAA;AAAA,IACb,mBAAmB,QAAA,EAAU,SAAA;AAAA,IAC7B,UAAU,QAAA,EAAU,KAAA;AAAA,IAEpB,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,MAAA,CAAO,cAAA,CAAe,kBAAA;AAAA,IAEvD,GAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,cAAA,CAAe,eAAA;AAAA,IAEjD,QAAA,EAAU,MAAA,CAAO,GAAG,CAAA,CACjB,KAAA,CAAM,YAAY,CAAA,CAClB,KAAA,CAAM,CAAC,CAAC,IAAA,EAAM,SAAS,CAAA,KAAM;AAC5B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,QAAA,CAAS,KAAK,IAAI,SAAS,CAAA,CAAA;AAAA,MAC/C;AAEA,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,IAC7B,CAAC;AAAA,GACL;AAAA,EACA,EAAE,QAAA;AACJ,CAAA;AAEA,SAAS,aAAaC,IAAAA,EAAgD;AACpE,EAAA,MAAM,QAAA,GAAWA,IAAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,QAAA,EAAU,KAAA,CAAM,GAAG,CAAA;AAEjC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iDAAA,EAAoDA,IAAG,CAAA,CAAE,CAAA;AAAA,EAC3E;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAExC,EAAA,OAAO,CAAC,MAAM,SAAS,CAAA;AACzB;AAEA,IAAO,gBAAQ,OAAA,CAAQ;AAAA,EACrB,KAAA,EAAO;AAAA,IACL,IAAI,IAAA,CAAK;AAAA;AAEb,CAAC","file":"index.js","sourcesContent":["import { l7EndpointToString } from \"@highstate/common\"\nimport { type common, proxmox } from \"@highstate/library\"\nimport { forUnit, output, toPromise } from \"@highstate/pulumi\"\nimport { download } from \"@muhlba91/pulumi-proxmoxve\"\nimport { createProvider } from \"../provider\"\n\nconst { args, inputs, outputs } = forUnit(proxmox.image)\n\nconst provider = await createProvider(inputs.proxmoxCluster)\n\nlet url: string | undefined = args.url\nlet checksum: common.Checksum | undefined = args.checksum\n\nif (!url) {\n const file = await toPromise(inputs.file)\n if (!file) {\n throw new Error(\"No file provided and no URL specified.\")\n }\n\n if (file.content.type !== \"remote\") {\n throw new Error(`For now only \"remote\" files are supported, got \"${file.content.type}\".`)\n }\n\n url = l7EndpointToString(file.content.endpoint)\n checksum = file.content.checksum\n}\n\nconst file = new download.File(\n \"image\",\n {\n contentType: \"iso\",\n checksumAlgorithm: checksum?.algorithm,\n checksum: checksum?.value,\n\n datastoreId: args.datastoreId ?? inputs.proxmoxCluster.defaultDatastoreId,\n\n url,\n nodeName: args.nodeName ?? inputs.proxmoxCluster.defaultNodeName,\n\n fileName: output(url)\n .apply(getNameByUrl)\n .apply(([name, extension]) => {\n if (checksum) {\n return `${name}-${checksum.value}.${extension}`\n }\n\n return `${name}.${extension}`\n }),\n },\n { provider },\n)\n\nfunction getNameByUrl(url: string): [name: string, extension: string] {\n const fullName = url.split(\"/\").pop()?.split(\"?\")[0]\n const parts = fullName?.split(\".\")\n\n if (!parts || parts.length < 2) {\n throw new Error(`Cannot extract file name and extension from URL: ${url}`)\n }\n\n const name = parts.slice(0, parts.length - 1).join(\".\")\n const extension = parts[parts.length - 1]\n\n return [name, extension]\n}\n\nexport default outputs({\n image: {\n id: file.id,\n },\n})\n"]}
|
|
@@ -5,6 +5,7 @@ import { forUnit, toPromise, getResourceComment, output } from '@highstate/pulum
|
|
|
5
5
|
import { vm, storage } from '@muhlba91/pulumi-proxmoxve';
|
|
6
6
|
|
|
7
7
|
var { name, args, getSecret, inputs, outputs } = forUnit(proxmox.virtualMachine);
|
|
8
|
+
var vmName = args.vmName ?? name;
|
|
8
9
|
var provider = await createProvider(inputs.proxmoxCluster);
|
|
9
10
|
var nodeName = args.nodeName ?? inputs.proxmoxCluster.defaultNodeName;
|
|
10
11
|
var datastoreId = args.datastoreId ?? inputs.proxmoxCluster.defaultDatastoreId;
|
|
@@ -12,9 +13,9 @@ var inputVendorData = await toPromise(inputs.vendorData);
|
|
|
12
13
|
var sshKeyPair = inputs.sshKeyPair ?? sshPrivateKeyToKeyPair(getSecret("sshPrivateKey", generateSshPrivateKey));
|
|
13
14
|
var rootPassword = getSecret("rootPassword", generatePassword);
|
|
14
15
|
var machine = new vm.VirtualMachine(
|
|
15
|
-
|
|
16
|
+
"virtual-machine",
|
|
16
17
|
{
|
|
17
|
-
name,
|
|
18
|
+
name: vmName,
|
|
18
19
|
nodeName,
|
|
19
20
|
description: getResourceComment(),
|
|
20
21
|
agent: {
|
|
@@ -75,7 +76,7 @@ function createCloudInit() {
|
|
|
75
76
|
nodeName,
|
|
76
77
|
contentType: "snippets",
|
|
77
78
|
sourceRaw: {
|
|
78
|
-
fileName: `${
|
|
79
|
+
fileName: `${vmName}-vendor-data.yaml`,
|
|
79
80
|
data: vendorData
|
|
80
81
|
}
|
|
81
82
|
},
|
|
@@ -113,7 +114,7 @@ var ipv4Addresses = await toPromise(machine.ipv4Addresses);
|
|
|
113
114
|
var nonLocalHostIpV4 = findNonLocalHostIpV4(ipv4Addresses);
|
|
114
115
|
var endpoint = parseL3Endpoint(nonLocalHostIpV4);
|
|
115
116
|
var { server, terminal } = await createServerBundle({
|
|
116
|
-
name,
|
|
117
|
+
name: vmName,
|
|
117
118
|
endpoints: [endpoint],
|
|
118
119
|
sshArgs: args.ssh,
|
|
119
120
|
sshPassword: rootPassword,
|
|
@@ -125,7 +126,7 @@ var virtual_machine_default = outputs({
|
|
|
125
126
|
endpoints: [endpoint],
|
|
126
127
|
$statusFields: {
|
|
127
128
|
endpoints: [l3EndpointToString(endpoint)],
|
|
128
|
-
hostname:
|
|
129
|
+
hostname: vmName
|
|
129
130
|
},
|
|
130
131
|
$terminals: [terminal]
|
|
131
132
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/virtual-machine/index.ts"],"names":[],"mappings":";;;;;;AAcA,IAAM,EAAE,MAAM,IAAA,EAAM,SAAA,EAAW,QAAQ,OAAA,EAAQ,GAAI,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAEjF,IAAM,QAAA,GAAW,MAAM,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA;AAE3D,IAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,cAAA,CAAe,eAAA;AACxD,IAAM,WAAA,GAAc,IAAA,CAAK,WAAA,IAAe,MAAA,CAAO,cAAA,CAAe,kBAAA;AAC9D,IAAM,eAAA,GAAkB,MAAM,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAEzD,IAAM,aACJ,MAAA,CAAO,UAAA,IAAc,uBAAuB,SAAA,CAAU,eAAA,EAAiB,qBAAqB,CAAC,CAAA;AAE/F,IAAM,YAAA,GAAe,SAAA,CAAU,cAAA,EAAgB,gBAAgB,CAAA;AAE/D,IAAM,OAAA,GAAU,IAAI,EAAA,CAAG,cAAA;AAAA,EACrB,
|
|
1
|
+
{"version":3,"sources":["../../src/virtual-machine/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { VM } from \"@muhlba91/pulumi-proxmoxve/types/input\"\nimport {\n createServerBundle,\n generatePassword,\n generateSshPrivateKey,\n l3EndpointToString,\n parseL3Endpoint,\n sshPrivateKeyToKeyPair,\n} from \"@highstate/common\"\nimport { proxmox } from \"@highstate/library\"\nimport { forUnit, getResourceComment, type Input, output, toPromise } from \"@highstate/pulumi\"\nimport { storage, vm } from \"@muhlba91/pulumi-proxmoxve\"\nimport { createProvider } from \"../provider\"\n\nconst { name, args, getSecret, inputs, outputs } = forUnit(proxmox.virtualMachine)\n\nconst vmName = args.vmName ?? name\n\nconst provider = await createProvider(inputs.proxmoxCluster)\n\nconst nodeName = args.nodeName ?? inputs.proxmoxCluster.defaultNodeName\nconst datastoreId = args.datastoreId ?? inputs.proxmoxCluster.defaultDatastoreId\nconst inputVendorData = await toPromise(inputs.vendorData)\n\nconst sshKeyPair =\n inputs.sshKeyPair ?? sshPrivateKeyToKeyPair(getSecret(\"sshPrivateKey\", generateSshPrivateKey))\n\nconst rootPassword = getSecret(\"rootPassword\", generatePassword)\n\nconst machine = new vm.VirtualMachine(\n \"virtual-machine\",\n {\n name: vmName,\n nodeName,\n description: getResourceComment(),\n agent: {\n enabled: true,\n },\n cpu: {\n cores: args.resources.cores,\n sockets: args.resources.sockets,\n type: args.cpuType,\n },\n memory: {\n dedicated: args.resources.memory,\n },\n disks: [\n {\n interface: \"virtio0\",\n size: args.resources.diskSize,\n iothread: true,\n discard: \"on\",\n datastoreId,\n fileId: inputs.image.id,\n },\n ],\n networkDevices: [\n {\n bridge: args.network.bridge,\n },\n ],\n initialization: createCloudInit(),\n },\n { provider, ignoreChanges: [\"disks\", \"cdrom\"] },\n)\n\nfunction findNonLocalHostIpV4(ips: string[][]): string {\n for (const ip of ips) {\n if (ip[0] && ip[0] !== \"127.0.0.1\" && ip[0] !== \"::1\") {\n return ip[0]\n }\n }\n\n throw new Error(\"No non-local host IP found\")\n}\n\nfunction deriveIpV4Gateway(ip: string): string {\n return `${ip.split(\".\").slice(0, 3).join(\".\")}.1`\n}\n\nfunction createCloudInit(): VM.VirtualMachineInitialization {\n let vendorDataFileId: Input<string> | undefined\n\n if (args.vendorData || inputVendorData) {\n let vendorData: string | undefined = args.vendorData\n\n if (!vendorData) {\n if (inputVendorData!.content.type !== \"embedded\") {\n throw new Error(\"For now, only the embedded vendor data is supported.\")\n }\n\n vendorData = inputVendorData!.content.value\n }\n\n const file = new storage.File(\n \"vendor-data\",\n {\n datastoreId,\n nodeName,\n contentType: \"snippets\",\n sourceRaw: {\n fileName: `${vmName}-vendor-data.yaml`,\n data: vendorData,\n },\n },\n { provider },\n )\n\n vendorDataFileId = file.id\n }\n\n return {\n datastoreId,\n interface: \"ide2\",\n\n ipConfigs:\n args.ipv4.type === \"static\"\n ? [\n {\n ipv4: {\n address: `${args.ipv4.address}/${args.ipv4.prefix}`,\n gateway: args.ipv4.gateway ?? deriveIpV4Gateway(args.ipv4.address),\n },\n },\n ]\n : [\n {\n ipv4: {\n address: \"dhcp\",\n },\n },\n ],\n\n dns: args.network.dns.length > 0 ? { servers: args.network.dns } : undefined,\n\n userAccount: output({\n keys: [sshKeyPair.publicKey],\n username: \"root\",\n password: rootPassword,\n }),\n\n vendorDataFileId,\n }\n}\n\nconst ipv4Addresses = await toPromise(machine.ipv4Addresses)\nconst nonLocalHostIpV4 = findNonLocalHostIpV4(ipv4Addresses)\n\nconst endpoint = parseL3Endpoint(nonLocalHostIpV4)\n\nconst { server, terminal } = await createServerBundle({\n name: vmName,\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: vmName,\n },\n\n $terminals: [terminal],\n})\n"]}
|