Skip to content

Commit e8764d3

Browse files
committed
Add gcloud context manager
1 parent 8766c4a commit e8764d3

23 files changed

+377
-352
lines changed

pyproject.toml

+13-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,19 @@ dev = [
6666
]
6767

6868
[tool.setuptools]
69-
packages = ["xpk", "xpk.parser", "xpk.core", "xpk.commands", "xpk.api", "xpk.templates", "xpk.utils", "xpk.core.blueprint", "xpk.core.remote_state", "xpk.core.workload_decorators"]
69+
packages = [
70+
"xpk",
71+
"xpk.parser",
72+
"xpk.core",
73+
"xpk.commands",
74+
"xpk.api",
75+
"xpk.templates",
76+
"xpk.utils",
77+
"xpk.core.blueprint",
78+
"xpk.core.remote_state",
79+
"xpk.core.workload_decorators",
80+
"xpk.core.gcloud"
81+
]
7082
package-dir = {"" = "src"}
7183
package-data = {"xpk.api" = ["storage_crd.yaml"], "xpk.templates" = ["storage.yaml"]}
7284

src/xpk/commands/batch.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,24 @@
1414
limitations under the License.
1515
"""
1616

17+
import re
1718
from argparse import Namespace
1819

19-
from ..core.cluster import setup_k8s_env, create_k8s_service_account
20+
from ..core.cluster import create_k8s_service_account, setup_k8s_env
2021
from ..core.commands import run_command_for_value
21-
from ..core.config import GCS_FUSE_ANNOTATION_KEY, GCS_FUSE_ANNOTATION_VALUE, XPK_SA, DEFAULT_NAMESPACE
22-
from ..core.gcloud_context import add_zone_and_project
22+
from ..core.config import (
23+
DEFAULT_NAMESPACE,
24+
GCS_FUSE_ANNOTATION_KEY,
25+
GCS_FUSE_ANNOTATION_VALUE,
26+
XPK_SA,
27+
)
28+
from ..core.gcloud.context import GCloudContextManager
29+
from ..core.kjob import AppProfileDefaults, Kueue_TAS_annotation, prepare_kjob
2330
from ..core.kueue import LOCAL_QUEUE_NAME
2431
from ..core.storage import get_auto_mount_gcsfuse_storages
2532
from ..utils.console import xpk_exit, xpk_print
2633
from .common import set_cluster_command
27-
from ..core.kjob import AppProfileDefaults, prepare_kjob, Kueue_TAS_annotation
2834
from .kind import set_local_cluster_command
29-
import re
3035

3136

3237
def batch(args: Namespace) -> None:
@@ -38,7 +43,7 @@ def batch(args: Namespace) -> None:
3843
None
3944
"""
4045
if not args.kind_cluster:
41-
add_zone_and_project(args)
46+
GCloudContextManager.add_zone_and_project(args)
4247
set_cluster_command_code = set_cluster_command(args)
4348
else:
4449
set_cluster_command_code = set_local_cluster_command(args)

src/xpk/commands/cluster.py

+14-21
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,14 @@
2323
install_nccl_on_cluster,
2424
set_jobset_on_cluster,
2525
setup_k8s_env,
26+
update_cluster_with_gcpfilestore_driver_if_necessary,
2627
update_cluster_with_gcsfuse_driver_if_necessary,
2728
update_cluster_with_workload_identity_if_necessary,
2829
)
2930
from ..core.cluster_private import authorize_private_cluster_access_if_necessary
3031
from ..core.commands import run_command_for_value, run_command_with_updates
3132
from ..core.config import VERTEX_TENSORBOARD_FEATURE_FLAG
32-
from ..core.gcloud_context import (
33-
add_zone_and_project,
34-
get_gke_control_plane_version,
35-
get_gke_server_config,
36-
zone_to_region,
37-
)
33+
from ..core.gcloud.context import GCloudContextManager, GKEVersionManager
3834
from ..core.kjob import apply_kjob_crds, prepare_kjob, verify_kjob_installed
3935
from ..core.kueue import (
4036
cluster_preheat_yml,
@@ -64,7 +60,6 @@
6460
from ..utils.file import write_tmp_file
6561
from . import cluster_gcluster
6662
from .common import set_cluster_command
67-
from ..core.cluster import update_cluster_with_gcpfilestore_driver_if_necessary
6863

6964

7065
def cluster_create(args) -> None:
@@ -83,7 +78,7 @@ def cluster_create(args) -> None:
8378
xpk_exit(return_code)
8479

8580
xpk_print(f'Starting cluster create for cluster {args.cluster}:', flush=True)
86-
add_zone_and_project(args)
81+
GCloudContextManager.add_zone_and_project(args)
8782

8883
if system.device_type in cluster_gcluster.supported_device_types:
8984
xpk_print(
@@ -93,12 +88,10 @@ def cluster_create(args) -> None:
9388
cluster_gcluster.cluster_create(args)
9489
xpk_exit(0)
9590

96-
return_code, gke_server_config = get_gke_server_config(args)
97-
if return_code != 0:
98-
xpk_exit(return_code)
91+
gke_server_config = GKEVersionManager(args)
9992

100-
return_code, gke_control_plane_version = get_gke_control_plane_version(
101-
args, gke_server_config
93+
return_code, gke_control_plane_version = (
94+
gke_server_config.get_gke_control_plane_version()
10295
)
10396
if return_code != 0:
10497
xpk_exit(return_code)
@@ -257,7 +250,7 @@ def cluster_create(args) -> None:
257250
xpk_print(
258251
'See your GKE Cluster here:'
259252
# pylint: disable=line-too-long
260-
f' https://console.cloud.google.com/kubernetes/clusters/details/{zone_to_region(args.zone)}/{args.cluster}/details?project={args.project}'
253+
f' https://console.cloud.google.com/kubernetes/clusters/details/{GCloudContextManager.zone_to_region(args.zone)}/{args.cluster}/details?project={args.project}'
261254
)
262255
xpk_exit(0)
263256

@@ -272,7 +265,7 @@ def cluster_delete(args) -> None:
272265
0 if successful and 1 otherwise.
273266
"""
274267
xpk_print(f'Starting cluster delete for cluster: {args.cluster}', flush=True)
275-
add_zone_and_project(args)
268+
GCloudContextManager.add_zone_and_project(args)
276269

277270
if cluster_gcluster.created_by_gcluster(args):
278271
xpk_print(f'Deleting {args.cluster} cluster using Cluster Toolkit...')
@@ -303,7 +296,7 @@ def cluster_cacheimage(args) -> None:
303296
xpk_print(
304297
f'Starting cluster cacheimage for cluster: {args.cluster}', flush=True
305298
)
306-
add_zone_and_project(args)
299+
GCloudContextManager.add_zone_and_project(args)
307300

308301
get_cluster_credentials(args)
309302
system, return_code = get_system_characteristics(args)
@@ -352,7 +345,7 @@ def cluster_describe(args) -> None:
352345
0 if successful and 1 otherwise.
353346
"""
354347
xpk_print(f'Starting nodepool list for cluster: {args.cluster}', flush=True)
355-
add_zone_and_project(args)
348+
GCloudContextManager.add_zone_and_project(args)
356349

357350
get_cluster_credentials(args)
358351

@@ -583,7 +576,7 @@ def cluster_list(args) -> None:
583576
Returns:
584577
0 if successful and 1 otherwise.
585578
"""
586-
add_zone_and_project(args)
579+
GCloudContextManager.add_zone_and_project(args)
587580
xpk_print(f'For project {args.project} and zone {args.zone}:', flush=True)
588581
if run_gke_clusters_list_command(args):
589582
xpk_exit(1)
@@ -675,7 +668,7 @@ def run_gke_cluster_delete_command(args) -> int:
675668
command = (
676669
'gcloud beta container clusters delete'
677670
f' {args.cluster} --project={args.project}'
678-
f' --region={zone_to_region(args.zone)} --quiet'
671+
f' --region={GCloudContextManager.zone_to_region(args.zone)} --quiet'
679672
)
680673

681674
return_code = run_command_with_updates(command, 'Cluster Delete', args)
@@ -701,7 +694,7 @@ def run_gke_clusters_list_command(args) -> int:
701694
"""
702695
command = (
703696
'gcloud container clusters list'
704-
f' --project={args.project} --region={zone_to_region(args.zone)}'
697+
f' --project={args.project} --region={GCloudContextManager.zone_to_region(args.zone)}'
705698
)
706699
return_code = run_command_with_updates(command, 'Cluster List', args)
707700
if return_code != 0:
@@ -748,7 +741,7 @@ def run_gke_cluster_create_command(
748741
command = (
749742
'gcloud beta container clusters create'
750743
f' {args.cluster} --project={args.project}'
751-
f' --region={zone_to_region(args.zone)}'
744+
f' --region={GCloudContextManager.zone_to_region(args.zone)}'
752745
f' --node-locations={args.zone}'
753746
f' --cluster-version={gke_control_plane_version}'
754747
f' --machine-type={machine_type}'

src/xpk/commands/cluster_gcluster.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,26 @@
1616

1717
import os
1818

19-
from ..core.remote_state.remote_state_client import RemoteStateClient
20-
from ..core.remote_state.fuse_remote_state import FuseStateClient
2119
from ..core.blueprint.blueprint_generator import (
2220
BlueprintGenerator,
2321
BlueprintGeneratorOutput,
2422
a3mega_device_type,
2523
a3ultra_device_type,
2624
supported_device_types,
2725
)
28-
from ..core.commands import run_command_for_value
2926
from ..core.capacity import get_capacity_type
27+
from ..core.cluster import get_cluster_credentials
28+
from ..core.commands import run_command_for_value
3029
from ..core.docker_manager import DockerManager
31-
from ..core.gcloud_context import zone_to_region
30+
from ..core.gcloud.context import GCloudContextManager
3231
from ..core.gcluster_manager import GclusterManager
32+
from ..core.kjob import apply_kjob_crds, prepare_kjob
33+
from ..core.remote_state.fuse_remote_state import FuseStateClient
34+
from ..core.remote_state.remote_state_client import RemoteStateClient
3335
from ..utils.console import xpk_exit, xpk_print
3436
from ..utils.file import ensure_directory_exists
3537
from ..utils.network import all_IPs_cidr
3638
from ..utils.objects import hash_string
37-
from ..core.cluster import get_cluster_credentials
38-
from ..core.kjob import apply_kjob_crds, prepare_kjob
3939

4040
blueprints_path = os.path.abspath('xpkclusters/blueprints')
4141
gcluster_working_dir = os.path.abspath('xpkclusters/gcluster-out')
@@ -53,7 +53,7 @@ def cluster_create(args) -> None:
5353
"""
5454
check_gcloud_authenticated()
5555
prepare_directories()
56-
region = zone_to_region(args.zone)
56+
region = GCloudContextManager.zone_to_region(args.zone)
5757

5858
# unique_name uses shortened hash string, so still name collision is possible
5959
unique_name = get_unique_name(args.project, region, args.cluster)
@@ -110,7 +110,7 @@ def cluster_delete(args) -> None:
110110
"""
111111
check_gcloud_authenticated()
112112
prepare_directories()
113-
region = zone_to_region(args.zone)
113+
region = GCloudContextManager.zone_to_region(args.zone)
114114
unique_name = get_unique_name(args.project, region, args.cluster)
115115
# prefix is to prevent name collisions for blueprints and also deployments by storing them in prefix directory. Ex.: blueprints/{prefix}/cluster_name_hash
116116
prefix = get_prefix_path(args.project, region)
@@ -152,7 +152,7 @@ def cluster_delete(args) -> None:
152152

153153
def created_by_gcluster(args) -> bool:
154154
prepare_directories()
155-
region = zone_to_region(args.zone)
155+
region = GCloudContextManager.zone_to_region(args.zone)
156156
unique_name = get_unique_name(args.project, region, args.cluster)
157157
prefix = get_prefix_path(args.project, region)
158158
bpg = prepare_blueprint_generator()
@@ -237,7 +237,7 @@ def generate_blueprint(
237237
blueprint_name=blueprint_name,
238238
prefix=prefix,
239239
cluster_name=args.cluster,
240-
region=zone_to_region(args.zone),
240+
region=GCloudContextManager.zone_to_region(args.zone),
241241
project_id=args.project,
242242
zone=args.zone,
243243
auth_cidr=all_IPs_cidr,
@@ -254,7 +254,7 @@ def generate_blueprint(
254254
blueprint_name=blueprint_name,
255255
prefix=prefix,
256256
cluster_name=args.cluster,
257-
region=zone_to_region(args.zone),
257+
region=GCloudContextManager.zone_to_region(args.zone),
258258
project_id=args.project,
259259
zone=args.zone,
260260
auth_cidr=all_IPs_cidr,

src/xpk/commands/common.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"""
1616

1717
from ..core.commands import run_command_with_updates_retry
18-
from ..core.gcloud_context import zone_to_region
18+
from ..core.gcloud.context import GCloudContextManager
1919
from ..utils.console import xpk_print
2020

2121

@@ -30,8 +30,7 @@ def set_cluster_command(args) -> int:
3030
"""
3131
command = (
3232
'gcloud container clusters get-credentials'
33-
f' {args.cluster} --region={zone_to_region(args.zone)}'
34-
f' --project={args.project} &&'
33+
f' {args.cluster} --region={GCloudContextManager.zone_to_region(args.zone)} --project={args.project} &&'
3534
' kubectl config view && kubectl config set-context --current'
3635
' --namespace=default'
3736
)

src/xpk/commands/info.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from tabulate import tabulate
2121

2222
from ..core.commands import run_command_for_value
23-
from ..core.gcloud_context import add_zone_and_project
23+
from ..core.gcloud.context import GCloudContextManager
2424
from ..core.kueue import verify_kueuectl
2525
from ..utils.console import xpk_exit, xpk_print
2626
from .common import set_cluster_command
@@ -36,7 +36,7 @@ def info(args: Namespace) -> None:
3636
Returns:
3737
None
3838
"""
39-
add_zone_and_project(args)
39+
GCloudContextManager.add_zone_and_project(args)
4040
set_cluster_command_code = set_cluster_command(args)
4141
if set_cluster_command_code != 0:
4242
xpk_exit(set_cluster_command_code)

src/xpk/commands/inspector.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
from ..core.cluster import get_cluster_credentials
1818
from ..core.commands import run_command_for_value
19-
from ..core.gcloud_context import add_zone_and_project, zone_to_region
19+
from ..core.gcloud.context import GCloudContextManager
2020
from ..core.kueue import CLUSTER_QUEUE_NAME, LOCAL_QUEUE_NAME
2121
from ..core.resources import CLUSTER_METADATA_CONFIGMAP, CLUSTER_RESOURCES_CONFIGMAP
2222
from ..utils.console import xpk_exit, xpk_print
@@ -120,7 +120,7 @@ def inspector(args) -> None:
120120
final_return_code = 0
121121
xpk_print(args)
122122

123-
add_zone_and_project(args)
123+
GCloudContextManager.add_zone_and_project(args)
124124
get_cluster_credentials(args)
125125

126126
inspector_file = write_tmp_file(
@@ -138,7 +138,8 @@ def inspector(args) -> None:
138138
(
139139
(
140140
'gcloud beta container clusters list --project'
141-
f' {args.project} --region {zone_to_region(args.zone)} | grep -e'
141+
f' {args.project} --region'
142+
f' {GCloudContextManager.zone_to_region(args.zone)} | grep -e'
142143
f' NAME -e {args.cluster}'
143144
),
144145
'GKE: Cluster Details',
@@ -160,7 +161,7 @@ def inspector(args) -> None:
160161
(
161162
(
162163
f'gcloud beta container node-pools list --cluster {args.cluster} '
163-
f' --project={args.project} --region={zone_to_region(args.zone)}'
164+
f' --project={args.project} --region={GCloudContextManager.zone_to_region(args.zone)}'
164165
),
165166
'GKE: Node pool Details',
166167
),
@@ -309,19 +310,19 @@ def inspector(args) -> None:
309310
workload_links = [(
310311
f'Cloud Console for the workload {args.workload}',
311312
# pylint: disable=line-too-long
312-
f'https://console.cloud.google.com/kubernetes/service/{zone_to_region(args.zone)}/{args.cluster}/default/{args.workload}/details?project={args.project}',
313+
f'https://console.cloud.google.com/kubernetes/service/{GCloudContextManager.zone_to_region(args.zone)}/{args.cluster}/default/{args.workload}/details?project={args.project}',
313314
)]
314315

315316
links = [
316317
(
317318
'Cloud Console for the GKE Cluster',
318319
# pylint: disable=line-too-long
319-
f'https://console.cloud.google.com/kubernetes/clusters/details/{zone_to_region(args.zone)}/{args.cluster}/details?project={args.project}',
320+
f'https://console.cloud.google.com/kubernetes/clusters/details/{GCloudContextManager.zone_to_region(args.zone)}/{args.cluster}/details?project={args.project}',
320321
),
321322
(
322323
'Cloud Console for all workloads in GKE Cluster',
323324
# pylint: disable=line-too-long
324-
f'https://console.cloud.google.com/kubernetes/workload/overview?project={args.project}&pageState=((gke%2F{zone_to_region(args.zone)}%2F{args.cluster}))',
325+
f'https://console.cloud.google.com/kubernetes/workload/overview?project={args.project}&pageState=((gke%2F{GCloudContextManager.zone_to_region(args.zone)}%2F{args.cluster}))',
325326
),
326327
(
327328
'Cloud Console for IAM Permissions',

src/xpk/commands/job.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ruamel.yaml import YAML
2121

2222
from ..core.commands import run_command_for_value, run_command_with_updates
23-
from ..core.gcloud_context import add_zone_and_project
23+
from ..core.gcloud.context import GCloudContextManager
2424
from ..core.kjob import AppProfileDefaults
2525
from ..utils.console import xpk_exit, xpk_print
2626
from .common import set_cluster_command
@@ -142,7 +142,7 @@ def job_list(args) -> None:
142142
None
143143
"""
144144
if not args.kind_cluster:
145-
add_zone_and_project(args)
145+
GCloudContextManager.add_zone_and_project(args)
146146
set_cluster_command_code = set_cluster_command(args)
147147
msg = f'Listing jobs for project {args.project} and zone {args.zone}:'
148148
else:
@@ -177,7 +177,7 @@ def job_cancel(args) -> None:
177177
"""
178178
xpk_print(f'Starting job cancel for job: {args.name}', flush=True)
179179
if not args.kind_cluster:
180-
add_zone_and_project(args)
180+
GCloudContextManager.add_zone_and_project(args)
181181
set_cluster_command_code = set_cluster_command(args)
182182
else:
183183
set_cluster_command_code = set_local_cluster_command(args)

0 commit comments

Comments
 (0)