From 92790f3e8b4e53db72b54b11100460c57584714f Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Tue, 3 Oct 2023 10:59:26 -0700 Subject: [PATCH 01/22] Fixes for Fleet identity options. --- src/fleet/HISTORY.rst | 4 ++++ src/fleet/azext_fleet/_params.py | 13 +++++++------ src/fleet/azext_fleet/custom.py | 14 ++++++++++++-- src/fleet/setup.py | 2 +- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/fleet/HISTORY.rst b/src/fleet/HISTORY.rst index d6234c27765..640c5006d55 100644 --- a/src/fleet/HISTORY.rst +++ b/src/fleet/HISTORY.rst @@ -45,3 +45,7 @@ Release History 0.2.7 ++++++ * Fix for `az fleet updaterun --node-image-selection` argument. + +0.2.8 +++++++ +* Updates to Fleet identity options. diff --git a/src/fleet/azext_fleet/_params.py b/src/fleet/azext_fleet/_params.py index fefaa06d61d..dcab08a14f2 100644 --- a/src/fleet/azext_fleet/_params.py +++ b/src/fleet/azext_fleet/_params.py @@ -9,7 +9,8 @@ tags_type, file_type, get_location_type, - get_enum_type + get_enum_type, + get_three_state_flag ) from azure.cli.core.commands.validators import get_default_location_from_resource_group from azext_fleet._validators import validate_member_cluster_id, validate_kubernetes_version, validate_apiserver_subnet_id, validate_agent_subnet_id, validate_assign_identity, validate_update_strategy_id @@ -24,17 +25,17 @@ def load_arguments(self, _): with self.argument_context('fleet create') as c: c.argument('tags', tags_type) c.argument('dns_name_prefix', options_list=['--dns-name-prefix', '-p']) - c.argument('enable_private_cluster', action='store_true', is_preview=True, help='Whether to create the Fleet hub as a private cluster or not.') - c.argument('enable_vnet_integration', action='store_true', is_preview=True, help='Whether to enable apiserver vnet integration for the Fleet hub or not.') + c.argument('enable_private_cluster', arg_type=get_three_state_flag(), is_preview=True, help='Whether to create the Fleet hub as a private cluster or not.') + c.argument('enable_vnet_integration', arg_type=get_three_state_flag(), is_preview=True, help='Whether to enable apiserver vnet integration for the Fleet hub or not.') c.argument('apiserver_subnet_id', validator=validate_apiserver_subnet_id, is_preview=True, help='The subnet to be used when apiserver vnet integration is enabled. It is required when creating a new Fleet with BYO vnet.') c.argument('agent_subnet_id', validator=validate_agent_subnet_id, is_preview=True, help='The ID of the subnet which the Fleet hub node will join on startup. If this is not specified, a vnet and subnet will be generated and used.') - c.argument('enable_managed_identity', action='store_true', is_preview=True, help='Enable system assigned managed identity (MSI) on the Fleet resource.') + c.argument('enable_managed_identity', arg_type=get_three_state_flag(), is_preview=True, help='Enable system assigned managed identity (MSI) on the Fleet resource.') c.argument('assign_identity', validator=validate_assign_identity, is_preview=True, help='With --enable-managed-identity, enable user assigned managed identity (MSI) on the Fleet resource. Specify the existing user assigned identity resource.') - c.argument('enable_hub', action='store_true', is_preview=True, help='If set, the Fleet will be created with a hub cluster.') + c.argument('enable_hub', arg_type=get_three_state_flag(), is_preview=True, help='If set, the Fleet will be created with a hub cluster.') with self.argument_context('fleet update') as c: c.argument('tags', tags_type) - c.argument('enable_managed_identity', action='store_true', is_preview=True, help='Enable system assigned managed identity (MSI) on the Fleet resource.') + c.argument('enable_managed_identity', arg_type=get_three_state_flag(), is_preview=True, help='Enable system assigned managed identity (MSI) on the Fleet resource.') c.argument('assign_identity', validator=validate_assign_identity, is_preview=True, help='With --enable-managed-identity, enable user assigned managed identity (MSI) on the Fleet resource. Specify the existing user assigned identity resource.') with self.argument_context('fleet get-credentials') as c: diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 8d2357c6e68..15d7304ee36 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -94,8 +94,13 @@ def create_fleet(cmd, if enable_managed_identity: managed_service_identity.type = "SystemAssigned" if assign_identity is not None: + empty_user_assigned_identity_model = cmd.get_models( + "UserAssignedIdentity", + resource_type=CUSTOM_MGMT_FLEET, + operation_group="fleets" + ) managed_service_identity.type = "UserAssigned" - managed_service_identity.user_assigned_identities = {assign_identity: None} + managed_service_identity.user_assigned_identities = {assign_identity: empty_user_assigned_identity_model} elif assign_identity is not None: raise CLIError("Cannot assign identity without enabling managed identity.") @@ -132,8 +137,13 @@ def update_fleet(cmd, if enable_managed_identity: managed_service_identity.type = "SystemAssigned" if assign_identity is not None: + empty_user_assigned_identity_model = cmd.get_models( + "UserAssignedIdentity", + resource_type=CUSTOM_MGMT_FLEET, + operation_group="fleets" + ) managed_service_identity.type = "UserAssigned" - managed_service_identity.user_assigned_identities = {assign_identity: None} + managed_service_identity.user_assigned_identities = {assign_identity: empty_user_assigned_identity_model} fleet_patch = fleet_patch_model( tags=tags, diff --git a/src/fleet/setup.py b/src/fleet/setup.py index 2362e9d70cd..aac176e24d9 100644 --- a/src/fleet/setup.py +++ b/src/fleet/setup.py @@ -16,7 +16,7 @@ # TODO: Confirm this is the right version number you want and it matches your # HISTORY.rst entry. -VERSION = '0.2.7' +VERSION = '0.2.8' # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers From ebd84d58de28f869f2e888207b0e105cb69e5d2a Mon Sep 17 00:00:00 2001 From: pdaru Date: Tue, 3 Oct 2023 18:28:29 +0000 Subject: [PATCH 02/22] fix user assigned model --- src/fleet/azext_fleet/custom.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 15d7304ee36..1df134501c0 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -94,13 +94,13 @@ def create_fleet(cmd, if enable_managed_identity: managed_service_identity.type = "SystemAssigned" if assign_identity is not None: - empty_user_assigned_identity_model = cmd.get_models( + user_assigned_identity_model = cmd.get_models( "UserAssignedIdentity", resource_type=CUSTOM_MGMT_FLEET, operation_group="fleets" ) managed_service_identity.type = "UserAssigned" - managed_service_identity.user_assigned_identities = {assign_identity: empty_user_assigned_identity_model} + managed_service_identity.user_assigned_identities = {assign_identity: user_assigned_identity_model()} elif assign_identity is not None: raise CLIError("Cannot assign identity without enabling managed identity.") @@ -137,13 +137,13 @@ def update_fleet(cmd, if enable_managed_identity: managed_service_identity.type = "SystemAssigned" if assign_identity is not None: - empty_user_assigned_identity_model = cmd.get_models( + user_assigned_identity_model = cmd.get_models( "UserAssignedIdentity", resource_type=CUSTOM_MGMT_FLEET, operation_group="fleets" ) managed_service_identity.type = "UserAssigned" - managed_service_identity.user_assigned_identities = {assign_identity: empty_user_assigned_identity_model} + managed_service_identity.user_assigned_identities = {assign_identity: user_assigned_identity_model()} fleet_patch = fleet_patch_model( tags=tags, From 981abe7598f8e98a3c67a397415eec021b5eea15 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Tue, 3 Oct 2023 12:04:15 -0700 Subject: [PATCH 03/22] reverted fleet create arg_type --- src/fleet/azext_fleet/_params.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fleet/azext_fleet/_params.py b/src/fleet/azext_fleet/_params.py index dcab08a14f2..a5dcba63f04 100644 --- a/src/fleet/azext_fleet/_params.py +++ b/src/fleet/azext_fleet/_params.py @@ -25,13 +25,13 @@ def load_arguments(self, _): with self.argument_context('fleet create') as c: c.argument('tags', tags_type) c.argument('dns_name_prefix', options_list=['--dns-name-prefix', '-p']) - c.argument('enable_private_cluster', arg_type=get_three_state_flag(), is_preview=True, help='Whether to create the Fleet hub as a private cluster or not.') - c.argument('enable_vnet_integration', arg_type=get_three_state_flag(), is_preview=True, help='Whether to enable apiserver vnet integration for the Fleet hub or not.') + c.argument('enable_private_cluster', action='store_true', is_preview=True, help='Whether to create the Fleet hub as a private cluster or not.') + c.argument('enable_vnet_integration', action='store_true', is_preview=True, help='Whether to enable apiserver vnet integration for the Fleet hub or not.') c.argument('apiserver_subnet_id', validator=validate_apiserver_subnet_id, is_preview=True, help='The subnet to be used when apiserver vnet integration is enabled. It is required when creating a new Fleet with BYO vnet.') c.argument('agent_subnet_id', validator=validate_agent_subnet_id, is_preview=True, help='The ID of the subnet which the Fleet hub node will join on startup. If this is not specified, a vnet and subnet will be generated and used.') - c.argument('enable_managed_identity', arg_type=get_three_state_flag(), is_preview=True, help='Enable system assigned managed identity (MSI) on the Fleet resource.') + c.argument('enable_managed_identity', action='store_true', is_preview=True, help='Enable system assigned managed identity (MSI) on the Fleet resource.') c.argument('assign_identity', validator=validate_assign_identity, is_preview=True, help='With --enable-managed-identity, enable user assigned managed identity (MSI) on the Fleet resource. Specify the existing user assigned identity resource.') - c.argument('enable_hub', arg_type=get_three_state_flag(), is_preview=True, help='If set, the Fleet will be created with a hub cluster.') + c.argument('enable_hub', action='store_true', is_preview=True, help='If set, the Fleet will be created with a hub cluster.') with self.argument_context('fleet update') as c: c.argument('tags', tags_type) From b693f6680033b37d18d8db2576c79851f0a83ee9 Mon Sep 17 00:00:00 2001 From: pdaru Date: Tue, 3 Oct 2023 19:10:00 +0000 Subject: [PATCH 04/22] fix patch for msi --- src/fleet/azext_fleet/custom.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 1df134501c0..9f3cdfdea8c 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -118,7 +118,7 @@ def update_fleet(cmd, client, resource_group_name, name, - enable_managed_identity=False, + enable_managed_identity=None, assign_identity=None, tags=None, no_wait=False): @@ -132,10 +132,13 @@ def update_fleet(cmd, resource_type=CUSTOM_MGMT_FLEET, operation_group="fleets" ) - - managed_service_identity = fleet_managed_service_identity_model(type="None") - if enable_managed_identity: - managed_service_identity.type = "SystemAssigned" + + if enable_managed_identity is None: + managed_service_identity = None + elif enable_managed_identity == False: + managed_service_identity = fleet_managed_service_identity_model(type="None") + else: + managed_service_identity = fleet_managed_service_identity_model(type="SystemAssigned") if assign_identity is not None: user_assigned_identity_model = cmd.get_models( "UserAssignedIdentity", @@ -150,7 +153,6 @@ def update_fleet(cmd, identity=managed_service_identity ) - fleet_patch = fleet_patch_model(tags=tags) return sdk_no_wait(no_wait, client.begin_update, resource_group_name, name, fleet_patch) From 6f7558a28e77abf702dcf2b53746403af43f78c9 Mon Sep 17 00:00:00 2001 From: pdaru Date: Tue, 3 Oct 2023 19:14:51 +0000 Subject: [PATCH 05/22] nit clean up --- src/fleet/azext_fleet/custom.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 9f3cdfdea8c..54389b4abe1 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -133,9 +133,8 @@ def update_fleet(cmd, operation_group="fleets" ) - if enable_managed_identity is None: - managed_service_identity = None - elif enable_managed_identity == False: + managed_service_identity = None + if enable_managed_identity == False: managed_service_identity = fleet_managed_service_identity_model(type="None") else: managed_service_identity = fleet_managed_service_identity_model(type="SystemAssigned") From 49b6ce325fd929c0b5b2b69c8e6d3abed9bc8884 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Tue, 3 Oct 2023 14:12:10 -0700 Subject: [PATCH 06/22] lint fixes --- src/fleet/azext_fleet/custom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 54389b4abe1..47f9b30ad32 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -132,9 +132,9 @@ def update_fleet(cmd, resource_type=CUSTOM_MGMT_FLEET, operation_group="fleets" ) - + managed_service_identity = None - if enable_managed_identity == False: + if enable_managed_identity is False: managed_service_identity = fleet_managed_service_identity_model(type="None") else: managed_service_identity = fleet_managed_service_identity_model(type="SystemAssigned") From 3b65d65eec4bbd2d6ad7a7e108f4e922a6b27501 Mon Sep 17 00:00:00 2001 From: pdaru Date: Tue, 3 Oct 2023 23:21:14 +0000 Subject: [PATCH 07/22] fix msi patch --- src/fleet/HISTORY.rst | 4 ++++ src/fleet/azext_fleet/custom.py | 5 +++-- src/fleet/setup.py | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/fleet/HISTORY.rst b/src/fleet/HISTORY.rst index 640c5006d55..6f128864136 100644 --- a/src/fleet/HISTORY.rst +++ b/src/fleet/HISTORY.rst @@ -49,3 +49,7 @@ Release History 0.2.8 ++++++ * Updates to Fleet identity options. + +0.2.9 +++++++ +* Bug fixes on Fleet MSI \ No newline at end of file diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 47f9b30ad32..22288b3dbbb 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -133,8 +133,9 @@ def update_fleet(cmd, operation_group="fleets" ) - managed_service_identity = None - if enable_managed_identity is False: + if managed_service_identity is None: + managed_service_identity = None + elif enable_managed_identity is False: managed_service_identity = fleet_managed_service_identity_model(type="None") else: managed_service_identity = fleet_managed_service_identity_model(type="SystemAssigned") diff --git a/src/fleet/setup.py b/src/fleet/setup.py index aac176e24d9..8202d23f7e8 100644 --- a/src/fleet/setup.py +++ b/src/fleet/setup.py @@ -16,7 +16,7 @@ # TODO: Confirm this is the right version number you want and it matches your # HISTORY.rst entry. -VERSION = '0.2.8' +VERSION = '0.2.9' # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers From cc2f1b1d5e8c435ff3ff60d43d5d00d6c362eac0 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Tue, 10 Oct 2023 11:12:29 -0700 Subject: [PATCH 08/22] Fix - Fleet Update --enable_managed_identity is none. --- src/fleet/azext_fleet/custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 22288b3dbbb..6d2c5e30527 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -133,7 +133,7 @@ def update_fleet(cmd, operation_group="fleets" ) - if managed_service_identity is None: + if enable_managed_identity is None: managed_service_identity = None elif enable_managed_identity is False: managed_service_identity = fleet_managed_service_identity_model(type="None") From b53eb9603929ca7c29e3f6530fa887edc2598a7f Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Wed, 11 Oct 2023 11:37:52 -0700 Subject: [PATCH 09/22] tags help text and examples --- src/fleet/azext_fleet/_help.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/fleet/azext_fleet/_help.py b/src/fleet/azext_fleet/_help.py index 395143f39b6..b4331dc584d 100644 --- a/src/fleet/azext_fleet/_help.py +++ b/src/fleet/azext_fleet/_help.py @@ -16,22 +16,29 @@ type: command short-summary: Creates or updates a Fleet. parameters: - - name: --tags - type: string - short-summary: The tags of the managed cluster. The managed cluster instance and all resources managed by the cloud provider will be tagged. - name: --dns-name-prefix -p type: string short-summary: Prefix for hostnames that are created. If not specified, generate a hostname using the managed cluster and resource group names. + examples: + - name: Create a hubless fleet + text: az fleet create -g MyResourceGroup -l MyLocation -n MyFleetName --tags "TagKey=TagValue" + - name: Create a hubful fleet + text: az fleet create -g MyResourceGroup -l MyLocation -n MyFleetName --enable-hub --tags "TagKey=TagValue" + """ helps['fleet update'] = """ type: command short-summary: Patches a fleet resource. parameters: - - name: --tags - type: string - short-summary: The tags of the managed cluster. The managed cluster instance and all resources managed by the cloud provider will be tagged. + examples: + - name: Update a Fleet's tags + text: az fleet update -g MyResourceGroup -n MyFleetName --tags Key=Value + - name: Update a Fleet to use a system assigned managed service identity. + text: az fleet update -g MyResourceGroup -n MyFleetName --enable-managed-identity --tags Key=Value + - name: Update a Fleet to use a user assigned managed service identity. + text: az fleet update -g MyResourceGroup -n MyFleetName --enable-managed-identity --assign-identity "/subscription/00000000-0000-0000-0000-000000000000/resourcegroup/MyResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/MyIdentity" --tags Key=Value """ helps['fleet show'] = """ From 3c5727cc4526ac5125dddf3355d77e57bd325d9f Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Wed, 11 Oct 2023 13:53:22 -0700 Subject: [PATCH 10/22] Deletes request confirmation. --- src/fleet/azext_fleet/commands.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fleet/azext_fleet/commands.py b/src/fleet/azext_fleet/commands.py index 913a6b6ca1b..7cf88b33222 100644 --- a/src/fleet/azext_fleet/commands.py +++ b/src/fleet/azext_fleet/commands.py @@ -40,7 +40,7 @@ def load_command_table(self, _): g.custom_command("update", "update_fleet", supports_no_wait=True) g.custom_show_command("show", "show_fleet") g.custom_command("list", "list_fleet") - g.custom_command("delete", "delete_fleet", supports_no_wait=True) + g.custom_command("delete", "delete_fleet", supports_no_wait=True, confirmation=True) g.custom_command("get-credentials", "get_credentials") g.wait_command("wait") @@ -48,7 +48,7 @@ def load_command_table(self, _): with self.command_group("fleet member", fleet_members_sdk, client_factory=cf_fleet_members) as g: g.custom_command("create", "create_fleet_member", supports_no_wait=True) g.custom_command("update", "update_fleet_member") - g.custom_command("delete", "delete_fleet_member", supports_no_wait=True) + g.custom_command("delete", "delete_fleet_member", supports_no_wait=True, confirmation=True) g.custom_command("list", "list_fleet_member") g.custom_show_command("show", "show_fleet_member") g.wait_command("wait") @@ -58,7 +58,7 @@ def load_command_table(self, _): g.custom_command("create", "create_update_run", supports_no_wait=True) g.custom_show_command("show", "show_update_run") g.custom_command("list", "list_update_run") - g.custom_command("delete", "delete_update_run", supports_no_wait=True) + g.custom_command("delete", "delete_update_run", supports_no_wait=True, confirmation=True) g.custom_command("start", "start_update_run", supports_no_wait=True) g.custom_command("stop", "stop_update_run", supports_no_wait=True) g.wait_command("wait") @@ -68,5 +68,5 @@ def load_command_table(self, _): g.custom_command("create", "create_fleet_update_strategy", supports_no_wait=True) g.custom_show_command("show", "show_fleet_update_strategy") g.custom_command("list", "list_fleet_update_strategies") - g.custom_command("delete", "delete_fleet_update_strategy", supports_no_wait=True) + g.custom_command("delete", "delete_fleet_update_strategy", supports_no_wait=True, confirmation=True) g.wait_command("wait") From ba9457e61f8d008d75c7e3b46926ef3a21a7e489 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Wed, 11 Oct 2023 14:46:10 -0700 Subject: [PATCH 11/22] K8s version validator update. --- src/fleet/azext_fleet/_validators.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/fleet/azext_fleet/_validators.py b/src/fleet/azext_fleet/_validators.py index be12a5ed41e..ef54c563ff3 100644 --- a/src/fleet/azext_fleet/_validators.py +++ b/src/fleet/azext_fleet/_validators.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -import semver +import re from azure.cli.core.azclierror import InvalidArgumentValueError from azure.cli.core.util import CLIError @@ -18,12 +18,12 @@ def validate_member_cluster_id(namespace): def validate_kubernetes_version(namespace): - try: - if namespace.kubernetes_version: - semver.VersionInfo.parse(namespace.kubernetes_version) - except ValueError: - raise InvalidArgumentValueError( - "--kubernetes-version must be set as version x.x.x (eg. 1.2.3)") + if namespace.kubernetes_version: + k8s_release_regex = re.compile(r'^[v|V]?(\d+\.\d+(?:\.\d+)?)$') + found = k8s_release_regex.findall(namespace.kubernetes_version) + if not found: + raise InvalidArgumentValueError( + '--kubernetes-version should be the full version number or alias minor version, such as "1.7.12" or "1.7"') def validate_apiserver_subnet_id(namespace): From 27503556c73468dcedfe388ddc1e851dc95c6561 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Wed, 11 Oct 2023 16:48:36 -0700 Subject: [PATCH 12/22] update_strategy_name WIP & default node_image_selection, & reduced poller time for fleet.create. --- src/fleet/azext_fleet/_params.py | 2 +- src/fleet/azext_fleet/custom.py | 26 +++++++++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/fleet/azext_fleet/_params.py b/src/fleet/azext_fleet/_params.py index a5dcba63f04..df7fe092253 100644 --- a/src/fleet/azext_fleet/_params.py +++ b/src/fleet/azext_fleet/_params.py @@ -62,7 +62,7 @@ def load_arguments(self, _): c.argument('kubernetes_version', validator=validate_kubernetes_version) c.argument('node_image_selection', arg_type=get_enum_type(['Latest', 'Consistent']), help='Node Image Selection is an option that lets you choose how your clusters\' nodes are upgraded') c.argument('stages', type=file_type, completer=FilesCompleter(), help='Path to a json file that defines stages to upgrade a fleet. See examples for further reference.') - c.argument('update_strategy_id', validator=validate_update_strategy_id, help='The ID of the update strategy to use for this update run. If not specified, the default update strategy will be used.') + c.argument('update_strategy_name', help='The name of the update strategy to use for this update run. If not specified, the default update strategy will be used.') with self.argument_context('fleet updatestrategy') as c: c.argument('name', options_list=['--name', '-n'], help='Specify name for the fleet update strategy.') diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 6d2c5e30527..9b1741f25ac 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -38,7 +38,9 @@ def create_fleet(cmd, operation_group="fleets" ) + poll_interval = 5 if enable_hub: + poll_interval = 30 fleet_hub_profile_model = cmd.get_models( "FleetHubProfile", resource_type=CUSTOM_MGMT_FLEET, @@ -110,8 +112,8 @@ def create_fleet(cmd, hub_profile=fleet_hub_profile, identity=managed_service_identity ) - - return sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, name, fleet) + + return sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, name, fleet, polling_interval = poll_interval) def update_fleet(cmd, @@ -176,7 +178,7 @@ def delete_fleet(cmd, # pylint: disable=unused-argument resource_group_name, name, no_wait=False): - return sdk_no_wait(no_wait, client.begin_delete, resource_group_name, name) + return sdk_no_wait(no_wait, client.begin_delete, resource_group_name, name, polling_interval=5) def get_credentials(cmd, # pylint: disable=unused-argument @@ -263,17 +265,17 @@ def create_update_run(cmd, fleet_name, name, upgrade_type, - node_image_selection, + node_image_selection=None, kubernetes_version=None, stages=None, - update_strategy_id=None, + update_strategy_name=None, no_wait=False): if upgrade_type == "Full" and kubernetes_version is None: raise CLIError("Please set kubernetes version when upgrade type is 'Full'.") if upgrade_type == "NodeImageOnly" and kubernetes_version is not None: raise CLIError("Cannot set kubernetes version when upgrade type is 'NodeImageOnly'.") - if stages is not None and update_strategy_id is not None: - raise CLIError("Cannot set stages when update strategy id is set.") + if stages is not None and update_strategy_name is not None: + raise CLIError("Cannot set stages when update strategy name is set.") update_run_strategy = get_update_run_strategy(cmd, "update_runs", stages) @@ -300,17 +302,23 @@ def create_update_run(cmd, managed_cluster_upgrade_spec = managed_cluster_upgrade_spec_model( type=upgrade_type, kubernetes_version=kubernetes_version) + if node_image_selection == None: + node_image_selection = "Latest" node_image_selection_type = node_image_selection_model(type=node_image_selection) managed_cluster_update = managed_cluster_update_model( upgrade=managed_cluster_upgrade_spec, node_image_selection=node_image_selection_type) + + subId=get_subscription_id(cmd.cli_ctx) + updateStrategyId = f"/subscriptions/{subId}/resourceGroups/{resource_group_name}1/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{name}" update_run = update_run_model( - update_strategy_id=update_strategy_id, + update_strategy_id=updateStrategyId, strategy=update_run_strategy, managed_cluster_update=managed_cluster_update) - + + print("After successfully creating the run, you need to use the following command to start the run: az fleet updaterun start --resource-group={resource_group_name} --fleet={fleet_name} --name={name}") return sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, fleet_name, name, update_run) From 4d8f4bb44f862c9f841b537026ffdd26775a2be5 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Wed, 11 Oct 2023 22:41:02 -0700 Subject: [PATCH 13/22] update-strategy-id changed to update-strategy-name --- src/fleet/azext_fleet/_params.py | 4 ++-- src/fleet/azext_fleet/_validators.py | 9 ++++----- src/fleet/azext_fleet/custom.py | 5 +++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/fleet/azext_fleet/_params.py b/src/fleet/azext_fleet/_params.py index df7fe092253..bc38fcb855a 100644 --- a/src/fleet/azext_fleet/_params.py +++ b/src/fleet/azext_fleet/_params.py @@ -13,7 +13,7 @@ get_three_state_flag ) from azure.cli.core.commands.validators import get_default_location_from_resource_group -from azext_fleet._validators import validate_member_cluster_id, validate_kubernetes_version, validate_apiserver_subnet_id, validate_agent_subnet_id, validate_assign_identity, validate_update_strategy_id +from azext_fleet._validators import validate_member_cluster_id, validate_kubernetes_version, validate_apiserver_subnet_id, validate_agent_subnet_id, validate_assign_identity, validate_update_strategy_name def load_arguments(self, _): @@ -62,7 +62,7 @@ def load_arguments(self, _): c.argument('kubernetes_version', validator=validate_kubernetes_version) c.argument('node_image_selection', arg_type=get_enum_type(['Latest', 'Consistent']), help='Node Image Selection is an option that lets you choose how your clusters\' nodes are upgraded') c.argument('stages', type=file_type, completer=FilesCompleter(), help='Path to a json file that defines stages to upgrade a fleet. See examples for further reference.') - c.argument('update_strategy_name', help='The name of the update strategy to use for this update run. If not specified, the default update strategy will be used.') + c.argument('update_strategy_name', validator=validate_update_strategy_name, help='The name of the update strategy to use for this update run. If not specified, the default update strategy will be used.') with self.argument_context('fleet updatestrategy') as c: c.argument('name', options_list=['--name', '-n'], help='Specify name for the fleet update strategy.') diff --git a/src/fleet/azext_fleet/_validators.py b/src/fleet/azext_fleet/_validators.py index ef54c563ff3..fd859a1f5a8 100644 --- a/src/fleet/azext_fleet/_validators.py +++ b/src/fleet/azext_fleet/_validators.py @@ -34,12 +34,11 @@ def validate_agent_subnet_id(namespace): _validate_subnet_id(namespace.agent_subnet_id, "--agent-subnet-id") -def validate_update_strategy_id(namespace): - if namespace.update_strategy_id is not None: - from msrestazure.tools import is_valid_resource_id - if not is_valid_resource_id(namespace.update_strategy_id): +def validate_update_strategy_name(namespace): + print(namespace.update_strategy_name) + if namespace.update_strategy_name is not None and not namespace.update_strategy_name.strip(): raise CLIError( - "--update-strategy-id is not a valid Azure resource ID.") + "--update-strategy-name is not a valid name") def _validate_subnet_id(subnet_id, name): diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 9b1741f25ac..02a55630efe 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -310,8 +310,9 @@ def create_update_run(cmd, upgrade=managed_cluster_upgrade_spec, node_image_selection=node_image_selection_type) - subId=get_subscription_id(cmd.cli_ctx) - updateStrategyId = f"/subscriptions/{subId}/resourceGroups/{resource_group_name}1/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{name}" + if update_strategy_name is not None: + subId=get_subscription_id(cmd.cli_ctx) + updateStrategyId = f"/subscriptions/{subId}/resourceGroups/{resource_group_name}/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{update_strategy_name}" update_run = update_run_model( update_strategy_id=updateStrategyId, From 518dd485ca124b265feb624ce1f529b0b96d69b9 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Thu, 12 Oct 2023 13:50:05 -0700 Subject: [PATCH 14/22] Validation & update_strategy_id fix --- src/fleet/azext_fleet/custom.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 02a55630efe..3bf8012b2ff 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -137,6 +137,8 @@ def update_fleet(cmd, if enable_managed_identity is None: managed_service_identity = None + if assign_identity is not None: + raise CLIError("Cannot assign identity without enabling managed identity.") elif enable_managed_identity is False: managed_service_identity = fleet_managed_service_identity_model(type="None") else: @@ -155,7 +157,7 @@ def update_fleet(cmd, identity=managed_service_identity ) - return sdk_no_wait(no_wait, client.begin_update, resource_group_name, name, fleet_patch) + return sdk_no_wait(no_wait, client.begin_update, resource_group_name, name, fleet_patch, polling_interval=5) def show_fleet(cmd, # pylint: disable=unused-argument @@ -310,6 +312,7 @@ def create_update_run(cmd, upgrade=managed_cluster_upgrade_spec, node_image_selection=node_image_selection_type) + updateStrategyId = None if update_strategy_name is not None: subId=get_subscription_id(cmd.cli_ctx) updateStrategyId = f"/subscriptions/{subId}/resourceGroups/{resource_group_name}/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{update_strategy_name}" From 99b1b73c661161bf930cfc711217c918254569af Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Fri, 13 Oct 2023 15:10:34 -0700 Subject: [PATCH 15/22] style / lint fixes --- src/fleet/azext_fleet/_validators.py | 4 +--- src/fleet/azext_fleet/custom.py | 33 +++++++++++++++++++--------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/fleet/azext_fleet/_validators.py b/src/fleet/azext_fleet/_validators.py index fd859a1f5a8..acb758531ee 100644 --- a/src/fleet/azext_fleet/_validators.py +++ b/src/fleet/azext_fleet/_validators.py @@ -35,10 +35,8 @@ def validate_agent_subnet_id(namespace): def validate_update_strategy_name(namespace): - print(namespace.update_strategy_name) if namespace.update_strategy_name is not None and not namespace.update_strategy_name.strip(): - raise CLIError( - "--update-strategy-name is not a valid name") + raise CLIError("--update-strategy-name is not a valid name") def _validate_subnet_id(subnet_id, name): diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 3bf8012b2ff..1291dfd0277 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -15,7 +15,7 @@ from azext_fleet._client_factory import CUSTOM_MGMT_FLEET from azext_fleet._helpers import print_or_merge_credentials - +# pylint: disable=too-many-locals def create_fleet(cmd, client, resource_group_name, @@ -112,8 +112,13 @@ def create_fleet(cmd, hub_profile=fleet_hub_profile, identity=managed_service_identity ) - - return sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, name, fleet, polling_interval = poll_interval) + + return sdk_no_wait(no_wait, + client.begin_create_or_update, + resource_group_name, + name, + fleet, + polling_interval = poll_interval) def update_fleet(cmd, @@ -294,7 +299,7 @@ def create_update_run(cmd, node_image_selection_model = cmd.get_models( "NodeImageSelection", resource_type=CUSTOM_MGMT_FLEET, - operation_group="update_runs" + operation_group="update_runs" ) update_run_model = cmd.get_models( "UpdateRun", @@ -304,26 +309,34 @@ def create_update_run(cmd, managed_cluster_upgrade_spec = managed_cluster_upgrade_spec_model( type=upgrade_type, kubernetes_version=kubernetes_version) - if node_image_selection == None: + if node_image_selection is None: node_image_selection = "Latest" node_image_selection_type = node_image_selection_model(type=node_image_selection) managed_cluster_update = managed_cluster_update_model( upgrade=managed_cluster_upgrade_spec, node_image_selection=node_image_selection_type) - + updateStrategyId = None if update_strategy_name is not None: subId=get_subscription_id(cmd.cli_ctx) - updateStrategyId = f"/subscriptions/{subId}/resourceGroups/{resource_group_name}/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{update_strategy_name}" + updateStrategyId = f"/subscriptions/{subId}/resourceGroups/{resource_group_name}" \ + "/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{update_strategy_name}" update_run = update_run_model( update_strategy_id=updateStrategyId, strategy=update_run_strategy, managed_cluster_update=managed_cluster_update) - - print("After successfully creating the run, you need to use the following command to start the run: az fleet updaterun start --resource-group={resource_group_name} --fleet={fleet_name} --name={name}") - return sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, fleet_name, name, update_run) + + result = None + try: + result = sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, fleet_name, name, update_run) + print("After successfully creating the run, you need to use the following command to start the run:" \ + "az fleet updaterun start --resource-group={resource_group_name} --fleet={fleet_name} --name={name}") + except Exception as e: + return e + + return result def show_update_run(cmd, # pylint: disable=unused-argument From 3c4a2cbadd8ee6f8576d800927600088d135fdf6 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Fri, 13 Oct 2023 15:26:29 -0700 Subject: [PATCH 16/22] Removed empty collection. --- src/fleet/azext_fleet/_help.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/fleet/azext_fleet/_help.py b/src/fleet/azext_fleet/_help.py index b4331dc584d..8e9ec948b6a 100644 --- a/src/fleet/azext_fleet/_help.py +++ b/src/fleet/azext_fleet/_help.py @@ -31,7 +31,6 @@ helps['fleet update'] = """ type: command short-summary: Patches a fleet resource. - parameters: examples: - name: Update a Fleet's tags text: az fleet update -g MyResourceGroup -n MyFleetName --tags Key=Value From 63960e5b1acd25210ecc0bc5a59d70f9ad133668 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Fri, 13 Oct 2023 15:27:42 -0700 Subject: [PATCH 17/22] removed whitespace --- src/fleet/azext_fleet/custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index 1291dfd0277..c3f830a9d1e 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -299,7 +299,7 @@ def create_update_run(cmd, node_image_selection_model = cmd.get_models( "NodeImageSelection", resource_type=CUSTOM_MGMT_FLEET, - operation_group="update_runs" + operation_group="update_runs" ) update_run_model = cmd.get_models( "UpdateRun", From 41d7687e03535f4b777303df2039de12cea09c1f Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Fri, 13 Oct 2023 15:56:48 -0700 Subject: [PATCH 18/22] test fixes --- .../latest/test_fleet_hubful_scenario.py | 4 ++-- .../latest/test_fleet_hubless_scenario.py | 12 +++++----- .../tests/latest/test_validators.py | 24 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/fleet/azext_fleet/tests/latest/test_fleet_hubful_scenario.py b/src/fleet/azext_fleet/tests/latest/test_fleet_hubful_scenario.py index 49697a97046..6029811a9df 100644 --- a/src/fleet/azext_fleet/tests/latest/test_fleet_hubful_scenario.py +++ b/src/fleet/azext_fleet/tests/latest/test_fleet_hubful_scenario.py @@ -76,6 +76,6 @@ def test_fleet_hubful(self): self.cmd('fleet member wait -g {rg} --fleet-name {fleet_name} --fleet-member-name {member_name} --created', checks=[self.is_empty()]) - self.cmd('fleet member delete -g {rg} --fleet-name {fleet_name} -n {member_name}') + self.cmd('fleet member delete -g {rg} --fleet-name {fleet_name} -n {member_name} --yes') - self.cmd('fleet delete -g {rg} -n {fleet_name}') + self.cmd('fleet delete -g {rg} -n {fleet_name} --yes') diff --git a/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py b/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py index 0f85e0efe99..32e5e4e5f8f 100644 --- a/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py +++ b/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py @@ -109,7 +109,7 @@ def test_fleet_hubless(self): self.cmd('fleet updaterun delete -g {rg} -n {updaterun} -f {fleet_name}') - update_strategy_id = self.cmd('fleet updatestrategy create -g {rg} -n {updateStrategy_name} -f {fleet_name} --stages {stages_file}', checks=[ + update_strategy_name = self.cmd('fleet updatestrategy create -g {rg} -n {updateStrategy_name} -f {fleet_name} --stages {stages_file}', checks=[ self.check('name', '{updateStrategy_name}') ]).get_output_in_json()['id'] @@ -122,10 +122,10 @@ def test_fleet_hubless(self): ]) self.kwargs.update({ - 'update_strategy_id': update_strategy_id, + 'update_strategy_name': update_strategy_name, }) - self.cmd('fleet updaterun create -g {rg} -n {updaterun} -f {fleet_name} --upgrade-type Full --node-image-selection Latest --kubernetes-version 1.27.1 --update-strategy-id {update_strategy_id}', checks=[ + self.cmd('fleet updaterun create -g {rg} -n {updaterun} -f {fleet_name} --upgrade-type Full --node-image-selection Latest --kubernetes-version 1.27.1 --update-strategy-name {update_strategy_name}', checks=[ self.check('name', '{updaterun}') ]) @@ -141,10 +141,10 @@ def test_fleet_hubless(self): self.check('length([])', 1) ]) - self.cmd('fleet updaterun delete -g {rg} -n {updaterun} -f {fleet_name}') + self.cmd('fleet updaterun delete -g {rg} -n {updaterun} -f {fleet_name} --yes') self.cmd('fleet updatestrategy delete -g {rg} -f {fleet_name} -n {updateStrategy_name}') - self.cmd('fleet member delete -g {rg} --fleet-name {fleet_name} -n {member_name}') + self.cmd('fleet member delete -g {rg} --fleet-name {fleet_name} -n {member_name} --yes') - self.cmd('fleet delete -g {rg} -n {fleet_name}') + self.cmd('fleet delete -g {rg} -n {fleet_name} --yes') diff --git a/src/fleet/azext_fleet/tests/latest/test_validators.py b/src/fleet/azext_fleet/tests/latest/test_validators.py index d5f362c8f8c..0532441400d 100644 --- a/src/fleet/azext_fleet/tests/latest/test_validators.py +++ b/src/fleet/azext_fleet/tests/latest/test_validators.py @@ -39,8 +39,8 @@ def __init__(self, node_image_selection): class UpdateStrategyNamespace: - def __init__(self, update_strategy_id): - self.update_strategy_id = update_strategy_id + def __init__(self, update_strategy_name): + self.update_strategy_name = update_strategy_name class TestValidateMemberClusterId(unittest.TestCase): def test_invalid_member_cluster_id(self): @@ -144,21 +144,21 @@ def test_empty_identity_id(self): self.assertIsNone(validators.validate_assign_identity(namespace)) -class TestValidateUpdateStrategyId(unittest.TestCase): - def test_invalid_update_strategy_id(self): - invalid_update_strategy_id = "dummy cluster id" - namespace = UpdateStrategyNamespace(update_strategy_id=invalid_update_strategy_id) - err = ("--update-strategy-id is not a valid Azure resource ID.") +class TestValidateUpdateStrategyName(unittest.TestCase): + def test_invalid_update_strategy_name(self): + invalid_update_strategy_name = "" + namespace = UpdateStrategyNamespace(update_strategy_name=invalid_update_strategy_name) + err = ("--update-strategy-name is not a valid name") with self.assertRaises(CLIError) as cm: - validators.validate_update_strategy_id(namespace) + validators.validate_update_strategy_name(namespace) self.assertEqual(str(cm.exception), err) - def test_valid_update_strategy_id(self): - valid_update_strategy_id = "/subscriptions/123/resourceGroups/abc/providers/Microsoft.ContainerService/fleets/fleet-1/updateStrategies/strategy-1" - namespace = UpdateStrategyNamespace(update_strategy_id=valid_update_strategy_id) + def test_valid_update_strategy_name(self): + valid_update_strategy_name = "strategyname" + namespace = UpdateStrategyNamespace(update_strategy_name=valid_update_strategy_name) - self.assertIsNone(validators.validate_update_strategy_id(namespace)) + self.assertIsNone(validators.validate_update_strategy_name(namespace)) if __name__ == "__main__": unittest.main() \ No newline at end of file From 9dc9f1572dc783845f379652e7cde4a73f6efe14 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Fri, 13 Oct 2023 16:16:32 -0700 Subject: [PATCH 19/22] --yes on delete --- .../azext_fleet/tests/latest/test_fleet_hubless_scenario.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py b/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py index 32e5e4e5f8f..c089e307361 100644 --- a/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py +++ b/src/fleet/azext_fleet/tests/latest/test_fleet_hubless_scenario.py @@ -107,7 +107,7 @@ def test_fleet_hubless(self): self.check('name', '{updaterun}') ]) - self.cmd('fleet updaterun delete -g {rg} -n {updaterun} -f {fleet_name}') + self.cmd('fleet updaterun delete -g {rg} -n {updaterun} -f {fleet_name} --yes') update_strategy_name = self.cmd('fleet updatestrategy create -g {rg} -n {updateStrategy_name} -f {fleet_name} --stages {stages_file}', checks=[ self.check('name', '{updateStrategy_name}') @@ -143,7 +143,7 @@ def test_fleet_hubless(self): self.cmd('fleet updaterun delete -g {rg} -n {updaterun} -f {fleet_name} --yes') - self.cmd('fleet updatestrategy delete -g {rg} -f {fleet_name} -n {updateStrategy_name}') + self.cmd('fleet updatestrategy delete -g {rg} -f {fleet_name} -n {updateStrategy_name} --yes') self.cmd('fleet member delete -g {rg} --fleet-name {fleet_name} -n {member_name} --yes') From 50253c5a2d552601b14fa983f0ee9da36340a7b1 Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Fri, 13 Oct 2023 16:43:32 -0700 Subject: [PATCH 20/22] style fixes --- src/fleet/azext_fleet/_validators.py | 2 +- src/fleet/azext_fleet/custom.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/fleet/azext_fleet/_validators.py b/src/fleet/azext_fleet/_validators.py index acb758531ee..efeb5533198 100644 --- a/src/fleet/azext_fleet/_validators.py +++ b/src/fleet/azext_fleet/_validators.py @@ -23,7 +23,7 @@ def validate_kubernetes_version(namespace): found = k8s_release_regex.findall(namespace.kubernetes_version) if not found: raise InvalidArgumentValueError( - '--kubernetes-version should be the full version number or alias minor version, such as "1.7.12" or "1.7"') + '--kubernetes-version should be the full version number or alias minor version, such as "1.7.12" or "1.7"') def validate_apiserver_subnet_id(namespace): diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index c3f830a9d1e..c12606e1e97 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -15,6 +15,7 @@ from azext_fleet._client_factory import CUSTOM_MGMT_FLEET from azext_fleet._helpers import print_or_merge_credentials + # pylint: disable=too-many-locals def create_fleet(cmd, client, @@ -118,7 +119,7 @@ def create_fleet(cmd, resource_group_name, name, fleet, - polling_interval = poll_interval) + polling_interval=poll_interval) def update_fleet(cmd, @@ -319,9 +320,11 @@ def create_update_run(cmd, updateStrategyId = None if update_strategy_name is not None: - subId=get_subscription_id(cmd.cli_ctx) - updateStrategyId = f"/subscriptions/{subId}/resourceGroups/{resource_group_name}" \ - "/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{update_strategy_name}" + subId = get_subscription_id(cmd.cli_ctx) + updateStrategyId = ( + f"/subscriptions/{subId}/resourceGroups/{resource_group_name}" + f"/providers/Microsoft.ContainerService/fleets/{fleet_name}/updateStrategies/{update_strategy_name}" + ) update_run = update_run_model( update_strategy_id=updateStrategyId, @@ -331,8 +334,10 @@ def create_update_run(cmd, result = None try: result = sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, fleet_name, name, update_run) - print("After successfully creating the run, you need to use the following command to start the run:" \ - "az fleet updaterun start --resource-group={resource_group_name} --fleet={fleet_name} --name={name}") + print( + "After successfully creating the run, you need to use the following command to start the run:" + f"az fleet updaterun start --resource-group={resource_group_name} --fleet={fleet_name} --name={name}" + ) except Exception as e: return e From 4e30eae683ecd6d879caa555a33d1bb65e9806db Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Fri, 13 Oct 2023 23:17:33 -0700 Subject: [PATCH 21/22] lint fix --- src/fleet/azext_fleet/custom.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index c12606e1e97..487b53ec1a2 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -334,10 +334,8 @@ def create_update_run(cmd, result = None try: result = sdk_no_wait(no_wait, client.begin_create_or_update, resource_group_name, fleet_name, name, update_run) - print( - "After successfully creating the run, you need to use the following command to start the run:" - f"az fleet updaterun start --resource-group={resource_group_name} --fleet={fleet_name} --name={name}" - ) + print("After successfully creating the run, you need to use the following command to start the run:" + f"az fleet updaterun start --resource-group={resource_group_name} --fleet={fleet_name} --name={name}") except Exception as e: return e From d9e62cd8602336522950d8488ded6d483b76505d Mon Sep 17 00:00:00 2001 From: Sean Hobbs Date: Mon, 16 Oct 2023 16:21:40 -0700 Subject: [PATCH 22/22] Updated version. --- src/fleet/HISTORY.rst | 6 ++++-- src/fleet/setup.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/fleet/HISTORY.rst b/src/fleet/HISTORY.rst index 6f128864136..1df26217588 100644 --- a/src/fleet/HISTORY.rst +++ b/src/fleet/HISTORY.rst @@ -50,6 +50,8 @@ Release History ++++++ * Updates to Fleet identity options. -0.2.9 +0.3.0 ++++++ -* Bug fixes on Fleet MSI \ No newline at end of file +* Resolved issues related to system & user assigned MSI. +* UpdateRun now takes a Strategy name in lieu of resource Id, e.g., `az fleet updaterun create --update_strategy_name UpdateStrategyName` +* Deletes now require confirmation. \ No newline at end of file diff --git a/src/fleet/setup.py b/src/fleet/setup.py index 8202d23f7e8..b4f83e679cd 100644 --- a/src/fleet/setup.py +++ b/src/fleet/setup.py @@ -16,7 +16,7 @@ # TODO: Confirm this is the right version number you want and it matches your # HISTORY.rst entry. -VERSION = '0.2.9' +VERSION = '0.3.0' # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers