Skip to content

Commit 930a73d

Browse files
authored
[vme] Add new vme command (#8827)
* Add new vme command list * Add history * Add vme list test
1 parent b379101 commit 930a73d

13 files changed

Lines changed: 4077 additions & 4430 deletions

src/vme/HISTORY.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ Release History
55

66
1.0.0b1
77
++++++
8-
* Initial release.
8+
* Initial release.
9+
10+
1.0.0b2
11+
++++++
12+
* Add new 'az vme list' command to list all version managed extensions.

src/vme/azext_vme/_format.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# --------------------------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for license information.
4+
# --------------------------------------------------------------------------------------------
5+
6+
from collections import OrderedDict
7+
8+
9+
def vme_list_table_format(results):
10+
return [__get_table_row(result) for result in results]
11+
12+
13+
def __get_table_row(result):
14+
return OrderedDict([
15+
('name', result['name']),
16+
('extensionType', result.get('properties', {}).get('extensionType', '')),
17+
('version', result.get('properties', {}).get('version', '')),
18+
('provisioningState', result.get('properties', {}).get('provisioningState', '')),
19+
('isSystemExtension', result.get('properties', {}).get('isSystemExtension', '')),
20+
('lastModifiedAt', result.get('systemData', {}).get('lastModifiedAt', '')),
21+
])

src/vme/azext_vme/_help.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,15 @@
4747
text: |-
4848
az vme upgrade --resource-group my-resource-group --cluster-name my-cluster --wait
4949
"""
50+
51+
helps['vme list'] = """
52+
type: command
53+
short-summary: List version managed extensions.
54+
examples:
55+
- name: List version managed extensions
56+
text: |-
57+
az vme list --resource-group my-resource-group --cluster-name my-cluster
58+
- name: List version managed extensions with table format
59+
text: |-
60+
az vme list --resource-group my-resource-group --cluster-name my-cluster --output table
61+
"""

src/vme/azext_vme/_params.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,15 @@ def load_arguments(self, _):
9292
help='Extension types to be uninstalled.',
9393
arg_type=get_enum_type(IncludedExtensionTypes),
9494
)
95+
96+
with self.argument_context('vme list') as c:
97+
c.argument(
98+
'resource_group',
99+
options_list=['--resource-group', '-g'],
100+
help='Name of the resource group'
101+
)
102+
c.argument(
103+
'cluster_name',
104+
options_list=['--cluster-name', '-c'],
105+
help='Name of the Kubernetes cluster'
106+
)

src/vme/azext_vme/commands.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
# --------------------------------------------------------------------------------------------
55

66
# pylint: disable=line-too-long
7+
from ._format import vme_list_table_format
8+
79

810
def load_command_table(self, _):
911

1012
with self.command_group('vme') as g:
1113
g.custom_command('upgrade', 'upgrade_vme')
1214
g.custom_command('install', 'install_vme')
1315
g.custom_command('uninstall', 'uninstall_vme')
16+
g.custom_command('list', 'list_vme', table_transformer=vme_list_table_format)

src/vme/azext_vme/consts.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
SUCCEEDED = "Succeeded"
2121
CANCELLED = "Cancelled"
2222
Bundle_FeatureFlag_NotEnabled = "Bundle feature flag is not enabled."
23-
UPGRADE_IN_PROGRESS_MSG = "Version managed extensions upgrade is in progress"
23+
UPGRADE_IN_PROGRESS_MSG = "Version managed extensions upgrade is in progress..."
2424
UPGRADE_SUCCEEDED_MSG = "Version managed extensions upgrade completed!"
2525
UPGRADE_FAILED_MSG = "Version managed extensions upgrade failed. Error: "
2626
UPGRADE_CANCELED_MSG = "Version managed extensions upgrade is canceled."
27-
UPGRADE_NOTSTARTED_MSG = "Waiting for version managed extensions upgrade to start"
27+
UPGRADE_NOTSTARTED_MSG = "Waiting for version managed extensions upgrade to start..."
2828
UPGRADE_TIMEOUT_MSG = """
2929
Error: version managed extensions upgrade could not start in {0} seconds. Check out common issues here: <url>
3030
"""
@@ -34,9 +34,14 @@
3434
"microsoft.azure.secretstore"
3535
]
3636

37-
BundleExtensionNames = {
37+
BundleExtensionTypeNames = {
3838
"microsoft.arc.containerstorage": "azure-arc-containerstorage",
3939
"microsoft.azure.secretstore": "azure-secret-store",
4040
}
4141

4242
IncludedExtensionTypes = BundleExtensionTypes + ["all"]
43+
BundleExtensionNames = [
44+
"azure-arc-containerstorage",
45+
"azure-secret-store",
46+
"microsoft.extensiondiagnostics-v0"
47+
]

src/vme/azext_vme/custom.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,12 @@ def install_vme(
4141
for extension_type in include_extension_types:
4242
extension_resource_id = (
4343
f"{cluster_resource_id}/Providers/Microsoft.KubernetesConfiguration/"
44-
f"extensions/{consts.BundleExtensionNames[extension_type]}"
44+
f"extensions/{consts.BundleExtensionTypeNames[extension_type]}"
4545
)
4646
try:
47-
resources.get_by_id(extension_resource_id, '2022-11-01')
47+
ext = resources.get_by_id(extension_resource_id, '2022-11-01')
48+
if ext.properties['provisioningState'] == 'Failed':
49+
raise ResourceNotFoundError()
4850
print(f"Extension {extension_type} already exists, skipping installation.")
4951
continue
5052
except ResourceNotFoundError:
@@ -61,14 +63,15 @@ def install_vme(
6163
"--cluster-type",
6264
consts.CONNECTEDCLUSTER_TYPE,
6365
"--name",
64-
consts.BundleExtensionNames[extension_type],
66+
consts.BundleExtensionTypeNames[extension_type],
6567
"--extension-type",
6668
extension_type,
6769
"--scope",
6870
"cluster"
6971
]
70-
utils.call_subprocess_raise_output(command)
72+
result = utils.call_subprocess_raise_output(command)
7173
print(f"Installed extension {extension_type} successfully.")
74+
print(result)
7275

7376
print("All extensions installed successfully.")
7477

@@ -103,7 +106,7 @@ def uninstall_vme(
103106
"--cluster-type",
104107
"connectedClusters",
105108
"--name",
106-
consts.BundleExtensionNames[extension_type],
109+
consts.BundleExtensionTypeNames[extension_type],
107110
"--force",
108111
"--yes"]
109112
utils.call_subprocess_raise_output(command)
@@ -177,3 +180,31 @@ def upgrade_vme(
177180

178181
if (not deployment):
179182
raise CLIError(consts.UPGRADE_TIMEOUT_MSG.format(wait_timeout))
183+
184+
185+
def list_vme(
186+
cmd,
187+
resource_group_name: str,
188+
cluster_name: str):
189+
subscription_id = get_subscription_id(cmd.cli_ctx)
190+
191+
# Check whether the cluster exists
192+
resources = cf_resources(cmd.cli_ctx, subscription_id)
193+
cluster_resource_id = '/subscriptions/{0}/resourceGroups/{1}/providers/{2}/{3}/{4}'.format(
194+
subscription_id, resource_group_name, consts.CONNECTEDCLUSTER_RP, consts.CONNECTEDCLUSTER_TYPE, cluster_name)
195+
resources.get_by_id(cluster_resource_id, '2024-12-01-preview')
196+
197+
results = []
198+
extension_names = consts.BundleExtensionNames
199+
for extension_name in extension_names:
200+
extension_resource_id = (
201+
f"{cluster_resource_id}/Providers/Microsoft.KubernetesConfiguration/"
202+
f"extensions/{extension_name}"
203+
)
204+
try:
205+
ext = resources.get_by_id(extension_resource_id, '2022-11-01')
206+
results.append(ext)
207+
except ResourceNotFoundError:
208+
continue
209+
210+
return results

src/vme/azext_vme/tests/latest/recordings/test_vme_install_uninstall_live.yaml

Lines changed: 0 additions & 3960 deletions
This file was deleted.

src/vme/azext_vme/tests/latest/recordings/test_vme_live.yaml

Lines changed: 3575 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)