@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.
- package/dist/chunk-27phq2qc.js +23 -0
- package/dist/connection/index.js +31 -30
- package/dist/existing-image/index.js +25 -20
- package/dist/highstate.manifest.json +4 -4
- package/dist/image/index.js +48 -36
- package/dist/virtual-machine/index.js +62 -60
- package/package.json +15 -14
- package/LICENSE +0 -21
- package/dist/chunk-NPPQI2HP.js +0 -27
- package/dist/chunk-NPPQI2HP.js.map +0 -1
- package/dist/connection/index.js.map +0 -1
- package/dist/existing-image/index.js.map +0 -1
- package/dist/image/index.js.map +0 -1
- package/dist/virtual-machine/index.js.map +0 -1
|
@@ -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 };
|
package/dist/connection/index.js
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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 =
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
//# sourceMappingURL=index.js.map
|
|
83
|
+
export {
|
|
84
|
+
connection_default as default
|
|
85
|
+
};
|
|
@@ -1,25 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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":
|
|
4
|
-
"./dist/virtual-machine/index.js":
|
|
5
|
-
"./dist/existing-image/index.js":
|
|
6
|
-
"./dist/image/index.js":
|
|
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
|
}
|
package/dist/image/index.js
CHANGED
|
@@ -1,42 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
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
|
|
13
|
-
if (!
|
|
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 (
|
|
17
|
-
throw new Error(`For now only "remote" files are supported, got "${
|
|
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(
|
|
20
|
-
checksum =
|
|
29
|
+
url = l7EndpointToString(file.content.endpoint);
|
|
30
|
+
checksum = file.content.checksum;
|
|
21
31
|
}
|
|
22
|
-
var file = new download.File(
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
//# sourceMappingURL=index.js.map
|
|
68
|
+
export {
|
|
69
|
+
image_default as default
|
|
70
|
+
};
|
|
@@ -1,53 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
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 ??
|
|
24
|
+
var sshKeyPair = inputs.sshKeyPair ?? getSecret("sshPrivateKey", generateSshPrivateKey).apply(sshPrivateKeyToKeyPair);
|
|
14
25
|
var rootPassword = getSecret("rootPassword", generatePassword);
|
|
15
|
-
var machine = new vm.VirtualMachine(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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 } :
|
|
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
|
-
|
|
134
|
-
|
|
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.
|
|
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
|
-
"@
|
|
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
|
-
"@
|
|
32
|
-
"@
|
|
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.
|
package/dist/chunk-NPPQI2HP.js
DELETED
|
@@ -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"]}
|
package/dist/image/index.js.map
DELETED
|
@@ -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"]}
|