Skip to content

Commit 09fa4c4

Browse files
author
German Robayo Paz
committed
feat: add appnet-preview extension
1 parent 9cd3205 commit 09fa4c4

40 files changed

+10266
-0
lines changed

src/appnet-preview/HISTORY.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.. :changelog:
2+
3+
Release History
4+
===============
5+
6+
1.0.0b1
7+
++++++
8+
* Initial release.

src/appnet-preview/README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Azure CLI AppnetPreview Extension #
2+
This is an extension to Azure CLI to manage Application Network resources.
3+
4+
## How to use ##
5+
6+
### Install the extension
7+
```bash
8+
az extension add --name appnet-preview
9+
```
10+
11+
### List available Application Network versions
12+
```bash
13+
az appnet list-versions --location <location>
14+
```
15+
16+
### Create an Application Network
17+
```bash
18+
az appnet create --resource-group <resource-group> --appnet-name <name> --location <location>
19+
```
20+
21+
### Join an AKS cluster to an Application Network
22+
23+
**Prerequisites:** You must have an existing AKS cluster before running `az appnet member join`.
24+
25+
```bash
26+
# Create an AKS cluster first (if you don't have one)
27+
az aks create --resource-group <resource-group> --name <aks-name> --location <location>
28+
29+
# Get the AKS cluster resource ID
30+
AKS_ID=$(az aks show --resource-group <resource-group> --name <aks-name> --query id -o tsv)
31+
32+
# Join the AKS cluster to the Application Network
33+
az appnet member join --resource-group <resource-group> --appnet-name <appnet-name> \
34+
--member-name <member-name> --cluster-type AKS --member-resource-id $AKS_ID \
35+
--upgrade-mode FullyManaged --release-channel Stable
36+
```
37+
38+
### Other commands
39+
```bash
40+
# List Application Networks
41+
az appnet list --resource-group <resource-group>
42+
43+
# Show an Application Network
44+
az appnet show --resource-group <resource-group> --name <appnet-name>
45+
46+
# List members in an Application Network
47+
az appnet member list --resource-group <resource-group> --appnet-name <appnet-name>
48+
49+
# Remove a member from an Application Network
50+
az appnet member remove --resource-group <resource-group> --appnet-name <appnet-name> --member-name <member-name>
51+
52+
# Delete an Application Network
53+
az appnet delete --resource-group <resource-group> --name <appnet-name>
54+
```
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
from azure.cli.core import AzCommandsLoader
9+
from azext_appnet_preview._help import helps # pylint: disable=unused-import
10+
11+
12+
class AppnetPreviewCommandsLoader(AzCommandsLoader):
13+
14+
def __init__(self, cli_ctx=None):
15+
from azure.cli.core.commands import CliCommandType
16+
custom_command_type = CliCommandType(
17+
operations_tmpl='azext_appnet_preview.custom#{}')
18+
super().__init__(cli_ctx=cli_ctx,
19+
custom_command_type=custom_command_type)
20+
21+
def load_command_table(self, args):
22+
from azext_appnet_preview.commands import load_command_table
23+
from azure.cli.core.aaz import load_aaz_command_table
24+
try:
25+
from . import aaz
26+
except ImportError:
27+
aaz = None
28+
if aaz:
29+
load_aaz_command_table(
30+
loader=self,
31+
aaz_pkg_name=aaz.__name__,
32+
args=args
33+
)
34+
load_command_table(self, args)
35+
36+
# Add table transformers to AAZ commands
37+
self._add_table_transformers()
38+
39+
return self.command_table
40+
41+
def _add_table_transformers(self):
42+
"""Add table transformers to AAZ-generated commands."""
43+
from azext_appnet_preview._format import (
44+
appnet_list_versions_table_format,
45+
appnet_member_list_table_format,
46+
appnet_member_upgrade_history_table_format
47+
)
48+
49+
# Map command names to their table transformers
50+
table_transformers = {
51+
'appnet list-versions': appnet_list_versions_table_format,
52+
'appnet member list': appnet_member_list_table_format,
53+
'appnet member upgrade-history list': appnet_member_upgrade_history_table_format,
54+
}
55+
56+
# Apply table transformers to commands
57+
for command_name, transformer in table_transformers.items():
58+
if command_name in self.command_table:
59+
self.command_table[command_name].table_transformer = transformer
60+
61+
def load_arguments(self, command):
62+
from azext_appnet_preview._params import load_arguments
63+
load_arguments(self, command)
64+
65+
66+
COMMAND_LOADER_CLS = AppnetPreviewCommandsLoader
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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+
from jmespath import compile as compile_jmes, Options
8+
9+
10+
def appnet_list_versions_table_format(results):
11+
"""Format appnet list-versions results for display with "-o table"."""
12+
formatted_results = []
13+
for result in results:
14+
# Extract the main info
15+
base_info = {
16+
'kubernetesVersion': result.get('properties', {}).get('kubernetesVersion', 'N/A'),
17+
}
18+
19+
# Get fully managed versions
20+
fully_managed = result.get('properties', {}).get('fullyManagedVersions', {})
21+
if fully_managed and fully_managed.get('releaseChannels'):
22+
for channel in fully_managed['releaseChannels']:
23+
formatted_results.append({
24+
'kubernetesVersion': base_info['kubernetesVersion'],
25+
'mode': 'FullyManaged',
26+
'releaseChannel': channel.get('releaseChannel', 'N/A'),
27+
'version': channel.get('version', 'N/A'),
28+
})
29+
30+
# Get self managed versions
31+
self_managed = result.get('properties', {}).get('selfManagedVersions', {})
32+
if self_managed and self_managed.get('versions'):
33+
for version_info in self_managed['versions']:
34+
upgrades_str = ', '.join(version_info.get('upgrades', []))
35+
formatted_results.append({
36+
'kubernetesVersion': base_info['kubernetesVersion'],
37+
'mode': 'SelfManaged',
38+
'releaseChannel': 'N/A',
39+
'version': version_info.get('version', 'N/A'),
40+
'availableUpgrades': upgrades_str if upgrades_str else 'None',
41+
})
42+
43+
return formatted_results
44+
45+
46+
def appnet_member_list_table_format(results):
47+
"""Format appnet member list results for display with "-o table"."""
48+
return [_appnet_member_show_table_format(r) for r in results]
49+
50+
51+
def _appnet_member_show_table_format(result):
52+
"""Format a single appnet member as summary results for display with "-o table"."""
53+
# Extract resource group from ID
54+
resource_id = result.get('id', '')
55+
resource_group = 'N/A'
56+
if resource_id:
57+
parts = resource_id.split('/resourceGroups/')
58+
if len(parts) > 1:
59+
resource_group = parts[1].split('/')[0]
60+
61+
parsed = compile_jmes("""{
62+
name: name,
63+
location: location,
64+
clusterType: properties.clusterType,
65+
mode: properties.mode,
66+
provisioningState: properties.provisioningState,
67+
clusterResourceId: properties.metadata.resourceId
68+
}""")
69+
70+
result_dict = parsed.search(result, Options(dict_cls=OrderedDict))
71+
result_dict['resourceGroup'] = resource_group
72+
73+
# Shorten cluster resource ID for readability
74+
if result_dict.get('clusterResourceId'):
75+
result_dict['clusterName'] = result_dict['clusterResourceId'].split('/')[-1]
76+
del result_dict['clusterResourceId']
77+
78+
return result_dict
79+
80+
81+
def appnet_member_upgrade_history_table_format(results):
82+
"""Format appnet member upgrade history results for display with "-o table"."""
83+
formatted_results = []
84+
for result in results:
85+
parsed = compile_jmes("""{
86+
name: name,
87+
upgradeState: properties.upgradeState,
88+
fromVersion: properties.fromVersion,
89+
toVersion: properties.toVersion,
90+
startTime: properties.startTime,
91+
endTime: properties.endTime,
92+
upgradeType: properties.upgradeType
93+
}""")
94+
formatted_results.append(parsed.search(result, Options(dict_cls=OrderedDict)))
95+
96+
return formatted_results
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
# pylint: disable=line-too-long
9+
# pylint: disable=too-many-lines
10+
11+
from knack.help_files import helps # pylint: disable=unused-import
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
# pylint: disable=too-many-lines
9+
# pylint: disable=too-many-statements
10+
11+
12+
def load_arguments(self, _): # pylint: disable=unused-argument
13+
pass
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
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+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
# pylint: skip-file
9+
# flake8: noqa
10+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
# pylint: skip-file
9+
# flake8: noqa
10+
11+
from azure.cli.core.aaz import *
12+
13+
14+
@register_command_group(
15+
"appnet",
16+
is_preview=True,
17+
)
18+
class __CMDGroup(AAZCommandGroup):
19+
"""Azure Kubernetes Application Network
20+
"""
21+
pass
22+
23+
24+
__all__ = ["__CMDGroup"]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
# pylint: skip-file
9+
# flake8: noqa
10+
11+
from .__cmd_group import *
12+
from ._create import *
13+
from ._delete import *
14+
from ._list import *
15+
from ._list_versions import *
16+
from ._show import *
17+
from ._update import *
18+
from ._wait import *

0 commit comments

Comments
 (0)