Skip to content

Commit b699c01

Browse files
authored
Fix error when xpk storage attach --type=gcpfilestore without --mount-options (#463)
* fix mount-options for filestore attach * split storage tests * fix tests concurrency * fix tests * increase workload timeout to 10m * disable interrupting storage deletion * more descriptive storage job names * remove pvc protection when detaching filestore * fix tests * fix finalizer deletion * remove finalizers after pvc deletion
1 parent ea5ff77 commit b699c01

File tree

7 files changed

+201
-75
lines changed

7 files changed

+201
-75
lines changed

.github/workflows/build_tests.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ jobs:
197197
cluster-name: ${{needs.set-variables.outputs.cluster-name}}
198198
tpu-type: ${{needs.set-variables.outputs.tpu-type}}
199199
zone: ${{needs.set-variables.outputs.zone}}
200-
location: ${{needs.set-variables.outputs.location}}
201200
run-id: ${{needs.set-variables.outputs.run-id}}
202201
secrets: inherit
203202
cluster-delete:

.github/workflows/reusable_storage_tests_by_type.yaml renamed to .github/workflows/reusable_storage_create.yaml

Lines changed: 28 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -26,40 +26,29 @@ on:
2626
zone:
2727
type: string
2828
required: true
29-
location:
30-
type: string
31-
required: true
32-
run-id:
33-
required: true
34-
type: string
3529
storage-type: # gcpfilestore or gcsfuse
3630
required: false
37-
default: 'gcpfilestore'
3831
type: string
3932
storage-command: # attach or create
4033
required: true
4134
default: 'attach'
4235
type: string
36+
storage-name:
37+
required: true
38+
type: string
4339
secrets:
4440
GCP_SA_KEY:
4541
required: true
46-
PROJECT_NAME:
47-
required: true
4842
BUCKET_NAME:
4943
required: true
50-
VOL_NAME:
51-
required: true
52-
IP_ADDRESS:
53-
required: true
54-
STORAGE_NAME:
55-
required: true
5644
jobs:
57-
storage-tests:
45+
storage-create:
46+
name: "${{inputs.storage-type}}-${{inputs.storage-command}}"
5847
runs-on: [ubuntu-22.04]
5948
env:
60-
FS_WRITE_WORKLOAD: "${{inputs.storage-type}}-${{inputs.storage-command}}-write-workload"
61-
FS_READ_WORKLOAD: "${{inputs.storage-type}}-${{inputs.storage-command}}-read-workload"
62-
FS_DELETE_WORKLOAD: "${{inputs.storage-type}}-${{inputs.storage-command}}-delete-workload"
49+
STORAGE_WRITE_WORKLOAD: "${{inputs.storage-type}}-${{inputs.storage-command}}-write-workload"
50+
STORAGE_READ_WORKLOAD: "${{inputs.storage-type}}-${{inputs.storage-command}}-read-workload"
51+
STORAGE_DELETE_WORKLOAD: "${{inputs.storage-type}}-${{inputs.storage-command}}-delete-workload"
6352
steps:
6453
- name: Validate storage-type
6554
run: |
@@ -117,37 +106,42 @@ jobs:
117106
- name: Attach auto-mount GCS FUSE Storage instance
118107
if: inputs.storage-command == 'attach' && inputs.storage-type == 'gcsfuse'
119108
run: |
120-
python3 xpk.py storage attach ${{secrets.STORAGE_NAME}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}} --type=${{inputs.storage-type}} \
109+
python3 xpk.py storage attach ${{inputs.storage-name}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}} --type=${{inputs.storage-type}} \
121110
--auto-mount=true --mount-point='/${{inputs.storage-type}}-test-mount-point' --readonly=false --size=1 --bucket=${{secrets.BUCKET_NAME}} --mount-options rename-dir-limit=10000 --prefetch-metadata
122111
- name: Create auto-mount GCP Filestore Storage instance
123112
if: inputs.storage-command == 'create' && inputs.storage-type == 'gcpfilestore'
124113
run: |
125-
python3 xpk.py storage create ${{secrets.STORAGE_NAME}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}} --type=${{inputs.storage-type}} \
114+
python3 xpk.py storage create ${{inputs.storage-name}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}} --type=${{inputs.storage-type}} \
126115
--auto-mount=true --vol=vol1 --size=1024 --tier=BASIC_HDD --mount-point='/${{inputs.storage-type}}-test-mount-point' --readonly=false
116+
- name: Attach an existing GCP Filestore Storage instance
117+
if: inputs.storage-command == 'attach' && inputs.storage-type == 'gcpfilestore'
118+
run: |
119+
python3 xpk.py storage attach ${{inputs.storage-name}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}} --type=${{inputs.storage-type}} \
120+
--auto-mount=true --vol=vol1 --mount-point='/${{inputs.storage-type}}-test-mount-point' --readonly=false
127121
- name: List and verify existing Storages
128-
run: python3 xpk.py storage list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} | tee output.txt | grep ${{secrets.STORAGE_NAME}} || (echo 'No storage found' && exit 143)
122+
run: python3 xpk.py storage list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} | tee output.txt | grep ${{inputs.storage-name}} || (echo 'No storage found' && exit 143)
129123
- name: Verify VolumeBundle created
130-
run: kubectl get volumebundle ${{secrets.STORAGE_NAME}} -o jsonpath='{.spec.containerVolumeMounts[0].mountPath}' | grep '/${{inputs.storage-type}}-test-mount-point'
124+
run: kubectl get volumebundle ${{inputs.storage-name}} -o jsonpath='{.spec.containerVolumeMounts[0].mountPath}' | grep '/${{inputs.storage-type}}-test-mount-point'
131125
- name: Verify Persistent Volume mount options
132126
if: inputs.storage-command == 'attach' && inputs.storage-type == 'gcsfuse'
133-
run: kubectl get pv ${{secrets.STORAGE_NAME}}-pv -oyaml | grep rename-dir-limit=10000 || (echo 'Invalid storage mount options' && exit 143)
127+
run: kubectl get pv ${{inputs.storage-name}}-pv -oyaml | grep rename-dir-limit=10000 || (echo 'Invalid storage mount options' && exit 143)
134128
- name: Verify that metadata pre-population is enabled
135129
if: inputs.storage-command == 'attach' && inputs.storage-type == 'gcsfuse'
136130
run: |
137-
kubectl get pv ${{secrets.STORAGE_NAME}}-pv -oyaml | grep 'gcsfuseMetadataPrefetchOnMount: "true"' || (echo 'Metadata pre-population was not enabled' && exit 143)
131+
kubectl get pv ${{inputs.storage-name}}-pv -oyaml | grep 'gcsfuseMetadataPrefetchOnMount: "true"' || (echo 'Metadata pre-population was not enabled' && exit 143)
138132
- name: Run workload to write file on filestore
139-
run: python3 xpk.py workload create --workload $FS_WRITE_WORKLOAD --num-slices=1 --docker-image='marketplace.gcr.io/google/ubuntu2004' --command "mkdir /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/ && echo 'Test text message' > /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/test.txt || (echo 'Writing to filestore failed' && exit 143)" --cluster ${{inputs.cluster-name}} --tpu-type=${{inputs.tpu-type}} --zone ${{inputs.zone}}
133+
run: python3 xpk.py workload create --workload $STORAGE_WRITE_WORKLOAD --num-slices=1 --docker-image='marketplace.gcr.io/google/ubuntu2004' --command "mkdir -p /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/ && echo 'Test text message' > /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/test.txt || (echo 'Writing to filestore failed' && exit 143)" --cluster ${{inputs.cluster-name}} --tpu-type=${{inputs.tpu-type}} --zone ${{inputs.zone}}
140134
- name: Wait for writer workload completion and confirm it succeeded
141-
run: python3 xpk.py workload list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} --wait-for-job-completion $FS_WRITE_WORKLOAD --timeout 300
135+
run: python3 xpk.py workload list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} --wait-for-job-completion $STORAGE_WRITE_WORKLOAD --timeout 300
142136
- name: Delete the writer workload on the cluster
143137
if: always()
144-
run: python3 xpk.py workload delete --workload $FS_WRITE_WORKLOAD --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}}
138+
run: python3 xpk.py workload delete --workload $STORAGE_WRITE_WORKLOAD --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}}
145139
- name: Run workload to read file on filestore
146-
run : python3 xpk.py workload create --workload $FS_READ_WORKLOAD --command "grep 'Test text message' /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/test.txt || (echo 'Reading from filestore failed' && exit 143)" --cluster ${{inputs.cluster-name}} --tpu-type=${{inputs.tpu-type}} --zone ${{inputs.zone}}
140+
run : python3 xpk.py workload create --workload $STORAGE_READ_WORKLOAD --command "grep 'Test text message' /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/test.txt || (echo 'Reading from filestore failed' && exit 143)" --cluster ${{inputs.cluster-name}} --tpu-type=${{inputs.tpu-type}} --zone ${{inputs.zone}}
147141
- name: Wait for reader workload completion and confirm it succeeded
148-
run: python3 xpk.py workload list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} --wait-for-job-completion $FS_READ_WORKLOAD --timeout 300
142+
run: python3 xpk.py workload list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} --wait-for-job-completion $STORAGE_READ_WORKLOAD --timeout 300
149143
- name: Delete the reader workload on the cluster
150-
run: python3 xpk.py workload delete --workload $FS_READ_WORKLOAD --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}}
144+
run: python3 xpk.py workload delete --workload $STORAGE_READ_WORKLOAD --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}}
151145
- name: Create batch-read.sh script
152146
run: |
153147
cat <<EOF > batch-read.sh
@@ -187,21 +181,8 @@ jobs:
187181
- name: Delete create-shell.exp file
188182
run: rm create-shell.exp
189183
- name: Run workload to delete file on filestore
190-
run : python3 xpk.py workload create --workload $FS_DELETE_WORKLOAD --command "rm -rf /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/test.txt || exit 143" --num-slices=1 --cluster ${{inputs.cluster-name}} --tpu-type=${{inputs.tpu-type}} --zone ${{inputs.zone}}
184+
run : python3 xpk.py workload create --workload $STORAGE_DELETE_WORKLOAD --command "rm -rf /${{inputs.storage-type}}-test-mount-point/$RANDOM_SEED/test.txt || exit 143" --num-slices=1 --cluster ${{inputs.cluster-name}} --tpu-type=${{inputs.tpu-type}} --zone ${{inputs.zone}}
191185
- name: Wait for delete workload completion and confirm it succeeded
192-
run: python3 xpk.py workload list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} --wait-for-job-completion $FS_DELETE_WORKLOAD --timeout 300
186+
run: python3 xpk.py workload list --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}} --wait-for-job-completion $STORAGE_DELETE_WORKLOAD --timeout 300
193187
- name: Delete the delete workload on the cluster
194-
run: python3 xpk.py workload delete --workload $FS_DELETE_WORKLOAD --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}}
195-
- name: Detach storage volumes
196-
if: always()
197-
run: python3 xpk.py storage detach ${{secrets.STORAGE_NAME}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}}
198-
- name: Verify VolumeBundle deleted
199-
run: |
200-
! kubectl get volumebundle | grep ${{secrets.STORAGE_NAME}}
201-
- name: Delete GCP Filestore Storage instance
202-
if: always() && inputs.storage-command == 'create' && inputs.storage-type == 'gcpfilestore'
203-
run: python3 xpk.py storage delete ${{secrets.STORAGE_NAME}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}}
204-
- name: Verify deletion of GCP Filestore Storage instance
205-
if: inputs.storage-command == 'create' && inputs.storage-type == 'gcpfilestore'
206-
run: |
207-
! gcloud filestore instances list | grep ${{secrets.STORAGE_NAME}}
188+
run: python3 xpk.py workload delete --workload $STORAGE_DELETE_WORKLOAD --cluster ${{inputs.cluster-name}} --zone=${{inputs.zone}}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# Copyright 2025 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# https://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License
14+
15+
on:
16+
workflow_call:
17+
inputs:
18+
cluster-name:
19+
type: string
20+
required: true
21+
zone:
22+
type: string
23+
required: true
24+
storage-type: # gcpfilestore or gcsfuse
25+
required: true
26+
type: string
27+
storage-command: # detach or delete
28+
required: true
29+
default: 'detach'
30+
type: string
31+
storage-name:
32+
required: true
33+
type: string
34+
secrets:
35+
GCP_SA_KEY:
36+
required: true
37+
jobs:
38+
storage-delete:
39+
name: "${{inputs.storage-type}}-${{inputs.storage-command}}"
40+
runs-on: [ubuntu-22.04]
41+
steps:
42+
- name: Validate storage-command
43+
run: |
44+
if [[ "${{ inputs.storage-command }}" != "detach" && "${{ inputs.storage-command }}" != "delete" ]]; then
45+
echo "Error: storage-command must be 'detach' or 'delete'"
46+
exit 1
47+
fi
48+
- uses: actions/checkout@v4
49+
- uses: actions/setup-python@v5
50+
with:
51+
python-version: '3.10'
52+
- uses: 'google-github-actions/auth@v2'
53+
with:
54+
credentials_json: '${{ secrets.GCP_SA_KEY }}'
55+
- uses: google-github-actions/setup-gcloud@v2
56+
with:
57+
version: '>= 363.0.0'
58+
install_components: 'beta,gke-gcloud-auth-plugin'
59+
- name: Install kubectl
60+
run: gcloud components install kubectl
61+
- name: Verify gcp setup
62+
run: gcloud info
63+
- name: Set Google Cloud CLI properties to a unused zone to verify --zone arg is passed properly in commands.
64+
run: |
65+
gcloud config set compute/zone us-east4-a
66+
gcloud config get compute/zone
67+
- name: Prepare directories
68+
run: mkdir -p ~/.cache/pip
69+
- name: Restore cached dependencies
70+
uses: actions/cache@v4
71+
with:
72+
path: |
73+
/usr/local/bin/kubectl-kueue
74+
/usr/local/bin/kubectl-kjob
75+
~/.cache/pip
76+
${{env.pythonLocation}}
77+
key: xpk-deps-3.10-${{github.run_id}}-${{github.run_attempt}}
78+
restore-keys: xpk-deps-3.10-
79+
- name: Verify xpk installation
80+
run: xpk --help
81+
- name: Detach storage volumes
82+
if: always()
83+
run: python3 xpk.py storage detach ${{inputs.storage-name}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}}
84+
- name: Verify VolumeBundle deleted
85+
run: |
86+
! kubectl get volumebundle | grep ${{inputs.storage-name}}
87+
- name: Delete GCP Filestore Storage instance
88+
if: always() && inputs.storage-command == 'delete'
89+
run: python3 xpk.py storage delete ${{inputs.storage-name}} --cluster=${{inputs.cluster-name}} --zone=${{inputs.zone}}
90+
- name: Verify deletion of GCP Filestore Storage instance
91+
if: inputs.storage-command == 'delete'
92+
run: |
93+
! gcloud filestore instances list | grep ${{inputs.storage-name}}

.github/workflows/reusable_storage_tests.yaml

Lines changed: 68 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,52 +28,102 @@ on:
2828
zone:
2929
type: string
3030
required: true
31-
location:
32-
type: string
33-
required: true
3431
run-id:
3532
required: true
3633
type: string
3734

3835
jobs:
3936
fuse-attach-tests:
40-
uses: ./.github/workflows/reusable_storage_tests_by_type.yaml
37+
uses: ./.github/workflows/reusable_storage_create.yaml
4138
concurrency: # We support one build or nightly test to run at a time currently.
4239
group: fuse-tests-${{inputs.run-id}}
4340
cancel-in-progress: true
4441
with:
4542
cluster-name: ${{inputs.cluster-name}}
4643
tpu-type: ${{inputs.tpu-type}}
4744
zone: ${{inputs.zone}}
48-
location: ${{inputs.location}}
49-
run-id: ${{inputs.run-id}}
5045
storage-type: 'gcsfuse'
5146
storage-command: 'attach'
47+
storage-name: fuse-test-${{inputs.run-id}}
5248
secrets:
5349
GCP_SA_KEY: ${{secrets.GCP_SA_KEY}}
54-
PROJECT_NAME: ${{secrets.PROJECT_NAME}}
55-
VOL_NAME: ${{secrets.VOL_NAME}}
56-
IP_ADDRESS: ${{secrets.IP_ADDRESS}}
5750
BUCKET_NAME: ${{secrets.BUCKET_NAME}}
58-
STORAGE_NAME: gcsfuse-test-${{inputs.run-id}}
51+
52+
fuse-detach-tests:
53+
if: always()
54+
needs: [fuse-attach-tests]
55+
uses: ./.github/workflows/reusable_storage_delete.yaml
56+
concurrency: # We support one build or nightly test to run at a time currently.
57+
group: fuse-tests-${{inputs.run-id}}
58+
with:
59+
cluster-name: ${{inputs.cluster-name}}
60+
zone: ${{inputs.zone}}
61+
storage-type: 'gcsfuse'
62+
storage-command: 'detach'
63+
storage-name: fuse-test-${{inputs.run-id}}
64+
secrets:
65+
GCP_SA_KEY: ${{secrets.GCP_SA_KEY}}
66+
5967
filestore-create-tests:
60-
needs: [ fuse-attach-tests ]
61-
uses: ./.github/workflows/reusable_storage_tests_by_type.yaml
68+
needs: [fuse-attach-tests]
69+
uses: ./.github/workflows/reusable_storage_create.yaml
6270
concurrency: # We support one build or nightly test to run at a time currently.
6371
group: filestore-tests-${{inputs.run-id}}
6472
cancel-in-progress: true
6573
with:
6674
cluster-name: ${{inputs.cluster-name}}
6775
tpu-type: ${{inputs.tpu-type}}
6876
zone: ${{inputs.zone}}
69-
location: ${{inputs.location}}
70-
run-id: ${{inputs.run-id}}
7177
storage-type: 'gcpfilestore'
7278
storage-command: 'create'
79+
storage-name: gcpfilestore-test-${{inputs.run-id}}
80+
secrets:
81+
GCP_SA_KEY: ${{secrets.GCP_SA_KEY}}
82+
BUCKET_NAME: ${{secrets.BUCKET_NAME}}
83+
84+
filestore-detach-tests:
85+
needs: [filestore-create-tests]
86+
uses: ./.github/workflows/reusable_storage_delete.yaml
87+
concurrency: # We support one build or nightly test to run at a time currently.
88+
group: filestore-tests-${{inputs.run-id}}
89+
with:
90+
cluster-name: ${{inputs.cluster-name}}
91+
zone: ${{inputs.zone}}
92+
storage-type: 'gcpfilestore'
93+
storage-command: 'detach'
94+
storage-name: 'gcpfilestore-test-${{inputs.run-id}}'
95+
secrets:
96+
GCP_SA_KEY: ${{secrets.GCP_SA_KEY}}
97+
98+
filestore-attach-tests:
99+
needs: [filestore-detach-tests]
100+
uses: ./.github/workflows/reusable_storage_create.yaml
101+
concurrency: # We support one build or nightly test to run at a time currently.
102+
group: filestore-tests-${{inputs.run-id}}
103+
cancel-in-progress: true
104+
with:
105+
cluster-name: ${{inputs.cluster-name}}
106+
tpu-type: ${{inputs.tpu-type}}
107+
zone: ${{inputs.zone}}
108+
storage-type: 'gcpfilestore'
109+
storage-command: 'attach'
110+
storage-name: gcpfilestore-test-${{inputs.run-id}}
73111
secrets:
74112
GCP_SA_KEY: ${{secrets.GCP_SA_KEY}}
75-
PROJECT_NAME: ${{secrets.PROJECT_NAME}}
76-
VOL_NAME: ${{secrets.VOL_NAME}}
77-
IP_ADDRESS: ${{secrets.IP_ADDRESS}}
78113
BUCKET_NAME: ${{secrets.BUCKET_NAME}}
79-
STORAGE_NAME: gcpfilestore-test-${{inputs.run-id}}
114+
115+
filestore-delete-tests:
116+
if: always()
117+
needs: [filestore-create-tests, filestore-attach-tests]
118+
uses: ./.github/workflows/reusable_storage_delete.yaml
119+
concurrency: # We support one build or nightly test to run at a time currently.
120+
group: filestore-tests-${{inputs.run-id}}
121+
with:
122+
cluster-name: ${{inputs.cluster-name}}
123+
zone: ${{inputs.zone}}
124+
storage-type: 'gcpfilestore'
125+
storage-command: 'delete'
126+
storage-name: gcpfilestore-test-${{inputs.run-id}}
127+
secrets:
128+
GCP_SA_KEY: ${{secrets.GCP_SA_KEY}}
129+

src/xpk/commands/storage.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ def storage_create(args: Namespace) -> None:
8686
args.vol,
8787
args.access_mode,
8888
filestore_network,
89-
args.mount_options,
9089
)
9190

9291
k8s_api_client = setup_k8s_env(args)
@@ -162,7 +161,6 @@ def storage_attach(args: Namespace) -> None:
162161
args.vol,
163162
args.access_mode,
164163
filestore_network,
165-
args.mount_options,
166164
)
167165

168166
elif args.type == GCS_FUSE_TYPE:
@@ -327,3 +325,12 @@ def delete_storage_resources(k8s_api_client: ApiClient, storage: Storage):
327325
storage.name,
328326
"Storage",
329327
)
328+
329+
# remove kubernetes.io/pvc-protection
330+
delete_resource(
331+
lambda name: core_api.patch_namespaced_persistent_volume_claim(
332+
name, "default", {"metadata": {"finalizers": None}}
333+
),
334+
storage.pvc,
335+
"Persistent Volume Claim finalizers",
336+
)

src/xpk/commands/workload.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ def workload_create(args) -> None:
402402
f' {parallelstore_storages}'
403403
)
404404
else:
405-
xpk_print('No gcp filestore instances to add detected.')
405+
xpk_print('No gcp parallelstore instances to add detected.')
406406

407407
if len(pd_storages) > 0:
408408
service_account = XPK_SA

0 commit comments

Comments
 (0)