From 83da2de9a0e9fbb3311169a3a05642e3ef2ad272 Mon Sep 17 00:00:00 2001 From: Yunge Zhu <37337818+yungezz@users.noreply.github.com> Date: Fri, 4 Jan 2019 16:32:36 +0800 Subject: [PATCH] azure_rm_webapp: fix updating app settings (#49181) --- .../modules/cloud/azure/azure_rm_webapp.py | 45 +++++++++---------- .../targets/azure_rm_webapp/tasks/main.yml | 22 +++++++-- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/lib/ansible/modules/cloud/azure/azure_rm_webapp.py b/lib/ansible/modules/cloud/azure/azure_rm_webapp.py index 010090af730..f34f80775c8 100644 --- a/lib/ansible/modules/cloud/azure/azure_rm_webapp.py +++ b/lib/ansible/modules/cloud/azure/azure_rm_webapp.py @@ -388,7 +388,7 @@ def webapp_to_dict(webapp): class Actions: - NoAction, CreateOrUpdate, UpdateAppSettings, Delete = range(4) + CreateOrUpdate, UpdateAppSettings, Delete = range(3) class AzureRMWebApps(AzureRMModuleBase): @@ -504,7 +504,7 @@ class AzureRMWebApps(AzureRMModuleBase): id=None, ) self.state = None - self.to_do = Actions.NoAction + self.to_do = [] self.frameworks = None @@ -642,7 +642,7 @@ class AzureRMWebApps(AzureRMModuleBase): self.log("Web App instance doesn't exist") to_be_updated = True - self.to_do = Actions.CreateOrUpdate + self.to_do.append(Actions.CreateOrUpdate) self.site.tags = self.tags # service plan is required for creation @@ -688,19 +688,19 @@ class AzureRMWebApps(AzureRMModuleBase): # check if root level property changed if self.is_updatable_property_changed(old_response): to_be_updated = True - self.to_do = Actions.CreateOrUpdate + self.to_do.append(Actions.CreateOrUpdate) # check if site_config changed old_config = self.get_webapp_configuration() if self.is_site_config_changed(old_config): to_be_updated = True - self.to_do = Actions.CreateOrUpdate + self.to_do.append(Actions.CreateOrUpdate) # check if linux_fx_version changed if old_config.linux_fx_version != self.site_config.get('linux_fx_version', ''): to_be_updated = True - self.to_do = Actions.CreateOrUpdate + self.to_do.append(Actions.CreateOrUpdate) self.app_settings_strDic = self.list_app_settings() @@ -708,11 +708,12 @@ class AzureRMWebApps(AzureRMModuleBase): if self.purge_app_settings: to_be_updated = True self.app_settings_strDic.properties = dict() + self.to_do.append(Actions.UpdateAppSettings) # check if app settings changed if self.purge_app_settings or self.is_app_settings_changed(): to_be_updated = True - self.to_do = Actions.CreateOrUpdate + self.to_do.append(Actions.UpdateAppSettings) if self.app_settings: for key in self.app_settings.keys(): @@ -740,11 +741,15 @@ class AzureRMWebApps(AzureRMModuleBase): if self.check_mode: return self.results - if self.to_do == Actions.CreateOrUpdate: + if Actions.CreateOrUpdate in self.to_do: response = self.create_update_webapp() self.results['id'] = response['id'] + if Actions.UpdateAppSettings in self.to_do: + update_response = self.update_app_settings() + self.results['id'] = update_response.id + webapp = None if old_response: webapp = old_response @@ -785,14 +790,12 @@ class AzureRMWebApps(AzureRMModuleBase): # comparing existing app setting with input, determine whether it's changed def is_app_settings_changed(self): if self.app_settings: - if len(self.app_settings_strDic.properties) != len(self.app_settings): - return True - - elif self.app_settings_strDic.properties and len(self.app_settings_strDic.properties) > 0: + if self.app_settings_strDic.properties: for key in self.app_settings.keys(): - if not self.app_settings_strDic.properties.get(key) \ - or self.app_settings[key] != self.app_settings_strDic.properties[key]: + if self.app_settings[key] != self.app_settings_strDic.properties.get(key, None): return True + else: + return True return False # comparing deployment source with input, determine wheather it's changed @@ -943,10 +946,8 @@ class AzureRMWebApps(AzureRMModuleBase): return response except CloudError as ex: - self.log("Failed to list application settings for web app {0} in resource group {1}".format( - self.name, self.resource_group)) - - return False + self.fail("Failed to list application settings for web app {0} in resource group {1}: {2}".format( + self.name, self.resource_group, str(ex))) def update_app_settings(self): ''' @@ -960,12 +961,10 @@ class AzureRMWebApps(AzureRMModuleBase): resource_group_name=self.resource_group, name=self.name, app_settings=self.app_settings_strDic) self.log("Response : {0}".format(response)) - return response.as_dict() + return response except CloudError as ex: - self.log("Failed to update application settings for web app {0} in resource group {1}".format( - self.name, self.resource_group)) - - return False + self.fail("Failed to update application settings for web app {0} in resource group {1}: {2}".format( + self.name, self.resource_group, str(ex))) def create_or_update_source_control(self): ''' diff --git a/test/integration/targets/azure_rm_webapp/tasks/main.yml b/test/integration/targets/azure_rm_webapp/tasks/main.yml index 309cf824fc4..4bce399b361 100644 --- a/test/integration/targets/azure_rm_webapp/tasks/main.yml +++ b/test/integration/targets/azure_rm_webapp/tasks/main.yml @@ -101,24 +101,38 @@ - output.webapps[0].app_settings | length == 1 - output.webapps[0].frameworks | length > 1 # there's default frameworks eg net_framework -- name: Update app settings +- name: Update app settings and framework azure_rm_webapp: resource_group: "{{ resource_group }}" name: "{{ win_app_name }}4" plan: "{{ win_plan_name }}" frameworks: - name: "java" - version: "1.8" + version: "1.7" settings: java_container: "Tomcat" - java_container_version: "8.0" + java_container_version: "8.5" app_settings: testkey2: "testvalue2" register: output - name: Assert the web app was updated assert: - that: output.changed + that: + - output.changed + +- name: get web app with name + azure_rm_webapp_facts: + resource_group: "{{ resource_group }}" + name: "{{ win_app_name }}4" + register: output + +- name: Assert updating + assert: + that: + - output.webapps[0].app_settings | length == 2 + - output.webapps[0].app_settings['testkey'] == 'testvalue' + - output.webapps[0].app_settings['testkey2'] == 'testvalue2' - name: get web app with return publishing profile azure_rm_webapp_facts: