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,
-)