diff --git a/azure-cli.pyproj b/azure-cli.pyproj index 7ce8f6242b1..dd2ba7a6d4a 100644 --- a/azure-cli.pyproj +++ b/azure-cli.pyproj @@ -211,13 +211,6 @@ - - - - - - - @@ -720,11 +713,6 @@ - - - - - @@ -899,7 +887,6 @@ - diff --git a/azure-cli2017.pyproj b/azure-cli2017.pyproj index 65288e30a3c..346d6e30791 100644 --- a/azure-cli2017.pyproj +++ b/azure-cli2017.pyproj @@ -172,12 +172,6 @@ - - - - - - @@ -497,11 +491,6 @@ - - - - - diff --git a/doc/sphinx/azhelpgen/doc_source_map.json b/doc/sphinx/azhelpgen/doc_source_map.json index faad5c9f0c1..ef47f527b54 100644 --- a/doc/sphinx/azhelpgen/doc_source_map.json +++ b/doc/sphinx/azhelpgen/doc_source_map.json @@ -12,7 +12,6 @@ "batch": "src/command_modules/azure-cli-batch/azure/cli/command_modules/batch/_help.py", "cloud": "src/command_modules/azure-cli-cloud/azure/cli/command_modules/cloud/_help.py", "component": "src/command_modules/azure-cli-component/azure/cli/command_modules/component/_help.py", - "container": "src/command_modules/azure-cli-container/azure/cli/command_modules/container/_help.py", "feature": "src/command_modules/azure-cli-resource/azure/cli/command_modules/resource/_help.py", "group": "src/command_modules/azure-cli-resource/azure/cli/command_modules/resource/_help.py", "iot": "src/command_modules/azure-cli-iot/azure/cli/command_modules/iot/_help.py", @@ -21,7 +20,7 @@ "policy": "src/command_modules/azure-cli-resource/azure/cli/command_modules/resource/_help.py", "provider": "src/command_modules/azure-cli-resource/azure/cli/command_modules/resource/_help.py", "redis": "src/command_modules/azure-cli-redis/azure/cli/command_modules/redis/_help.py", - "resource": "src/command_modules/azure-cli-resource/azure/cli/command_modules/resource/_help.py", + "resource": "src/command_modules/azure-cli-resource/azure/cli/command_modules/resource/_help.py", "role": "src/command_modules/azure-cli-role/azure/cli/command_modules/role/_help.py", "sql": "src/command_modules/azure-cli-sql/azure/cli/command_modules/sql/help.py", "storage": "src/command_modules/azure-cli-storage/azure/cli/command_modules/storage/_help.py", diff --git a/packaged_releases/pip_requirements/0.2.1_python27.txt b/packaged_releases/pip_requirements/0.2.1_python27.txt index 3236c4df0b2..4d3099dbab2 100644 --- a/packaged_releases/pip_requirements/0.2.1_python27.txt +++ b/packaged_releases/pip_requirements/0.2.1_python27.txt @@ -9,7 +9,6 @@ azure-cli-batch==0.1.1b4 azure-cli-cloud==0.1.2rc2 azure-cli-component==0.1.1rc2 azure-cli-configure==0.1.2rc2 -azure-cli-container==0.1.1b3 azure-cli-core==0.1.2rc2 azure-cli-documentdb==0.1.1b2 azure-cli-feedback==0.1.2rc1 diff --git a/packaged_releases/pip_requirements/0.2.1_python35.txt b/packaged_releases/pip_requirements/0.2.1_python35.txt index efcacf165e7..d3ae50a7fcc 100644 --- a/packaged_releases/pip_requirements/0.2.1_python35.txt +++ b/packaged_releases/pip_requirements/0.2.1_python35.txt @@ -9,7 +9,6 @@ azure-cli-batch==0.1.1b4 azure-cli-cloud==0.1.2rc2 azure-cli-component==0.1.1rc2 azure-cli-configure==0.1.2rc2 -azure-cli-container==0.1.1b3 azure-cli-core==0.1.2rc2 azure-cli-documentdb==0.1.1b2 azure-cli-feedback==0.1.2rc1 diff --git a/packaged_releases/pip_requirements/0.2.2_python27.txt b/packaged_releases/pip_requirements/0.2.2_python27.txt index 900366d6cd0..66c75c36b2c 100644 --- a/packaged_releases/pip_requirements/0.2.2_python27.txt +++ b/packaged_releases/pip_requirements/0.2.2_python27.txt @@ -9,7 +9,6 @@ azure-cli-batch==0.1.1b4 azure-cli-cloud==2.0.0 azure-cli-component==2.0.0 azure-cli-configure==2.0.0 -azure-cli-container==0.1.1b4 azure-cli-core==2.0.0 azure-cli-documentdb==0.1.1b2 azure-cli-feedback==2.0.0 diff --git a/packaged_releases/pip_requirements/0.2.2_python35.txt b/packaged_releases/pip_requirements/0.2.2_python35.txt index 8690b486648..8ff7104f3d9 100644 --- a/packaged_releases/pip_requirements/0.2.2_python35.txt +++ b/packaged_releases/pip_requirements/0.2.2_python35.txt @@ -9,7 +9,6 @@ azure-cli-batch==0.1.1b4 azure-cli-cloud==2.0.0 azure-cli-component==2.0.0 azure-cli-configure==2.0.0 -azure-cli-container==0.1.1b4 azure-cli-core==2.0.0 azure-cli-documentdb==0.1.1b2 azure-cli-feedback==2.0.0 diff --git a/packaged_releases/pip_requirements/0.2.3_python27.txt b/packaged_releases/pip_requirements/0.2.3_python27.txt index a20e73922be..178aa42e730 100644 --- a/packaged_releases/pip_requirements/0.2.3_python27.txt +++ b/packaged_releases/pip_requirements/0.2.3_python27.txt @@ -10,7 +10,6 @@ azure-cli-batch==0.1.1b5 azure-cli-cloud==2.0.0 azure-cli-component==2.0.0 azure-cli-configure==2.0.1 -azure-cli-container==0.1.1b4 azure-cli-core==2.0.1 azure-cli-documentdb==0.1.1b2 azure-cli-feedback==2.0.0 diff --git a/packaged_releases/pip_requirements/0.2.3_python35.txt b/packaged_releases/pip_requirements/0.2.3_python35.txt index 15648b33f44..c3139b6434c 100644 --- a/packaged_releases/pip_requirements/0.2.3_python35.txt +++ b/packaged_releases/pip_requirements/0.2.3_python35.txt @@ -10,7 +10,6 @@ azure-cli-batch==0.1.1b5 azure-cli-cloud==2.0.0 azure-cli-component==2.0.0 azure-cli-configure==2.0.1 -azure-cli-container==0.1.1b4 azure-cli-core==2.0.1 azure-cli-documentdb==0.1.1b2 azure-cli-feedback==2.0.0 diff --git a/packaged_releases/pip_requirements/0.2.4_python27.txt b/packaged_releases/pip_requirements/0.2.4_python27.txt index a5eca4c1cf6..108c8ef3113 100644 --- a/packaged_releases/pip_requirements/0.2.4_python27.txt +++ b/packaged_releases/pip_requirements/0.2.4_python27.txt @@ -11,7 +11,6 @@ azure-cli-batch==2.0.0 azure-cli-cloud==2.0.0 azure-cli-component==2.0.0 azure-cli-configure==2.0.2 -azure-cli-container==0.1.2 azure-cli-core==2.0.2 azure-cli-documentdb==0.1.2 azure-cli-feedback==2.0.0 diff --git a/packaged_releases/pip_requirements/0.2.4_python35.txt b/packaged_releases/pip_requirements/0.2.4_python35.txt index 8eac7d3b440..199dc9cf605 100644 --- a/packaged_releases/pip_requirements/0.2.4_python35.txt +++ b/packaged_releases/pip_requirements/0.2.4_python35.txt @@ -11,7 +11,6 @@ azure-cli-batch==2.0.0 azure-cli-cloud==2.0.0 azure-cli-component==2.0.0 azure-cli-configure==2.0.2 -azure-cli-container==0.1.2 azure-cli-core==2.0.2 azure-cli-documentdb==0.1.2 azure-cli-feedback==2.0.0 diff --git a/packaged_releases/pip_requirements/0.2.5_python27.txt b/packaged_releases/pip_requirements/0.2.5_python27.txt index 3bc56baa17b..4a10fa97198 100644 --- a/packaged_releases/pip_requirements/0.2.5_python27.txt +++ b/packaged_releases/pip_requirements/0.2.5_python27.txt @@ -11,7 +11,6 @@ azure-cli-batch==2.0.1 azure-cli-cloud==2.0.1 azure-cli-component==2.0.1 azure-cli-configure==2.0.3 -azure-cli-container==0.1.3 azure-cli-core==2.0.3 azure-cli-documentdb==0.1.3 azure-cli-feedback==2.0.1 diff --git a/packaged_releases/pip_requirements/0.2.5_python35.txt b/packaged_releases/pip_requirements/0.2.5_python35.txt index 11bc86baff1..7eee5186698 100644 --- a/packaged_releases/pip_requirements/0.2.5_python35.txt +++ b/packaged_releases/pip_requirements/0.2.5_python35.txt @@ -11,7 +11,6 @@ azure-cli-batch==2.0.1 azure-cli-cloud==2.0.1 azure-cli-component==2.0.1 azure-cli-configure==2.0.3 -azure-cli-container==0.1.3 azure-cli-core==2.0.3 azure-cli-documentdb==0.1.3 azure-cli-feedback==2.0.1 diff --git a/packaged_releases/pip_requirements/0.2.6_python27.txt b/packaged_releases/pip_requirements/0.2.6_python27.txt index 2c5202390cd..018caf95434 100644 --- a/packaged_releases/pip_requirements/0.2.6_python27.txt +++ b/packaged_releases/pip_requirements/0.2.6_python27.txt @@ -12,7 +12,6 @@ azure-cli-cloud==2.0.2 azure-cli-command-modules-nspkg==2.0.0 azure-cli-component==2.0.2 azure-cli-configure==2.0.4 -azure-cli-container==0.1.4 azure-cli-core==2.0.4 azure-cli-documentdb==0.1.4 azure-cli-feedback==2.0.2 diff --git a/packaged_releases/pip_requirements/0.2.6_python35.txt b/packaged_releases/pip_requirements/0.2.6_python35.txt index c63a9b49f72..b667a6e459c 100644 --- a/packaged_releases/pip_requirements/0.2.6_python35.txt +++ b/packaged_releases/pip_requirements/0.2.6_python35.txt @@ -12,7 +12,6 @@ azure-cli-cloud==2.0.2 azure-cli-command-modules-nspkg==2.0.0 azure-cli-component==2.0.2 azure-cli-configure==2.0.4 -azure-cli-container==0.1.4 azure-cli-core==2.0.4 azure-cli-documentdb==0.1.4 azure-cli-feedback==2.0.2 diff --git a/src/azure-cli-core/azure/cli/core/commands/__init__.py b/src/azure-cli-core/azure/cli/core/commands/__init__.py index da63c2faa4e..0d2c5497872 100644 --- a/src/azure-cli-core/azure/cli/core/commands/__init__.py +++ b/src/azure-cli-core/azure/cli/core/commands/__init__.py @@ -35,7 +35,7 @@ CONFIRM_PARAM_NAME = 'yes' -BLACKLISTED_MODS = ['context'] +BLACKLISTED_MODS = ['context', 'container'] class VersionConstraint(object): diff --git a/src/command_modules/azure-cli-container/HISTORY.rst b/src/command_modules/azure-cli-container/HISTORY.rst deleted file mode 100644 index e9bfd8f9075..00000000000 --- a/src/command_modules/azure-cli-container/HISTORY.rst +++ /dev/null @@ -1,49 +0,0 @@ -.. :changelog: - -Release History -=============== - -0.1.4 (2017-04-28) -++++++++++++++++++ - -* New packaging system. - -0.1.3 (2017-04-17) -++++++++++++++++++ - -* Apply core changes required for JSON string parsing from shell (#2705) - -0.1.2 (2017-04-03) -++++++++++++++++++ - -* Checks for local dockerfile when remote url is provided (#2572) -* Add note about being in preview (#2512) - -0.1.1b4 (2017-02-27) -+++++++++++++++++++++ - -* Validate Azure Container Registry name/resource ID before running container release create - - -0.1.1b3 (2017-02-22) -+++++++++++++++++++++ - -* Documentation updates. - - -0.1.1b2 (2017-01-30) -+++++++++++++++++++++ - -* Support Python 3.6. -* Update base url for the service to 'https://api.mindaro.microsoft.io'. - -0.1.1b1 (2017-01-17) -+++++++++++++++++++++ - -* Get the token for service principal when service principal is being use. -* Better exception handling message for missing command "git remote get-url" in git versions less than 2.7.0 - -0.1.0b11 (2016-12-12) -+++++++++++++++++++++ - -* Preview release. diff --git a/src/command_modules/azure-cli-container/MANIFEST.in b/src/command_modules/azure-cli-container/MANIFEST.in deleted file mode 100644 index bb37a2723da..00000000000 --- a/src/command_modules/azure-cli-container/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include *.rst diff --git a/src/command_modules/azure-cli-container/README.rst b/src/command_modules/azure-cli-container/README.rst deleted file mode 100644 index e48f84cb8cc..00000000000 --- a/src/command_modules/azure-cli-container/README.rst +++ /dev/null @@ -1,5 +0,0 @@ -Microsoft Azure CLI 'Container' Command Module -============================================== - -This package is for the 'container' module. -i.e. 'az container' diff --git a/src/command_modules/azure-cli-container/azure/__init__.py b/src/command_modules/azure-cli-container/azure/__init__.py deleted file mode 100644 index a9dfa5391b9..00000000000 --- a/src/command_modules/azure-cli-container/azure/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -import pkg_resources -pkg_resources.declare_namespace(__name__) diff --git a/src/command_modules/azure-cli-container/azure/cli/__init__.py b/src/command_modules/azure-cli-container/azure/cli/__init__.py deleted file mode 100644 index a9dfa5391b9..00000000000 --- a/src/command_modules/azure-cli-container/azure/cli/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -import pkg_resources -pkg_resources.declare_namespace(__name__) diff --git a/src/command_modules/azure-cli-container/azure/cli/command_modules/__init__.py b/src/command_modules/azure-cli-container/azure/cli/command_modules/__init__.py deleted file mode 100644 index a9dfa5391b9..00000000000 --- a/src/command_modules/azure-cli-container/azure/cli/command_modules/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -import pkg_resources -pkg_resources.declare_namespace(__name__) diff --git a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/__init__.py b/src/command_modules/azure-cli-container/azure/cli/command_modules/container/__init__.py deleted file mode 100644 index 6c32ef2d038..00000000000 --- a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -import azure.cli.command_modules.container._help # pylint: disable=unused-import - - -def load_params(_): - import azure.cli.command_modules.container._params # pylint: disable=redefined-outer-name - - -def load_commands(): - import azure.cli.command_modules.container.commands # pylint: disable=redefined-outer-name diff --git a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/_help.py b/src/command_modules/azure-cli-container/azure/cli/command_modules/container/_help.py deleted file mode 100644 index 9a491c70ce1..00000000000 --- a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/_help.py +++ /dev/null @@ -1,24 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -from azure.cli.core.help_files import helps - -helps['container'] = """ - type: group - short-summary: "Set up automated builds and deployments for multi-container Docker applications." - long-summary: These commands are in preview. -""" - -helps['container release'] = """ - type: group - short-summary: "Set up automated builds and deployments for a multi-container Docker application." - long-summary: These commands are in preview. -""" - -helps['container build'] = """ - type: group - short-summary: "Set up automated builds for a multi-container Docker application." - long-summary: These commands are in preview. -""" diff --git a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/_params.py b/src/command_modules/azure-cli-container/azure/cli/command_modules/container/_params.py deleted file mode 100644 index 864325f9bcf..00000000000 --- a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/_params.py +++ /dev/null @@ -1,63 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -from azure.cli.core.commands import CliArgumentType, register_cli_argument - -# pylint: disable=line-too-long - -target_name = CliArgumentType( - options_list=('--target-name',), - help='Name of the Azure Container Service cluster to deploy containers to.' -) - -target_resource_group = CliArgumentType( - options_list=('--target-resource-group',), - help='Name of the Azure Container Service cluster\'s resource group.' -) - -registry_name = CliArgumentType( - options_list=('--registry-name', '-r'), - help='Azure Container Registry name to which container images will be pushed after each build, and pulled from to deploy container instances. If you have an existing registry at myregistry-{accountname}.azureacr.io, then set this parameter value to myregistry. A new Azure Container Registry is created if this parameter value is omitted or does not exist.' -) - -registry_resource_id = CliArgumentType( - options_list=('--registry-resource-id',), - help='Azure container registry resource id. Specifies an existing Azure container registry. e.g. /subscriptions/{subscriptionId}/resourcegroups/{resourceGroup}/providers/Microsoft.ContainerRegistry/registries/{registryName}' -) - -remote_url = CliArgumentType( - options_list=('--remote-url', '-u'), - help='Remote url of the GitHub or VSTS source repository that will be built and deployed. Example: https://github.com/myaccount/myrepository.git. If omitted, a source repository will be searched for in the current working directory.' -) - -remote_branch = CliArgumentType( - options_list=('--remote-branch', '-b'), - help='Remote branch of the GitHub or VSTS source repository that will be built and deployed. If omitted refs/heads/master will be selected' -) - -remote_access_token = CliArgumentType( - options_list=('--remote-access-token', '-t'), - help='GitHub personal access token (minimum permission is "repo"). Required if the source repository is in GitHub.' -) - -vsts_account_name = CliArgumentType( - options_list=('--vsts-account-name',), - help='VSTS account name to create the build and release definitions. If you have an existing VSTS account at myvstsaccount.visualstudio.com, then set this parameter value to myvstsaccount. A new VSTS account is created if parameter value is omitted or does not exist.' -) - -vsts_project_name = CliArgumentType( - options_list=('--vsts-project-name',), - help='VSTS project name to create the build and release definitions. A new VSTS project is created if omitted or does not exist.' -) - -register_cli_argument('container', 'target_name', target_name) -register_cli_argument('container', 'target_resource_group', target_resource_group) -register_cli_argument('container', 'registry_name', registry_name) -register_cli_argument('container', 'registry_resource_id', registry_resource_id) -register_cli_argument('container', 'remote_url', remote_url) -register_cli_argument('container', 'remote_branch', remote_branch) -register_cli_argument('container', 'remote_access_token', remote_access_token) -register_cli_argument('container', 'vsts_account_name', vsts_account_name) -register_cli_argument('container', 'vsts_project_name', vsts_project_name) diff --git a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/commands.py b/src/command_modules/azure-cli-container/azure/cli/command_modules/container/commands.py deleted file mode 100644 index 06c4ceb53c5..00000000000 --- a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/commands.py +++ /dev/null @@ -1,12 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -from azure.cli.core.commands import cli_command - -cli_command(__name__, 'container release create', - 'azure.cli.command_modules.container.custom#add_release') -cli_command(__name__, 'container release list', - 'azure.cli.command_modules.container.custom#list_releases') -cli_command(__name__, 'container build create', 'azure.cli.command_modules.container.custom#add_ci') diff --git a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/custom.py b/src/command_modules/azure-cli-container/azure/cli/command_modules/container/custom.py deleted file mode 100644 index 9aee99b858c..00000000000 --- a/src/command_modules/azure-cli-container/azure/cli/command_modules/container/custom.py +++ /dev/null @@ -1,436 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -import json -import os -import re -import time -import uuid -from subprocess import CalledProcessError, check_output - -import requests -import yaml -import azure.cli.core.azlogging as azlogging -from azure.cli.core._config import az_config -from azure.cli.core._profile import _SERVICE_PRINCIPAL, CredsCache, Profile -# pylint: disable=too-few-public-methods,too-many-arguments,no-self-use,too-many-locals,line-too-long -from azure.cli.core.util import CLIError - -logger = azlogging.get_az_logger(__name__) - -BASE_URL = az_config.get('container', 'service_url', fallback='https://api.mindaro.microsoft.io') -SUBSCRIPTION_URL = "/subscriptions/{subscription_id}" -RESOURCE_BASE_URL = SUBSCRIPTION_URL + "/resourceGroups/{resource_group_name}" -CONTAINER_SERVICE_PROVIDER = "/providers/Microsoft.ContainerService" -CONTAINER_SERVICE_RESOURCE_URL = RESOURCE_BASE_URL + \ - CONTAINER_SERVICE_PROVIDER + \ - "/containerServices/{container_service_name}" - -SERVICE_URL = BASE_URL + SUBSCRIPTION_URL -API_VERSION = "2016-11-01-preview" -SERVICE_RESOURCE_ID = "https://mindaro.microsoft.io/" - -DOCKERFILE_FILE = 'Dockerfile' -DOCKER_COMPOSE_FILE = 'docker-compose.yml' -DOCKER_COMPOSE_EXPECTED_VERSION = '2' - - -def add_release( - target_name, - target_resource_group, - remote_url=None, - remote_branch=None, - remote_access_token=None, - vsts_account_name=None, - vsts_project_name=None, - registry_resource_id=None, - registry_name=None): - """ - Creates a build definition that automates building and pushing Docker images to an Azure container registry, and creates a release definition that automates deploying container images from a container registry to an Azure container service. Source repository must define a docker-compose.yml file. - - :param target_name: Name of the target Azure container service instance to deploy containers to. - :type target_name: String - :param target_resource_group: Name of Azure container service's resource group. - :type target_resource_group: String - :param remote_url: Remote url of the GitHub or VSTS source repository that will be built and deployed. If omitted, a source repository will be searched for in the current working directory. - :type remote_url: String - :param remote_branch: Remote branch of the GitHub or VSTS source repository that will be built and deployed. If omitted refs/heads/master will be selected. - :type remote_branch: String - :param remote_access_token: GitHub personal access token (minimum permission is 'repo'). Required if the source repository is in GitHub. - :type remote_access_token: String - :param vsts_account_name: VSTS account name to create the build and release definitions. A new VSTS account is created if omitted or does not exist. - :type vsts_account_name: String - :param vsts_project_name: VSTS project name to create the build and release definitions. A new VSTS project is created if omitted or does not exist. - :type vsts_project_name: String - :param registry_resource_id: Azure container registry resource id. - :type registry_resource_id: String - :param registry_name: Azure container registry name. A new Azure container registry is created if omitted or does not exist. - :type registry_name: String - """ - # Ensure docker-compose file is correct if no remote url provided. - if not remote_url: - _ensure_docker_compose() - - _check_registry_information(registry_name, registry_resource_id) - - # Call the RP - return _call_rp_configure_cicd( - target_name, - target_resource_group, - vsts_account_name, - vsts_project_name, - registry_name, - registry_resource_id, - _get_valid_remote_url(remote_url, remote_access_token), - remote_branch, - remote_access_token) - - -def _get_valid_remote_url(remote_url=None, remote_access_token=None): - """ - Calls the git repo parser to check for non VSTS repository and - returns remote url for repository. - """ - remote_url = remote_url or _get_remote_url() - repo_type = _get_repo_type(remote_url) - - if not repo_type: - raise CLIError("Invalid repository. Only Github and VSTS repositories supported.") - - if repo_type != 'vsts' and not remote_access_token: - raise CLIError("--remote-access-token is required for non VSTS repositories") - - return remote_url - - -def _get_repo_type(remote_url): - """ - Returns repo type by parsing the remote_url for github.com and visualstudio.com - """ - lower_case_url = remote_url.lower() - if 'github.com' in lower_case_url: - return 'github' - elif 'visualstudio.com' in lower_case_url: - return 'vsts' - - return None - - -def _call_rp_configure_cicd( - target_name, - target_resource_group, - vsts_account_name, - vsts_project_name, - registry_name, - registry_resource_id, - remote_url, - remote_branch, - remote_access_token, - create_release=True): - """ - Calls the RP to build and deploy the service(s) in the cluster. - - :param target_name: Name of the target Azure container service instance to deploy containers to. - :type target_name: String - :param target_resource_group: Name of Azure container service's resource group. - :type target_resource_group: String - :param remote_url: Remote url of the GitHub or VSTS source repository that will be built and deployed. If omitted, a source repository will be searched for in the current working directory. - :type remote_url: String - :param remote_branch: Remote branch of the GitHub or VSTS source repository that will be built and deployed. If omitted refs/heads/master will be selected. - :type remote_branch: String - :param remote_access_token: GitHub personal access token (minimum permission is 'repo'). Required if the source repository is in GitHub. - :type remote_access_token: String - :param vsts_account_name: VSTS account name to create the build and release definitions. A new VSTS account is created if omitted or does not exist. - :type vsts_account_name: String - :param vsts_project_name: VSTS project name to create the build and release definitions. A new VSTS project is created if omitted or does not exist. - :type vsts_project_name: String - :param registry_resource_id: Azure container registry resource id. - :type registry_resource_id: String - :param registry_name: Azure container registry name. A new Azure container registry is created if omitted or does not exist. - :type registry_name: String - :param create_release: Whether to create a release definition and deploy the application. - :type create_release: bool - """ - profile = Profile() - _, subscription_id, _ = profile.get_login_credentials() - - o_auth_token = _get_service_token() - container_service_resource_id = CONTAINER_SERVICE_RESOURCE_URL.format( - subscription_id=subscription_id, resource_group_name=target_resource_group, - container_service_name=target_name) - data = { - 'acsResourceId': container_service_resource_id, - 'vstsAccountName': vsts_account_name, - 'vstsProjectName': vsts_project_name, - 'registryName': registry_name, - 'registryResourceId': registry_resource_id, - 'remoteToken': remote_access_token, - 'remoteUrl': remote_url, - 'remoteBranch': remote_branch, - 'createRelease': create_release - } - - configure_ci_cd_url = SERVICE_URL.format( - subscription_id=subscription_id) + '/configureCI?api-version=' + API_VERSION - - headers = {} - headers['Authorization'] = o_auth_token - headers['Content-Type'] = 'application/json; charset=utf-8' - headers['x-ms-client-request-id'] = str(uuid.uuid1()) - req = requests.post(configure_ci_cd_url, data=json.dumps(data), headers=headers, timeout=600) - while req.status_code == 202: # Long-running operation - time.sleep(10) - req = requests.get(BASE_URL + req.headers['Location'], headers=headers, timeout=600) - if req.status_code != 200: - raise CLIError( - 'Server returned status code: ' + str( - req.status_code) + '. Could not configure CI/CD: ' + req.text) - json_request = req.json() - return json_request - - -def list_releases(target_name, target_resource_group): - """ - Lists all the release definitions that are deployed to a given Azure container service. - - :param target_name: Name of the target Azure container service instance. - :type target_name: String - :param target_resource_group: Name of Azure container service's resource group. - :type target_resource_group: String - """ - profile = Profile() - _, subscription_id, _ = profile.get_login_credentials() - - o_auth_token = _get_service_token() - container_service_resource_id = CONTAINER_SERVICE_RESOURCE_URL.format( - subscription_id=subscription_id, resource_group_name=target_resource_group, - container_service_name=target_name) - data = { - 'acsResourceId': container_service_resource_id - } - - list_releases_url = SERVICE_URL.format( - subscription_id=subscription_id) + '/listReleases?api-version=' + API_VERSION - - headers = {} - headers['Authorization'] = o_auth_token - headers['Content-Type'] = 'application/json; charset=utf-8' - headers['x-ms-client-request-id'] = str(uuid.uuid1()) - req = requests.post(list_releases_url, data=json.dumps(data), headers=headers, timeout=600) - while req.status_code == 202: # Long-running operation - time.sleep(10) - req = requests.get(BASE_URL + req.headers['Location'], headers=headers, timeout=600) - if req.status_code != 200: - raise CLIError( - 'Server returned status code: ' + str( - req.status_code) + '. Could not list releases: ' + req.text) - json_request = req.json() - return json_request - - -def _is_inside_git_directory(): - """ - Determines if the user is inside the .git folder of a git repo - """ - try: - is_inside_git_dir = check_output(['git', 'rev-parse', '--is-inside-git-dir']) - except OSError: - raise CLIError('Git is not currently installed.') - except CalledProcessError: - raise CLIError('Current working directory is not a git repository') - - git_result = is_inside_git_dir.decode('utf-8').strip() - - if git_result == 'false': - return False - elif git_result == 'true': - return True - else: - raise CLIError('Unexpected value from git operation.') - - -def _gitroot(): - """ - Gets the absolute path of the repository root - """ - if _is_inside_git_directory(): # special case need to navigate to parent - os.chdir('..') - try: - base = check_output(['git', 'rev-parse', '--show-toplevel']) - except OSError: - raise CLIError('Git is not currently installed.') - except CalledProcessError: - raise CLIError('Current working directory is not a git repository') - return base.decode('utf-8').strip() - - -def _get_filepath_in_current_git_repo(file_to_search): - """ - retrieves the full path of the first file in the git repo that matches filename - """ - for dirpath, _, filenames in os.walk(_gitroot()): - for file_name in filenames: - if file_name.lower() == file_to_search.lower(): - return os.path.join(dirpath, file_name) - return None - - -def _ensure_docker_compose(): - """ - 1. Raises an error if there is no docker_compose_file present. - 2. Raises an error if the version specified in the docker_compose_file is not - docker_compose_version. - """ - docker_compose_file = _get_filepath_in_current_git_repo(DOCKER_COMPOSE_FILE) - - if not docker_compose_file: - raise CLIError('Docker compose file "{}" was not found.'.format(DOCKER_COMPOSE_FILE)) - _ensure_version(docker_compose_file, DOCKER_COMPOSE_EXPECTED_VERSION) - - -def _ensure_version(filepath, expected_version): - with open(filepath, 'r') as f: - compose_data = yaml.load(f) - if 'version' not in compose_data.keys(): - raise CLIError('File : "{}"\nis missing version information.'.format( - filepath)) - if expected_version not in compose_data['version']: - raise CLIError( - 'File : "{}"\nhas incorrect version. \ - \n Only version "{}" is supported.'.format( - filepath, - expected_version)) - - -def _ensure_dockerfile(): - """ - 1. Raises an error if there is no dockerfile present. - """ - dockerfile_file = _get_filepath_in_current_git_repo(DOCKERFILE_FILE) - - if not dockerfile_file: - raise CLIError('Docker file "{}" was not found.'.format(dockerfile_file)) - - -def _get_remote_url(): - """ - Tries to find a remote for the repo in the current folder. - If only one remote is present return that remote, - if more than one remote is present it looks for origin. - """ - try: - remotes = check_output(['git', 'remote']).strip().splitlines() - remote_url = '' - if len(remotes) == 1: - remote_url = check_output(['git', 'remote', 'get-url', remotes[0].decode()]).strip() - else: - remote_url = check_output(['git', 'remote', 'get-url', 'origin']).strip() - except ValueError as e: - logger.debug(e) - raise CLIError( - "A default remote was not found for the current folder. \ - Please run this command in a git repository folder with \ - an 'origin' remote or specify a remote using '--remote-url'") - except CalledProcessError as e: - raise CLIError('Please ensure git version 2.7.0 or greater is installed.\n' + str(e)) - return remote_url.decode() - - -def _check_registry_information(registry_name, registry_resource_id): - """ - Check that only one of registry_name and registry_resource_id is provided - :param registry_name: The registry name. - :type name: String - :param registry_resource_id: The registry resource id. - :type name: String - Sample registry_resource_id: /subscriptions/{subscriptionId}/resourcegroups/{resourceGroup}/providers/Microsoft.ContainerRegistry/registries/{registryName} - """ - if registry_name and registry_resource_id: - raise CLIError( - "Please provide only one of registry-name and registry-resource-id, not both.") - - if registry_resource_id: - registry_id_pattern = "/subscriptions/[-a-z0-9]+/resourcegroups/[-a-z0-9_.()]+/providers/Microsoft.ContainerRegistry/registries/[a-z0-9]+" - if not re.match(registry_id_pattern, registry_resource_id, re.IGNORECASE): - raise CLIError("Invalid registry resource ID") - else: - if registry_name: - name_pattern = '[^0-9a-zA-Z]' - name_length = len(registry_name) - if re.search(name_pattern, registry_name) or \ - (name_length < 5 or name_length > 50): - raise CLIError( - "Registry name '{}' is invalid. A valid registry name is between 5-50 characters and contains only alphanumeric values.".format( - registry_name)) - - -def add_ci( - target_name, - target_resource_group, - remote_url=None, - remote_branch=None, - remote_access_token=None, - vsts_account_name=None, - vsts_project_name=None, - registry_resource_id=None, - registry_name=None): - """ - Creates a build definition that automates building and pushing Docker images to an Azure container registry. Source repository must define a Dockerfile. - - :param name: Name of the target Azure container service instance to deploy containers to. - :type name: String - :param resource_group_name: Name of Azure container service's resource group. - :type resource_group_name: String - :param remote_url: Remote url of the GitHub or VSTS source repository that will be built and deployed. If omitted, a source repository will be searched for in the current working directory. - :type remote_url: String - :param remote_branch: Remote branch of the GitHub or VSTS source repository that will be built and deployed. If omitted refs/heads/master will be selected. - :type remote_branch: String - :param remote_access_token: GitHub personal access token (minimum permission is 'repo'). Required if the source repository is in GitHub. - :type remote_access_token: String - :param vsts_account_name: VSTS account name to create the build and release definitions. A new VSTS account is created if omitted or does not exist. - :type vsts_account_name: String - :param vsts_project_name: VSTS project name to create the build and release definitions. A new VSTS project is created if omitted or does not exist. - :type vsts_project_name: String - :param registry_resource_id: Azure container registry resource id. - :type registry_resource_id: String - :param registry_name: Azure container registry name. A new Azure container registry is created if omitted or does not exist. - :type registry_name: String - """ - # Ensure docker-compose file is correct if no remote url provided. - if not remote_url: - _ensure_dockerfile() - - _check_registry_information(registry_name, registry_resource_id) - - # Call the RP - return _call_rp_configure_cicd( - target_name, - target_resource_group, - vsts_account_name, - vsts_project_name, - registry_name, - registry_resource_id, - _get_valid_remote_url(remote_url, remote_access_token), - remote_branch, - remote_access_token, - False) - - -def _get_service_token(): - profile = Profile() - credsCache = CredsCache() - account = profile.get_subscription() - - user_name = account['user']['name'] - tenant = account['tenantId'] - - if account['user']['type'] == _SERVICE_PRINCIPAL: - scheme, token = credsCache.retrieve_token_for_service_principal(user_name, - SERVICE_RESOURCE_ID) - else: - scheme, token = credsCache.retrieve_token_for_user(user_name, tenant, SERVICE_RESOURCE_ID) - - service_token = "{} {}".format(scheme, token) - return service_token diff --git a/src/command_modules/azure-cli-container/azure_bdist_wheel.py b/src/command_modules/azure-cli-container/azure_bdist_wheel.py deleted file mode 100644 index 3ffa5ea50a9..00000000000 --- a/src/command_modules/azure-cli-container/azure_bdist_wheel.py +++ /dev/null @@ -1,533 +0,0 @@ -""" -"wheel" copyright (c) 2012-2017 Daniel Holth and -contributors. - -The MIT License - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Create a Azure wheel (.whl) distribution (a wheel is a built archive format). - -This file is a copy of the official bdist_wheel file from wheel 0.30.0a0, enhanced -of the bottom with some Microsoft extension for Azure SDK for Python - -""" - -import csv -import hashlib -import os -import subprocess -import warnings -import shutil -import json -import sys - -try: - import sysconfig -except ImportError: # pragma nocover - # Python < 2.7 - import distutils.sysconfig as sysconfig - -import pkg_resources - -safe_name = pkg_resources.safe_name -safe_version = pkg_resources.safe_version - -from shutil import rmtree -from email.generator import Generator - -from distutils.core import Command -from distutils.sysconfig import get_python_version - -from distutils import log as logger - -from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform -from wheel.util import native, open_for_csv -from wheel.archive import archive_wheelfile -from wheel.pkginfo import read_pkg_info, write_pkg_info -from wheel.metadata import pkginfo_to_dict -from wheel import pep425tags, metadata -from wheel import __version__ as wheel_version - -def safer_name(name): - return safe_name(name).replace('-', '_') - -def safer_version(version): - return safe_version(version).replace('-', '_') - -class bdist_wheel(Command): - - description = 'create a wheel distribution' - - user_options = [('bdist-dir=', 'b', - "temporary directory for creating the distribution"), - ('plat-name=', 'p', - "platform name to embed in generated filenames " - "(default: %s)" % get_platform()), - ('keep-temp', 'k', - "keep the pseudo-installation tree around after " + - "creating the distribution archive"), - ('dist-dir=', 'd', - "directory to put final built distributions in"), - ('skip-build', None, - "skip rebuilding everything (for testing/debugging)"), - ('relative', None, - "build the archive using relative paths" - "(default: false)"), - ('owner=', 'u', - "Owner name used when creating a tar file" - " [default: current user]"), - ('group=', 'g', - "Group name used when creating a tar file" - " [default: current group]"), - ('universal', None, - "make a universal wheel" - " (default: false)"), - ('python-tag=', None, - "Python implementation compatibility tag" - " (default: py%s)" % get_impl_ver()[0]), - ] - - boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal'] - - def initialize_options(self): - self.bdist_dir = None - self.data_dir = None - self.plat_name = None - self.plat_tag = None - self.format = 'zip' - self.keep_temp = False - self.dist_dir = None - self.distinfo_dir = None - self.egginfo_dir = None - self.root_is_pure = None - self.skip_build = None - self.relative = False - self.owner = None - self.group = None - self.universal = False - self.python_tag = 'py' + get_impl_ver()[0] - self.plat_name_supplied = False - - def finalize_options(self): - if self.bdist_dir is None: - bdist_base = self.get_finalized_command('bdist').bdist_base - self.bdist_dir = os.path.join(bdist_base, 'wheel') - - self.data_dir = self.wheel_dist_name + '.data' - self.plat_name_supplied = self.plat_name is not None - - need_options = ('dist_dir', 'plat_name', 'skip_build') - - self.set_undefined_options('bdist', - *zip(need_options, need_options)) - - self.root_is_pure = not (self.distribution.has_ext_modules() - or self.distribution.has_c_libraries()) - - # Support legacy [wheel] section for setting universal - wheel = self.distribution.get_option_dict('wheel') - if 'universal' in wheel: - # please don't define this in your global configs - val = wheel['universal'][1].strip() - if val.lower() in ('1', 'true', 'yes'): - self.universal = True - - @property - def wheel_dist_name(self): - """Return distribution full name with - replaced with _""" - return '-'.join((safer_name(self.distribution.get_name()), - safer_version(self.distribution.get_version()))) - - def get_tag(self): - # bdist sets self.plat_name if unset, we should only use it for purepy - # wheels if the user supplied it. - if self.plat_name_supplied: - plat_name = self.plat_name - elif self.root_is_pure: - plat_name = 'any' - else: - plat_name = self.plat_name or get_platform() - if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: - plat_name = 'linux_i686' - plat_name = plat_name.replace('-', '_').replace('.', '_') - - - if self.root_is_pure: - if self.universal: - impl = 'py2.py3' - else: - impl = self.python_tag - tag = (impl, 'none', plat_name) - else: - impl_name = get_abbr_impl() - impl_ver = get_impl_ver() - # PEP 3149 - abi_tag = str(get_abi_tag()).lower() - tag = (impl_name + impl_ver, abi_tag, plat_name) - supported_tags = pep425tags.get_supported( - supplied_platform=plat_name if self.plat_name_supplied else None) - # XXX switch to this alternate implementation for non-pure: - assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0]) - return tag - - def get_archive_basename(self): - """Return archive name without extension""" - - impl_tag, abi_tag, plat_tag = self.get_tag() - - archive_basename = "%s-%s-%s-%s" % ( - self.wheel_dist_name, - impl_tag, - abi_tag, - plat_tag) - return archive_basename - - def run(self): - build_scripts = self.reinitialize_command('build_scripts') - build_scripts.executable = 'python' - - if not self.skip_build: - self.run_command('build') - - install = self.reinitialize_command('install', - reinit_subcommands=True) - install.root = self.bdist_dir - install.compile = False - install.skip_build = self.skip_build - install.warn_dir = False - - # A wheel without setuptools scripts is more cross-platform. - # Use the (undocumented) `no_ep` option to setuptools' - # install_scripts command to avoid creating entry point scripts. - install_scripts = self.reinitialize_command('install_scripts') - install_scripts.no_ep = True - - # Use a custom scheme for the archive, because we have to decide - # at installation time which scheme to use. - for key in ('headers', 'scripts', 'data', 'purelib', 'platlib'): - setattr(install, - 'install_' + key, - os.path.join(self.data_dir, key)) - - basedir_observed = '' - - if os.name == 'nt': - # win32 barfs if any of these are ''; could be '.'? - # (distutils.command.install:change_roots bug) - basedir_observed = os.path.normpath(os.path.join(self.data_dir, '..')) - self.install_libbase = self.install_lib = basedir_observed - - setattr(install, - 'install_purelib' if self.root_is_pure else 'install_platlib', - basedir_observed) - - logger.info("installing to %s", self.bdist_dir) - - self.run_command('install') - - archive_basename = self.get_archive_basename() - - pseudoinstall_root = os.path.join(self.dist_dir, archive_basename) - if not self.relative: - archive_root = self.bdist_dir - else: - archive_root = os.path.join( - self.bdist_dir, - self._ensure_relative(install.install_base)) - - self.set_undefined_options( - 'install_egg_info', ('target', 'egginfo_dir')) - self.distinfo_dir = os.path.join(self.bdist_dir, - '%s.dist-info' % self.wheel_dist_name) - self.egg2dist(self.egginfo_dir, - self.distinfo_dir) - - self.write_wheelfile(self.distinfo_dir) - - self.write_record(self.bdist_dir, self.distinfo_dir) - - # Make the archive - if not os.path.exists(self.dist_dir): - os.makedirs(self.dist_dir) - wheel_name = archive_wheelfile(pseudoinstall_root, archive_root) - - # Sign the archive - if 'WHEEL_TOOL' in os.environ: - subprocess.call([os.environ['WHEEL_TOOL'], 'sign', wheel_name]) - - # Add to 'Distribution.dist_files' so that the "upload" command works - getattr(self.distribution, 'dist_files', []).append( - ('bdist_wheel', get_python_version(), wheel_name)) - - if not self.keep_temp: - if self.dry_run: - logger.info('removing %s', self.bdist_dir) - else: - rmtree(self.bdist_dir) - - def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): - from email.message import Message - msg = Message() - msg['Wheel-Version'] = '1.0' # of the spec - msg['Generator'] = generator - msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() - - # Doesn't work for bdist_wininst - impl_tag, abi_tag, plat_tag = self.get_tag() - for impl in impl_tag.split('.'): - for abi in abi_tag.split('.'): - for plat in plat_tag.split('.'): - msg['Tag'] = '-'.join((impl, abi, plat)) - - wheelfile_path = os.path.join(wheelfile_base, 'WHEEL') - logger.info('creating %s', wheelfile_path) - with open(wheelfile_path, 'w') as f: - Generator(f, maxheaderlen=0).flatten(msg) - - def _ensure_relative(self, path): - # copied from dir_util, deleted - drive, path = os.path.splitdrive(path) - if path[0:1] == os.sep: - path = drive + path[1:] - return path - - def _pkginfo_to_metadata(self, egg_info_path, pkginfo_path): - return metadata.pkginfo_to_metadata(egg_info_path, pkginfo_path) - - def license_file(self): - """Return license filename from a license-file key in setup.cfg, or None.""" - metadata = self.distribution.get_option_dict('metadata') - if not 'license_file' in metadata: - return None - return metadata['license_file'][1] - - def setupcfg_requirements(self): - """Generate requirements from setup.cfg as - ('Requires-Dist', 'requirement; qualifier') tuples. From a metadata - section in setup.cfg: - - [metadata] - provides-extra = extra1 - extra2 - requires-dist = requirement; qualifier - another; qualifier2 - unqualified - - Yields - - ('Provides-Extra', 'extra1'), - ('Provides-Extra', 'extra2'), - ('Requires-Dist', 'requirement; qualifier'), - ('Requires-Dist', 'another; qualifier2'), - ('Requires-Dist', 'unqualified') - """ - metadata = self.distribution.get_option_dict('metadata') - - # our .ini parser folds - to _ in key names: - for key, title in (('provides_extra', 'Provides-Extra'), - ('requires_dist', 'Requires-Dist')): - if not key in metadata: - continue - field = metadata[key] - for line in field[1].splitlines(): - line = line.strip() - if not line: - continue - yield (title, line) - - def add_requirements(self, metadata_path): - """Add additional requirements from setup.cfg to file metadata_path""" - additional = list(self.setupcfg_requirements()) - if not additional: return - pkg_info = read_pkg_info(metadata_path) - if 'Provides-Extra' in pkg_info or 'Requires-Dist' in pkg_info: - warnings.warn('setup.cfg requirements overwrite values from setup.py') - del pkg_info['Provides-Extra'] - del pkg_info['Requires-Dist'] - for k, v in additional: - pkg_info[k] = v - write_pkg_info(metadata_path, pkg_info) - - def egg2dist(self, egginfo_path, distinfo_path): - """Convert an .egg-info directory into a .dist-info directory""" - def adios(p): - """Appropriately delete directory, file or link.""" - if os.path.exists(p) and not os.path.islink(p) and os.path.isdir(p): - shutil.rmtree(p) - elif os.path.exists(p): - os.unlink(p) - - adios(distinfo_path) - - if not os.path.exists(egginfo_path): - # There is no egg-info. This is probably because the egg-info - # file/directory is not named matching the distribution name used - # to name the archive file. Check for this case and report - # accordingly. - import glob - pat = os.path.join(os.path.dirname(egginfo_path), '*.egg-info') - possible = glob.glob(pat) - err = "Egg metadata expected at %s but not found" % (egginfo_path,) - if possible: - alt = os.path.basename(possible[0]) - err += " (%s found - possible misnamed archive file?)" % (alt,) - - raise ValueError(err) - - if os.path.isfile(egginfo_path): - # .egg-info is a single file - pkginfo_path = egginfo_path - pkg_info = self._pkginfo_to_metadata(egginfo_path, egginfo_path) - os.mkdir(distinfo_path) - else: - # .egg-info is a directory - pkginfo_path = os.path.join(egginfo_path, 'PKG-INFO') - pkg_info = self._pkginfo_to_metadata(egginfo_path, pkginfo_path) - - # ignore common egg metadata that is useless to wheel - shutil.copytree(egginfo_path, distinfo_path, - ignore=lambda x, y: set(('PKG-INFO', - 'requires.txt', - 'SOURCES.txt', - 'not-zip-safe',))) - - # delete dependency_links if it is only whitespace - dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt') - with open(dependency_links_path, 'r') as dependency_links_file: - dependency_links = dependency_links_file.read().strip() - if not dependency_links: - adios(dependency_links_path) - - write_pkg_info(os.path.join(distinfo_path, 'METADATA'), pkg_info) - - # XXX deprecated. Still useful for current distribute/setuptools. - metadata_path = os.path.join(distinfo_path, 'METADATA') - self.add_requirements(metadata_path) - - # XXX intentionally a different path than the PEP. - metadata_json_path = os.path.join(distinfo_path, 'metadata.json') - pymeta = pkginfo_to_dict(metadata_path, - distribution=self.distribution) - - if 'description' in pymeta: - description_filename = 'DESCRIPTION.rst' - description_text = pymeta.pop('description') - description_path = os.path.join(distinfo_path, - description_filename) - with open(description_path, "wb") as description_file: - description_file.write(description_text.encode('utf-8')) - pymeta['extensions']['python.details']['document_names']['description'] = description_filename - - # XXX heuristically copy any LICENSE/LICENSE.txt? - license = self.license_file() - if license: - license_filename = 'LICENSE.txt' - shutil.copy(license, os.path.join(self.distinfo_dir, license_filename)) - pymeta['extensions']['python.details']['document_names']['license'] = license_filename - - with open(metadata_json_path, "w") as metadata_json: - json.dump(pymeta, metadata_json, sort_keys=True) - - adios(egginfo_path) - - def write_record(self, bdist_dir, distinfo_dir): - from wheel.util import urlsafe_b64encode - - record_path = os.path.join(distinfo_dir, 'RECORD') - record_relpath = os.path.relpath(record_path, bdist_dir) - - def walk(): - for dir, dirs, files in os.walk(bdist_dir): - dirs.sort() - for f in sorted(files): - yield os.path.join(dir, f) - - def skip(path): - """Wheel hashes every possible file.""" - return (path == record_relpath) - - with open_for_csv(record_path, 'w+') as record_file: - writer = csv.writer(record_file) - for path in walk(): - relpath = os.path.relpath(path, bdist_dir) - if skip(relpath): - hash = '' - size = '' - else: - with open(path, 'rb') as f: - data = f.read() - digest = hashlib.sha256(data).digest() - hash = 'sha256=' + native(urlsafe_b64encode(digest)) - size = len(data) - record_path = os.path.relpath( - path, bdist_dir).replace(os.path.sep, '/') - writer.writerow((record_path, hash, size)) - - -#------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for -# license information. -#-------------------------------------------------------------------------- - -from distutils import log as logger -import os.path - -#from wheel.bdist_wheel import bdist_wheel -class azure_bdist_wheel(bdist_wheel): - - description = "Create an Azure wheel distribution" - - user_options = bdist_wheel.user_options + \ - [('azure-namespace-package=', None, - "Name of the deepest nspkg used")] - - def initialize_options(self): - bdist_wheel.initialize_options(self) - self.azure_namespace_package = None - - def finalize_options(self): - bdist_wheel.finalize_options(self) - if self.azure_namespace_package and not self.azure_namespace_package.endswith("-nspkg"): - raise ValueError("azure_namespace_package must finish by -nspkg") - - def run(self): - if not self.distribution.install_requires: - self.distribution.install_requires = [] - self.distribution.install_requires.append( - "{}>=2.0.0".format(self.azure_namespace_package.replace('_', '-'))) - bdist_wheel.run(self) - - def write_record(self, bdist_dir, distinfo_dir): - if self.azure_namespace_package: - # Split and remove last part, assuming it's "nspkg" - subparts = self.azure_namespace_package.split('-')[0:-1] - folder_with_init = [os.path.join(*subparts[0:i+1]) for i in range(len(subparts))] - for azure_sub_package in folder_with_init: - init_file = os.path.join(bdist_dir, azure_sub_package, '__init__.py') - if os.path.isfile(init_file): - logger.info("manually remove {} while building the wheel".format(init_file)) - os.remove(init_file) - else: - raise ValueError("Unable to find {}. Are you sure of your namespace package?".format(init_file)) - bdist_wheel.write_record(self, bdist_dir, distinfo_dir) -cmdclass = { - 'bdist_wheel': azure_bdist_wheel, -} diff --git a/src/command_modules/azure-cli-container/setup.cfg b/src/command_modules/azure-cli-container/setup.cfg deleted file mode 100644 index 3326c62a76e..00000000000 --- a/src/command_modules/azure-cli-container/setup.cfg +++ /dev/null @@ -1,3 +0,0 @@ -[bdist_wheel] -universal=1 -azure-namespace-package=azure-cli-command_modules-nspkg diff --git a/src/command_modules/azure-cli-container/setup.py b/src/command_modules/azure-cli-container/setup.py deleted file mode 100644 index a47b2861c92..00000000000 --- a/src/command_modules/azure-cli-container/setup.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python - -# -------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# -------------------------------------------------------------------------------------------- - -from codecs import open -from setuptools import setup -try: - from azure_bdist_wheel import cmdclass -except ImportError: - from distutils import log as logger - logger.warn("Wheel is not available, disabling bdist_wheel hook") - cmdclass = {} - - -VERSION = '0.1.4+dev' - -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', -] - -DEPENDENCIES = [ - 'pyyaml', -] - -with open('README.rst', 'r', encoding='utf-8') as f: - README = f.read() -with open('HISTORY.rst', 'r', encoding='utf-8') as f: - HISTORY = f.read() - -setup( - name='azure-cli-container', - version=VERSION, - description='Microsoft Azure Command-Line Tools container Command Module', - long_description=README + '\n\n' + HISTORY, - license='MIT', - author='Microsoft Corporation', - author_email='azpycli@microsoft.com', - url='https://github.com/Azure/azure-cli', - classifiers=CLASSIFIERS, - packages=[ - 'azure', - 'azure.cli', - 'azure.cli.command_modules', - 'azure.cli.command_modules.container', - ], - install_requires=DEPENDENCIES, - cmdclass=cmdclass, -)