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


Reply via email to