From 39e6075f2902a56ce133d5f80703ce0e486d7446 Mon Sep 17 00:00:00 2001 From: Sam Yaple Date: Sun, 5 Jul 2015 07:03:12 +0000 Subject: [PATCH] make merge_configs idempotent merge_configs can now check if the destination file has the same content will be written. This information is used to inform ansible no change has occured Closes-Bug: 1471514 Change-Id: I78bce04505349d5aafbb027fd3f7d76ab6eccf6a --- ansible/library/merge_configs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/ansible/library/merge_configs b/ansible/library/merge_configs index b1baeb3d14..61d667be7f 100644 --- a/ansible/library/merge_configs +++ b/ansible/library/merge_configs @@ -14,9 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# TODO(SamYaple): Provide idempotency for module (Note to self: pull logic from -# pervious bslurp module in yaodu) - DOCUMENTATION = ''' --- module: merge_configs @@ -54,6 +51,8 @@ Merge multiple configs: ''' import ConfigParser +from hashlib import sha1 +from StringIO import StringIO def main(): module = AnsibleModule( @@ -67,17 +66,27 @@ def main(): sources = module.params.pop('sources') dest = module.params.pop('dest') + changed = False + dest_digest = None + fakedest = StringIO() + config = ConfigParser.ConfigParser() for source_file in sources: config.read(source_file) - with open(dest, 'wb') as dest_file: - config.write(dest_file) + if os.path.exists(dest) and os.access(dest, os.R_OK): + config.write(fakedest) + with open(dest, 'rb') as f: + dest_digest = sha1(f.read()).hexdigest() - module.exit_json(changed=True) + if dest_digest != sha1(fakedest.getvalue()).hexdigest(): + changed = True + with open(dest, 'wb') as f: + config.write(f) + + module.exit_json(changed=changed) except Exception, e: - changed = True module.exit_json(failed=True, changed=changed, msg=repr(e))