@highstate/proxmox 0.19.1 → 0.21.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,23 @@
1
+ // @bun
2
+ // src/provider.ts
3
+ import { l7EndpointToString } from "@highstate/common";
4
+ import { output, toPromise } from "@highstate/pulumi";
5
+ import { Provider } from "@muhlba91/pulumi-proxmoxve";
6
+ function createProvider(cluster) {
7
+ return toPromise(output(cluster).apply((cluster2) => {
8
+ return new Provider("proxmox", {
9
+ endpoint: l7EndpointToString(cluster2.endpoint),
10
+ insecure: cluster2.insecure,
11
+ username: cluster2.username,
12
+ password: cluster2.password?.value,
13
+ apiToken: cluster2.apiToken?.value,
14
+ ssh: cluster2.ssh ? {
15
+ privateKey: cluster2.ssh.keyPair?.privateKey.value,
16
+ username: cluster2.ssh.user,
17
+ password: cluster2.ssh.password?.value
18
+ } : undefined
19
+ });
20
+ }));
21
+ }
22
+
23
+ export { createProvider };
@@ -1,21 +1,19 @@
1
- import { parseEndpoint, createServerBundle } from '@highstate/common';
2
- import { proxmox } from '@highstate/library';
3
- import { forUnit, toPromise, output } from '@highstate/pulumi';
4
- import { Provider, cluster, storage } from '@muhlba91/pulumi-proxmoxve';
5
-
1
+ // @bun
6
2
  // src/connection/index.ts
7
- var { name, args, secrets, inputs, outputs } = forUnit(proxmox.connection);
8
- var provider = await toPromise(
9
- output({ args, secrets }).apply(({ args: args2, secrets: secrets2 }) => {
10
- return new Provider("proxmox", {
11
- endpoint: args2.endpoint,
12
- insecure: args2.insecure,
13
- username: args2.username,
14
- password: secrets2.sshPassword,
15
- apiToken: secrets2.apiToken
16
- });
17
- })
18
- );
3
+ import { createServerBundle, parseEndpoint } from "@highstate/common";
4
+ import { proxmox } from "@highstate/library";
5
+ import { forUnit, makeEntityOutput, output, toPromise } from "@highstate/pulumi";
6
+ import { cluster, Provider, storage } from "@muhlba91/pulumi-proxmoxve";
7
+ var { stateId, name, args, secrets, inputs, outputs } = forUnit(proxmox.connection);
8
+ var provider = await toPromise(output({ args, secrets }).apply(({ args: args2, secrets: secrets2 }) => {
9
+ return new Provider("proxmox", {
10
+ endpoint: args2.endpoint,
11
+ insecure: args2.insecure,
12
+ username: args2.username,
13
+ password: secrets2.password,
14
+ apiToken: secrets2.apiToken
15
+ });
16
+ }));
19
17
  var nodes = await cluster.getNodes({ provider });
20
18
  if (nodes.names.length === 0) {
21
19
  throw new Error("No nodes found");
@@ -49,15 +47,19 @@ if (inputs.sshKeyPair || secrets.sshPassword || secrets.sshPrivateKey) {
49
47
  sshCredentials = server.ssh;
50
48
  nodeTerminal = terminal;
51
49
  }
52
- var proxmoxCluster = output({
53
- endpoint,
54
- insecure: args.insecure,
55
- username: args.username,
56
- defaultNodeName: nodeName,
57
- defaultDatastoreId: datastoreId,
58
- password: secrets.sshPassword,
59
- apiToken: secrets.apiToken,
60
- ssh: sshCredentials
50
+ var proxmoxCluster = makeEntityOutput({
51
+ entity: proxmox.clusterEntity,
52
+ identity: stateId,
53
+ value: {
54
+ endpoint,
55
+ insecure: args.insecure,
56
+ username: args.username,
57
+ defaultNodeName: nodeName,
58
+ defaultDatastoreId: datastoreId,
59
+ password: secrets.password,
60
+ apiToken: secrets.apiToken,
61
+ ssh: sshCredentials
62
+ }
61
63
  });
62
64
  var connection_default = outputs({
63
65
  proxmoxCluster,
@@ -78,7 +80,6 @@ var connection_default = outputs({
78
80
  }
79
81
  }
80
82
  });
81
-
82
- export { connection_default as default };
83
- //# sourceMappingURL=index.js.map
84
- //# sourceMappingURL=index.js.map
83
+ export {
84
+ connection_default as default
85
+ };
@@ -1,25 +1,30 @@
1
- import { createProvider } from '../chunk-NPPQI2HP.js';
2
- import { proxmox } from '@highstate/library';
3
- import { forUnit } from '@highstate/pulumi';
4
- import { storage } from '@muhlba91/pulumi-proxmoxve';
1
+ // @bun
2
+ import {
3
+ createProvider
4
+ } from "../chunk-27phq2qc.js";
5
5
 
6
+ // src/existing-image/index.ts
7
+ import { proxmox } from "@highstate/library";
8
+ import { forUnit, getCombinedIdentityOutput, makeEntityOutput } from "@highstate/pulumi";
9
+ import { storage } from "@muhlba91/pulumi-proxmoxve";
6
10
  var { args, inputs, outputs } = forUnit(proxmox.existingImage);
7
11
  var provider = await createProvider(inputs.proxmoxCluster);
8
- var image = storage.File.get(
9
- "image",
10
- args.id,
11
- {
12
- datastoreId: inputs.proxmoxCluster.defaultDatastoreId,
13
- nodeName: inputs.proxmoxCluster.defaultNodeName
14
- },
15
- { provider }
16
- );
12
+ var image = storage.File.get("image", args.id, {
13
+ datastoreId: inputs.proxmoxCluster.defaultDatastoreId,
14
+ nodeName: inputs.proxmoxCluster.defaultNodeName
15
+ }, { provider });
17
16
  var existing_image_default = outputs({
18
- image: {
19
- id: image.id
20
- }
17
+ image: makeEntityOutput({
18
+ entity: proxmox.imageEntity,
19
+ identity: getCombinedIdentityOutput([inputs.proxmoxCluster, image.id]),
20
+ meta: {
21
+ title: image.fileName
22
+ },
23
+ value: {
24
+ id: image.id
25
+ }
26
+ })
21
27
  });
22
-
23
- export { existing_image_default as default };
24
- //# sourceMappingURL=index.js.map
25
- //# sourceMappingURL=index.js.map
28
+ export {
29
+ existing_image_default as default
30
+ };
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "sourceHashes": {
3
- "./dist/connection/index.js": 2386027482,
4
- "./dist/virtual-machine/index.js": 3539137165,
5
- "./dist/existing-image/index.js": 1289689566,
6
- "./dist/image/index.js": 3082504750
3
+ "./dist/connection/index.js": 2682630323,
4
+ "./dist/virtual-machine/index.js": 1911689256,
5
+ "./dist/existing-image/index.js": 3496683035,
6
+ "./dist/image/index.js": 4125963652
7
7
  }
8
8
  }
@@ -1,42 +1,48 @@
1
- import { createProvider } from '../chunk-NPPQI2HP.js';
2
- import { l7EndpointToString } from '@highstate/common';
3
- import { proxmox } from '@highstate/library';
4
- import { forUnit, toPromise, output } from '@highstate/pulumi';
5
- import { download } from '@muhlba91/pulumi-proxmoxve';
1
+ // @bun
2
+ import {
3
+ createProvider
4
+ } from "../chunk-27phq2qc.js";
6
5
 
6
+ // src/image/index.ts
7
+ import { l7EndpointToString } from "@highstate/common";
8
+ import { proxmox } from "@highstate/library";
9
+ import {
10
+ forUnit,
11
+ getCombinedIdentityOutput,
12
+ makeEntityOutput,
13
+ output,
14
+ toPromise
15
+ } from "@highstate/pulumi";
16
+ import { download } from "@muhlba91/pulumi-proxmoxve";
7
17
  var { args, inputs, outputs } = forUnit(proxmox.image);
8
18
  var provider = await createProvider(inputs.proxmoxCluster);
9
19
  var url = args.url;
10
20
  var checksum = args.checksum;
11
21
  if (!url) {
12
- const file2 = await toPromise(inputs.file);
13
- if (!file2) {
22
+ const file = await toPromise(inputs.file);
23
+ if (!file) {
14
24
  throw new Error("No file provided and no URL specified.");
15
25
  }
16
- if (file2.content.type !== "remote") {
17
- throw new Error(`For now only "remote" files are supported, got "${file2.content.type}".`);
26
+ if (file.content.type !== "remote") {
27
+ throw new Error(`For now only "remote" files are supported, got "${file.content.type}".`);
18
28
  }
19
- url = l7EndpointToString(file2.content.endpoint);
20
- checksum = file2.content.checksum;
29
+ url = l7EndpointToString(file.content.endpoint);
30
+ checksum = file.content.checksum;
21
31
  }
22
- var file = new download.File(
23
- "image",
24
- {
25
- contentType: "iso",
26
- checksumAlgorithm: checksum?.algorithm,
27
- checksum: checksum?.value,
28
- datastoreId: args.datastoreId ?? inputs.proxmoxCluster.defaultDatastoreId,
29
- url,
30
- nodeName: args.nodeName ?? inputs.proxmoxCluster.defaultNodeName,
31
- fileName: output(url).apply(getNameByUrl).apply(([name, extension]) => {
32
- if (checksum) {
33
- return `${name}-${checksum.value}.${extension}`;
34
- }
35
- return `${name}.${extension}`;
36
- })
37
- },
38
- { provider }
39
- );
32
+ var file = new download.File("image", {
33
+ contentType: "iso",
34
+ checksumAlgorithm: checksum?.algorithm,
35
+ checksum: checksum?.value,
36
+ datastoreId: args.datastoreId ?? inputs.proxmoxCluster.defaultDatastoreId,
37
+ url,
38
+ nodeName: args.nodeName ?? inputs.proxmoxCluster.defaultNodeName,
39
+ fileName: output(url).apply(getNameByUrl).apply(([name, extension]) => {
40
+ if (checksum) {
41
+ return `${name}-${checksum.value}.${extension}`;
42
+ }
43
+ return `${name}.${extension}`;
44
+ })
45
+ }, { provider });
40
46
  function getNameByUrl(url2) {
41
47
  const fullName = url2.split("/").pop()?.split("?")[0];
42
48
  const parts = fullName?.split(".");
@@ -48,11 +54,17 @@ function getNameByUrl(url2) {
48
54
  return [name, extension];
49
55
  }
50
56
  var image_default = outputs({
51
- image: {
52
- id: file.id
53
- }
57
+ image: makeEntityOutput({
58
+ entity: proxmox.imageEntity,
59
+ identity: getCombinedIdentityOutput([inputs.proxmoxCluster, file.id]),
60
+ meta: {
61
+ title: file.fileName
62
+ },
63
+ value: {
64
+ id: file.id
65
+ }
66
+ })
54
67
  });
55
-
56
- export { image_default as default };
57
- //# sourceMappingURL=index.js.map
58
- //# sourceMappingURL=index.js.map
68
+ export {
69
+ image_default as default
70
+ };
@@ -1,53 +1,60 @@
1
- import { createProvider } from '../chunk-NPPQI2HP.js';
2
- import { sshPrivateKeyToKeyPair, generateSshPrivateKey, generatePassword, parseEndpoint, createServerBundle, l3EndpointToString } from '@highstate/common';
3
- import { proxmox } from '@highstate/library';
4
- import { forUnit, toPromise, getResourceComment, output } from '@highstate/pulumi';
5
- import { vm, storage } from '@muhlba91/pulumi-proxmoxve';
1
+ // @bun
2
+ import {
3
+ createProvider
4
+ } from "../chunk-27phq2qc.js";
6
5
 
6
+ // src/virtual-machine/index.ts
7
+ import {
8
+ createServerBundle,
9
+ generatePassword,
10
+ generateSshPrivateKey,
11
+ l3EndpointToString,
12
+ parseEndpoint,
13
+ sshPrivateKeyToKeyPair
14
+ } from "@highstate/common";
15
+ import { proxmox } from "@highstate/library";
16
+ import { forUnit, getResourceComment, output, toPromise } from "@highstate/pulumi";
17
+ import { storage, vm } from "@muhlba91/pulumi-proxmoxve";
7
18
  var { name, args, getSecret, inputs, outputs } = forUnit(proxmox.virtualMachine);
8
19
  var vmName = args.vmName ?? name;
9
20
  var provider = await createProvider(inputs.proxmoxCluster);
10
21
  var nodeName = args.nodeName ?? inputs.proxmoxCluster.defaultNodeName;
11
22
  var datastoreId = args.datastoreId ?? inputs.proxmoxCluster.defaultDatastoreId;
12
23
  var inputVendorData = await toPromise(inputs.vendorData);
13
- var sshKeyPair = inputs.sshKeyPair ?? sshPrivateKeyToKeyPair(getSecret("sshPrivateKey", generateSshPrivateKey));
24
+ var sshKeyPair = inputs.sshKeyPair ?? getSecret("sshPrivateKey", generateSshPrivateKey).apply(sshPrivateKeyToKeyPair);
14
25
  var rootPassword = getSecret("rootPassword", generatePassword);
15
- var machine = new vm.VirtualMachine(
16
- "virtual-machine",
17
- {
18
- name: vmName,
19
- nodeName,
20
- description: getResourceComment(),
21
- agent: {
22
- enabled: true
23
- },
24
- cpu: {
25
- cores: args.resources.cores,
26
- sockets: args.resources.sockets,
27
- type: args.cpuType
28
- },
29
- memory: {
30
- dedicated: args.resources.memory
31
- },
32
- disks: [
33
- {
34
- interface: "virtio0",
35
- size: args.resources.diskSize,
36
- iothread: true,
37
- discard: "on",
38
- datastoreId,
39
- fileId: inputs.image.id
40
- }
41
- ],
42
- networkDevices: [
43
- {
44
- bridge: args.network.bridge
45
- }
46
- ],
47
- initialization: createCloudInit()
26
+ var machine = new vm.VirtualMachine("virtual-machine", {
27
+ name: vmName,
28
+ nodeName,
29
+ description: getResourceComment(),
30
+ agent: {
31
+ enabled: true
32
+ },
33
+ cpu: {
34
+ cores: args.resources.cores,
35
+ sockets: args.resources.sockets,
36
+ type: args.cpuType
48
37
  },
49
- { provider, ignoreChanges: ["disks", "cdrom"] }
50
- );
38
+ memory: {
39
+ dedicated: args.resources.memory
40
+ },
41
+ disks: [
42
+ {
43
+ interface: "virtio0",
44
+ size: args.resources.diskSize,
45
+ iothread: true,
46
+ discard: "on",
47
+ datastoreId,
48
+ fileId: inputs.image.id
49
+ }
50
+ ],
51
+ networkDevices: [
52
+ {
53
+ bridge: args.network.bridge
54
+ }
55
+ ],
56
+ initialization: createCloudInit()
57
+ }, { provider, ignoreChanges: ["disks", "cdrom"] });
51
58
  function findNonLocalHostIpV4(ips) {
52
59
  for (const ip of ips) {
53
60
  if (ip[0] && ip[0] !== "127.0.0.1" && ip[0] !== "::1") {
@@ -69,19 +76,15 @@ function createCloudInit() {
69
76
  }
70
77
  vendorData = inputVendorData.content.value;
71
78
  }
72
- const file = new storage.File(
73
- "vendor-data",
74
- {
75
- datastoreId,
76
- nodeName,
77
- contentType: "snippets",
78
- sourceRaw: {
79
- fileName: `${vmName}-vendor-data.yaml`,
80
- data: vendorData
81
- }
82
- },
83
- { provider }
84
- );
79
+ const file = new storage.File("vendor-data", {
80
+ datastoreId,
81
+ nodeName,
82
+ contentType: "snippets",
83
+ sourceRaw: {
84
+ fileName: `${vmName}-vendor-data.yaml`,
85
+ data: vendorData
86
+ }
87
+ }, { provider });
85
88
  vendorDataFileId = file.id;
86
89
  }
87
90
  return {
@@ -101,7 +104,7 @@ function createCloudInit() {
101
104
  }
102
105
  }
103
106
  ],
104
- dns: args.network.dns.length > 0 ? { servers: args.network.dns } : void 0,
107
+ dns: args.network.dns.length > 0 ? { servers: args.network.dns } : undefined,
105
108
  userAccount: output({
106
109
  keys: [sshKeyPair.publicKey],
107
110
  username: "root",
@@ -118,7 +121,7 @@ var { server, terminal } = await createServerBundle({
118
121
  endpoints: [endpoint],
119
122
  sshArgs: args.ssh,
120
123
  sshPassword: rootPassword,
121
- sshPrivateKey: sshKeyPair.privateKey,
124
+ sshPrivateKey: sshKeyPair.privateKey.value,
122
125
  sshKeyPair
123
126
  });
124
127
  var virtual_machine_default = outputs({
@@ -129,7 +132,6 @@ var virtual_machine_default = outputs({
129
132
  },
130
133
  $terminals: [terminal]
131
134
  });
132
-
133
- export { virtual_machine_default as default };
134
- //# sourceMappingURL=index.js.map
135
- //# sourceMappingURL=index.js.map
135
+ export {
136
+ virtual_machine_default as default
137
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@highstate/proxmox",
3
- "version": "0.19.1",
3
+ "version": "0.21.1",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -19,25 +19,26 @@
19
19
  "stdlib"
20
20
  ]
21
21
  },
22
+ "scripts": {
23
+ "build": "highstate build",
24
+ "typecheck": "tsgo --noEmit --skipLibCheck",
25
+ "biome": "biome check --write --unsafe --error-on-warnings",
26
+ "biome:check": "biome check --error-on-warnings"
27
+ },
22
28
  "dependencies": {
29
+ "@highstate/common": "0.20.0",
30
+ "@highstate/contract": "0.20.0",
31
+ "@highstate/library": "0.20.0",
32
+ "@highstate/pulumi": "0.20.0",
23
33
  "@muhlba91/pulumi-proxmoxve": "^6.17.1",
24
- "@highstate/common": "0.19.1",
25
- "@highstate/library": "0.19.1",
26
- "@highstate/contract": "0.19.1",
27
- "@highstate/pulumi": "0.19.1"
34
+ "@pulumi/pulumi": "3.232.0"
28
35
  },
29
36
  "devDependencies": {
30
37
  "@biomejs/biome": "2.2.0",
31
- "@typescript/native-preview": "^7.0.0-dev.20250920.1",
32
- "@highstate/cli": "0.19.1"
38
+ "@highstate/cli": "0.20.0",
39
+ "@typescript/native-preview": "^7.0.0-dev.20250920.1"
33
40
  },
34
41
  "repository": {
35
42
  "url": "https://github.com/highstate-io/highstate"
36
- },
37
- "scripts": {
38
- "build": "highstate build",
39
- "typecheck": "tsgo --noEmit --skipLibCheck",
40
- "biome": "biome check --write --unsafe --error-on-warnings",
41
- "biome:check": "biome check --error-on-warnings"
42
43
  }
43
- }
44
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Exeteres
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,27 +0,0 @@
1
- import { l7EndpointToString } from '@highstate/common';
2
- import { toPromise, output } from '@highstate/pulumi';
3
- import { Provider } from '@muhlba91/pulumi-proxmoxve';
4
-
5
- // src/provider.ts
6
- function createProvider(cluster) {
7
- return toPromise(
8
- output(cluster).apply((cluster2) => {
9
- return new Provider("proxmox", {
10
- endpoint: l7EndpointToString(cluster2.endpoint),
11
- insecure: cluster2.insecure,
12
- username: cluster2.username,
13
- password: cluster2.password,
14
- apiToken: cluster2.apiToken,
15
- ssh: cluster2.ssh ? {
16
- privateKey: cluster2.ssh.keyPair?.privateKey,
17
- username: cluster2.ssh.user,
18
- password: cluster2.ssh.password
19
- } : void 0
20
- });
21
- })
22
- );
23
- }
24
-
25
- export { createProvider };
26
- //# sourceMappingURL=chunk-NPPQI2HP.js.map
27
- //# sourceMappingURL=chunk-NPPQI2HP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/provider.ts"],"names":["cluster"],"mappings":";;;;;AAKO,SAAS,eAAe,OAAA,EAAoD;AACjF,EAAA,OAAO,SAAA;AAAA,IACL,MAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,CAAAA,QAAAA,KAAW;AAC/B,MAAA,OAAO,IAAI,SAAS,SAAA,EAAW;AAAA,QAC7B,QAAA,EAAU,kBAAA,CAAmBA,QAAAA,CAAQ,QAAQ,CAAA;AAAA,QAE7C,UAAUA,QAAAA,CAAQ,QAAA;AAAA,QAClB,UAAUA,QAAAA,CAAQ,QAAA;AAAA,QAClB,UAAUA,QAAAA,CAAQ,QAAA;AAAA,QAElB,UAAUA,QAAAA,CAAQ,QAAA;AAAA,QAElB,GAAA,EAAKA,SAAQ,GAAA,GACT;AAAA,UACE,UAAA,EAAYA,QAAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,UAAA;AAAA,UACjC,QAAA,EAAUA,SAAQ,GAAA,CAAI,IAAA;AAAA,UACtB,QAAA,EAAUA,SAAQ,GAAA,CAAI;AAAA,SACxB,GACA;AAAA,OACL,CAAA;AAAA,IACH,CAAC;AAAA,GACH;AACF","file":"chunk-NPPQI2HP.js","sourcesContent":["import type { proxmox } from \"@highstate/library\"\nimport { l7EndpointToString } from \"@highstate/common\"\nimport { type Input, output, toPromise } from \"@highstate/pulumi\"\nimport { Provider } from \"@muhlba91/pulumi-proxmoxve\"\n\nexport function createProvider(cluster: Input<proxmox.Cluster>): Promise<Provider> {\n return toPromise(\n output(cluster).apply(cluster => {\n return new Provider(\"proxmox\", {\n endpoint: l7EndpointToString(cluster.endpoint),\n\n insecure: cluster.insecure,\n username: cluster.username,\n password: cluster.password,\n\n apiToken: cluster.apiToken,\n\n ssh: cluster.ssh\n ? {\n privateKey: cluster.ssh.keyPair?.privateKey,\n username: cluster.ssh.user,\n password: cluster.ssh.password,\n }\n : undefined,\n })\n }),\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/connection/index.ts"],"names":["args","secrets"],"mappings":"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","file":"index.js","sourcesContent":["import type { UnitTerminal } from \"@highstate/contract\"\nimport type { Output } from \"@highstate/pulumi\"\nimport { createServerBundle, parseEndpoint } from \"@highstate/common\"\nimport { type common, proxmox, type ssh } from \"@highstate/library\"\nimport { forUnit, output, toPromise } from \"@highstate/pulumi\"\nimport { cluster, Provider, storage } from \"@muhlba91/pulumi-proxmoxve\"\n\nconst { name, args, secrets, inputs, outputs } = forUnit(proxmox.connection)\n\nconst provider = await toPromise(\n output({ args, secrets }).apply(({ args, secrets }) => {\n return new Provider(\"proxmox\", {\n endpoint: args.endpoint,\n insecure: args.insecure,\n\n username: args.username,\n password: secrets.sshPassword,\n\n apiToken: secrets.apiToken,\n })\n }),\n)\n\nconst nodes = await cluster.getNodes({ provider })\nif (nodes.names.length === 0) {\n throw new Error(\"No nodes found\")\n}\n\nconst nodeName = args.defaultNodeName ?? nodes.names[0]\nif (!nodes.names.includes(nodeName)) {\n throw new Error(`Node \"${nodeName}\" not found in the cluster`)\n}\n\nconst datastores = await storage.getDatastores({ nodeName }, { provider })\nif (datastores.datastoreIds.length === 0) {\n throw new Error(`No datastores found in the node \"${nodeName}\"`)\n}\n\nconst datastoreId = args.defaultDatastoreId ?? datastores.datastoreIds[0]\nif (!datastores.datastoreIds.includes(datastoreId)) {\n throw new Error(`Datastore \"${datastoreId}\" not found in the node \"${nodeName}\"`)\n}\n\nconst endpoint = parseEndpoint(args.endpoint, 7)\n\nlet serverEntity: Output<common.Server> | undefined\nlet sshCredentials: Output<ssh.Connection | undefined> | undefined\nlet nodeTerminal: Output<UnitTerminal> | undefined\n\nif (inputs.sshKeyPair || secrets.sshPassword || secrets.sshPrivateKey) {\n const { server, terminal } = await createServerBundle({\n name,\n endpoints: [endpoint],\n sshArgs: args.ssh,\n sshPassword: secrets.sshPassword,\n sshPrivateKey: secrets.sshPrivateKey,\n sshKeyPair: inputs.sshKeyPair,\n })\n\n serverEntity = server\n sshCredentials = server.ssh\n nodeTerminal = terminal\n}\n\nconst proxmoxCluster: Output<proxmox.Cluster> = output({\n endpoint,\n insecure: args.insecure,\n username: args.username,\n defaultNodeName: nodeName,\n defaultDatastoreId: datastoreId,\n password: secrets.sshPassword,\n apiToken: secrets.apiToken,\n ssh: sshCredentials,\n})\n\nexport default outputs({\n proxmoxCluster,\n server: serverEntity,\n\n $terminals: [nodeTerminal],\n\n $statusFields: {\n defaultNodeName: {\n meta: {\n icon: \"mdi:server\",\n },\n value: proxmoxCluster.defaultNodeName,\n },\n defaultDatastoreId: {\n meta: {\n icon: \"mdi:database\",\n },\n value: proxmoxCluster.defaultDatastoreId,\n },\n },\n})\n"]}
@@ -1 +0,0 @@
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 +0,0 @@
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"]}
@@ -1 +0,0 @@
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 parseEndpoint,\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 = parseEndpoint(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\n $statusFields: {\n endpoints: [l3EndpointToString(endpoint)],\n hostname: vmName,\n },\n\n $terminals: [terminal],\n})\n"]}