Hello community,
here is the log from the commit of package azure-cli-appservice for
openSUSE:Factory checked in at 2018-05-13 16:01:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/azure-cli-appservice (Old)
and /work/SRC/openSUSE:Factory/.azure-cli-appservice.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "azure-cli-appservice"
Sun May 13 16:01:08 2018 rev:3 rq:600032 version:0.1.31
Changes:
--------
---
/work/SRC/openSUSE:Factory/azure-cli-appservice/azure-cli-appservice.changes
2018-02-14 09:29:48.063439083 +0100
+++
/work/SRC/openSUSE:Factory/.azure-cli-appservice.new/azure-cli-appservice.changes
2018-05-13 16:01:11.998792592 +0200
@@ -1,0 +2,8 @@
+Mon Apr 23 07:48:23 UTC 2018 - [email protected]
+
+- New upstream release
+ + Version 0.1.31
+- Move LICENSE.txt from %doc to %license section
+- Update Requires from setup.py
+
+-------------------------------------------------------------------
Old:
----
azure-cli-appservice-0.1.25.tar.gz
New:
----
azure-cli-appservice-0.1.31.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ azure-cli-appservice.spec ++++++
--- /var/tmp/diff_new_pack.91vcGD/_old 2018-05-13 16:01:12.738765594 +0200
+++ /var/tmp/diff_new_pack.91vcGD/_new 2018-05-13 16:01:12.742765448 +0200
@@ -17,7 +17,7 @@
Name: azure-cli-appservice
-Version: 0.1.25
+Version: 0.1.31
Release: 0
Summary: Microsoft Azure CLI 'appservice' Command Module
License: MIT
@@ -35,7 +35,7 @@
Requires: azure-cli-core
Requires: azure-cli-nspkg
Requires: python3-azure-mgmt-containerregistry >= 1.0.1
-Requires: python3-azure-mgmt-web >= 0.34.1
+Requires: python3-azure-mgmt-web >= 0.35.0
Requires: python3-azure-nspkg
Requires: python3-pyOpenSSL
Requires: python3-urllib3 >= 1.18
@@ -68,7 +68,8 @@
%files
%defattr(-,root,root,-)
-%doc HISTORY.rst LICENSE.txt README.rst
+%doc HISTORY.rst README.rst
+%license LICENSE.txt
%{python3_sitelib}/azure/cli/command_modules/appservice
%{python3_sitelib}/azure_cli_appservice-*.egg-info
++++++ azure-cli-appservice-0.1.25.tar.gz -> azure-cli-appservice-0.1.31.tar.gz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-cli-appservice-0.1.25/HISTORY.rst
new/azure-cli-appservice-0.1.31/HISTORY.rst
--- old/azure-cli-appservice-0.1.25/HISTORY.rst 2018-01-26 17:12:23.000000000
+0100
+++ new/azure-cli-appservice-0.1.31/HISTORY.rst 2018-04-06 19:33:13.000000000
+0200
@@ -2,6 +2,34 @@
Release History
===============
+0.1.31
+++++++
+* (Breaking change): remove `assign-identity` which was tagged `deprecating` 2
releases ago
+* webapp: capture the unhandled exception if the appservice plan doesn't exist
+* `sdist` is now compatible with wheel 0.31.0
+
+0.1.30
+++++++
+* webapp: az webapp update supports httpsOnly
+* webapp/functionapp: slot support for identity assign & identity show
+
+0.1.29
+++++++
+* webapp/functionapp: author managed identity commands `identity assign/show`,
and deprecate `assign-identity`
+
+0.1.28
+++++++
+* webapp: updating tests/code for sdk update
+
+0.1.27
+++++++
+* appservice: list-location: Fixes the bug where 'Free' was reported as an
invalid SKU
+
+0.1.26
+++++++
+* webapp backup/restore: Fix issue where restore command fails because of a
null reference
+* appservice: support default app service plan through `az configure
--defaults appserviceplan=my-asp`
+
0.1.25
++++++
* fix broken webapp log tail/download
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-cli-appservice-0.1.25/PKG-INFO
new/azure-cli-appservice-0.1.31/PKG-INFO
--- old/azure-cli-appservice-0.1.25/PKG-INFO 2018-01-26 17:12:49.000000000
+0100
+++ new/azure-cli-appservice-0.1.31/PKG-INFO 2018-04-06 19:33:30.000000000
+0200
@@ -1,11 +1,12 @@
Metadata-Version: 1.1
Name: azure-cli-appservice
-Version: 0.1.25
+Version: 0.1.31
Summary: Microsoft Azure Command-Line Tools AppService Command Module
Home-page: https://github.com/Azure/azure-cli
Author: Microsoft Corporation
Author-email: [email protected]
License: MIT
+Description-Content-Type: UNKNOWN
Description: Microsoft Azure CLI 'appservice' Command Module
===============================================
@@ -19,6 +20,34 @@
Release History
===============
+ 0.1.31
+ ++++++
+ * (Breaking change): remove `assign-identity` which was tagged
`deprecating` 2 releases ago
+ * webapp: capture the unhandled exception if the appservice plan
doesn't exist
+ * `sdist` is now compatible with wheel 0.31.0
+
+ 0.1.30
+ ++++++
+ * webapp: az webapp update supports httpsOnly
+ * webapp/functionapp: slot support for identity assign & identity show
+
+ 0.1.29
+ ++++++
+ * webapp/functionapp: author managed identity commands `identity
assign/show`, and deprecate `assign-identity`
+
+ 0.1.28
+ ++++++
+ * webapp: updating tests/code for sdk update
+
+ 0.1.27
+ ++++++
+ * appservice: list-location: Fixes the bug where 'Free' was reported
as an invalid SKU
+
+ 0.1.26
+ ++++++
+ * webapp backup/restore: Fix issue where restore command fails because
of a null reference
+ * appservice: support default app service plan through `az configure
--defaults appserviceplan=my-asp`
+
0.1.25
++++++
* fix broken webapp log tail/download
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/_help.py
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/_help.py
---
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/_help.py
2018-01-26 17:12:23.000000000 +0100
+++
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/_help.py
2018-04-06 19:33:13.000000000 +0200
@@ -44,19 +44,33 @@
--facebook-oauth-scopes public_profile email
"""
-helps['webapp assign-identity'] = """
+helps['webapp identity assign'] = """
type: command
short-summary: (PREVIEW) assign managed service identity to the webapp
examples:
- name: assign local identity and assign a reader role to the current
resource group.
text: >
- az webapp assign-identity -g MyResourceGroup -n MyUniqueApp --role
reader --scope
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/MyResourceGroup
+ az webapp identity assign -g MyResourceGroup -n MyUniqueApp --role
reader --scope
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/MyResourceGroup
- name: disable the identity when there is need.
text: >
az webapp config appsettings set -g MyResourceGroup -n MyUniqueApp
--settings WEBSITE_DISABLE_MSI=true
"""
-helps['functionapp assign-identity'] = helps['webapp
assign-identity'].replace('webapp', 'functionapp')
+helps['webapp identity'] = """
+ type: group
+ short-summary: (PREVIEW) manage webapp's managed service identity
+"""
+
+helps['webapp identity show'] = """
+ type: command
+ short-summary: (PREVIEW) display webapp's managed service identity
+"""
+
+helps['functionapp identity'] = helps['webapp identity'].replace('webapp',
'functionapp')
+
+helps['functionapp identity assign'] = helps['webapp identity
assign'].replace('webapp', 'functionapp')
+
+helps['functionapp identity show'] = helps['webapp identity
show'].replace('webapp', 'functionapp')
helps['webapp config'] = """
type: group
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/_params.py
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/_params.py
---
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/_params.py
2018-01-26 17:12:23.000000000 +0100
+++
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/_params.py
2018-04-06 19:33:13.000000000 +0200
@@ -56,7 +56,9 @@
c.argument('sku', arg_type=sku_arg_type)
with self.argument_context('appservice plan') as c:
- c.argument('name', arg_type=name_arg_type, help='The name of the app
service plan',
completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
id_part='name')
+ c.argument('name', arg_type=name_arg_type, help='The name of the app
service plan',
+
completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
+ configured_default='appserviceplan', id_part='name')
c.argument('number_of_workers', help='Number of workers to be
allocated.', type=int, default=1)
c.argument('admin_site_name', help='The name of the admin web app.')
@@ -72,7 +74,8 @@
c.argument('name', options_list=['--name', '-n'], help='name of the
new webapp')
c.argument('startup_file', help="Linux only. The web's startup file")
c.argument('runtime', options_list=['--runtime', '-r'],
help="canonicalized web runtime in the format of Framework|Version, e.g.
\"PHP|5.6\". Use 'az webapp list-runtimes' for available list") # TODO ADD
completer
- c.argument('plan', options_list=['--plan', '-p'],
completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
+ c.argument('plan', options_list=['--plan', '-p'],
configured_default='appserviceplan',
+
completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
help="name or resource id of the app service plan. Use
'appservice plan create' to get one")
with self.argument_context('webapp show') as c:
@@ -82,10 +85,11 @@
c.argument('linux', action='store_true', help='list runtime stacks for
linux based webapps')
with self.argument_context('webapp traffic-routing') as c:
- c.argument('distribution', options_list=['--distribution', '-d'],
nargs='+', help='space separated slot routings in a format of
<slot-name>=<percentage> e.g. staging=50. Unused traffic percentage will go to
the Production slot')
+ c.argument('distribution', options_list=['--distribution', '-d'],
nargs='+', help='space-separated slot routings in a format of
<slot-name>=<percentage> e.g. staging=50. Unused traffic percentage will go to
the Production slot')
with self.argument_context('webapp update') as c:
c.argument('client_affinity_enabled', help="Enables sending session
affinity cookies.", arg_type=get_three_state_flag(return_label=True))
+ c.argument('https_only', help="Redirect all traffic made to an app
using HTTP to HTTPS.", arg_type=get_three_state_flag(return_label=True))
with self.argument_context('webapp browse') as c:
c.argument('logs', options_list=['--logs', '-l'], action='store_true',
help='Enable viewing the log stream immediately after launching the web app')
with self.argument_context('webapp delete') as c:
@@ -108,8 +112,8 @@
with self.argument_context(scope + ' config ssl') as c:
c.argument('certificate_thumbprint', help='The ssl cert
thumbprint')
with self.argument_context(scope + ' config appsettings') as c:
- c.argument('settings', nargs='+', help="space separated app
settings in a format of <name>=<value>")
- c.argument('setting_names', nargs='+', help="space separated app
setting names")
+ c.argument('settings', nargs='+', help="space-separated app
settings in a format of <name>=<value>")
+ c.argument('setting_names', nargs='+', help="space-separated app
setting names")
with self.argument_context(scope + ' config hostname') as c:
c.argument('hostname', completer=get_hostname_completion_list,
help="hostname assigned to the site, such as custom domains",
id_part='child_name_1')
with self.argument_context(scope + ' deployment user') as c:
@@ -132,7 +136,7 @@
c.argument('slot_swap', arg_group='VSTS CD Provider', help='Name
of the slot to be used for deployment and later promote to production. If slot
is not available, it will be created. Default: Not configured')
c.argument('repository_type', help='repository type',
arg_type=get_enum_type(['git', 'mercurial', 'vsts', 'github', 'externalgit',
'localgit']))
c.argument('git_token', help='Git access token required for auto
sync')
- with self.argument_context(scope + ' assign-identity') as c:
+ with self.argument_context(scope + ' identity') as c:
c.argument('disable_msi', action='store_true', help='disable the
identity')
c.argument('scope', help="The scope the managed identity has
access to")
c.argument('role', help="Role name or id the managed identity will
be assigned")
@@ -141,7 +145,7 @@
c.argument('webapp_name', help="webapp name. You can configure the
default using 'az configure --defaults web=<name>'", configured_default='web',
completer=get_resource_name_completion_list('Microsoft.Web/sites'),
id_part='name')
with self.argument_context('webapp config appsettings') as c:
- c.argument('slot_settings', nargs='+', help="space separated slot app
settings in a format of <name>=<value>")
+ c.argument('slot_settings', nargs='+', help="space-separated slot app
settings in a format of <name>=<value>")
with self.argument_context('webapp deployment container config') as c:
c.argument('enable', options_list=['--enable-cd', '-e'],
help='enable/disable continuous deployment', arg_type=get_enum_type(['true',
'false']))
with self.argument_context('webapp deployment slot') as c:
@@ -171,9 +175,9 @@
for scope in ['appsettings', 'connection-string']:
with self.argument_context('webapp config ' + scope) as c:
- c.argument('settings', nargs='+', help="space separated {} in a
format of <name>=<value>".format(scope))
- c.argument('slot_settings', nargs='+', help="space separated slot
{} in a format of <name>=<value>".format(scope))
- c.argument('setting_names', nargs='+', help="space separated {}
names".format(scope))
+ c.argument('settings', nargs='+', help="space-separated {} in a
format of <name>=<value>".format(scope))
+ c.argument('slot_settings', nargs='+', help="space-separated slot
{} in a format of <name>=<value>".format(scope))
+ c.argument('setting_names', nargs='+', help="space-separated {}
names".format(scope))
with self.argument_context('webapp config connection-string') as c:
c.argument('connection_string_type',
options_list=['--connection-string-type', '-t'], help='connection string type',
arg_type=get_enum_type(ConnectionStringType))
@@ -211,6 +215,7 @@
c.argument('backup_name', help='Name of the backup. If unspecified,
the backup will be named with the webapp name and a timestamp')
with self.argument_context('webapp config backup update') as c:
+ c.argument('backup_name', help='Name of the backup. If unspecified,
the backup will be named with the webapp name and a timestamp')
c.argument('frequency', help='How often to backup. Use a number
followed by d or h, e.g. 5d = 5 days, 2h = 2 hours')
c.argument('keep_at_least_one_backup', help='Always keep one backup,
regardless of how old it is', options_list=['--retain-one'],
arg_type=get_three_state_flag(return_label=True))
c.argument('retention_period_in_days', help='How many days to keep a
backup before automatically deleting it. Set to 0 for indefinite retention',
options_list=['--retention'])
@@ -226,24 +231,24 @@
c.argument('token_store_enabled', options_list=['--token-store'],
arg_type=get_three_state_flag(return_label=True))
c.argument('action', arg_type=get_enum_type(AUTH_TYPES))
c.argument('token_refresh_extension_hours', type=float, help="Hours,
must be formattable into a float")
- c.argument('allowed_external_redirect_urls', nargs='+', help="One or
more urls (space delimited).")
+ c.argument('allowed_external_redirect_urls', nargs='+', help="One or
more urls (space-delimited).")
c.argument('client_id', options_list=['--aad-client-id'],
arg_group='Azure Active Directory')
c.argument('client_secret', options_list=['--aad-client-secret'],
arg_group='Azure Active Directory')
- c.argument('allowed_audiences', nargs='+',
options_list=['--aad-allowed-token-audiences'], arg_group='Azure Active
Directory', help="One or more token audiences (space delimited).")
+ c.argument('allowed_audiences', nargs='+',
options_list=['--aad-allowed-token-audiences'], arg_group='Azure Active
Directory', help="One or more token audiences (space-delimited).")
c.argument('issuer', options_list=['--aad-token-issuer-url'],
help='This url can be found in the JSON output returned
from your active directory endpoint using your tenantID. The endpoint can be
queried from \'az cloud show\' at \"endpoints.activeDirectory\". '
'The tenantID can be found using \'az account show\'.
Get the \"issuer\" from the JSON at <active directory
endpoint>/<tenantId>/.well-known/openid-configuration.', arg_group='Azure
Active Directory')
c.argument('facebook_app_id', arg_group='Facebook')
c.argument('facebook_app_secret', arg_group='Facebook')
- c.argument('facebook_oauth_scopes', nargs='+', help="One or more
facebook authentication scopes (space delimited).", arg_group='Facebook')
+ c.argument('facebook_oauth_scopes', nargs='+', help="One or more
facebook authentication scopes (space-delimited).", arg_group='Facebook')
c.argument('twitter_consumer_key', arg_group='Twitter')
c.argument('twitter_consumer_secret', arg_group='Twitter')
c.argument('google_client_id', arg_group='Google')
c.argument('google_client_secret', arg_group='Google')
- c.argument('google_oauth_scopes', nargs='+', help="One or more Google
authentication scopes (space delimited).", arg_group='Google')
+ c.argument('google_oauth_scopes', nargs='+', help="One or more Google
authentication scopes (space-delimited).", arg_group='Google')
c.argument('microsoft_account_client_id', arg_group='Microsoft')
c.argument('microsoft_account_client_secret', arg_group='Microsoft')
- c.argument('microsoft_account_oauth_scopes', nargs='+', help="One or
more Microsoft authentification scopes (space delimited).",
arg_group='Microsoft')
+ c.argument('microsoft_account_oauth_scopes', nargs='+', help="One or
more Microsoft authentification scopes (space-delimited).",
arg_group='Microsoft')
with self.argument_context('functionapp') as c:
c.ignore('app_instance', 'slot')
@@ -251,7 +256,8 @@
with self.argument_context('functionapp config hostname') as c:
c.argument('webapp_name', arg_type=name_arg_type, id_part='name',
help='name of the function app')
with self.argument_context('functionapp create') as c:
- c.argument('plan', options_list=['--plan', '-p'],
completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
+ c.argument('plan', options_list=['--plan', '-p'],
configured_default='appserviceplan',
+
completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
help="name or resource id of the function app service plan.
Use 'appservice plan create' to get one")
c.argument('new_app_name', options_list=['--name', '-n'], help='name
of the new function app')
c.argument('storage_account', options_list=['--storage-account', '-s'],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/commands.py
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/commands.py
---
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/commands.py
2018-01-26 17:12:23.000000000 +0100
+++
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/commands.py
2018-04-06 19:33:13.000000000 +0200
@@ -76,7 +76,8 @@
g.custom_command('restart', 'restart_webapp')
g.custom_command('browse', 'view_in_browser')
g.custom_command('list-runtimes', 'list_runtimes')
- g.custom_command('assign-identity', 'assign_identity')
+ g.custom_command('identity assign', 'assign_identity')
+ g.custom_command('identity show', 'show_identity')
g.generic_update_command('update', custom_func_name='update_webapp',
setter_arg_name='site_envelope')
with self.command_group('webapp traffic-routing') as g:
@@ -178,7 +179,9 @@
g.custom_command('start', 'start_webapp')
g.custom_command('restart', 'restart_webapp')
g.custom_command('list-consumption-locations',
'list_consumption_locations')
- g.custom_command('assign-identity', 'assign_identity')
+ g.custom_command('assign-identity', 'assign_identity',
deprecate_info='identity assign')
+ g.custom_command('identity assign', 'assign_identity')
+ g.custom_command('identity show', 'show_identity')
with self.command_group('functionapp config appsettings') as g:
g.custom_command('list', 'get_app_settings',
exception_handler=empty_on_404)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/custom.py
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/custom.py
---
old/azure-cli-appservice-0.1.25/azure/cli/command_modules/appservice/custom.py
2018-01-26 17:12:23.000000000 +0100
+++
new/azure-cli-appservice-0.1.31/azure/cli/command_modules/appservice/custom.py
2018-04-06 19:33:13.000000000 +0200
@@ -11,6 +11,7 @@
from urlparse import urlparse # pylint: disable=import-error
from binascii import hexlify
from os import urandom
+import json
import OpenSSL.crypto
from knack.prompting import prompt_pass, NoTTYException
@@ -40,15 +41,8 @@
# pylint:disable=no-member,too-many-lines,too-many-locals
-
-def _generic_settings_operation(cli_ctx, resource_group_name, name,
operation_name,
- setting_properties, slot=None, client=None):
- client = client or web_client_factory(cli_ctx)
- operation = getattr(client.web_apps, operation_name if slot is None else
operation_name + '_slot')
- if slot is None:
- return operation(resource_group_name, name, str, setting_properties)
-
- return operation(resource_group_name, name, slot, str, setting_properties)
+# region "Common routines shared with quick-start extensions."
+# Please maintain compatibility in both interfaces and functionalities"
def create_webapp(cmd, resource_group_name, name, plan, runtime=None,
startup_file=None,
@@ -62,11 +56,14 @@
plan_info =
client.app_service_plans.get(parse_result['resource_group'],
parse_result['name'])
else:
plan_info = client.app_service_plans.get(resource_group_name, plan)
+ if not plan_info:
+ raise CLIError("The plan '{}' doesn't exist".format(plan))
is_linux = plan_info.reserved
node_default_version = "6.9.1"
location = plan_info.location
site_config = SiteConfig(app_settings=[])
webapp_def = Site(server_farm_id=plan_info.id, location=location,
site_config=site_config)
+ helper = _StackRuntimeHelper(client, linux=is_linux)
if is_linux:
if runtime and deployment_container_image_name:
@@ -76,6 +73,11 @@
if runtime:
site_config.linux_fx_version = runtime
+ match = helper.resolve(runtime)
+ if not match:
+ raise CLIError("Linux Runtime '{}' is not supported."
+ "Please invoke 'list-runtimes' to cross
check".format(runtime))
+
elif deployment_container_image_name:
site_config.linux_fx_version =
_format_linux_fx_version(deployment_container_image_name)
site_config.app_settings.append(NameValuePair("WEBSITES_ENABLE_APP_SERVICE_STORAGE",
"false"))
@@ -86,7 +88,6 @@
if startup_file or deployment_container_image_name:
raise CLIError("usage error: --startup-file or
--deployment-container-image-name is "
"only appliable on linux webapp")
- helper = _StackRuntimeHelper(client)
match = helper.resolve(runtime)
if not match:
raise CLIError("Runtime '{}' is not supported. Please invoke
'list-runtimes' to cross check".format(runtime)) # pylint:
disable=line-too-long
@@ -116,6 +117,96 @@
return webapp
+def update_app_settings(cmd, resource_group_name, name, settings=None,
slot=None, slot_settings=None):
+ if not settings and not slot_settings:
+ raise CLIError('Usage Error: --settings |--slot-settings')
+
+ settings = settings or []
+ slot_settings = slot_settings or []
+
+ app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name,
name,
+ 'list_application_settings', slot)
+ for name_value in settings + slot_settings:
+ # split at the first '=', appsetting should not have '=' in the name
+ settings_name, value = name_value.split('=', 1)
+ app_settings.properties[settings_name] = value
+ client = web_client_factory(cmd.cli_ctx)
+
+ result = _generic_settings_operation(cmd.cli_ctx, resource_group_name,
name,
+ 'update_application_settings',
+ app_settings.properties, slot, client)
+
+ app_settings_slot_cfg_names = []
+ if slot_settings:
+ new_slot_setting_names = [n.split('=', 1)[0] for n in slot_settings]
+ slot_cfg_names =
client.web_apps.list_slot_configuration_names(resource_group_name, name)
+ slot_cfg_names.app_setting_names = slot_cfg_names.app_setting_names or
[]
+ slot_cfg_names.app_setting_names += new_slot_setting_names
+ app_settings_slot_cfg_names = slot_cfg_names.app_setting_names
+ client.web_apps.update_slot_configuration_names(resource_group_name,
name, slot_cfg_names)
+
+ return _build_app_settings_output(result.properties,
app_settings_slot_cfg_names)
+
+
+def enable_zip_deploy(cmd, resource_group_name, name, src, slot=None):
+ user_name, password = _get_site_credential(cmd.cli_ctx,
resource_group_name, name, slot)
+ scm_url = _get_scm_url(cmd, resource_group_name, name, slot)
+ zip_url = scm_url + '/api/zipdeploy'
+
+ import urllib3
+ authorization =
urllib3.util.make_headers(basic_auth='{0}:{1}'.format(user_name, password))
+ headers = authorization
+ headers['content-type'] = 'application/octet-stream'
+
+ import requests
+ import os
+ # Read file content
+ with open(os.path.realpath(os.path.expanduser(src)), 'rb') as fs:
+ zip_content = fs.read()
+ r = requests.post(zip_url, data=zip_content, headers=headers)
+ if r.status_code != 200:
+ raise CLIError("Zip deployment {} failed with status code '{}' and
reason '{}'".format(
+ zip_url, r.status_code, r.text))
+
+ # on successful deployment navigate to the app, display the latest
deployment json response
+ response = requests.get(scm_url + '/api/deployments/latest',
headers=authorization)
+ return response.json()
+
+
+def get_sku_name(tier):
+ tier = tier.upper()
+ if tier == 'F1' or tier == "FREE":
+ return 'FREE'
+ elif tier == 'D1' or tier == "SHARED":
+ return 'SHARED'
+ elif tier in ['B1', 'B2', 'B3', 'BASIC']:
+ return 'BASIC'
+ elif tier in ['S1', 'S2', 'S3']:
+ return 'STANDARD'
+ elif tier in ['P1', 'P2', 'P3']:
+ return 'PREMIUM'
+ elif tier in ['P1V2', 'P2V2', 'P3V2']:
+ return 'PREMIUMV2'
+ else:
+ raise CLIError("Invalid sku(pricing tier), please refer to command
help for valid values")
+
+
+# deprecated, do not use
+def _get_sku_name(tier):
+ return get_sku_name(tier)
+# endregion
+
+
+def _generic_settings_operation(cli_ctx, resource_group_name, name,
operation_name,
+ setting_properties, slot=None, client=None):
+ client = client or web_client_factory(cli_ctx)
+ operation = getattr(client.web_apps, operation_name if slot is None else
operation_name + '_slot')
+ if slot is None:
+ return operation(resource_group_name, name, str, setting_properties)
+
+ return operation(resource_group_name, name, slot, str, setting_properties)
+
+
def show_webapp(cmd, resource_group_name, name, slot=None, app_instance=None):
webapp = app_instance
if not app_instance: # when the routine is invoked as a help method, not
through commands
@@ -125,9 +216,11 @@
return webapp
-def update_webapp(instance, client_affinity_enabled=None):
+def update_webapp(instance, client_affinity_enabled=None, https_only=None):
if client_affinity_enabled is not None:
instance.client_affinity_enabled = client_affinity_enabled == 'true'
+ if https_only is not None:
+ instance.https_only = https_only == 'true'
return instance
@@ -152,23 +245,25 @@
return result
-def assign_identity(cmd, resource_group_name, name, role='Contributor',
scope=None, disable_msi=False):
- client = web_client_factory(cmd.cli_ctx)
-
+def assign_identity(cmd, resource_group_name, name, role='Contributor',
slot=None, scope=None, disable_msi=False):
def getter():
- return _generic_site_operation(cmd.cli_ctx, resource_group_name, name,
'get')
+ return _generic_site_operation(cmd.cli_ctx, resource_group_name, name,
'get', slot)
def setter(webapp):
webapp.identity = ManagedServiceIdentity(type='SystemAssigned')
- poller = client.web_apps.create_or_update(resource_group_name, name,
webapp)
+ poller = _generic_site_operation(cmd.cli_ctx, resource_group_name,
name, 'create_or_update', slot, webapp)
return LongRunningOperation(cmd.cli_ctx)(poller)
from azure.cli.core.commands.arm import assign_identity as _assign_identity
webapp = _assign_identity(cmd.cli_ctx, getter, setter, role, scope)
- update_app_settings(cmd, resource_group_name, name,
['WEBSITE_DISABLE_MSI={}'.format(disable_msi)])
+ update_app_settings(cmd, resource_group_name, name,
['WEBSITE_DISABLE_MSI={}'.format(disable_msi)], slot)
return webapp.identity
+def show_identity(cmd, resource_group_name, name, slot=None):
+ return _generic_site_operation(cmd.cli_ctx, resource_group_name, name,
'get', slot).identity
+
+
def get_auth_settings(cmd, resource_group_name, name, slot=None):
return _generic_site_operation(cmd.cli_ctx, resource_group_name, name,
'get_auth_settings', slot)
@@ -209,14 +304,8 @@
def list_runtimes(cmd, linux=False):
client = web_client_factory(cmd.cli_ctx)
- if linux:
- # workaround before API is exposed
- logger.warning('You are viewing an offline list of runtimes. For up to
date list, '
- 'check out https://aka.ms/linux-stacks')
- return ['node|6.4', 'node|4.5', 'node|6.2', 'node|6.6', 'node|6.9',
'node|6.10',
- 'php|5.6', 'php|7.0', 'dotnetcore|1.0', 'dotnetcore|1.1',
'ruby|2.3']
+ runtime_helper = _StackRuntimeHelper(client, linux)
- runtime_helper = _StackRuntimeHelper(client)
return [s['displayName'] for s in runtime_helper.stacks]
@@ -339,37 +428,6 @@
return _generic_site_operation(cmd.cli_ctx, resource_group_name, name,
'update_configuration', slot, configs)
-def update_app_settings(cmd, resource_group_name, name, settings=None,
slot=None, slot_settings=None):
- if not settings and not slot_settings:
- raise CLIError('Usage Error: --settings |--slot-settings')
-
- settings = settings or []
- slot_settings = slot_settings or []
-
- app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name,
name,
- 'list_application_settings', slot)
- for name_value in settings + slot_settings:
- # split at the first '=', appsetting should not have '=' in the name
- settings_name, value = name_value.split('=', 1)
- app_settings.properties[settings_name] = value
- client = web_client_factory(cmd.cli_ctx)
-
- result = _generic_settings_operation(cmd.cli_ctx, resource_group_name,
name,
- 'update_application_settings',
- app_settings.properties, slot, client)
-
- app_settings_slot_cfg_names = []
- if slot_settings:
- new_slot_setting_names = [n.split('=', 1)[0] for n in slot_settings]
- slot_cfg_names =
client.web_apps.list_slot_configuration_names(resource_group_name, name)
- slot_cfg_names.app_setting_names = slot_cfg_names.app_setting_names or
[]
- slot_cfg_names.app_setting_names += new_slot_setting_names
- app_settings_slot_cfg_names = slot_cfg_names.app_setting_names
- client.web_apps.update_slot_configuration_names(resource_group_name,
name, slot_cfg_names)
-
- return _build_app_settings_output(result.properties,
app_settings_slot_cfg_names)
-
-
def delete_app_settings(cmd, resource_group_name, name, setting_names,
slot=None):
app_settings = _generic_site_operation(cmd.cli_ctx, resource_group_name,
name, 'list_application_settings', slot)
client = web_client_factory(cmd.cli_ctx)
@@ -755,7 +813,7 @@
def _linux_sku_check(sku):
- tier = _get_sku_name(sku)
+ tier = get_sku_name(sku)
if tier in ['BASIC', 'STANDARD']:
return
format_string = 'usage error: {0} is not a valid sku for linux plan,
please use one of the following: {1}'
@@ -771,7 +829,7 @@
if is_linux:
_linux_sku_check(sku)
# the api is odd on parameter naming, have to live with it for now
- sku_def = SkuDescription(tier=_get_sku_name(sku), name=sku,
capacity=number_of_workers)
+ sku_def = SkuDescription(tier=get_sku_name(sku), name=sku,
capacity=number_of_workers)
plan_def = AppServicePlan(location, app_service_plan_name=name,
sku=sku_def, reserved=(is_linux or None))
return client.app_service_plans.create_or_update(resource_group_name,
name, plan_def)
@@ -782,7 +840,7 @@
sku_def = instance.sku
if sku is not None:
sku = _normalize_sku(sku)
- sku_def.tier = _get_sku_name(sku)
+ sku_def.tier = get_sku_name(sku)
sku_def.name = sku
if number_of_workers is not None:
@@ -813,9 +871,8 @@
client = web_client_factory(cmd.cli_ctx)
if backup_name and backup_name.lower().endswith('.zip'):
backup_name = backup_name[:-4]
- location = _get_location_from_webapp(client, resource_group_name,
webapp_name)
db_setting = _create_db_setting(db_name, db_type, db_connection_string)
- backup_request = BackupRequest(location, backup_request_name=backup_name,
+ backup_request = BackupRequest(backup_request_name=backup_name,
storage_account_url=storage_account_url,
databases=db_setting)
if slot:
return client.web_apps.backup_slot(resource_group_name, webapp_name,
backup_request, slot)
@@ -826,10 +883,13 @@
def update_backup_schedule(cmd, resource_group_name, webapp_name,
storage_account_url=None,
frequency=None, keep_at_least_one_backup=None,
retention_period_in_days=None, db_name=None,
- db_connection_string=None, db_type=None, slot=None):
- client = web_client_factory(cmd.cli_ctx)
- location = _get_location_from_webapp(client, resource_group_name,
webapp_name)
+ db_connection_string=None, db_type=None,
backup_name=None, slot=None):
configuration = None
+ if backup_name and backup_name.lower().endswith('.zip'):
+ backup_name = backup_name[:-4]
+ if not backup_name:
+ from datetime import datetime
+ backup_name = '{0}_{1}'.format(webapp_name,
datetime.utcnow().strftime('%Y%m%d%H%M'))
try:
configuration = _generic_site_operation(cmd.cli_ctx,
resource_group_name, webapp_name,
@@ -871,8 +931,9 @@
backup_schedule = BackupSchedule(frequency_num, frequency_unit.name,
keep_at_least_one_backup,
retention_period_in_days)
- backup_request = BackupRequest(location, backup_schedule=backup_schedule,
enabled=True,
- storage_account_url=storage_account_url,
databases=db_setting)
+ backup_request = BackupRequest(backup_request_name=backup_name,
backup_schedule=backup_schedule,
+ enabled=True,
storage_account_url=storage_account_url,
+ databases=db_setting)
return _generic_site_operation(cmd.cli_ctx, resource_group_name,
webapp_name, 'update_backup_configuration',
slot, backup_request)
@@ -882,17 +943,13 @@
target_name=None, overwrite=None,
ignore_hostname_conflict=None, slot=None):
client = web_client_factory(cmd.cli_ctx)
storage_blob_name = backup_name
- webapp_info = client.web_apps.get(resource_group_name, webapp_name)
- app_service_plan = webapp_info.server_farm_id.split('/')[-1]
if not storage_blob_name.lower().endswith('.zip'):
storage_blob_name += '.zip'
- location = _get_location_from_webapp(client, resource_group_name,
webapp_name)
db_setting = _create_db_setting(db_name, db_type, db_connection_string)
- restore_request = RestoreRequest(location,
storage_account_url=storage_account_url,
+ restore_request = RestoreRequest(storage_account_url=storage_account_url,
blob_name=storage_blob_name,
overwrite=overwrite,
site_name=target_name,
databases=db_setting,
-
ignore_conflicting_host_names=ignore_hostname_conflict,
- app_service_plan=app_service_plan)
+
ignore_conflicting_host_names=ignore_hostname_conflict)
if slot:
return client.web_apps.restore_slot(resource_group_name, webapp_name,
0, restore_request, slot)
@@ -936,24 +993,6 @@
return sku
-def _get_sku_name(tier):
- tier = tier.upper()
- if tier == 'F1':
- return 'FREE'
- elif tier == 'D1':
- return 'SHARED'
- elif tier in ['B1', 'B2', 'B3']:
- return 'BASIC'
- elif tier in ['S1', 'S2', 'S3']:
- return 'STANDARD'
- elif tier in ['P1', 'P2', 'P3']:
- return 'PREMIUM'
- elif tier in ['P1V2', 'P2V2', 'P3V2']:
- return 'PREMIUMV2'
- else:
- raise CLIError("Invalid sku(pricing tier), please refer to command
help for valid values")
-
-
def _get_location_from_resource_group(cli_ctx, resource_group_name):
from azure.mgmt.resource import ResourceManagementClient
client = get_mgmt_service_client(cli_ctx, ResourceManagementClient)
@@ -990,8 +1029,7 @@
Update deployment credentials.(Note, all webapps in your subscription will
be impacted)
'''
client = web_client_factory(cmd.cli_ctx)
- user = User()
- user.publishing_user_name = user_name
+ user = User(user_name)
if password is None:
try:
password = prompt_pass(msg='Password: ', confirm=True)
@@ -1251,7 +1289,6 @@
except ImportError:
pass
- std_encoding = sys.stdout.encoding
http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
headers = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(user_name,
password))
r = http.request(
@@ -1271,6 +1308,7 @@
break
f.write(data)
else: # streaming
+ std_encoding = sys.stdout.encoding
for chunk in r.stream():
if chunk:
# Extra encode() and decode for stdout which does not surpport
'utf-8'
@@ -1386,8 +1424,9 @@
# help class handles runtime stack in format like 'node|6.1', 'php|5.5'
class _StackRuntimeHelper(object):
- def __init__(self, client):
+ def __init__(self, client, linux=False):
self._client = client
+ self._linux = linux
self._stacks = []
def resolve(self, display_name):
@@ -1416,50 +1455,66 @@
def _load_stacks(self):
if self._stacks:
return
- raw_list = self._client.provider.get_available_stacks()
- stacks = raw_list['value']
- config_mappings = {
- 'node': 'WEBSITE_NODE_DEFAULT_VERSION',
- 'python': 'python_version',
- 'php': 'php_version',
- 'aspnet': 'net_framework_version'
- }
-
+ os_type = ('Linux' if self._linux else 'Windows')
+ raw_stacks =
self._client.provider.get_available_stacks(os_type_selected=os_type, raw=True)
+ bytes_value = raw_stacks._get_next().content # pylint:
disable=protected-access
+ json_value = bytes_value.decode('utf8')
+ json_stacks = json.loads(json_value)
+ stacks = json_stacks['value']
result = []
- # get all stack version except 'java'
- for name, properties in [(s['name'], s['properties']) for s in stacks
- if s['name'] in config_mappings]:
- for major in properties['majorVersions']:
- default_minor = next((m for m in (major['minorVersions'] or
[]) if m['isDefault']),
- None)
- result.append({
- 'displayName': name + '|' + major['displayVersion'],
- 'configs': {
- config_mappings[name]: (default_minor['runtimeVersion']
- if default_minor else
major['runtimeVersion'])
- }
- })
-
- # deal with java, which pairs with java container version
- java_stack = next((s for s in stacks if s['name'] == 'java'))
- java_container_stack = next((s for s in stacks if s['name'] ==
'javaContainers'))
- for java_version in java_stack['properties']['majorVersions']:
- for fx in java_container_stack['properties']['frameworks']:
- for fx_version in fx['majorVersions']:
+ if self._linux:
+ for properties in [(s['properties']) for s in stacks]:
+ for major in properties['majorVersions']:
+ default_minor = next((m for m in (major['minorVersions']
or []) if m['isDefault']),
+ None)
result.append({
- 'displayName':
'java|{}|{}|{}'.format(java_version['displayVersion'],
- fx['display'],
-
fx_version['displayVersion']),
+ 'displayName': (default_minor['runtimeVersion']
+ if default_minor else
major['runtimeVersion'])
+ })
+ else: # Windows stacks
+ config_mappings = {
+ 'node': 'WEBSITE_NODE_DEFAULT_VERSION',
+ 'python': 'python_version',
+ 'php': 'php_version',
+ 'aspnet': 'net_framework_version'
+ }
+
+ # get all stack version except 'java'
+ for stack in stacks:
+ if stack['name'] not in config_mappings:
+ continue
+ name, properties = stack['name'], stack['properties']
+ for major in properties['majorVersions']:
+ default_minor = next((m for m in (major['minorVersions']
or []) if m['isDefault']),
+ None)
+ result.append({
+ 'displayName': name + '|' + major['displayVersion'],
'configs': {
- 'java_version': java_version['runtimeVersion'],
- 'java_container': fx['name'],
- 'java_container_version':
fx_version['runtimeVersion']
+ config_mappings[name]:
(default_minor['runtimeVersion']
+ if default_minor else
major['runtimeVersion'])
}
})
- for r in result:
- r['setter'] = (_StackRuntimeHelper.update_site_appsettings if
'node' in
- r['displayName'] else
_StackRuntimeHelper.update_site_config)
+ # deal with java, which pairs with java container version
+ java_stack = next((s for s in stacks if s['name'] == 'java'))
+ java_container_stack = next((s for s in stacks if s['name'] ==
'javaContainers'))
+ for java_version in java_stack['properties']['majorVersions']:
+ for fx in java_container_stack['properties']['frameworks']:
+ for fx_version in fx['majorVersions']:
+ result.append({
+ 'displayName':
'java|{}|{}|{}'.format(java_version['displayVersion'],
+
fx['display'],
+
fx_version['displayVersion']),
+ 'configs': {
+ 'java_version': java_version['runtimeVersion'],
+ 'java_container': fx['name'],
+ 'java_container_version':
fx_version['runtimeVersion']
+ }
+ })
+
+ for r in result:
+ r['setter'] = (_StackRuntimeHelper.update_site_appsettings if
'node' in
+ r['displayName'] else
_StackRuntimeHelper.update_site_config)
self._stacks = result
@@ -1467,6 +1522,7 @@
consumption_plan_location=None, deployment_source_url=None,
deployment_source_branch='master',
deployment_local_git=None,
deployment_container_image_name=None):
+ # pylint: disable=too-many-statements
if deployment_source_url and deployment_local_git:
raise CLIError('usage error: --deployment-source-url <url> |
--deployment-local-git')
if bool(plan) == bool(consumption_plan_location):
@@ -1487,6 +1543,8 @@
if is_valid_resource_id(plan):
plan = parse_resource_id(plan)['name']
plan_info = client.app_service_plans.get(resource_group_name, plan)
+ if not plan_info:
+ raise CLIError("The plan '{}' doesn't exist".format(plan))
location = plan_info.location
is_linux = plan_info.reserved
if is_linux:
@@ -1596,30 +1654,5 @@
def list_locations(cmd, sku, linux_workers_enabled=None):
client = web_client_factory(cmd.cli_ctx)
- full_sku = _get_sku_name(sku)
+ full_sku = get_sku_name(sku)
return client.list_geo_regions(full_sku, linux_workers_enabled)
-
-
-def enable_zip_deploy(cmd, resource_group_name, name, src, slot=None):
- user_name, password = _get_site_credential(cmd.cli_ctx,
resource_group_name, name, slot)
- scm_url = _get_scm_url(cmd, resource_group_name, name, slot)
- zip_url = scm_url + '/api/zipdeploy'
-
- import urllib3
- authorization =
urllib3.util.make_headers(basic_auth='{0}:{1}'.format(user_name, password))
- headers = authorization
- headers['content-type'] = 'application/octet-stream'
-
- import requests
- import os
- # Read file content
- with open(os.path.realpath(os.path.expanduser(src)), 'rb') as fs:
- zip_content = fs.read()
- r = requests.post(zip_url, data=zip_content, headers=headers)
- if r.status_code != 200:
- raise CLIError("Zip deployment {} failed with status code '{}' and
reason '{}'".format(
- zip_url, r.status_code, r.text))
-
- # on successful deployment navigate to the app, display the latest
deployment json response
- response = requests.get(scm_url + '/api/deployments/latest',
headers=authorization)
- return response.json()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-cli-appservice-0.1.25/azure_cli_appservice.egg-info/PKG-INFO
new/azure-cli-appservice-0.1.31/azure_cli_appservice.egg-info/PKG-INFO
--- old/azure-cli-appservice-0.1.25/azure_cli_appservice.egg-info/PKG-INFO
2018-01-26 17:12:49.000000000 +0100
+++ new/azure-cli-appservice-0.1.31/azure_cli_appservice.egg-info/PKG-INFO
2018-04-06 19:33:30.000000000 +0200
@@ -1,11 +1,12 @@
Metadata-Version: 1.1
Name: azure-cli-appservice
-Version: 0.1.25
+Version: 0.1.31
Summary: Microsoft Azure Command-Line Tools AppService Command Module
Home-page: https://github.com/Azure/azure-cli
Author: Microsoft Corporation
Author-email: [email protected]
License: MIT
+Description-Content-Type: UNKNOWN
Description: Microsoft Azure CLI 'appservice' Command Module
===============================================
@@ -19,6 +20,34 @@
Release History
===============
+ 0.1.31
+ ++++++
+ * (Breaking change): remove `assign-identity` which was tagged
`deprecating` 2 releases ago
+ * webapp: capture the unhandled exception if the appservice plan
doesn't exist
+ * `sdist` is now compatible with wheel 0.31.0
+
+ 0.1.30
+ ++++++
+ * webapp: az webapp update supports httpsOnly
+ * webapp/functionapp: slot support for identity assign & identity show
+
+ 0.1.29
+ ++++++
+ * webapp/functionapp: author managed identity commands `identity
assign/show`, and deprecate `assign-identity`
+
+ 0.1.28
+ ++++++
+ * webapp: updating tests/code for sdk update
+
+ 0.1.27
+ ++++++
+ * appservice: list-location: Fixes the bug where 'Free' was reported
as an invalid SKU
+
+ 0.1.26
+ ++++++
+ * webapp backup/restore: Fix issue where restore command fails because
of a null reference
+ * appservice: support default app service plan through `az configure
--defaults appserviceplan=my-asp`
+
0.1.25
++++++
* fix broken webapp log tail/download
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-cli-appservice-0.1.25/azure_cli_appservice.egg-info/requires.txt
new/azure-cli-appservice-0.1.31/azure_cli_appservice.egg-info/requires.txt
--- old/azure-cli-appservice-0.1.25/azure_cli_appservice.egg-info/requires.txt
2018-01-26 17:12:49.000000000 +0100
+++ new/azure-cli-appservice-0.1.31/azure_cli_appservice.egg-info/requires.txt
2018-04-06 19:33:30.000000000 +0200
@@ -1,5 +1,5 @@
azure-cli-core
-azure-mgmt-web==0.34.1
+azure-mgmt-web==0.35.0
azure-mgmt-containerregistry==1.0.1
urllib3[secure]>=1.18
xmltodict
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-cli-appservice-0.1.25/setup.py
new/azure-cli-appservice-0.1.31/setup.py
--- old/azure-cli-appservice-0.1.25/setup.py 2018-01-26 17:12:23.000000000
+0100
+++ new/azure-cli-appservice-0.1.31/setup.py 2018-04-06 19:33:13.000000000
+0200
@@ -14,7 +14,7 @@
logger.warn("Wheel is not available, disabling bdist_wheel hook")
cmdclass = {}
-VERSION = "0.1.25"
+VERSION = "0.1.31"
CLASSIFIERS = [
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
@@ -31,7 +31,7 @@
DEPENDENCIES = [
'azure-cli-core',
- 'azure-mgmt-web==0.34.1',
+ 'azure-mgmt-web==0.35.0',
'azure-mgmt-containerregistry==1.0.1',
# v1.17 breaks on wildcard cert
https://github.com/shazow/urllib3/issues/981
'urllib3[secure]>=1.18',