Browse Source

Add additive_facts_to_overwrite instead of overwriting all additive_facts

Andrew Butcher 9 years ago
parent
commit
927e585bbe

+ 2 - 1
playbooks/common/openshift-master/config.yml

@@ -288,7 +288,8 @@
       role: master
       local_facts:
         named_certificates: "{{ hostvars.localhost.parsed_named_certificates | default([]) }}"
-      overwrite_additive_facts: "{{ overwrite_named_certs }}"
+      additive_facts_to_overwrite:
+      - "{{ 'master.named_certificates' if overwrite_named_certs | bool else omit }}"
   - name: Clear named certificates
     file:
       path: "{{ named_certs_dir }}"

+ 29 - 17
roles/openshift_facts/library/openshift_facts.py

@@ -864,13 +864,16 @@ def apply_provider_facts(facts, provider_facts):
     return facts
 
 
-def merge_facts(orig, new, overwrite_additive_facts):
+def merge_facts(orig, new, additive_facts_to_overwrite):
     """ Recursively merge facts dicts
 
         Args:
             orig (dict): existing facts
             new (dict): facts to update
-            overwrite_additive_facts (bool): overwrite additive facts
+
+            additive_facts_to_overwrite (list): additive facts to overwrite in jinja
+                                                '.' notation ex: ['master.named_certificates']
+
         Returns:
             dict: the merged facts
     """
@@ -879,8 +882,14 @@ def merge_facts(orig, new, overwrite_additive_facts):
     for key, value in orig.iteritems():
         if key in new:
             if isinstance(value, dict) and isinstance(new[key], dict):
-                facts[key] = merge_facts(value, new[key], overwrite_additive_facts)
-            elif key in additive_facts and not overwrite_additive_facts:
+                relevant_additive_facts = []
+                # Keep additive_facts_to_overwrite if key matches
+                for item in additive_facts_to_overwrite:
+                    if '.' in item and item.startswith(key + '.'):
+                        relevant_additive_facts.append(item)
+                facts[key] = merge_facts(value, new[key], relevant_additive_facts)
+            elif key in additive_facts and key not in [x.split('.')[-1] for x in additive_facts_to_overwrite]:
+                # Fact is additive so we'll combine orig and new.
                 if isinstance(value, list) and isinstance(new[key], list):
                     new_fact = []
                     for item in copy.deepcopy(value) + copy.copy(new[key]):
@@ -970,14 +979,15 @@ class OpenShiftFacts(object):
             role (str): role for setting local facts
             filename (str): local facts file to use
             local_facts (dict): local facts to set
-            overwrite_additive_facts (bool): overwrite additive facts
+            additive_facts_to_overwrite (list): additive facts to overwrite in jinja
+                                                '.' notation ex: ['master.named_certificates']
 
         Raises:
             OpenShiftFactsUnsupportedRoleError:
     """
     known_roles = ['common', 'master', 'node', 'master_sdn', 'node_sdn', 'dns', 'etcd']
 
-    def __init__(self, role, filename, local_facts, overwrite_additive_facts=False):
+    def __init__(self, role, filename, local_facts, additive_facts_to_overwrite=False):
         self.changed = False
         self.filename = filename
         if role not in self.known_roles:
@@ -986,26 +996,27 @@ class OpenShiftFacts(object):
             )
         self.role = role
         self.system_facts = ansible_facts(module)
-        self.facts = self.generate_facts(local_facts, overwrite_additive_facts)
+        self.facts = self.generate_facts(local_facts, additive_facts_to_overwrite)
 
-    def generate_facts(self, local_facts, overwrite_additive_facts):
+    def generate_facts(self, local_facts, additive_facts_to_overwrite):
         """ Generate facts
 
             Args:
                 local_facts (dict): local_facts for overriding generated
                                     defaults
-                overwrite_additive_facts (dict): overwrite additive facts
+                additive_facts_to_overwrite (list): additive facts to overwrite in jinja
+                                                    '.' notation ex: ['master.named_certificates']
 
             Returns:
                 dict: The generated facts
         """
-        local_facts = self.init_local_facts(local_facts, overwrite_additive_facts)
+        local_facts = self.init_local_facts(local_facts, additive_facts_to_overwrite)
         roles = local_facts.keys()
 
         defaults = self.get_defaults(roles)
         provider_facts = self.init_provider_facts()
         facts = apply_provider_facts(defaults, provider_facts)
-        facts = merge_facts(facts, local_facts, overwrite_additive_facts)
+        facts = merge_facts(facts, local_facts, additive_facts_to_overwrite)
         facts['current_config'] = get_current_config(facts)
         facts = set_url_facts_if_unset(facts)
         facts = set_project_cfg_facts_if_unset(facts)
@@ -1143,12 +1154,13 @@ class OpenShiftFacts(object):
         )
         return provider_facts
 
-    def init_local_facts(self, facts=None, overwrite_additive_facts=False):
+    def init_local_facts(self, facts=None, additive_facts_to_overwrite=False):
         """ Initialize the provider facts
 
             Args:
                 facts (dict): local facts to set
-                overwrite_additive_facts (bool): overwrite additive facts
+                additive_facts_to_overwrite (list): additive facts to overwrite in jinja
+                                                    '.' notation ex: ['master.named_certificates']
 
             Returns:
                 dict: The result of merging the provided facts with existing
@@ -1166,7 +1178,7 @@ class OpenShiftFacts(object):
                                                   basestring):
                 facts_to_set[arg] = module.from_json(facts_to_set[arg])
 
-        new_local_facts = merge_facts(local_facts, facts_to_set, overwrite_additive_facts)
+        new_local_facts = merge_facts(local_facts, facts_to_set, additive_facts_to_overwrite)
         for facts in new_local_facts.values():
             keys_to_delete = []
             for fact, value in facts.iteritems():
@@ -1196,7 +1208,7 @@ def main():
             role=dict(default='common', required=False,
                       choices=OpenShiftFacts.known_roles),
             local_facts=dict(default=None, type='dict', required=False),
-            overwrite_additive_facts=dict(default=False, type='bool', required=False),
+            additive_facts_to_overwrite=dict(default=[], type='list', required=False),
         ),
         supports_check_mode=True,
         add_file_common_args=True,
@@ -1204,10 +1216,10 @@ def main():
 
     role = module.params['role']
     local_facts = module.params['local_facts']
-    overwrite_additive_facts = module.params['overwrite_additive_facts']
+    additive_facts_to_overwrite = module.params['additive_facts_to_overwrite']
     fact_file = '/etc/ansible/facts.d/openshift.fact'
 
-    openshift_facts = OpenShiftFacts(role, fact_file, local_facts, overwrite_additive_facts)
+    openshift_facts = OpenShiftFacts(role, fact_file, local_facts, additive_facts_to_overwrite)
 
     file_params = module.params.copy()
     file_params['path'] = fact_file