From ed90aa9a5174a2868fad97803d9b6002a21f9f5f Mon Sep 17 00:00:00 2001 From: GaneshaThirumurthi Date: Thu, 25 Jul 2019 17:20:27 -0700 Subject: [PATCH 1/3] update table formatters --- src/aks-preview/azext_aks_preview/_format.py | 96 +++++++++----------- src/aks-preview/setup.py | 2 +- src/index.json | 6 +- 3 files changed, 45 insertions(+), 59 deletions(-) diff --git a/src/aks-preview/azext_aks_preview/_format.py b/src/aks-preview/azext_aks_preview/_format.py index 2cd4978c77b..1d69f21dae8 100644 --- a/src/aks-preview/azext_aks_preview/_format.py +++ b/src/aks-preview/azext_aks_preview/_format.py @@ -4,6 +4,10 @@ # -------------------------------------------------------------------------------------------- from collections import OrderedDict +# pylint: disable=import-error +from jmespath import compile as compile_jmes, Options +# pylint: disable=import-error +from jmespath import functions def aks_agentpool_show_table_format(result): @@ -12,9 +16,6 @@ def aks_agentpool_show_table_format(result): def _aks_agentpool_table_format(result): - # pylint: disable=import-error - from jmespath import compile as compile_jmes, Options - parsed = compile_jmes("""{ name: name, osType: osType, @@ -45,9 +46,6 @@ def aks_show_table_format(result): def _aks_table_format(result): - # pylint: disable=import-error - from jmespath import compile as compile_jmes, Options - parsed = compile_jmes("""{ name: name, location: location, @@ -62,16 +60,16 @@ def _aks_table_format(result): def aks_upgrades_table_format(result): """Format get-upgrades results as a summary for display with "-o table".""" - # pylint: disable=import-error - from jmespath import compile as compile_jmes, Options - - preview = [] - for i, j in result.items(): - if i == "controlPlaneProfile": - # the reason why we choose "upgrades" obejct, since only it has the isPreview boolean. - for item in j["upgrades"]: - if item["isPreview"]: - preview.append(item["kubernetesVersion"]) + + preview = {} + + def find_preview_versions(versions_bag): + for upgrade in versions_bag.get('upgrades', []): + if upgrade.get('isPreview', False): + preview[upgrade['kubernetesVersion']] = True + find_preview_versions(result.get('controlPlaneProfile', {})) + find_preview_versions(result.get('agentPoolProfiles', [{}])[0]) + # This expression assumes there is one node pool, and that the master and nodes upgrade in lockstep. parsed = compile_jmes("""{ name: name, @@ -86,16 +84,15 @@ def aks_upgrades_table_format(result): def aks_versions_table_format(result): """Format get-versions results as a summary for display with "-o table".""" - # pylint: disable=import-error - from jmespath import compile as compile_jmes, Options # get preview orchestrator version - preview = [] - for key, value in result.items(): - if key == "orchestrators": - for i in value: - if i["isPreview"]: - preview.append(i["orchestratorVersion"]) + preview = {} + + def find_preview_versions(): + for orchestrator in result.get('orchestrators', []): + if orchestrator.get('isPreview', False): + preview[orchestrator['orchestratorVersion']] = True + find_preview_versions() parsed = compile_jmes("""orchestrators[].{ kubernetesVersion: orchestratorVersion | set_preview(@), @@ -106,54 +103,43 @@ def aks_versions_table_format(result): return sorted(results, key=lambda x: version_to_tuple(x.get('kubernetesVersion')), reverse=True) -def version_to_tuple(v): - """Quick-and-dirty sort function to handle simple semantic versions like 1.7.12 or 1.8.7.""" - if v.endswith('(preview)'): - return tuple(map(int, (v[:-9].split('.')))) - return tuple(map(int, (v.split('.')))) +def version_to_tuple(version): + """Removes preview suffix""" + if version.endswith('(preview)'): + version = version[:-len('(preview)')] + return tuple(map(int, (version.split('.')))) def _custom_functions(preview_versions): - # pylint: disable=import-error - from jmespath import functions - class CustomFunctions(functions.Functions): # pylint: disable=too-few-public-methods @functions.signature({'types': ['array']}) - def _func_sort_versions(self, s): # pylint: disable=no-self-use - """Custom JMESPath `sort_versions` function that sorts an array of strings as software versions.""" + def _func_sort_versions(self, versions): # pylint: disable=no-self-use + """Custom JMESPath `sort_versions` function that sorts an array of strings as software versions""" try: - return sorted(s, key=version_to_tuple) + return sorted(versions, key=version_to_tuple) except (TypeError, ValueError): # if it wasn't sortable, return the input so the pipeline continues - return s + return versions @functions.signature({'types': ['array']}) - def _func_set_preview_array(self, s): # pylint: disable=no-self-use + def _func_set_preview_array(self, versions): """Custom JMESPath `set_preview_array` function that suffixes preview version""" try: - res = [] - for version in s: - preview = False - for i in preview_versions: - if version == i: - res.append(version + "(preview)") - preview = True - break - if not preview: - res.append(version) - return res + for i, _ in enumerate(versions): + versions[i] = self._func_set_preview(versions[i]) + return versions except(TypeError, ValueError): - return s + return versions @functions.signature({'types': ['string']}) - def _func_set_preview(self, s): # pylint: disable=no-self-use + def _func_set_preview(self, version): # pylint: disable=no-self-use """Custom JMESPath `set_preview` function that suffixes preview version""" try: - for i in preview_versions: - if s == i: - return s + "(preview)" - return s + if preview_versions.get(version, False): + return version + '(preview)' + return version except(TypeError, ValueError): - return s + return version return CustomFunctions() + diff --git a/src/aks-preview/setup.py b/src/aks-preview/setup.py index da2ce3be2f4..0425357beba 100644 --- a/src/aks-preview/setup.py +++ b/src/aks-preview/setup.py @@ -8,7 +8,7 @@ from codecs import open as open1 from setuptools import setup, find_packages -VERSION = "0.4.5" +VERSION = "0.4.6" CLASSIFIERS = [ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', diff --git a/src/index.json b/src/index.json index e8b2ee61607..a0f19b93bcd 100644 --- a/src/index.json +++ b/src/index.json @@ -48,8 +48,8 @@ ], "aks-preview": [ { - "downloadUrl": "https://azurecliaks.blob.core.windows.net/azure-cli-extension/aks_preview-0.4.5-py2.py3-none-any.whl", - "filename": "aks_preview-0.4.5-py2.py3-none-any.whl", + "downloadUrl": "https://azurecliaks.blob.core.windows.net/azure-cli-extension/aks_preview-0.4.6-py2.py3-none-any.whl", + "filename": "aks_preview-0.4.6-py2.py3-none-any.whl", "metadata": { "azext.isPreview": true, "azext.minCliCoreVersion": "2.0.49", @@ -77,7 +77,7 @@ "summary": "Provides a preview for upcoming AKS features", "version": "0.4.5" }, - "sha256Digest": "10c50ce99780433e98e7ddb1f0d7cdfc5743b4487908363d17dc9de6808bcc83" + "sha256Digest": "f6b338b5b443b78263be233e89fb1a9125e8585a33ad5c75febd91d66e081a0e" } ], "alias": [ From f3445496f4134e32a1e112337e6daaa4259d4b82 Mon Sep 17 00:00:00 2001 From: GaneshaThirumurthi Date: Wed, 31 Jul 2019 08:45:23 -0700 Subject: [PATCH 2/3] fix linting error and add descriptive error message to multiple agent node pools --- src/aks-preview/azext_aks_preview/_format.py | 1 - src/aks-preview/azext_aks_preview/custom.py | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/aks-preview/azext_aks_preview/_format.py b/src/aks-preview/azext_aks_preview/_format.py index 1d69f21dae8..3039a5b2e03 100644 --- a/src/aks-preview/azext_aks_preview/_format.py +++ b/src/aks-preview/azext_aks_preview/_format.py @@ -142,4 +142,3 @@ def _func_set_preview(self, version): # pylint: disable=no-self-use return version return CustomFunctions() - diff --git a/src/aks-preview/azext_aks_preview/custom.py b/src/aks-preview/azext_aks_preview/custom.py index 0e2fd23530d..bd9bcb27a1c 100644 --- a/src/aks-preview/azext_aks_preview/custom.py +++ b/src/aks-preview/azext_aks_preview/custom.py @@ -816,6 +816,8 @@ def aks_get_credentials(cmd, client, resource_group_name, name, admin=False, def aks_scale(cmd, client, resource_group_name, name, node_count, nodepool_name="", no_wait=False): instance = client.get(resource_group_name, name) # TODO: change this approach when we support multiple agent pools. + if node_count == 0: + raise CLIError("Can't scale down to 0 nodes.") for agent_profile in instance.agent_pool_profiles: if agent_profile.name == nodepool_name or (nodepool_name == "" and len(instance.agent_pool_profiles) == 1): agent_profile.count = int(node_count) # pylint: disable=no-member @@ -1226,7 +1228,7 @@ def aks_agentpool_scale(cmd, client, resource_group_name, cluster_name, instance = client.get(resource_group_name, cluster_name, nodepool_name) new_node_count = int(node_count) if new_node_count == 0: - raise CLIError("Can't scale down to 0 node.") + raise CLIError("Can't scale down to 0 nodes.") if new_node_count == instance.count: raise CLIError("The new node count is the same as the current node count.") instance.count = new_node_count # pylint: disable=no-member From d145f414983f7504d3d221ac4028f425ac35df70 Mon Sep 17 00:00:00 2001 From: GaneshaThirumurthi Date: Wed, 31 Jul 2019 09:34:03 -0700 Subject: [PATCH 3/3] create new whl --- src/aks-preview/setup.py | 2 +- src/index.json | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/aks-preview/setup.py b/src/aks-preview/setup.py index 0425357beba..04b5f9781aa 100644 --- a/src/aks-preview/setup.py +++ b/src/aks-preview/setup.py @@ -8,7 +8,7 @@ from codecs import open as open1 from setuptools import setup, find_packages -VERSION = "0.4.6" +VERSION = "0.4.7" CLASSIFIERS = [ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', diff --git a/src/index.json b/src/index.json index 5530c324cf4..64ea87f77a0 100644 --- a/src/index.json +++ b/src/index.json @@ -91,6 +91,51 @@ "version": "0.4.6" }, "sha256Digest": "55f96dd5e723dc832c13816d7b58ff15ff73fb7af01046783f6619417fc8cbc7" + }, + { + "downloadUrl": "https://azurecliaks.blob.core.windows.net/azure-cli-extension/aks_preview-0.4.7-py2.py3-none-any.whl", + "filename": "aks_preview-0.4.7-py2.py3-none-any.whl", + "metadata": { + "azext.isPreview": true, + "azext.minCliCoreVersion": "2.0.49", + "classifiers": [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Intended Audience :: System Administrators", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "License :: OSI Approved :: MIT License" + ], + "extensions": { + "python.details": { + "contacts": [ + { + "email": "azpycli@microsoft.com", + "name": "Microsoft Corporation", + "role": "author" + } + ], + "document_names": { + "description": "DESCRIPTION.rst" + }, + "project_urls": { + "Home": "https://github.com/Azure/azure-cli-extensions/tree/master/src/aks-preview" + } + } + }, + "generator": "bdist_wheel (0.30.0)", + "license": "MIT", + "metadata_version": "2.0", + "name": "aks-preview", + "summary": "Provides a preview for upcoming AKS features", + "version": "0.4.7" + }, + "sha256Digest": "5da6e25dc204143da09c3a7b2713068dd6db431f53aed8ba3b4bdf04c60f94df" } ], "alias": [