@highstate/library 0.11.7 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,34 @@
1
1
  import { defineEntity, defineUnit, z } from "@highstate/contract"
2
2
  import { serverOutputs, vmSecrets, vmSshArgs } from "../common"
3
- import { ipv4PrefixSchema, ipv46Schema } from "../network"
4
3
  import * as ssh from "../ssh"
5
4
 
6
- export const cloudEntity = defineEntity({
7
- type: "yandex.cloud.v0",
5
+ export const connectionEntity = defineEntity({
6
+ type: "yandex.connection.v1",
8
7
 
9
8
  schema: z.object({
10
- token: z.string().optional(),
9
+ /**
10
+ * The service account key file content (JSON).
11
+ */
11
12
  serviceAccountKeyFile: z.string().optional(),
13
+
14
+ /**
15
+ * The ID of the cloud.
16
+ */
12
17
  cloudId: z.string(),
18
+
19
+ /**
20
+ * The default folder ID.
21
+ */
13
22
  defaultFolderId: z.string(),
23
+
24
+ /**
25
+ * The default availability zone.
26
+ */
14
27
  defaultZone: z.string(),
28
+
29
+ /**
30
+ * The region ID.
31
+ */
15
32
  regionId: z.string().optional(),
16
33
  }),
17
34
 
@@ -24,23 +41,51 @@ export const cloudEntity = defineEntity({
24
41
  * The connection to a Yandex Cloud account.
25
42
  */
26
43
  export const connection = defineUnit({
27
- type: "yandex.connection.v0",
44
+ type: "yandex.connection.v1",
28
45
 
29
46
  args: {
30
47
  /**
31
- * The availability zone for resources.
48
+ * The region to create connection for.
49
+ *
50
+ * See [Regions](https://yandex.cloud/en/docs/overview/concepts/region) for details.
32
51
  */
33
- defaultZone: z.string().default("ru-central1-d"),
52
+ region: z
53
+ .discriminatedUnion("id", [
54
+ z.object({
55
+ /**
56
+ * The ID of the region.
57
+ */
58
+ id: z.literal("ru-central1"),
34
59
 
35
- /**
36
- * The region ID for resources.
37
- */
38
- regionId: z.string().default("ru-central1"),
60
+ /**
61
+ * The default availability zone in ru-central1 to place resources in.
62
+ */
63
+ defaultZone: z
64
+ .enum(["ru-central1-a", "ru-central1-b", "ru-central1-d"])
65
+ .default("ru-central1-d"),
66
+ }),
67
+ z.object({
68
+ /**
69
+ * The ID of the region.
70
+ */
71
+ id: z.literal("kz1"),
72
+
73
+ /**
74
+ * The default availability zone in kz1 to place resources in.
75
+ */
76
+ defaultZone: z.enum(["kz1-a"]).default("kz1-a"),
77
+ }),
78
+ ])
79
+ .prefault({ id: "ru-central1" }),
39
80
  },
40
81
 
41
82
  secrets: {
42
83
  /**
43
84
  * The service account key file content (JSON).
85
+ *
86
+ * Important: service account must have `iam.serviceAccounts.user` role to work properly.
87
+ *
88
+ * See [Creating an authorized key](https://yandex.cloud/en/docs/iam/operations/authentication/manage-authorized-keys#create-authorized-key) for details.
44
89
  */
45
90
  serviceAccountKeyFile: {
46
91
  schema: z.string().meta({ language: "json" }),
@@ -58,11 +103,11 @@ export const connection = defineUnit({
58
103
  /**
59
104
  * The Yandex Cloud connection.
60
105
  */
61
- yandexCloud: cloudEntity,
106
+ connection: connectionEntity,
62
107
  },
63
108
 
64
109
  meta: {
65
- title: "Yandex Cloud Connection",
110
+ title: "YC Connection",
66
111
  category: "Yandex Cloud",
67
112
  icon: "simple-icons:yandexcloud",
68
113
  iconColor: "#0080ff",
@@ -74,17 +119,186 @@ export const connection = defineUnit({
74
119
  },
75
120
  })
76
121
 
122
+ export const diskSchema = z.object({
123
+ /**
124
+ * The disk type.
125
+ *
126
+ * - Network SSD (network-ssd): Fast network drive; SSD network block storage.
127
+ * - Network HDD (network-hdd): Standard network drive; HDD network block storage.
128
+ * - Non-replicated SSD (network-ssd-nonreplicated): Enhanced performance network drive without redundancy.
129
+ * - Ultra high-speed network storage with three replicas (SSD) (network-ssd-io-m3): High-performance SSD offering the same speed as network-ssd-nonreplicated, plus redundancy.
130
+ */
131
+ type: z
132
+ .enum(["network-ssd", "network-hdd", "network-ssd-nonreplicated", "network-ssd-io-m3"])
133
+ .default("network-ssd"),
134
+
135
+ /**
136
+ * The disk size in GB.
137
+ *
138
+ * For `network-ssd-nonreplicated` and `network-ssd-io-m3` must be multiple of 93.
139
+ */
140
+ size: z.number().default(20),
141
+ })
142
+
143
+ export const diskEntity = defineEntity({
144
+ type: "yandex.disk.v1",
145
+
146
+ schema: z.object({
147
+ /**
148
+ * The global ID of the disk.
149
+ */
150
+ id: z.string(),
151
+ }),
152
+
153
+ meta: {
154
+ title: "YC Disk",
155
+ icon: "simple-icons:yandexcloud",
156
+ iconColor: "#0080ff",
157
+ secondaryIcon: "icon-park-outline:disk",
158
+ },
159
+ })
160
+
161
+ /**
162
+ * The disk on Yandex Cloud.
163
+ */
164
+ export const disk = defineUnit({
165
+ type: "yandex.disk.v1",
166
+
167
+ args: {
168
+ /**
169
+ * The name of the disk in the folder.
170
+ * If not specified, the name of the unit will be used.
171
+ */
172
+ diskName: z.string().optional(),
173
+
174
+ ...diskSchema.shape,
175
+ },
176
+
177
+ inputs: {
178
+ connection: connectionEntity,
179
+ },
180
+
181
+ outputs: {
182
+ /**
183
+ * The disk entity.
184
+ */
185
+ disk: diskEntity,
186
+ },
187
+
188
+ meta: {
189
+ title: "YC Disk",
190
+ category: "Yandex Cloud",
191
+ icon: "icon-park-outline:disk",
192
+ iconColor: "#0080ff",
193
+ secondaryIcon: "mage:compact-disk-fill",
194
+ },
195
+
196
+ source: {
197
+ package: "@highstate/yandex",
198
+ path: "disk",
199
+ },
200
+ })
201
+
202
+ export const imageEntity = defineEntity({
203
+ type: "yandex.image.v1",
204
+
205
+ schema: z.object({
206
+ /**
207
+ * The global ID of the image.
208
+ */
209
+ id: z.string(),
210
+ }),
211
+
212
+ meta: {
213
+ title: "Yandex Cloud Image",
214
+ icon: "simple-icons:yandexcloud",
215
+ iconColor: "#0080ff",
216
+ secondaryIcon: "mage:compact-disk-fill",
217
+ },
218
+ })
219
+
220
+ /**
221
+ * The existing image from Yandex Cloud Marketplace or user images.
222
+ */
223
+ export const existingImage = defineUnit({
224
+ type: "yandex.existing-image.v1",
225
+
226
+ args: {
227
+ /**
228
+ * The ID of the image.
229
+ *
230
+ * See [Yandex Cloud Marketplace Images](https://yandex.cloud/en/marketplace) to find available images and their IDs.
231
+ * You can also use user images by specifying their IDs.
232
+ */
233
+ id: z.string(),
234
+ },
235
+
236
+ inputs: {
237
+ connection: connectionEntity,
238
+ },
239
+
240
+ outputs: {
241
+ /**
242
+ * The image entity.
243
+ */
244
+ image: imageEntity,
245
+ },
246
+
247
+ meta: {
248
+ title: "YC Existing Image",
249
+ category: "Yandex Cloud",
250
+ icon: "simple-icons:yandexcloud",
251
+ iconColor: "#0080ff",
252
+ secondaryIcon: "mage:compact-disk-fill",
253
+ },
254
+
255
+ source: {
256
+ package: "@highstate/yandex",
257
+ path: "existing-image",
258
+ },
259
+ })
260
+
77
261
  /**
78
262
  * The virtual machine on Yandex Cloud.
79
263
  */
80
264
  export const virtualMachine = defineUnit({
81
- type: "yandex.virtual-machine.v0",
265
+ type: "yandex.virtual-machine.v1",
82
266
 
83
267
  args: {
268
+ /**
269
+ * The name of the virtual machine.
270
+ * If not specified, the name of the unit will be used.
271
+ */
272
+ vmName: z.string().optional(),
273
+
84
274
  /**
85
275
  * The platform ID for the instance.
276
+ *
277
+ * See [Platforms](https://yandex.cloud/en/docs/compute/concepts/vm-platforms) for details.
86
278
  */
87
- platformId: z.string().default("standard-v3"),
279
+ platformId: z
280
+ .enum([
281
+ // standard platforms
282
+ "standard-v1",
283
+ "standard-v2",
284
+ "standard-v3",
285
+ "amd-v1",
286
+ "standard-v4a",
287
+
288
+ // high-performance platforms
289
+ "highfreq-v3",
290
+ "highfreq-v4a",
291
+
292
+ // with gpu
293
+ "gpu-standard-v1",
294
+ "gpu-standard-v2",
295
+ "gpu-standard-v3",
296
+ "gpu-standard-v3i",
297
+ "standard-v3-t4",
298
+ "standard-v3-t4i",
299
+ "gpu-platform-v4",
300
+ ])
301
+ .default("standard-v3"),
88
302
 
89
303
  /**
90
304
  * The resources to allocate to the virtual machine.
@@ -102,7 +316,7 @@ export const virtualMachine = defineUnit({
102
316
  memory: z.number().default(4),
103
317
 
104
318
  /**
105
- * The core fraction (10-100).
319
+ * The guaranteed CPU core performance (10-100).
106
320
  */
107
321
  coreFraction: z.number().min(10).max(100).optional(),
108
322
  })
@@ -111,26 +325,7 @@ export const virtualMachine = defineUnit({
111
325
  /**
112
326
  * The boot disk configuration.
113
327
  */
114
- disk: z
115
- .object({
116
- /**
117
- * The disk size in GB.
118
- *
119
- * For `network-ssd-nonreplicated` must be multiple of 93.
120
- */
121
- size: z.number().default(20),
122
-
123
- /**
124
- * The disk type.
125
- */
126
- type: z.string().default("network-ssd-nonreplicated"),
127
-
128
- /**
129
- * The image family to use.
130
- */
131
- imageFamily: z.string().default("ubuntu-2204-lts"),
132
- })
133
- .prefault({}),
328
+ bootDisk: diskSchema.prefault({}),
134
329
 
135
330
  /**
136
331
  * The network configuration.
@@ -149,38 +344,20 @@ export const virtualMachine = defineUnit({
149
344
  assignPublicIp: z.boolean().default(true),
150
345
 
151
346
  /**
152
- * The list of DNS servers.
347
+ * Whether to reserve the public IP permanently.
348
+ *
349
+ * If not set, the public IP can be changed when the VM is stopped and started again.
350
+ *
351
+ * Makes no sense if `assignPublicIp` is false.
153
352
  */
154
- dns: ipv46Schema.array().default([]),
353
+ reservePublicIp: z.boolean().default(true),
155
354
  })
156
355
  .prefault({}),
157
356
 
158
- /**
159
- * The IPv4 address configuration.
160
- */
161
- ipv4: z
162
- .discriminatedUnion("type", [
163
- z.object({
164
- type: z.literal("dhcp"),
165
- }),
166
- z.object({
167
- type: z.literal("static"),
168
- address: z.string(),
169
- prefix: ipv4PrefixSchema.default(24),
170
- gateway: z.string().optional(),
171
- }),
172
- ])
173
- .default({ type: "dhcp" }),
174
-
175
357
  /**
176
358
  * The SSH configuration.
177
359
  */
178
360
  ssh: vmSshArgs,
179
-
180
- /**
181
- * Additional metadata for cloud-init.
182
- */
183
- metadata: z.record(z.string(), z.string()).default({}),
184
361
  },
185
362
 
186
363
  secrets: {
@@ -188,14 +365,15 @@ export const virtualMachine = defineUnit({
188
365
  },
189
366
 
190
367
  inputs: {
191
- yandexCloud: cloudEntity,
368
+ connection: connectionEntity,
369
+ image: imageEntity,
192
370
  ...ssh.inputs,
193
371
  },
194
372
 
195
373
  outputs: serverOutputs,
196
374
 
197
375
  meta: {
198
- title: "Yandex Cloud Virtual Machine",
376
+ title: "YC Virtual Machine",
199
377
  category: "Yandex Cloud",
200
378
  icon: "simple-icons:yandexcloud",
201
379
  iconColor: "#0080ff",
@@ -208,4 +386,4 @@ export const virtualMachine = defineUnit({
208
386
  },
209
387
  })
210
388
 
211
- export type Cloud = z.infer<typeof cloudEntity.schema>
389
+ export type Connection = z.infer<typeof connectionEntity.schema>