From ff6d4e6bf4a34dce58ce4396430d22dfa74b9121 Mon Sep 17 00:00:00 2001
From: Bjorn Hansen <holomorph@gmail.com>
Date: Wed, 15 Aug 2018 20:35:39 -0700
Subject: [PATCH] =?UTF-8?q?azure=5Frm=5Fcommon:=20only=20remove=20tags=20f?=
 =?UTF-8?q?rom=20new=5Ftags=20if=20append=5Ftags=20is=20not=E2=80=A6=20(#2?=
 =?UTF-8?q?4040)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 lib/ansible/module_utils/azure_rm_common.py   | 21 +++++++++++--------
 .../azure_rm_publicipaddress/tasks/main.yml   |  7 ++-----
 .../azure_rm_securitygroup/tasks/main.yml     |  2 ++
 .../azure_rm_storageaccount/tasks/main.yml    |  3 +++
 .../azure_rm_virtualnetwork/tasks/main.yml    |  1 +
 5 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/lib/ansible/module_utils/azure_rm_common.py b/lib/ansible/module_utils/azure_rm_common.py
index 896e5e93c7a..61c27988b9f 100644
--- a/lib/ansible/module_utils/azure_rm_common.py
+++ b/lib/ansible/module_utils/azure_rm_common.py
@@ -464,17 +464,20 @@ class AzureRMModuleBase(object):
         :return: bool, dict
         '''
         new_tags = copy.copy(tags) if isinstance(tags, dict) else dict()
+        param_tags = self.module.params.get('tags') if isinstance(self.module.params.get('tags'), dict) else dict()
+        append_tags = self.module.params.get('append_tags') if self.module.params.get('append_tags') is not None else True
         changed = False
-        if isinstance(self.module.params.get('tags'), dict):
-            for key, value in self.module.params['tags'].items():
-                if not new_tags.get(key) or new_tags[key] != value:
+        # check add or update
+        for key, value in param_tags.items():
+            if not new_tags.get(key) or new_tags[key] != value:
+                changed = True
+                new_tags[key] = value
+        # check remove
+        if not append_tags:
+            for key, value in tags.items():
+                if not param_tags.get(key):
+                    new_tags.pop(key)
                     changed = True
-                    new_tags[key] = value
-            if isinstance(tags, dict):
-                for key, value in tags.items():
-                    if not self.module.params['tags'].get(key):
-                        new_tags.pop(key)
-                        changed = True
         return changed, new_tags
 
     def has_tags(self, obj_tags, tag_list):
diff --git a/test/integration/targets/azure_rm_publicipaddress/tasks/main.yml b/test/integration/targets/azure_rm_publicipaddress/tasks/main.yml
index 16b22a1e8a5..91f67750b10 100644
--- a/test/integration/targets/azure_rm_publicipaddress/tasks/main.yml
+++ b/test/integration/targets/azure_rm_publicipaddress/tasks/main.yml
@@ -33,9 +33,6 @@
       name: "pip{{ rpfx }}"
       allocation_method: Static
       domain_name: "{{ domain_name }}"
-      tags:
-          testing: testing
-          delete: on-exit
   register: output
 
 - assert:
@@ -45,8 +42,8 @@
   azure_rm_publicipaddress:
       resource_group: "{{ resource_group }}"
       name: "pip{{ rpfx }}"
+      append_tags: yes
       tags:
-          testing: testing
           delete: never
           foo: bar
   register: output
@@ -70,7 +67,7 @@
   azure_rm_publicipaddress:
       resource_group: "{{ resource_group }}"
       name: "pip{{ rpfx }}"
-      tags: {}
+      append_tags: no
   register: output
 
 - assert:
diff --git a/test/integration/targets/azure_rm_securitygroup/tasks/main.yml b/test/integration/targets/azure_rm_securitygroup/tasks/main.yml
index 74968fdfdb7..073c10bffa7 100644
--- a/test/integration/targets/azure_rm_securitygroup/tasks/main.yml
+++ b/test/integration/targets/azure_rm_securitygroup/tasks/main.yml
@@ -94,6 +94,7 @@
           testing: testing
           delete: never
           baz: bar
+      append_tags: false
   register: output
 
 - assert:
@@ -105,6 +106,7 @@
   azure_rm_securitygroup:
       resource_group: "{{ resource_group }}"
       name: "{{ secgroupname }}"
+      append_tags: false
       tags:
           testing: testing
           delete: on-exit
diff --git a/test/integration/targets/azure_rm_storageaccount/tasks/main.yml b/test/integration/targets/azure_rm_storageaccount/tasks/main.yml
index ec1dc70c4d8..a315be4a029 100644
--- a/test/integration/targets/azure_rm_storageaccount/tasks/main.yml
+++ b/test/integration/targets/azure_rm_storageaccount/tasks/main.yml
@@ -24,6 +24,7 @@
        resource_group: "{{ resource_group }}" 
        name: "{{ storage_account }}"
        account_type: Standard_LRS
+       append_tags: no
        tags:
            test: test
            galaxy: galaxy
@@ -72,6 +73,7 @@
    azure_rm_storageaccount:
        resource_group: "{{ resource_group }}"
        name: "{{ storage_account }}"
+       append_tags: no
        tags:
            testing: testing
            delete: never
@@ -87,6 +89,7 @@
    azure_rm_storageaccount:
        resource_group: "{{ resource_group }}"
        name: "{{ storage_account }}"
+       append_tags: no
        tags:
            testing: testing
            delete: never
diff --git a/test/integration/targets/azure_rm_virtualnetwork/tasks/main.yml b/test/integration/targets/azure_rm_virtualnetwork/tasks/main.yml
index b42378e897c..0c1dc76cb93 100644
--- a/test/integration/targets/azure_rm_virtualnetwork/tasks/main.yml
+++ b/test/integration/targets/azure_rm_virtualnetwork/tasks/main.yml
@@ -102,6 +102,7 @@
 - name: Purge tags
   azure_rm_virtualnetwork:
     name: "{{ vnetname }}"
+    append_tags: no
     tags:
       testing: 'always'
     resource_group: "{{ resource_group }}"