xpk 0.13.0__py3-none-any.whl → 0.14.0__py3-none-any.whl

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.
Files changed (64) hide show
  1. xpk/commands/batch.py +9 -2
  2. xpk/commands/cluster.py +128 -115
  3. xpk/commands/cluster_gcluster.py +77 -14
  4. xpk/commands/cluster_gcluster_test.py +177 -0
  5. xpk/commands/common.py +10 -28
  6. xpk/commands/info.py +11 -9
  7. xpk/commands/inspector.py +21 -10
  8. xpk/commands/job.py +25 -9
  9. xpk/commands/kind.py +38 -40
  10. xpk/commands/kjob_common.py +4 -4
  11. xpk/commands/run.py +9 -2
  12. xpk/commands/shell.py +13 -10
  13. xpk/commands/storage.py +21 -0
  14. xpk/commands/version.py +0 -4
  15. xpk/commands/workload.py +43 -22
  16. xpk/core/blueprint/blueprint_generator.py +4 -40
  17. xpk/core/blueprint/blueprint_test.py +0 -6
  18. xpk/core/capacity.py +6 -5
  19. xpk/core/cluster.py +91 -194
  20. xpk/core/cluster_private.py +6 -11
  21. xpk/core/commands.py +11 -18
  22. xpk/core/config.py +1 -1
  23. xpk/core/docker_image.py +3 -4
  24. xpk/core/gcloud_context.py +26 -2
  25. xpk/core/gcloud_context_test.py +96 -0
  26. xpk/core/gcluster_manager.py +0 -3
  27. xpk/core/jobset.py +4 -7
  28. xpk/core/kjob.py +14 -27
  29. xpk/core/kueue_manager.py +383 -0
  30. xpk/core/kueue_manager_test.py +542 -0
  31. xpk/core/monitoring.py +1 -1
  32. xpk/core/nap.py +10 -15
  33. xpk/core/network.py +17 -18
  34. xpk/core/nodepool.py +66 -77
  35. xpk/core/nodepool_test.py +198 -1
  36. xpk/core/pathways.py +5 -5
  37. xpk/core/ray.py +10 -14
  38. xpk/core/resources.py +6 -11
  39. xpk/core/scheduling.py +19 -1
  40. xpk/core/scheduling_test.py +31 -0
  41. xpk/core/system_characteristics.py +335 -229
  42. xpk/core/vertex.py +1 -1
  43. xpk/core/workload.py +7 -8
  44. xpk/main.py +2 -4
  45. xpk/parser/cluster.py +7 -0
  46. xpk/parser/cluster_test.py +66 -0
  47. xpk/parser/common.py +11 -0
  48. xpk/parser/workload.py +62 -25
  49. xpk/parser/workload_test.py +82 -0
  50. xpk/utils/feature_flags.py +28 -0
  51. xpk/utils/kueue.py +20 -0
  52. xpk/utils/templates.py +2 -0
  53. xpk/utils/topology.py +37 -0
  54. xpk/utils/topology_test.py +43 -0
  55. xpk/utils/validation.py +79 -55
  56. xpk/utils/validation_test.py +37 -0
  57. {xpk-0.13.0.dist-info → xpk-0.14.0.dist-info}/METADATA +6 -1
  58. xpk-0.14.0.dist-info/RECORD +112 -0
  59. xpk/core/kueue.py +0 -561
  60. xpk-0.13.0.dist-info/RECORD +0 -101
  61. {xpk-0.13.0.dist-info → xpk-0.14.0.dist-info}/WHEEL +0 -0
  62. {xpk-0.13.0.dist-info → xpk-0.14.0.dist-info}/entry_points.txt +0 -0
  63. {xpk-0.13.0.dist-info → xpk-0.14.0.dist-info}/licenses/LICENSE +0 -0
  64. {xpk-0.13.0.dist-info → xpk-0.14.0.dist-info}/top_level.txt +0 -0
xpk/core/kueue.py DELETED
@@ -1,561 +0,0 @@
1
- """
2
- Copyright 2024 Google LLC
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- https://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- """
16
-
17
- from argparse import Namespace
18
-
19
- import math
20
- import packaging
21
- from packaging.version import Version
22
-
23
- from ..utils.console import xpk_exit, xpk_print
24
- from ..utils.file import write_tmp_file
25
- from .capacity import B200_DEVICE_TYPE, H100_MEGA_DEVICE_TYPE, H200_DEVICE_TYPE
26
- from .commands import (
27
- run_command_for_value,
28
- run_command_with_updates,
29
- run_command_with_updates_retry,
30
- )
31
- from .pathways import add_pw_resource_flavors, add_pw_resources_to_kueue
32
- from .resources import AutoprovisioningConfig
33
- from .scheduling import (
34
- create_accelerator_label,
35
- create_machine_label,
36
- get_total_chips_requested_from_args,
37
- )
38
- from .system_characteristics import (
39
- AcceleratorTypeToAcceleratorCharacteristics,
40
- SystemCharacteristics,
41
- )
42
-
43
- KUEUE_VERSION = 'v0.12.2'
44
- CLUSTER_QUEUE_NAME = 'cluster-queue'
45
- LOCAL_QUEUE_NAME = 'multislice-queue'
46
- WAIT_FOR_KUEUE_TIMEOUT = '10m'
47
- MEMORY_SIZE_PER_VM = 1.2
48
- MIN_MEMORY_LIMIT_SIZE = 4096
49
-
50
- packaging.version.VERSION_PATTERN = r'^v\d+\.\d+\.\d+$'
51
-
52
- topology_yaml = """apiVersion: kueue.x-k8s.io/v1alpha1
53
- kind: Topology
54
- metadata:
55
- name: "gke-default"
56
- spec:
57
- levels:
58
- - nodeLabel: "cloud.google.com/gce-topology-block"
59
- - nodeLabel: "cloud.google.com/gce-topology-subblock"
60
- - nodeLabel: "cloud.google.com/gce-topology-host"
61
- - nodeLabel: "kubernetes.io/hostname"
62
- ---
63
- """
64
-
65
- cluster_set_crd_yaml = """apiVersion: kueue.x-k8s.io/v1beta1
66
- kind: ResourceFlavor
67
- metadata:
68
- name: {cluster_hardware_name}
69
- spec:
70
- nodeLabels:
71
- {accelerator_label}
72
- {machine_label}
73
- {topology_label}
74
- ---
75
- apiVersion: kueue.x-k8s.io/v1beta1
76
- kind: AdmissionCheck
77
- metadata:
78
- name: dws-prov
79
- spec:
80
- controllerName: kueue.x-k8s.io/provisioning-request
81
- parameters:
82
- apiGroup: kueue.x-k8s.io
83
- kind: ProvisioningRequestConfig
84
- name: dws-config
85
- ---
86
- apiVersion: kueue.x-k8s.io/v1beta1
87
- kind: ProvisioningRequestConfig
88
- metadata:
89
- name: dws-config
90
- spec:
91
- provisioningClassName: queued-provisioning.gke.io
92
- podSetUpdates:
93
- nodeSelector:
94
- - key: autoscaling.gke.io/provisioning-request
95
- valueFromProvisioningClassDetail: ResizeRequestName
96
- managedResources:
97
- - {managed_resource}
98
- ---
99
- {pw_resource_flavors}
100
- apiVersion: kueue.x-k8s.io/v1beta1
101
- kind: ClusterQueue
102
- metadata:
103
- name: {cluster_queue_name}
104
- spec:
105
- preemption:
106
- reclaimWithinCohort: Never # Don't preempt other queues in the cohort.
107
- withinClusterQueue: LowerPriority
108
- namespaceSelector: {{}} # match all.
109
- resourceGroups:
110
- {covered_resources_config}
111
- {pw_resources_kueue}
112
- {admission_checks}
113
- ---
114
- apiVersion: kueue.x-k8s.io/v1beta1
115
- kind: LocalQueue
116
- metadata:
117
- namespace: default
118
- name: {local_queue_name}
119
- spec:
120
- clusterQueue: {cluster_queue_name}
121
- ---
122
- apiVersion: scheduling.k8s.io/v1
123
- kind: PriorityClass
124
- metadata:
125
- name: very-low
126
- value: 100
127
- globalDefault: false
128
- description: "Very Low"
129
- ---
130
- apiVersion: scheduling.k8s.io/v1
131
- kind: PriorityClass
132
- metadata:
133
- name: low
134
- value: 250
135
- globalDefault: false
136
- description: "Low"
137
- ---
138
- apiVersion: scheduling.k8s.io/v1
139
- kind: PriorityClass
140
- metadata:
141
- name: medium
142
- value: 500
143
- globalDefault: false
144
- description: "Medium"
145
- ---
146
- apiVersion: scheduling.k8s.io/v1
147
- kind: PriorityClass
148
- metadata:
149
- name: high
150
- value: 750
151
- globalDefault: false
152
- description: "High"
153
- ---
154
- apiVersion: scheduling.k8s.io/v1
155
- kind: PriorityClass
156
- metadata:
157
- name: very-high
158
- value: 1000
159
- globalDefault: false
160
- description: "Very High"
161
- """
162
-
163
- cluster_preheat_yml = """
164
- apiVersion: apps/v1
165
- kind: DaemonSet
166
- metadata:
167
- name: {cachekey}
168
- labels:
169
- k8s-app: {cachekey}
170
- spec:
171
- selector:
172
- matchLabels:
173
- k8s-app: {cachekey}
174
- updateStrategy:
175
- type: RollingUpdate
176
- template:
177
- metadata:
178
- labels:
179
- name: {cachekey}
180
- k8s-app: {cachekey}
181
- spec:
182
- affinity:
183
- nodeAffinity:
184
- requiredDuringSchedulingIgnoredDuringExecution:
185
- nodeSelectorTerms:
186
- - matchExpressions:
187
- - key: {nodeSelectorKey}
188
- operator: Exists
189
- tolerations:
190
- - operator: "Exists"
191
- containers:
192
- - image: {image_name}
193
- name: {cachekey}
194
- command: [ "sleep", "inf" ]
195
- """
196
-
197
- kueue_controller_manager_yml = """
198
- apiVersion: apps/v1
199
- kind: Deployment
200
- metadata:
201
- labels:
202
- app.kubernetes.io/component: controller
203
- app.kubernetes.io/name: kueue
204
- control-plane: controller-manager
205
- name: kueue-controller-manager
206
- namespace: kueue-system
207
- spec:
208
- replicas: 1
209
- selector:
210
- matchLabels:
211
- control-plane: controller-manager
212
- template:
213
- metadata:
214
- annotations:
215
- kubectl.kubernetes.io/default-container: manager
216
- labels:
217
- app.kubernetes.io/component: controller
218
- app.kubernetes.io/name: kueue
219
- control-plane: controller-manager
220
- spec:
221
- containers:
222
- - args:
223
- - --config=/controller_manager_config.yaml
224
- - --zap-log-level=2
225
- command:
226
- - /manager
227
- image: registry.k8s.io/kueue/kueue:{KUEUE_VERSION}
228
- imagePullPolicy: Always
229
- livenessProbe:
230
- httpGet:
231
- path: /healthz
232
- port: 8081
233
- initialDelaySeconds: 15
234
- periodSeconds: 20
235
- name: manager
236
- ports:
237
- - containerPort: 8082
238
- name: visibility
239
- protocol: TCP
240
- - containerPort: 9443
241
- name: webhook-server
242
- protocol: TCP
243
- readinessProbe:
244
- httpGet:
245
- path: /readyz
246
- port: 8081
247
- initialDelaySeconds: 5
248
- periodSeconds: 10
249
- resources:
250
- limits:
251
- cpu: 1000m
252
- memory: {memory_limit_size}
253
- requests:
254
- cpu: 1000m
255
- memory: 512Mi
256
- securityContext:
257
- allowPrivilegeEscalation: false
258
- volumeMounts:
259
- - mountPath: /visibility
260
- name: visibility
261
- - mountPath: /tmp/k8s-webhook-server/serving-certs
262
- name: cert
263
- readOnly: true
264
- - mountPath: /controller_manager_config.yaml
265
- name: manager-config
266
- subPath: controller_manager_config.yaml
267
- securityContext:
268
- runAsNonRoot: true
269
- serviceAccountName: kueue-controller-manager
270
- terminationGracePeriodSeconds: 10
271
- volumes:
272
- - name: visibility
273
- emptyDir: {{}}
274
- - name: cert
275
- secret:
276
- defaultMode: 420
277
- secretName: kueue-webhook-server-cert
278
- - configMap:
279
- name: kueue-manager-config
280
- name: manager-config
281
- """
282
-
283
-
284
- def verify_kueuectl(args: Namespace) -> None:
285
- """Verify if kueuectl is installed.
286
- Args:
287
- args: user provided arguments.
288
- Returns:
289
- None
290
- """
291
- xpk_print('Veryfing kueuectl installation')
292
-
293
- command = 'kubectl kueue version'
294
- task = 'Verify kueuectl installation on cluster'
295
- verify_kueuectl_installed_code, _ = run_command_for_value(command, task, args)
296
-
297
- if verify_kueuectl_installed_code == 0:
298
- xpk_print('kueuectl found')
299
-
300
- if verify_kueuectl_installed_code != 0:
301
- xpk_print(
302
- 'kueuectl not found. Please follow'
303
- ' https://kueue.sigs.k8s.io/docs/reference/kubectl-kueue/installation/'
304
- ' to install kueuectl.'
305
- )
306
- xpk_exit(verify_kueuectl_installed_code)
307
-
308
-
309
- def delete_multikueueconfigs_definitions(args) -> int:
310
- command = 'kubectl delete crd multikueueconfigs.kueue.x-k8s.io'
311
- task = 'Delete multikueueconfigs crds'
312
- return_code = run_command_with_updates_retry(command, task, args)
313
- if return_code != 0:
314
- xpk_print(f'{task} returned ERROR {return_code}')
315
- return return_code
316
-
317
-
318
- def delete_multikueueclusters_definitions(args) -> int:
319
- command = 'kubectl delete crd multikueueclusters.kueue.x-k8s.io'
320
- task = 'Delete multikueueclusters crds'
321
- return_code = run_command_with_updates_retry(command, task, args)
322
- if return_code != 0:
323
- xpk_print(f'{task} returned ERROR {return_code}')
324
- return return_code
325
-
326
-
327
- def get_kueue_version(args) -> tuple[int, str]:
328
- command = 'kubectl kueue version'
329
- task = 'Get kueue version on server'
330
- return_code, val = run_command_for_value(command, task, args)
331
- if return_code != 0:
332
- return return_code, ''
333
- lines = val.splitlines()
334
- if len(lines) == 1:
335
- return 1, ''
336
- server_version_line = lines[1]
337
- manager_image_version = server_version_line.split(':')[-1]
338
- return return_code, manager_image_version
339
-
340
-
341
- def install_kueue_on_cluster(args) -> int:
342
- """Install Kueue on the cluster.
343
-
344
- Args:
345
- args: user provided arguments for running the command.
346
-
347
- Returns:
348
- 0 if successful and 1 otherwise.
349
- """
350
-
351
- err_code, kueue_version_installed = get_kueue_version(args)
352
- if err_code == 0:
353
- if Version(kueue_version_installed) < Version('v0.9.0') and Version(
354
- KUEUE_VERSION
355
- ) >= Version('v0.9.0'):
356
- xpk_print('Upgrading kueue on cluster from version < 0.9.0.')
357
- upgrade_code = delete_multikueueclusters_definitions(args)
358
- if upgrade_code != 0:
359
- return upgrade_code
360
- upgrade_code = delete_multikueueconfigs_definitions(args)
361
- if upgrade_code != 0:
362
- return upgrade_code
363
-
364
- command = (
365
- 'kubectl apply --server-side --force-conflicts -f'
366
- f' https://github.com/kubernetes-sigs/kueue/releases/download/{KUEUE_VERSION}/manifests.yaml'
367
- )
368
- task = 'Set Kueue On Cluster'
369
- return_code = run_command_with_updates_retry(command, task, args)
370
- if return_code != 0:
371
- xpk_print(f'{task} returned ERROR {return_code}')
372
- return return_code
373
-
374
-
375
- def wait_for_kueue_available(args: Namespace) -> int:
376
- """Wait for Kueue to be fully available.
377
-
378
- Args:
379
- args: user provided arguments for running the command.
380
-
381
- Returns:
382
- 0 if successful and 1 otherwise.
383
- """
384
- command = (
385
- 'kubectl wait deploy/kueue-controller-manager -nkueue-system'
386
- f' --for=condition=available --timeout={WAIT_FOR_KUEUE_TIMEOUT}'
387
- )
388
- task = 'Wait for Kueue to be available'
389
- return_code = run_command_with_updates(command, task, args)
390
- if return_code != 0:
391
- xpk_print(f'{task} returned ERROR {return_code}')
392
- return return_code
393
-
394
-
395
- def install_kueue_crs(
396
- args,
397
- system: SystemCharacteristics,
398
- autoprovisioning_config: AutoprovisioningConfig | None,
399
- flex_with_tpu=False,
400
- ) -> int:
401
- """Install Kueue Custom Resources.
402
-
403
- Args:
404
- args: user provided arguments for running the command.
405
- system: system level arguments.
406
- autoprovisioning_config: Autoprovisioning config to configure kueue with if
407
- autoprovisioning is enabled.
408
-
409
- Returns:
410
- 0 if successful and 1 otherwise.
411
- """
412
- device_type = system.device_type
413
- cluster_hardware_name = f'{args.num_slices}x{device_type}'
414
- resource_type = AcceleratorTypeToAcceleratorCharacteristics[
415
- system.accelerator_type
416
- ].resource_type
417
-
418
- autoprovisioning_enabled = False
419
- if autoprovisioning_config:
420
- # Determine total resources available based on autoprovisioning max chips.
421
- autoprovisioning_enabled = True
422
- total_chips = autoprovisioning_config.maximum_chips
423
- cluster_hardware_name = f'{system.gke_accelerator}'
424
- else:
425
- # Determine total chips based on user specified topology.
426
- total_chips = get_total_chips_requested_from_args(args, system)
427
- if args.flex and flex_with_tpu is False:
428
- admission_checks = """
429
- admissionChecks:
430
- - dws-prov
431
- """
432
- else:
433
- admission_checks = ''
434
-
435
- covered_resources_config = get_kueue_covered_resources_config(
436
- cluster_hardware_name=cluster_hardware_name,
437
- resource_type=resource_type,
438
- total_chips=total_chips,
439
- cpu_limit=args.cpu_limit,
440
- memory_limit=args.memory_limit,
441
- )
442
- topology_label = ''
443
- if system.device_type in [
444
- H100_MEGA_DEVICE_TYPE,
445
- H200_DEVICE_TYPE,
446
- B200_DEVICE_TYPE,
447
- ]:
448
- topology_label = 'topologyName: "gke-default"'
449
- res_type = AcceleratorTypeToAcceleratorCharacteristics[
450
- system.accelerator_type
451
- ].resource_type
452
- yml_string = cluster_set_crd_yaml.format(
453
- system=system,
454
- cluster_hardware_name=cluster_hardware_name,
455
- accelerator_label=create_accelerator_label(
456
- system.accelerator_type, system
457
- ),
458
- machine_label=create_machine_label(
459
- system.accelerator_type, system, autoprovisioning_enabled
460
- ),
461
- topology_label=topology_label,
462
- covered_resources_config=covered_resources_config,
463
- resource_type=res_type,
464
- pw_resource_flavors=add_pw_resource_flavors(args),
465
- pw_resources_kueue=add_pw_resources_to_kueue(args),
466
- admission_checks=admission_checks,
467
- managed_resource=res_type,
468
- cluster_queue_name=CLUSTER_QUEUE_NAME,
469
- local_queue_name=LOCAL_QUEUE_NAME,
470
- )
471
- if system.device_type in [
472
- H100_MEGA_DEVICE_TYPE,
473
- H200_DEVICE_TYPE,
474
- B200_DEVICE_TYPE,
475
- ]:
476
- yml_string = topology_yaml + yml_string
477
-
478
- tmp = write_tmp_file(yml_string)
479
- command = f'kubectl apply -f {str(tmp)}'
480
-
481
- task = 'Applying Kueue Custom Resources'
482
- return_code = run_command_with_updates_retry(command, task, args)
483
- if return_code != 0:
484
- xpk_print(f'{task} returned ERROR {return_code}')
485
- return return_code
486
-
487
-
488
- def get_kueue_covered_resources_config(
489
- cluster_hardware_name, resource_type, total_chips, cpu_limit, memory_limit
490
- ) -> str:
491
- """Gets Kueue covered resources configuration.
492
-
493
- Args:
494
- cluster_hardware_name: cluster hardware name.
495
- resource_type: resource type of tpu or gpu.
496
- total_chips: total number of chips for the specific resource type.
497
-
498
- Returns:
499
- A string of Kueue covered resources configuration.
500
- """
501
- config_format = """
502
- - coveredResources: {resource_types}
503
- flavors:
504
- - name: {cluster_hardware_name}
505
- resources:
506
- - name: "{resource_type}"
507
- nominalQuota: {total_chips}"""
508
- resource_types = [resource_type]
509
- if cpu_limit:
510
- config_format = config_format + """
511
- - name: "cpu"
512
- nominalQuota: {cpu_limit}"""
513
- resource_types.append('cpu')
514
- if memory_limit:
515
- config_format = config_format + """
516
- - name: "memory"
517
- nominalQuota: {memory_limit}"""
518
- resource_types.append('memory')
519
-
520
- config_string = config_format.format(
521
- cluster_hardware_name=cluster_hardware_name,
522
- resource_types=resource_types,
523
- resource_type=resource_type,
524
- total_chips=total_chips,
525
- cpu_limit=cpu_limit,
526
- memory_limit=memory_limit,
527
- )
528
- return config_string
529
-
530
-
531
- def update_kueue_resources_if_necessary(args):
532
- """Update the kueue manifest to increase the resources for the kueue controller manager.
533
-
534
- Args:
535
- args: user provided arguments for running the command.
536
-
537
- Returns:
538
- 0 if successful and 1 otherwise.
539
- """
540
- # Get total number of nodes
541
- cmd_total_node_num = 'kubectl get node --no-headers | wc -l'
542
- return_code, out = run_command_for_value(
543
- cmd_total_node_num, 'Count total nodes', args
544
- )
545
- if return_code != 0:
546
- xpk_exit(1)
547
- # 1.2MiB per VM or 4GiB (whichever is greater).
548
- new_memory_limit = (
549
- f'{max(math.ceil(int(out) * MEMORY_SIZE_PER_VM), MIN_MEMORY_LIMIT_SIZE)}Mi'
550
- )
551
- yml_string = kueue_controller_manager_yml.format(
552
- memory_limit_size=new_memory_limit, KUEUE_VERSION=KUEUE_VERSION
553
- )
554
- tmp = write_tmp_file(yml_string)
555
- command = f'kubectl apply -f {str(tmp)}'
556
-
557
- task = 'Updating Kueue Controller Manager resources'
558
- return_code = run_command_with_updates_retry(command, task, args)
559
- if return_code != 0:
560
- xpk_print(f'{task} returned ERROR {return_code}')
561
- return return_code
@@ -1,101 +0,0 @@
1
- xpk/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
2
- xpk/main.py,sha256=GrA6HQ4YzIHEspkP2uwDOLRYZOfBmAh8Rv9sIZcUhZg,2504
3
- xpk/api/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
4
- xpk/api/storage_crd.yaml,sha256=r4WFXnSJJ25EUF-t4Ljfbl-cJoSaiFiZkP8451eTub4,1260
5
- xpk/commands/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
6
- xpk/commands/batch.py,sha256=g24nbVV-ruiFgFottJ-o4RG6CZeK1vkRJ1dOIoeLr9k,3905
7
- xpk/commands/cluster.py,sha256=PzXQSgPzctA4EfeuFr8b5oyxzp03TZT3OxixNqUwXlw,40407
8
- xpk/commands/cluster_gcluster.py,sha256=8jJ7nHBbkmaPtsVQ2m_GnLxkS5iNV5sSN61KL0K_uEY,10861
9
- xpk/commands/common.py,sha256=xDpg8Y-0dtGNyx7NIhu-k4fjYSlW1X80wl_WL5fumrs,2504
10
- xpk/commands/config.py,sha256=gFNkf3ibsvZmcPpkpKXe-KJmHO5IKucNwLCXNgKvaDc,836
11
- xpk/commands/info.py,sha256=1orA0u5KCB6fj-smHkuFL1WCH96NGrEiDpRCgPrxUW4,7304
12
- xpk/commands/inspector.py,sha256=q12w8V1JRd9HuBwtpi3KvTFHbCrBR0j-59CAsPREG5I,12092
13
- xpk/commands/job.py,sha256=lfc7rrw-YEA4Wsz5n-mTABkVX050FPWUbwz14G82xGA,6134
14
- xpk/commands/kind.py,sha256=Vl3RT47kHCR0ORX9dK37HCiYtbmXJUCIAaq-QEbIclU,7578
15
- xpk/commands/kjob_common.py,sha256=dtT-R0n50byTmu2Qcni0pqKYobUAHNENBN_4pt0l-KE,1952
16
- xpk/commands/run.py,sha256=5hYMG0DcdHnFWsJ5gmfX09t6ZPVItt7FFoHO_ED0_Dk,3798
17
- xpk/commands/shell.py,sha256=5-sKcI2Rbk3aCojnBNtipCwgOrbIDnG4f8ah0KIayY8,4182
18
- xpk/commands/storage.py,sha256=Odrp3JNbVp1Ngr_Pj1ds-V02Qz3HbJiSYm9wUYscI8s,10704
19
- xpk/commands/version.py,sha256=CU4mb71r66U28krnPAopC6vBpdK-IGclsy5uNaQcgRY,824
20
- xpk/commands/workload.py,sha256=zIRTwxz_pDUkGMUiBGvrejY-gjnCVpsJW2Ey9cQcb14,26906
21
- xpk/core/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
22
- xpk/core/capacity.py,sha256=SQzncJSLuI4LLJ2VcnpxcRlTjiBG3e8nM0_QxG1986w,7367
23
- xpk/core/cluster.py,sha256=D9VGYlB8mZlGWUjgF9ri7P17RK-Q0EIWLVLHvh7f948,29057
24
- xpk/core/cluster_private.py,sha256=_wzaywvp_uaszg_L0U3u8wYRYQbY0vSlf3a0aycDUxM,6812
25
- xpk/core/commands.py,sha256=_kpML4DkorN2yB7gcrgpLaa4OSrivkC8tOTdaCh85VU,10805
26
- xpk/core/config.py,sha256=svK1NWm7M0ttu2jyp7mzhM0iKmA7ATxLQY5sB-7FfS4,3407
27
- xpk/core/config_test.py,sha256=v1qfyFRzLkYSQ7Wn4nx1N0dBSOFXidLWDfhkeHDZOVM,1847
28
- xpk/core/docker_container.py,sha256=GvkCJ2S5UKn8uh3pZhRd3X7iS0-PsQpRO8l7QhywVGc,7604
29
- xpk/core/docker_image.py,sha256=r7gXOqQX7wd8oHklYjPvhOi8Dbaz0NIfv4NbVfhbGkg,6805
30
- xpk/core/docker_manager.py,sha256=JBFgyD6O7LKwEHJC7YuSoCDZqrFRtb-LjgWNqkfAbR0,10566
31
- xpk/core/docker_resources.py,sha256=_aKgpUjyJB2krQ1PkHrotB7K4kByLmPLbuvl_UVvuX8,12843
32
- xpk/core/filestore.py,sha256=mcuUzsAPARbnrBG4fIGsEoN8NmzjaQ6k0tvIwMtjO9k,8068
33
- xpk/core/gcloud_context.py,sha256=go0avmBbYx45vk_7W3iwQEphmQUx27oaL6dseyocqLI,5836
34
- xpk/core/gcluster_manager.py,sha256=JFip2hInFczFP2h5AXa70IPIuTaJ475TG6GxkQjKOI8,6337
35
- xpk/core/gcsfuse.py,sha256=kg5pgxdTjgiqquuGjev9fXzJPb8oiWPTK6wzCddzheQ,2125
36
- xpk/core/jobset.py,sha256=T1TPlIm0D5h5PTwnfMGUPZkwVfkd_MpnoKYRqI63ses,4113
37
- xpk/core/kjob.py,sha256=vuSzPsMIuBpAXJkXTGSgCAz6WzzDl31XkQPQnW3pg1M,14806
38
- xpk/core/kueue.py,sha256=K2nU-Icqi7-LcDHYIX7m0cNOz3zjuwqFzqMD35k6W7A,15753
39
- xpk/core/monitoring.py,sha256=v9MvLzNfvJAVby_ehSlPe6PaO0_pf3shkXg5gd-UWm8,4338
40
- xpk/core/mtc.py,sha256=pO7p3l-EzLFdTE8MdwWV8i0Zu-7epGql_kPoksVofIU,6259
41
- xpk/core/nap.py,sha256=H0ZDj68m8B8LHPTP41BLd8Q945eYjxFbh4SCkqf9HFM,12809
42
- xpk/core/network.py,sha256=mu1J9QIQzv_fWfvnVXJYQPcgw7Od01ok2zEqCJx0dIs,10527
43
- xpk/core/nodepool.py,sha256=8a5sYPFH7CSkLzTugAQ8JaXPux2RH7bY_6fTPMBMh4E,23132
44
- xpk/core/nodepool_test.py,sha256=QRpmdyZTPRDE2qCibWeKQgE3Q2WCxXt1Onfv0MK4QZQ,2626
45
- xpk/core/pathways.py,sha256=Q76IaxffhvlTR_Rz6BxSEO0j-ytY5hPEcQaATcfGQiM,10704
46
- xpk/core/ray.py,sha256=74IMjmwneoMoPu1TpILCV1F64nSu7L5ETmGp86fLgp0,6327
47
- xpk/core/resources.py,sha256=wFqpcWQj1KwF6b1NRIMqMcrDTQJT00cNHMpFsHlIs_k,8230
48
- xpk/core/scheduling.py,sha256=dlWMeP_3RDdNKO2qmNxzq-YyQATQ9vKyMMI7xEfEkoM,9242
49
- xpk/core/storage.py,sha256=NILvVAcLNMLmp4wKx_TEKbMMF5X1oL-FrQV46PT0_ds,16902
50
- xpk/core/system_characteristics.py,sha256=2mtQlUiufK98XUXo0_f1D4d06FRGdUk_VNkaBg48Fcs,15152
51
- xpk/core/vertex.py,sha256=pD9UBL62xHomuqdNu7xKccfD2KCbjgohMk3AhX-CXSw,3644
52
- xpk/core/workload.py,sha256=WyT-H4XdeDY07glL1ikmcs44kLgLjMuMtclyZTxrmg8,8921
53
- xpk/core/workload_test.py,sha256=tVTvrwDRXD3O1GCoftgEBWilCYTN74ayP1KRP0vptx0,857
54
- xpk/core/blueprint/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
55
- xpk/core/blueprint/blueprint_definitions.py,sha256=5i331XA-2yP_ALyB6XU5tP2Tf9iHcIX5g0TilxQi8zE,1800
56
- xpk/core/blueprint/blueprint_generator.py,sha256=Uoz3YKsZKLfIoPI8d3bQ5RNrFFsqBOWb3HBQr3OolHo,38010
57
- xpk/core/blueprint/blueprint_test.py,sha256=f3dL7KU9n6M8Hdnrg4VI5EEi9GA2dnwm4LDf9n5Wbuw,7410
58
- xpk/core/remote_state/__init__.py,sha256=PkV8D9WOtlJHH5AIxsQaKeIBcmupT_Ol_bwJgN6G2I8,561
59
- xpk/core/remote_state/fuse_remote_state.py,sha256=3Dx4ZZd0NFF5-MlqGWHzz8H4bjYiPOWdF_YSEnKUPQ8,3246
60
- xpk/core/remote_state/remote_state_client.py,sha256=6PcR92Xy_RMjlF4AscanQ1jXNHnewLWGNC2v53jbzD4,1077
61
- xpk/core/workload_decorators/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
62
- xpk/core/workload_decorators/rdma_decorator.py,sha256=isbgPnjdu2AT_Da1nVUIRoGE_qZ7jMDOKCgZOLq5r2A,4006
63
- xpk/core/workload_decorators/storage_decorator.py,sha256=DDYQVO1OKTLhveDOA4V6b2RWr4n0fbwHdnoFFmW7iaQ,2000
64
- xpk/core/workload_decorators/tcpx_decorator.py,sha256=m5EgzEHjbcOD13ygY91mQdhwQt4Gr5PyalVkKcHyeV8,5975
65
- xpk/core/workload_decorators/tcpx_decorator_test.py,sha256=iTBS3X_-VwA2oveNDjscduLtll0VOJyFRCp4xmsjg7w,8515
66
- xpk/core/workload_decorators/tcpxo_decorator.py,sha256=_nLX7tbnxhnS-xv4Jijd1JOP76V4LpNCfW3Np404Cqw,6537
67
- xpk/parser/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
68
- xpk/parser/batch.py,sha256=mJU-Cp1yTLje59vD-B1IiBcUeD-ZmEsoeB4xhj9cflc,1406
69
- xpk/parser/cluster.py,sha256=jt6oPoFtOZjdtDKVLOKSskUZooajan8mgT9sdlbNuow,30445
70
- xpk/parser/common.py,sha256=N6P6wPuptluNEddh9kpUsaWgxXGADNZLMfKT-P7QkW0,7791
71
- xpk/parser/config.py,sha256=-XnWx9aFsBW4Uzo_hpOMD2ZQ0bdZLvq1ksv83_5jqSM,1633
72
- xpk/parser/core.py,sha256=VRJerlS92ufoQbG1mZv7B04DAP4qGkBHa4pRXgcbAs0,4761
73
- xpk/parser/info.py,sha256=UJohxVVWdt9IgUXoPsrVae2DN1BjAVGWrSN2ajrB8RQ,1860
74
- xpk/parser/inspector.py,sha256=hAPAZ2k9iSJgC1mjnz3rMleInsAQ8PmkyyUKFyBmsgY,1997
75
- xpk/parser/job.py,sha256=5RdE70rucGfrsn65l7Ho6RmO06mag1S0AO-3saVuXyw,4328
76
- xpk/parser/kind.py,sha256=sgPCqNVrgmFLcOBEbhlaphwVXxMh_opP9ntCq4KPePE,2682
77
- xpk/parser/run.py,sha256=oi_ksSyJ8Ooffe2EgoV_ecpmXEmNGVotjpIQH-HjufE,1481
78
- xpk/parser/shell.py,sha256=VC8p-kz9XjJZW9DXZ-rnv41XnRDRpQRFywHpB5j7tfc,1970
79
- xpk/parser/storage.py,sha256=XNynqulEzTmT8_G6wkeBwfXX0XQ1lsd6BFcx0H6rGfU,9971
80
- xpk/parser/validators.py,sha256=-NBZelvfwZRzjz-YUCreD8EzMLHll8PZM-d-MVm2PG4,1192
81
- xpk/parser/version.py,sha256=eJo4PAbbmRQZulgKBs_ytbVgV9zAaaXeNzMMxmgFMVY,769
82
- xpk/parser/workload.py,sha256=J0Wg4NEO7pOdOwf_8uC9bVzXodBXwkYo1c2gRJVyyak,26068
83
- xpk/templates/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
84
- xpk/templates/storage.yaml,sha256=AykdyMtDnKZF8Y_0BYxoYP03hEIzEk6iNalXAQHgAls,163
85
- xpk/utils/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
86
- xpk/utils/console.py,sha256=hRbvtog_VAzuxt5GfwK5GZdd5SWaa7kvWG8zo_qFRQc,1519
87
- xpk/utils/execution_context.py,sha256=WYxm6NExBIP6iLAWaL5aV858riGJbAHn0Zs6fmKlmzE,784
88
- xpk/utils/file.py,sha256=hi9v4gfwiB3JHi3tnelPbm_dlTUt47U0wvvWKQqMjiQ,2500
89
- xpk/utils/gcs_utils.py,sha256=zg-XSTv4G4TFjeT2bNBm2WLdDXPrOZi0rNv_JdppNg4,4113
90
- xpk/utils/kubectl.py,sha256=WKB9UhpouPN9G4n2ejRi_PgsYLI0R01gzkS1WGU6mJA,1828
91
- xpk/utils/network.py,sha256=dGS5rxIm_zaayDElHNlzalaf09M99by5ckL_lGDl_yQ,4293
92
- xpk/utils/objects.py,sha256=OwMNxB4TGX21qnJPdZo2YBMPMbQPqOtHMh19QhoRNRY,2498
93
- xpk/utils/templates.py,sha256=g8zgR1MxyJmTmzM_wnvH30FmcbgQMC47UQwBtLj8B9k,807
94
- xpk/utils/validation.py,sha256=bSJApIY0Lk48I4EEQP08ZUvolXt_APpYXVGJXFQ_YLA,2711
95
- xpk/utils/yaml.py,sha256=j8xuAJ9yAAwnQi6ozwZ-nMnDyDnc3xWkeBZMtSuP4RU,844
96
- xpk-0.13.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
97
- xpk-0.13.0.dist-info/METADATA,sha256=EdMiwFyuULp8iGjAVi9qMtzt57IRDZD9sYk0tww-JKY,71759
98
- xpk-0.13.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
- xpk-0.13.0.dist-info/entry_points.txt,sha256=mzEtiIesFkT1kmcTUVDA1o3uOhiniX6tIz2wmOlMu1M,38
100
- xpk-0.13.0.dist-info/top_level.txt,sha256=aDe4N0jicmuWExx_6w0TxWQJaEuPSs9BnLU-3aF1GLo,4
101
- xpk-0.13.0.dist-info/RECORD,,
File without changes