Skip to content
This repository was archived by the owner on May 13, 2025. It is now read-only.

Commit 5b03182

Browse files
bavneetsingh16Bavneet Singh
andauthored
[k8s-extension] add support for provisionedClusters (#144)
* add provisionedClusters support for k8s-extension * support added in azuredefender and containerInsights * add support for azuremlkubernetes * add support for Dapr and OpenServiceMesh * add support in model * fix the cli errors * remove redundant changes for osm * add description for cmd * updating the api version * modify the description of the argument Co-authored-by: Bavneet Singh <[email protected]>
1 parent b187fa8 commit 5b03182

File tree

11 files changed

+72
-48
lines changed

11 files changed

+72
-48
lines changed

src/k8s-extension/azext_k8s_extension/_params.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ def load_arguments(self, _):
2929
options_list=['--cluster-name', '-c'],
3030
help='Name of the Kubernetes cluster')
3131
c.argument('cluster_type',
32-
arg_type=get_enum_type(['connectedClusters', 'managedClusters', 'appliances']),
32+
arg_type=get_enum_type(['connectedClusters', 'managedClusters', 'appliances', 'provisionedClusters']),
3333
options_list=['--cluster-type', '-t'],
34-
help='Specify Arc clusters or AKS managed clusters or Arc appliances.')
34+
help='Specify Arc clusters or AKS managed clusters or Arc appliances or provisionedClusters.')
35+
c.argument('cluster_resource_provider',
36+
options_list=['--cluster-resource-provider', '--cluster-rp'],
37+
help='Cluster Resource Provider name for this clusterType (Required for provisionedClusters)')
3538
c.argument('scope',
3639
arg_type=get_enum_type(['cluster', 'namespace']),
3740
help='Specify the extension scope.')

src/k8s-extension/azext_k8s_extension/consts.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@
1313
CONNECTED_CLUSTER_RP = "Microsoft.Kubernetes"
1414
MANAGED_CLUSTER_RP = "Microsoft.ContainerService"
1515
APPLIANCE_RP = "Microsoft.ResourceConnector"
16+
HYBRIDCONTAINERSERVICE_RP = "microsoft.hybridcontainerservice"
1617

1718
CONNECTED_CLUSTER_TYPE = "connectedclusters"
1819
MANAGED_CLUSTER_TYPE = "managedclusters"
1920
APPLIANCE_TYPE = "appliances"
21+
PROVISIONED_CLUSTER_TYPE = "provisionedclusters"
2022

2123
CONNECTED_CLUSTER_API_VERSION = "2021-10-01"
2224
MANAGED_CLUSTER_API_VERSION = "2021-10-01"
2325
APPLIANCE_API_VERSION = "2021-10-31-preview"
26+
HYBRIDCONTAINERSERVICE_API_VERSION = "2022-05-01-preview"

src/k8s-extension/azext_k8s_extension/custom.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ def ExtensionFactory(extension_name):
5353
return extension_map.get(extension_name, DefaultExtension)()
5454

5555

56-
def show_k8s_extension(client, resource_group_name, cluster_name, name, cluster_type):
56+
def show_k8s_extension(client, resource_group_name, cluster_name, name, cluster_type, cluster_resource_provider=None):
5757
"""Get an existing K8s Extension."""
5858
# Determine ClusterRP
59-
cluster_rp, _ = get_cluster_rp_api_version(cluster_type)
59+
cluster_rp, _ = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_resource_provider)
6060

6161
try:
6262
extension = client.get(
@@ -95,6 +95,7 @@ def create_k8s_extension(
9595
name,
9696
cluster_type,
9797
extension_type,
98+
cluster_resource_provider=None,
9899
scope=None,
99100
auto_upgrade_minor_version=None,
100101
release_train=None,
@@ -110,7 +111,7 @@ def create_k8s_extension(
110111
"""Create a new Extension Instance."""
111112

112113
extension_type_lower = extension_type.lower()
113-
cluster_rp, _ = get_cluster_rp_api_version(cluster_type)
114+
cluster_rp, _ = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_resource_provider)
114115

115116
# Configuration Settings & Configuration Protected Settings
116117
if configuration_settings is not None and configuration_settings_file is not None:
@@ -167,6 +168,7 @@ def create_k8s_extension(
167168
cluster_name,
168169
name,
169170
cluster_type,
171+
cluster_rp,
170172
extension_type_lower,
171173
scope,
172174
auto_upgrade_minor_version,
@@ -193,7 +195,7 @@ def create_k8s_extension(
193195
# We don't create the identity if we are in DF
194196
if create_identity and not is_dogfood_cluster(cmd):
195197
identity_object, location = __create_identity(
196-
cmd, resource_group_name, cluster_name, cluster_type
198+
cmd, resource_group_name, cluster_name, cluster_type, cluster_rp
197199
)
198200
if identity_object is not None and location is not None:
199201
extension_instance.identity, extension_instance.location = (
@@ -214,8 +216,8 @@ def create_k8s_extension(
214216
)
215217

216218

217-
def list_k8s_extension(client, resource_group_name, cluster_name, cluster_type):
218-
cluster_rp, _ = get_cluster_rp_api_version(cluster_type)
219+
def list_k8s_extension(client, resource_group_name, cluster_name, cluster_type, cluster_resource_provider=None):
220+
cluster_rp, _ = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_resource_provider)
219221
return client.list(resource_group_name, cluster_rp, cluster_type, cluster_name)
220222

221223

@@ -226,6 +228,7 @@ def update_k8s_extension(
226228
cluster_name,
227229
name,
228230
cluster_type,
231+
cluster_resource_provider=None,
229232
auto_upgrade_minor_version=None,
230233
release_train=None,
231234
version=None,
@@ -253,22 +256,21 @@ def update_k8s_extension(
253256
user_confirmation_factory(cmd, yes, msg)
254257

255258
# Determine ClusterRP
256-
cluster_rp, _ = get_cluster_rp_api_version(cluster_type)
259+
cluster_rp, _ = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_resource_provider)
257260

258261
# We need to determine the ExtensionType to call ExtensionFactory and create Extension class
259262
extension = show_k8s_extension(
260-
client, resource_group_name, cluster_name, name, cluster_type
263+
client, resource_group_name, cluster_name, name, cluster_type, cluster_rp
261264
)
262265
extension_type_lower = extension.extension_type.lower()
263266

264-
config_settings = None
265-
config_protected_settings = None
267+
config_settings = {}
268+
config_protected_settings = {}
266269
# Get Configuration Settings from file
267270
if configuration_settings_file is not None:
268271
config_settings = read_config_settings_file(configuration_settings_file)
269272

270273
if configuration_settings is not None:
271-
config_settings = {}
272274
for dicts in configuration_settings:
273275
for key, value in dicts.items():
274276
config_settings[key] = value
@@ -280,7 +282,6 @@ def update_k8s_extension(
280282
)
281283

282284
if configuration_protected_settings is not None:
283-
config_protected_settings = {}
284285
for dicts in configuration_protected_settings:
285286
for key, value in dicts.items():
286287
config_protected_settings[key] = value
@@ -320,13 +321,14 @@ def delete_k8s_extension(
320321
cluster_name,
321322
name,
322323
cluster_type,
324+
cluster_resource_provider=None,
323325
no_wait=False,
324326
yes=False,
325327
force=False,
326328
):
327329
"""Delete an existing Kubernetes Extension."""
328330
# Determine ClusterRP
329-
cluster_rp, _ = get_cluster_rp_api_version(cluster_type)
331+
cluster_rp, _ = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_resource_provider)
330332
extension = None
331333
try:
332334
extension = client.get(
@@ -343,7 +345,7 @@ def delete_k8s_extension(
343345

344346
# If there is any custom delete logic, this will call the logic
345347
extension_class.Delete(
346-
cmd, client, resource_group_name, cluster_name, name, cluster_type, yes
348+
cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp, yes
347349
)
348350

349351
return sdk_no_wait(
@@ -358,7 +360,7 @@ def delete_k8s_extension(
358360
)
359361

360362

361-
def __create_identity(cmd, resource_group_name, cluster_name, cluster_type):
363+
def __create_identity(cmd, resource_group_name, cluster_name, cluster_type, cluster_rp):
362364
subscription_id = get_subscription_id(cmd.cli_ctx)
363365
resources = cf_resources(cmd.cli_ctx, subscription_id)
364366

@@ -369,7 +371,7 @@ def __create_identity(cmd, resource_group_name, cluster_name, cluster_type):
369371
):
370372
return None, None
371373

372-
cluster_rp, parent_api_version = get_cluster_rp_api_version(cluster_type)
374+
cluster_rp, parent_api_version = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_rp)
373375

374376
cluster_resource_id = (
375377
"/subscriptions/{0}/resourceGroups/{1}/providers/{2}/{3}/{4}".format(

src/k8s-extension/azext_k8s_extension/partner_extensions/AzureDefender.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919

2020
class AzureDefender(DefaultExtension):
21-
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, extension_type,
22-
scope, auto_upgrade_minor_version, release_train, version, target_namespace,
21+
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp,
22+
extension_type, scope, auto_upgrade_minor_version, release_train, version, target_namespace,
2323
release_namespace, configuration_settings, configuration_protected_settings,
2424
configuration_settings_file, configuration_protected_settings_file):
2525

@@ -43,7 +43,7 @@ def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_t
4343
'only supports cluster scope and single instance of this extension.', extension_type)
4444
logger.warning("Defaulting to extension name '%s' and release-namespace '%s'", name, release_namespace)
4545

46-
_get_container_insights_settings(cmd, resource_group_name, cluster_name, configuration_settings,
46+
_get_container_insights_settings(cmd, resource_group_name, cluster_rp, cluster_type, cluster_name, configuration_settings,
4747
configuration_protected_settings, is_ci_extension_type)
4848

4949
# NOTE-2: Return a valid Extension object, Instance name and flag for Identity

src/k8s-extension/azext_k8s_extension/partner_extensions/AzureMLKubernetes.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ def __init__(self):
108108

109109
self.OPEN_SHIFT = 'openshift'
110110

111-
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, extension_type,
112-
scope, auto_upgrade_minor_version, release_train, version, target_namespace,
111+
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp,
112+
extension_type, scope, auto_upgrade_minor_version, release_train, version, target_namespace,
113113
release_namespace, configuration_settings, configuration_protected_settings,
114114
configuration_settings_file, configuration_protected_settings_file):
115115
if scope == 'namespace':
@@ -126,7 +126,7 @@ def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_t
126126

127127
# get the arc's location
128128
subscription_id = get_subscription_id(cmd.cli_ctx)
129-
cluster_rp, parent_api_version = get_cluster_rp_api_version(cluster_type)
129+
cluster_rp, parent_api_version = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_rp)
130130
cluster_resource_id = '/subscriptions/{0}/resourceGroups/{1}/providers/{2}' \
131131
'/{3}/{4}'.format(subscription_id, resource_group_name, cluster_rp, cluster_type, cluster_name)
132132
cluster_location = ''
@@ -216,7 +216,7 @@ def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_t
216216
)
217217
return extension, name, create_identity
218218

219-
def Delete(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, yes):
219+
def Delete(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp, yes):
220220
user_confirmation_factory(cmd, yes)
221221

222222
def Update(self, cmd, resource_group_name, cluster_name, auto_upgrade_minor_version, release_train, version, configuration_settings,

src/k8s-extension/azext_k8s_extension/partner_extensions/ContainerInsights.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232

3333

3434
class ContainerInsights(DefaultExtension):
35-
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, extension_type,
36-
scope, auto_upgrade_minor_version, release_train, version, target_namespace,
35+
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp,
36+
extension_type, scope, auto_upgrade_minor_version, release_train, version, target_namespace,
3737
release_namespace, configuration_settings, configuration_protected_settings,
3838
configuration_settings_file, configuration_protected_settings_file):
3939
"""ExtensionType 'microsoft.azuremonitor.containers' specific validations & defaults for Create
@@ -56,7 +56,7 @@ def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_t
5656
'only supports cluster scope and single instance of this extension.', extension_type)
5757
logger.warning("Defaulting to extension name '%s' and release-namespace '%s'", name, release_namespace)
5858

59-
_get_container_insights_settings(cmd, resource_group_name, cluster_name, configuration_settings,
59+
_get_container_insights_settings(cmd, resource_group_name, cluster_rp, cluster_type, cluster_name, configuration_settings,
6060
configuration_protected_settings, is_ci_extension_type)
6161

6262
# NOTE-2: Return a valid Extension object, Instance name and flag for Identity
@@ -72,11 +72,11 @@ def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_t
7272
)
7373
return extension, name, create_identity
7474

75-
def Delete(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, yes):
75+
def Delete(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp, yes):
7676
# Delete DCR-A if it exists incase of MSI Auth
7777
useAADAuth = False
7878
isDCRAExists = False
79-
cluster_rp, _ = get_cluster_rp_api_version(cluster_type)
79+
cluster_rp, _ = get_cluster_rp_api_version(cluster_type=cluster_type, cluster_rp=cluster_rp)
8080
try:
8181
extension = client.get(resource_group_name, cluster_rp, cluster_type, cluster_name, name)
8282
except Exception:
@@ -140,8 +140,8 @@ def _invoke_deployment(cmd, resource_group_name, deployment_name, template, para
140140
return sdk_no_wait(no_wait, smc.begin_create_or_update, resource_group_name, deployment_name, deployment)
141141

142142

143-
def _ensure_default_log_analytics_workspace_for_monitoring(cmd, subscription_id,
144-
cluster_resource_group_name, cluster_name):
143+
def _ensure_default_log_analytics_workspace_for_monitoring(cmd, subscription_id, cluster_resource_group_name,
144+
cluster_rp, cluster_type, cluster_name):
145145
# mapping for azure public cloud
146146
# log analytics workspaces cannot be created in WCUS region due to capacity limits
147147
# so mapped to EUS per discussion with log analytics team
@@ -236,8 +236,8 @@ def _ensure_default_log_analytics_workspace_for_monitoring(cmd, subscription_id,
236236
cluster_location = ''
237237
resources = cf_resources(cmd.cli_ctx, subscription_id)
238238

239-
cluster_resource_id = '/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Kubernetes' \
240-
'/connectedClusters/{2}'.format(subscription_id, cluster_resource_group_name, cluster_name)
239+
cluster_resource_id = '/subscriptions/{0}/resourceGroups/{1}/providers//{2}/{3}/{4}'.format(
240+
subscription_id, cluster_resource_group_name, cluster_rp, cluster_type, cluster_name)
241241
try:
242242
resource = resources.get_by_id(cluster_resource_id, '2020-01-01-preview')
243243
cluster_location = resource.location.lower()
@@ -438,8 +438,8 @@ def _ensure_container_insights_for_monitoring(cmd, workspace_resource_id):
438438
validate=False, no_wait=False, subscription_id=subscription_id)
439439

440440

441-
def _get_container_insights_settings(cmd, cluster_resource_group_name, cluster_name, configuration_settings,
442-
configuration_protected_settings, is_ci_extension_type):
441+
def _get_container_insights_settings(cmd, cluster_resource_group_name, cluster_rp, cluster_type, cluster_name,
442+
configuration_settings, configuration_protected_settings, is_ci_extension_type):
443443

444444
subscription_id = get_subscription_id(cmd.cli_ctx)
445445
workspace_resource_id = ''
@@ -477,15 +477,15 @@ def _get_container_insights_settings(cmd, cluster_resource_group_name, cluster_n
477477

478478
if not workspace_resource_id:
479479
workspace_resource_id = _ensure_default_log_analytics_workspace_for_monitoring(
480-
cmd, subscription_id, cluster_resource_group_name, cluster_name)
480+
cmd, subscription_id, cluster_resource_group_name, cluster_rp, cluster_type, cluster_name)
481481
else:
482482
if not is_valid_resource_id(workspace_resource_id):
483483
raise InvalidArgumentValueError('{} is not a valid Azure resource ID.'.format(workspace_resource_id))
484484

485485
if is_ci_extension_type:
486486
if useAADAuth:
487487
logger.info("creating data collection rule and association")
488-
_ensure_container_insights_dcr_for_monitoring(cmd, subscription_id, cluster_resource_group_name, cluster_name, workspace_resource_id)
488+
_ensure_container_insights_dcr_for_monitoring(cmd, subscription_id, cluster_resource_group_name, cluster_rp, cluster_type, cluster_name, workspace_resource_id)
489489
elif not _is_container_insights_solution_exists(cmd, workspace_resource_id):
490490
logger.info("Creating ContainerInsights solution resource, since it doesn't exist and it is using legacy authentication")
491491
_ensure_container_insights_for_monitoring(cmd, workspace_resource_id).result()
@@ -545,13 +545,13 @@ def get_existing_container_insights_extension_dcr_tags(cmd, dcr_url):
545545
return tags
546546

547547

548-
def _ensure_container_insights_dcr_for_monitoring(cmd, subscription_id, cluster_resource_group_name, cluster_name, workspace_resource_id):
548+
def _ensure_container_insights_dcr_for_monitoring(cmd, subscription_id, cluster_resource_group_name, cluster_rp, cluster_type, cluster_name, workspace_resource_id):
549549
from azure.core.exceptions import HttpResponseError
550550

551551
cluster_region = ''
552552
resources = cf_resources(cmd.cli_ctx, subscription_id)
553-
cluster_resource_id = '/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Kubernetes' \
554-
'/connectedClusters/{2}'.format(subscription_id, cluster_resource_group_name, cluster_name)
553+
cluster_resource_id = '/subscriptions/{0}/resourceGroups/{1}/providers/{2}/{3}/{4}'.format(
554+
subscription_id, cluster_resource_group_name, cluster_rp, cluster_type, cluster_name)
555555
try:
556556
resource = resources.get_by_id(cluster_resource_id, '2020-01-01-preview')
557557
cluster_region = resource.location.lower()

src/k8s-extension/azext_k8s_extension/partner_extensions/Dapr.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ def __init__(self):
1919
# constants for configuration settings.
2020
self.CLUSTER_TYPE = 'global.clusterType'
2121

22-
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, extension_type,
23-
scope, auto_upgrade_minor_version, release_train, version, target_namespace,
22+
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp,
23+
extension_type, scope, auto_upgrade_minor_version, release_train, version, target_namespace,
2424
release_namespace, configuration_settings, configuration_protected_settings,
2525
configuration_settings_file, configuration_protected_settings_file):
2626

src/k8s-extension/azext_k8s_extension/partner_extensions/DefaultExtension.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def Create(
2525
cluster_name,
2626
name,
2727
cluster_type,
28+
cluster_rp,
2829
extension_type,
2930
scope,
3031
auto_upgrade_minor_version,
@@ -87,7 +88,7 @@ def Update(
8788
)
8889

8990
def Delete(
90-
self, cmd, client, resource_group_name, cluster_name, name, cluster_type, yes
91+
self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp, yes
9192
):
9293
user_confirmation_factory(cmd, yes)
9394

src/k8s-extension/azext_k8s_extension/partner_extensions/OpenServiceMesh.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232

3333
class OpenServiceMesh(DefaultExtension):
3434

35-
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, extension_type,
36-
scope, auto_upgrade_minor_version, release_train, version, target_namespace,
35+
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, cluster_rp,
36+
extension_type, scope, auto_upgrade_minor_version, release_train, version, target_namespace,
3737
release_namespace, configuration_settings, configuration_protected_settings,
3838
configuration_settings_file, configuration_protected_settings_file):
3939
"""ExtensionType 'microsoft.openservicemesh' specific validations & defaults for Create

src/k8s-extension/azext_k8s_extension/partner_extensions/PartnerExtensionModel.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def Create(
1818
cluster_name: str,
1919
name: str,
2020
cluster_type: str,
21+
cluster_rp: str,
2122
extension_type: str,
2223
scope: str,
2324
auto_upgrade_minor_version: bool,
@@ -57,6 +58,7 @@ def Delete(
5758
cluster_name: str,
5859
name: str,
5960
cluster_type: str,
61+
cluster_rp: str,
6062
yes: bool,
6163
):
6264
pass

0 commit comments

Comments
 (0)