@reyemtech/pulumi-rackspace-spot 0.1.4 → 0.2.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/cmd/install-plugin.js +19 -0
- package/cmd/provider/auth.d.ts +15 -0
- package/cmd/provider/auth.js +77 -0
- package/cmd/provider/auth.js.map +1 -0
- package/cmd/provider/client.d.ts +17 -0
- package/cmd/provider/client.js +75 -0
- package/cmd/provider/client.js.map +1 -0
- package/cmd/provider/functions/getCloudspace.d.ts +14 -0
- package/cmd/provider/functions/getCloudspace.js +18 -0
- package/cmd/provider/functions/getCloudspace.js.map +1 -0
- package/cmd/provider/functions/getKubeconfig.d.ts +10 -0
- package/cmd/provider/functions/getKubeconfig.js +26 -0
- package/cmd/provider/functions/getKubeconfig.js.map +1 -0
- package/cmd/provider/functions/getRegions.d.ts +10 -0
- package/cmd/provider/functions/getRegions.js +16 -0
- package/cmd/provider/functions/getRegions.js.map +1 -0
- package/cmd/provider/functions/getServerClasses.d.ts +17 -0
- package/cmd/provider/functions/getServerClasses.js +24 -0
- package/cmd/provider/functions/getServerClasses.js.map +1 -0
- package/cmd/provider/index.d.ts +1 -0
- package/cmd/provider/index.js +53 -0
- package/cmd/provider/index.js.map +1 -0
- package/cmd/provider/provider.d.ts +20 -0
- package/cmd/provider/provider.js +257 -0
- package/cmd/provider/provider.js.map +1 -0
- package/cmd/provider/resources/cloudspace.d.ts +33 -0
- package/cmd/provider/resources/cloudspace.js +114 -0
- package/cmd/provider/resources/cloudspace.js.map +1 -0
- package/cmd/provider/resources/ondemandnodepool.d.ts +35 -0
- package/cmd/provider/resources/ondemandnodepool.js +100 -0
- package/cmd/provider/resources/ondemandnodepool.js.map +1 -0
- package/cmd/provider/resources/spotnodepool.d.ts +40 -0
- package/cmd/provider/resources/spotnodepool.js +141 -0
- package/cmd/provider/resources/spotnodepool.js.map +1 -0
- package/cmd/pulumi-resource-rackspace-spot.js +2 -0
- package/package.json +11 -2
- package/cloudspace.ts +0 -29
- package/getCloudspace.ts +0 -23
- package/getKubeconfig.ts +0 -19
- package/getRegions.ts +0 -19
- package/getServerClasses.ts +0 -28
- package/index.ts +0 -10
- package/ondemandnodepool.ts +0 -33
- package/provider.ts +0 -11
- package/spotnodepool.ts +0 -37
- package/tsconfig.json +0 -15
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RackspaceSpotProvider = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const auth_1 = require("./auth");
|
|
41
|
+
const client_1 = require("./client");
|
|
42
|
+
const cloudspace_1 = require("./resources/cloudspace");
|
|
43
|
+
const spotnodepool_1 = require("./resources/spotnodepool");
|
|
44
|
+
const ondemandnodepool_1 = require("./resources/ondemandnodepool");
|
|
45
|
+
const getCloudspace_1 = require("./functions/getCloudspace");
|
|
46
|
+
const getKubeconfig_1 = require("./functions/getKubeconfig");
|
|
47
|
+
const getRegions_1 = require("./functions/getRegions");
|
|
48
|
+
const getServerClasses_1 = require("./functions/getServerClasses");
|
|
49
|
+
const API_BASE = "https://spot.rackspace.com";
|
|
50
|
+
/** Extract the simple resource type from a URN like `urn:pulumi:stack::project::rackspace-spot:index:CloudSpace::name` */
|
|
51
|
+
function resourceTypeFromUrn(urn) {
|
|
52
|
+
// URN format: urn:pulumi:<stack>::<project>::<module>:<type>::<name>
|
|
53
|
+
// The type segment is at index 2 (0-based after splitting on "::")
|
|
54
|
+
const typeSegment = urn.split("::")[2] ?? "";
|
|
55
|
+
// typeSegment is e.g. "rackspace-spot:index:CloudSpace"
|
|
56
|
+
const parts = typeSegment.split(":");
|
|
57
|
+
return parts[parts.length - 1] ?? "";
|
|
58
|
+
}
|
|
59
|
+
class RackspaceSpotProvider {
|
|
60
|
+
version;
|
|
61
|
+
schema;
|
|
62
|
+
refreshToken;
|
|
63
|
+
constructor(version, schema) {
|
|
64
|
+
this.version = version;
|
|
65
|
+
this.schema = schema;
|
|
66
|
+
}
|
|
67
|
+
// -------------------------------------------------------------------------
|
|
68
|
+
// Config validation / storage
|
|
69
|
+
// -------------------------------------------------------------------------
|
|
70
|
+
async checkConfig(urn, _olds, news) {
|
|
71
|
+
if (news["token"]) {
|
|
72
|
+
this.refreshToken = news["token"];
|
|
73
|
+
}
|
|
74
|
+
return { inputs: news };
|
|
75
|
+
}
|
|
76
|
+
async diffConfig(_id, _urn, _olds, news) {
|
|
77
|
+
return { changes: false };
|
|
78
|
+
}
|
|
79
|
+
async configure(news) {
|
|
80
|
+
if (news["token"]) {
|
|
81
|
+
this.refreshToken = news["token"];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
// Auth helper
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
async ensureClient() {
|
|
88
|
+
const token = this.refreshToken ??
|
|
89
|
+
process.env["RACKSPACE_SPOT_TOKEN"] ??
|
|
90
|
+
this.readSpotConfig();
|
|
91
|
+
if (!token) {
|
|
92
|
+
throw new Error("A Rackspace Spot refresh token is required. " +
|
|
93
|
+
"Set rackspace-spot:token, RACKSPACE_SPOT_TOKEN env var, " +
|
|
94
|
+
"or run `spotctl configure` (~/.spot_config).");
|
|
95
|
+
}
|
|
96
|
+
const auth = new auth_1.SpotAuth(token, API_BASE);
|
|
97
|
+
const { idToken, namespace } = await auth.getToken();
|
|
98
|
+
const client = new client_1.SpotClient(API_BASE, namespace, idToken);
|
|
99
|
+
return { client, token: idToken, namespace };
|
|
100
|
+
}
|
|
101
|
+
/** Read refreshToken from ~/.spot_config (created by `spotctl configure`). */
|
|
102
|
+
readSpotConfig() {
|
|
103
|
+
try {
|
|
104
|
+
const configPath = path.join(os.homedir(), ".spot_config");
|
|
105
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
106
|
+
for (const line of content.split("\n")) {
|
|
107
|
+
const match = line.match(/^refreshToken:\s*(.+)/);
|
|
108
|
+
if (match)
|
|
109
|
+
return match[1].trim();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// File doesn't exist or can't be read — fall through
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
// -------------------------------------------------------------------------
|
|
118
|
+
// check — pass inputs through unchanged
|
|
119
|
+
// -------------------------------------------------------------------------
|
|
120
|
+
async check(urn, _olds, news) {
|
|
121
|
+
return { inputs: news };
|
|
122
|
+
}
|
|
123
|
+
// -------------------------------------------------------------------------
|
|
124
|
+
// diff — pure logic, no API calls needed
|
|
125
|
+
// -------------------------------------------------------------------------
|
|
126
|
+
async diff(id, urn, olds, news) {
|
|
127
|
+
const type = resourceTypeFromUrn(urn);
|
|
128
|
+
switch (type) {
|
|
129
|
+
case "CloudSpace": {
|
|
130
|
+
const h = new cloudspace_1.CloudSpaceHandler(null, "");
|
|
131
|
+
return h.diff(olds, news);
|
|
132
|
+
}
|
|
133
|
+
case "SpotNodePool": {
|
|
134
|
+
const h = new spotnodepool_1.SpotNodePoolHandler(null, "");
|
|
135
|
+
return h.diff(olds, news);
|
|
136
|
+
}
|
|
137
|
+
case "OnDemandNodePool": {
|
|
138
|
+
const h = new ondemandnodepool_1.OnDemandNodePoolHandler(null, "");
|
|
139
|
+
return h.diff(olds, news);
|
|
140
|
+
}
|
|
141
|
+
default:
|
|
142
|
+
throw new Error(`Unknown resource type for diff: ${type}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// -------------------------------------------------------------------------
|
|
146
|
+
// create
|
|
147
|
+
// -------------------------------------------------------------------------
|
|
148
|
+
async create(urn, inputs) {
|
|
149
|
+
const { client, namespace } = await this.ensureClient();
|
|
150
|
+
const type = resourceTypeFromUrn(urn);
|
|
151
|
+
switch (type) {
|
|
152
|
+
case "CloudSpace": {
|
|
153
|
+
const h = new cloudspace_1.CloudSpaceHandler(client, namespace);
|
|
154
|
+
return h.create(inputs);
|
|
155
|
+
}
|
|
156
|
+
case "SpotNodePool": {
|
|
157
|
+
const h = new spotnodepool_1.SpotNodePoolHandler(client, namespace);
|
|
158
|
+
return h.create(inputs);
|
|
159
|
+
}
|
|
160
|
+
case "OnDemandNodePool": {
|
|
161
|
+
const h = new ondemandnodepool_1.OnDemandNodePoolHandler(client, namespace);
|
|
162
|
+
return h.create(inputs);
|
|
163
|
+
}
|
|
164
|
+
default:
|
|
165
|
+
throw new Error(`Unknown resource type for create: ${type}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// -------------------------------------------------------------------------
|
|
169
|
+
// read
|
|
170
|
+
// -------------------------------------------------------------------------
|
|
171
|
+
async read(id, urn, props) {
|
|
172
|
+
const { client, namespace } = await this.ensureClient();
|
|
173
|
+
const type = resourceTypeFromUrn(urn);
|
|
174
|
+
switch (type) {
|
|
175
|
+
case "CloudSpace": {
|
|
176
|
+
const h = new cloudspace_1.CloudSpaceHandler(client, namespace);
|
|
177
|
+
return h.read(id);
|
|
178
|
+
}
|
|
179
|
+
case "SpotNodePool": {
|
|
180
|
+
const h = new spotnodepool_1.SpotNodePoolHandler(client, namespace);
|
|
181
|
+
return h.read(id);
|
|
182
|
+
}
|
|
183
|
+
case "OnDemandNodePool": {
|
|
184
|
+
const h = new ondemandnodepool_1.OnDemandNodePoolHandler(client, namespace);
|
|
185
|
+
return h.read(id);
|
|
186
|
+
}
|
|
187
|
+
default:
|
|
188
|
+
throw new Error(`Unknown resource type for read: ${type}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// -------------------------------------------------------------------------
|
|
192
|
+
// update
|
|
193
|
+
// -------------------------------------------------------------------------
|
|
194
|
+
async update(id, urn, olds, news) {
|
|
195
|
+
const { client, namespace } = await this.ensureClient();
|
|
196
|
+
const type = resourceTypeFromUrn(urn);
|
|
197
|
+
switch (type) {
|
|
198
|
+
case "CloudSpace": {
|
|
199
|
+
const h = new cloudspace_1.CloudSpaceHandler(client, namespace);
|
|
200
|
+
return h.update(id, olds, news);
|
|
201
|
+
}
|
|
202
|
+
case "SpotNodePool": {
|
|
203
|
+
const h = new spotnodepool_1.SpotNodePoolHandler(client, namespace);
|
|
204
|
+
return h.update(id, olds, news);
|
|
205
|
+
}
|
|
206
|
+
case "OnDemandNodePool": {
|
|
207
|
+
const h = new ondemandnodepool_1.OnDemandNodePoolHandler(client, namespace);
|
|
208
|
+
return h.update(id, olds, news);
|
|
209
|
+
}
|
|
210
|
+
default:
|
|
211
|
+
throw new Error(`Unknown resource type for update: ${type}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// -------------------------------------------------------------------------
|
|
215
|
+
// delete
|
|
216
|
+
// -------------------------------------------------------------------------
|
|
217
|
+
async delete(id, urn, _props) {
|
|
218
|
+
const { client, namespace } = await this.ensureClient();
|
|
219
|
+
const type = resourceTypeFromUrn(urn);
|
|
220
|
+
switch (type) {
|
|
221
|
+
case "CloudSpace": {
|
|
222
|
+
const h = new cloudspace_1.CloudSpaceHandler(client, namespace);
|
|
223
|
+
return h.delete(id);
|
|
224
|
+
}
|
|
225
|
+
case "SpotNodePool": {
|
|
226
|
+
const h = new spotnodepool_1.SpotNodePoolHandler(client, namespace);
|
|
227
|
+
return h.delete(id);
|
|
228
|
+
}
|
|
229
|
+
case "OnDemandNodePool": {
|
|
230
|
+
const h = new ondemandnodepool_1.OnDemandNodePoolHandler(client, namespace);
|
|
231
|
+
return h.delete(id);
|
|
232
|
+
}
|
|
233
|
+
default:
|
|
234
|
+
throw new Error(`Unknown resource type for delete: ${type}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// -------------------------------------------------------------------------
|
|
238
|
+
// invoke — data source functions
|
|
239
|
+
// -------------------------------------------------------------------------
|
|
240
|
+
async invoke(token, inputs) {
|
|
241
|
+
const { client, token: idToken } = await this.ensureClient();
|
|
242
|
+
switch (token) {
|
|
243
|
+
case "rackspace-spot:index:getCloudspace":
|
|
244
|
+
return (0, getCloudspace_1.getCloudspace)(client, inputs);
|
|
245
|
+
case "rackspace-spot:index:getKubeconfig":
|
|
246
|
+
return (0, getKubeconfig_1.getKubeconfig)(client, idToken, inputs);
|
|
247
|
+
case "rackspace-spot:index:getRegions":
|
|
248
|
+
return (0, getRegions_1.getRegions)(client);
|
|
249
|
+
case "rackspace-spot:index:getServerClasses":
|
|
250
|
+
return (0, getServerClasses_1.getServerClasses)(client, inputs);
|
|
251
|
+
default:
|
|
252
|
+
throw new Error(`Unknown function token: ${token}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.RackspaceSpotProvider = RackspaceSpotProvider;
|
|
257
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SpotClient } from "../client";
|
|
2
|
+
export interface CloudSpaceInputs {
|
|
3
|
+
cloudspaceName: string;
|
|
4
|
+
region: string;
|
|
5
|
+
kubernetesVersion?: string;
|
|
6
|
+
cni?: string;
|
|
7
|
+
haControlPlane?: boolean;
|
|
8
|
+
preemptionWebhookUrl?: string;
|
|
9
|
+
deploymentType?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class CloudSpaceHandler {
|
|
12
|
+
private readonly client;
|
|
13
|
+
private readonly namespace;
|
|
14
|
+
constructor(client: SpotClient, namespace: string);
|
|
15
|
+
create(inputs: CloudSpaceInputs): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
outs: Record<string, any>;
|
|
18
|
+
}>;
|
|
19
|
+
read(id: string): Promise<{
|
|
20
|
+
id: string;
|
|
21
|
+
props: Record<string, any>;
|
|
22
|
+
inputs: Record<string, any>;
|
|
23
|
+
}>;
|
|
24
|
+
diff(olds: CloudSpaceInputs, news: CloudSpaceInputs): {
|
|
25
|
+
changes: boolean;
|
|
26
|
+
replaces: string[];
|
|
27
|
+
deleteBeforeReplace: boolean;
|
|
28
|
+
};
|
|
29
|
+
update(id: string, _olds: CloudSpaceInputs, news: CloudSpaceInputs): Promise<{
|
|
30
|
+
outs: Record<string, any>;
|
|
31
|
+
}>;
|
|
32
|
+
delete(id: string): Promise<void>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudSpaceHandler = void 0;
|
|
4
|
+
const RESOURCE = "cloudspaces";
|
|
5
|
+
const API_VERSION = "ngpc.rxt.io/v1";
|
|
6
|
+
const KIND = "CloudSpace";
|
|
7
|
+
// Fields that cannot change in-place; any change requires resource replacement.
|
|
8
|
+
const IMMUTABLE_FIELDS = [
|
|
9
|
+
"cloudspaceName",
|
|
10
|
+
"region",
|
|
11
|
+
"cni",
|
|
12
|
+
"deploymentType",
|
|
13
|
+
];
|
|
14
|
+
function buildBody(inputs, namespace) {
|
|
15
|
+
return {
|
|
16
|
+
apiVersion: API_VERSION,
|
|
17
|
+
kind: KIND,
|
|
18
|
+
metadata: {
|
|
19
|
+
name: inputs.cloudspaceName,
|
|
20
|
+
namespace,
|
|
21
|
+
},
|
|
22
|
+
spec: {
|
|
23
|
+
region: inputs.region,
|
|
24
|
+
cloud: "default",
|
|
25
|
+
kubernetesVersion: inputs.kubernetesVersion,
|
|
26
|
+
cni: inputs.cni,
|
|
27
|
+
HAControlPlane: inputs.haControlPlane,
|
|
28
|
+
deploymentType: inputs.deploymentType ?? "gen2",
|
|
29
|
+
webhook: inputs.preemptionWebhookUrl,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function mapToOutputs(resource) {
|
|
34
|
+
const spec = resource.spec ?? {};
|
|
35
|
+
const status = resource.status ?? {};
|
|
36
|
+
const result = {
|
|
37
|
+
cloudspaceName: resource.metadata?.name ?? "",
|
|
38
|
+
region: spec.region ?? "",
|
|
39
|
+
kubernetesVersion: spec.kubernetesVersion ?? "",
|
|
40
|
+
cni: spec.cni ?? "calico",
|
|
41
|
+
haControlPlane: spec.HAControlPlane ?? spec.haControlPlane ?? false,
|
|
42
|
+
preemptionWebhookUrl: spec.webhook ?? "",
|
|
43
|
+
deploymentType: spec.deploymentType ?? "gen2",
|
|
44
|
+
apiServerEndpoint: status.APIServerEndpoint ?? status.apiServerEndpoint ?? "",
|
|
45
|
+
phase: status.phase ?? "",
|
|
46
|
+
};
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
class CloudSpaceHandler {
|
|
50
|
+
client;
|
|
51
|
+
namespace;
|
|
52
|
+
constructor(client, namespace) {
|
|
53
|
+
this.client = client;
|
|
54
|
+
this.namespace = namespace;
|
|
55
|
+
}
|
|
56
|
+
async create(inputs) {
|
|
57
|
+
const body = buildBody(inputs, this.namespace);
|
|
58
|
+
const resource = await this.client.create(RESOURCE, body);
|
|
59
|
+
return {
|
|
60
|
+
id: inputs.cloudspaceName,
|
|
61
|
+
outs: JSON.parse(JSON.stringify(mapToOutputs(resource))),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async read(id) {
|
|
65
|
+
const resource = await this.client.get(RESOURCE, id);
|
|
66
|
+
// JSON round-trip to strip non-serializable values (protobuf requires plain JSON)
|
|
67
|
+
const outputs = JSON.parse(JSON.stringify(mapToOutputs(resource)));
|
|
68
|
+
return { id, props: outputs, inputs: outputs };
|
|
69
|
+
}
|
|
70
|
+
diff(olds, news) {
|
|
71
|
+
const replaces = [];
|
|
72
|
+
for (const field of IMMUTABLE_FIELDS) {
|
|
73
|
+
if (olds[field] !== news[field]) {
|
|
74
|
+
replaces.push(field);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Check mutable fields too so we can signal changes even with no replacements
|
|
78
|
+
const mutableFields = [
|
|
79
|
+
"kubernetesVersion",
|
|
80
|
+
"haControlPlane",
|
|
81
|
+
"preemptionWebhookUrl",
|
|
82
|
+
];
|
|
83
|
+
let mutableChanged = false;
|
|
84
|
+
for (const field of mutableFields) {
|
|
85
|
+
if (olds[field] !== news[field]) {
|
|
86
|
+
mutableChanged = true;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const changes = replaces.length > 0 || mutableChanged;
|
|
91
|
+
return { changes, replaces, deleteBeforeReplace: false };
|
|
92
|
+
}
|
|
93
|
+
async update(id, _olds, news) {
|
|
94
|
+
// GET latest to obtain metadata.resourceVersion for optimistic concurrency
|
|
95
|
+
const latest = await this.client.get(RESOURCE, id);
|
|
96
|
+
// Merge ONLY mutable fields onto the existing resource body
|
|
97
|
+
const updated = {
|
|
98
|
+
...latest,
|
|
99
|
+
spec: {
|
|
100
|
+
...latest.spec,
|
|
101
|
+
kubernetesVersion: news.kubernetesVersion,
|
|
102
|
+
HAControlPlane: news.haControlPlane,
|
|
103
|
+
webhook: news.preemptionWebhookUrl,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const resource = await this.client.update(RESOURCE, id, updated);
|
|
107
|
+
return { outs: mapToOutputs(resource) };
|
|
108
|
+
}
|
|
109
|
+
async delete(id) {
|
|
110
|
+
await this.client.remove(RESOURCE, id);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.CloudSpaceHandler = CloudSpaceHandler;
|
|
114
|
+
//# sourceMappingURL=cloudspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudspace.js","sourceRoot":"","sources":["../../resources/cloudspace.ts"],"names":[],"mappings":";;;AAEA,MAAM,QAAQ,GAAG,aAAa,CAAC;AAC/B,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,IAAI,GAAG,YAAY,CAAC;AAY1B,gFAAgF;AAChF,MAAM,gBAAgB,GAA+B;IACnD,gBAAgB;IAChB,QAAQ;IACR,KAAK;IACL,gBAAgB;CACjB,CAAC;AAEF,SAAS,SAAS,CAAC,MAAwB,EAAE,SAAiB;IAC5D,OAAO;QACL,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC,cAAc;YAC3B,SAAS;SACV;QACD,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,SAAS;YAChB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM;YAC/C,OAAO,EAAE,MAAM,CAAC,oBAAoB;SACrC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAAqB;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IACrC,MAAM,MAAM,GAAwB;QAClC,cAAc,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;QAC7C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,EAAE;QAC/C,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,QAAQ;QACzB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,IAAI,KAAK;QACnE,oBAAoB,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;QACxC,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,MAAM;QAC7C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE;QAC7E,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;KAC1B,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAa,iBAAiB;IACX,MAAM,CAAa;IACnB,SAAS,CAAS;IAEnC,YAAY,MAAkB,EAAE,SAAiB;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAwB;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,cAAc;YACzB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;SACzD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrD,kFAAkF;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,CACF,IAAsB,EACtB,IAAsB;QAEtB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,8EAA8E;QAC9E,MAAM,aAAa,GAA+B;YAChD,mBAAmB;YACnB,gBAAgB;YAChB,sBAAsB;SACvB,CAAC;QAEF,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAU,EACV,KAAuB,EACvB,IAAsB;QAEtB,2EAA2E;QAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEnD,4DAA4D;QAC5D,MAAM,OAAO,GAAgB;YAC3B,GAAG,MAAM;YACT,IAAI,EAAE;gBACJ,GAAG,MAAM,CAAC,IAAI;gBACd,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,OAAO,EAAE,IAAI,CAAC,oBAAoB;aACnC;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACjE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;CACF;AAlFD,8CAkFC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SpotClient } from "../client";
|
|
2
|
+
export interface OnDemandNodePoolInputs {
|
|
3
|
+
cloudspaceName: string;
|
|
4
|
+
serverClass: string;
|
|
5
|
+
desiredCount: number;
|
|
6
|
+
labels?: Record<string, string>;
|
|
7
|
+
annotations?: Record<string, string>;
|
|
8
|
+
taints?: Array<{
|
|
9
|
+
key: string;
|
|
10
|
+
value?: string;
|
|
11
|
+
effect: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare class OnDemandNodePoolHandler {
|
|
15
|
+
private readonly client;
|
|
16
|
+
private readonly namespace;
|
|
17
|
+
constructor(client: SpotClient, namespace: string);
|
|
18
|
+
create(inputs: OnDemandNodePoolInputs): Promise<{
|
|
19
|
+
id: string;
|
|
20
|
+
outs: Record<string, any>;
|
|
21
|
+
}>;
|
|
22
|
+
read(id: string): Promise<{
|
|
23
|
+
id: string;
|
|
24
|
+
props: Record<string, any>;
|
|
25
|
+
}>;
|
|
26
|
+
diff(olds: OnDemandNodePoolInputs, news: OnDemandNodePoolInputs): {
|
|
27
|
+
changes: boolean;
|
|
28
|
+
replaces: string[];
|
|
29
|
+
deleteBeforeReplace: boolean;
|
|
30
|
+
};
|
|
31
|
+
update(id: string, olds: OnDemandNodePoolInputs, news: OnDemandNodePoolInputs): Promise<{
|
|
32
|
+
outs: Record<string, any>;
|
|
33
|
+
}>;
|
|
34
|
+
delete(id: string): Promise<void>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OnDemandNodePoolHandler = void 0;
|
|
4
|
+
const RESOURCE = "ondemandnodepools";
|
|
5
|
+
function buildSpec(inputs) {
|
|
6
|
+
return {
|
|
7
|
+
cloudSpace: inputs.cloudspaceName,
|
|
8
|
+
serverClass: inputs.serverClass,
|
|
9
|
+
desired: inputs.desiredCount,
|
|
10
|
+
customLabels: inputs.labels ?? {},
|
|
11
|
+
customAnnotations: inputs.annotations ?? {},
|
|
12
|
+
customTaints: inputs.taints ?? [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function apiToOutputs(resource) {
|
|
16
|
+
const { metadata, spec, status } = resource;
|
|
17
|
+
return {
|
|
18
|
+
cloudspaceName: spec.cloudSpace,
|
|
19
|
+
serverClass: spec.serverClass,
|
|
20
|
+
desiredCount: spec.desired,
|
|
21
|
+
labels: spec.customLabels ?? {},
|
|
22
|
+
annotations: spec.customAnnotations ?? {},
|
|
23
|
+
taints: spec.customTaints ?? [],
|
|
24
|
+
nodepoolId: metadata.name,
|
|
25
|
+
reservedCount: status?.reservedCount,
|
|
26
|
+
reservedStatus: status?.reservedStatus,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function deepEqual(a, b) {
|
|
30
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
31
|
+
}
|
|
32
|
+
class OnDemandNodePoolHandler {
|
|
33
|
+
client;
|
|
34
|
+
namespace;
|
|
35
|
+
constructor(client, namespace) {
|
|
36
|
+
this.client = client;
|
|
37
|
+
this.namespace = namespace;
|
|
38
|
+
}
|
|
39
|
+
async create(inputs) {
|
|
40
|
+
const body = {
|
|
41
|
+
apiVersion: "ngpc.rxt.io/v1",
|
|
42
|
+
kind: "OnDemandNodePool",
|
|
43
|
+
metadata: {
|
|
44
|
+
namespace: this.namespace,
|
|
45
|
+
},
|
|
46
|
+
spec: buildSpec(inputs),
|
|
47
|
+
};
|
|
48
|
+
const resource = await this.client.create(RESOURCE, body);
|
|
49
|
+
const id = resource.metadata.name;
|
|
50
|
+
const outs = apiToOutputs(resource);
|
|
51
|
+
return { id, outs };
|
|
52
|
+
}
|
|
53
|
+
async read(id) {
|
|
54
|
+
const resource = await this.client.get(RESOURCE, id);
|
|
55
|
+
const props = apiToOutputs(resource);
|
|
56
|
+
return { id, props };
|
|
57
|
+
}
|
|
58
|
+
diff(olds, news) {
|
|
59
|
+
const replaces = [];
|
|
60
|
+
// Immutable fields
|
|
61
|
+
if (olds.cloudspaceName !== news.cloudspaceName)
|
|
62
|
+
replaces.push("cloudspaceName");
|
|
63
|
+
if (olds.serverClass !== news.serverClass)
|
|
64
|
+
replaces.push("serverClass");
|
|
65
|
+
// Mutable fields — detect any change
|
|
66
|
+
const mutableChanged = olds.desiredCount !== news.desiredCount ||
|
|
67
|
+
!deepEqual(olds.labels, news.labels) ||
|
|
68
|
+
!deepEqual(olds.annotations, news.annotations) ||
|
|
69
|
+
!deepEqual(olds.taints, news.taints);
|
|
70
|
+
const changes = replaces.length > 0 || mutableChanged;
|
|
71
|
+
return {
|
|
72
|
+
changes,
|
|
73
|
+
replaces,
|
|
74
|
+
deleteBeforeReplace: replaces.length > 0,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async update(id, olds, news) {
|
|
78
|
+
// Fetch latest to get the current resourceVersion
|
|
79
|
+
const latest = await this.client.get(RESOURCE, id);
|
|
80
|
+
const updatedSpec = {
|
|
81
|
+
...latest.spec,
|
|
82
|
+
desired: news.desiredCount,
|
|
83
|
+
customLabels: news.labels ?? {},
|
|
84
|
+
customAnnotations: news.annotations ?? {},
|
|
85
|
+
customTaints: news.taints ?? [],
|
|
86
|
+
};
|
|
87
|
+
const body = {
|
|
88
|
+
...latest,
|
|
89
|
+
spec: updatedSpec,
|
|
90
|
+
};
|
|
91
|
+
const updated = await this.client.update(RESOURCE, id, body);
|
|
92
|
+
const outs = apiToOutputs(updated);
|
|
93
|
+
return { outs };
|
|
94
|
+
}
|
|
95
|
+
async delete(id) {
|
|
96
|
+
await this.client.remove(RESOURCE, id);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.OnDemandNodePoolHandler = OnDemandNodePoolHandler;
|
|
100
|
+
//# sourceMappingURL=ondemandnodepool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ondemandnodepool.js","sourceRoot":"","sources":["../../resources/ondemandnodepool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SpotClient } from "../client";
|
|
2
|
+
export interface SpotNodePoolInputs {
|
|
3
|
+
cloudspaceName: string;
|
|
4
|
+
serverClass: string;
|
|
5
|
+
bidPrice: number;
|
|
6
|
+
desiredCount?: number;
|
|
7
|
+
autoscaling?: {
|
|
8
|
+
minNodes: number;
|
|
9
|
+
maxNodes: number;
|
|
10
|
+
};
|
|
11
|
+
labels?: Record<string, string>;
|
|
12
|
+
annotations?: Record<string, string>;
|
|
13
|
+
taints?: Array<{
|
|
14
|
+
key: string;
|
|
15
|
+
value?: string;
|
|
16
|
+
effect: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export declare class SpotNodePoolHandler {
|
|
20
|
+
private readonly client;
|
|
21
|
+
private readonly namespace;
|
|
22
|
+
constructor(client: SpotClient, namespace: string);
|
|
23
|
+
create(inputs: SpotNodePoolInputs): Promise<{
|
|
24
|
+
id: string;
|
|
25
|
+
outs: Record<string, any>;
|
|
26
|
+
}>;
|
|
27
|
+
read(id: string): Promise<{
|
|
28
|
+
id: string;
|
|
29
|
+
props: Record<string, any>;
|
|
30
|
+
}>;
|
|
31
|
+
diff(olds: SpotNodePoolInputs, news: SpotNodePoolInputs): {
|
|
32
|
+
changes: boolean;
|
|
33
|
+
replaces: string[];
|
|
34
|
+
deleteBeforeReplace: boolean;
|
|
35
|
+
};
|
|
36
|
+
update(id: string, olds: SpotNodePoolInputs, news: SpotNodePoolInputs): Promise<{
|
|
37
|
+
outs: Record<string, any>;
|
|
38
|
+
}>;
|
|
39
|
+
delete(id: string): Promise<void>;
|
|
40
|
+
}
|