summaryrefslogtreecommitdiffstats
path: root/ipaserver/install/ldapupdate.py
diff options
context:
space:
mode:
authorMartin Basti <mbasti@redhat.com>2015-03-06 15:14:17 +0100
committerTomas Babej <tbabej@redhat.com>2015-03-19 12:37:09 +0100
commit0c7274ead8670951b1f07039b68014b06418024d (patch)
treedf2fdd02331a4565efbd4d0a844fb73f3c44b9a4 /ipaserver/install/ldapupdate.py
parent144bc6c1ebc29cc0bbe54d8f8a6bc5a6cf026a90 (diff)
downloadfreeipa-0c7274ead8670951b1f07039b68014b06418024d.tar.gz
freeipa-0c7274ead8670951b1f07039b68014b06418024d.tar.xz
freeipa-0c7274ead8670951b1f07039b68014b06418024d.zip
Server Upgrade: Update entries in order specified in file
Dictionary replaced with list. Particular upgrades are executed in the same order as they are specified in update a file. Different updates for the smae cn, are not merged into one upgrade https://fedorahosted.org/freeipa/ticket/4904 Reviewed-By: David Kupka <dkupka@redhat.com>
Diffstat (limited to 'ipaserver/install/ldapupdate.py')
-rw-r--r--ipaserver/install/ldapupdate.py75
1 files changed, 13 insertions, 62 deletions
diff --git a/ipaserver/install/ldapupdate.py b/ipaserver/install/ldapupdate.py
index 92b6d56ae..3e4fc3f7a 100644
--- a/ipaserver/install/ldapupdate.py
+++ b/ipaserver/install/ldapupdate.py
@@ -137,22 +137,20 @@ class LDAPUpdate:
4: 'cn=bob,ou=people,dc=example,dc=com',
}
- all_updates = {
- 'dn': 'cn=config,dc=example,dc=com':
+ all_updates = [
{
'dn': 'cn=config,dc=example,dc=com',
'default': ['attr1':default1'],
'updates': ['action:attr1:value1',
'action:attr2:value2]
},
- 'dn': 'cn=bob,ou=people,dc=example,dc=com':
{
'dn': 'cn=bob,ou=people,dc=example,dc=com',
'default': ['attr3':default3'],
'updates': ['action:attr3:value3',
'action:attr4:value4],
}
- }
+ ]
The default and update lists are "dispositions"
@@ -279,49 +277,6 @@ class LDAPUpdate:
if fd != sys.stdin: fd.close()
return text
- def _combine_updates(self, all_updates, update):
- 'Combine a new update with the list of total updates'
- dn = update.get('dn')
- assert isinstance(dn, DN)
-
- if not all_updates.get(dn):
- all_updates[dn] = update
- return
-
- existing_update = all_updates[dn]
- if 'default' in update:
- disposition_list = existing_update.setdefault('default', [])
- disposition_list.extend(update['default'])
- elif 'updates' in update:
- disposition_list = existing_update.setdefault('updates', [])
- disposition_list.extend(update['updates'])
- else:
- self.debug("Unknown key in updates %s" % update.keys())
-
- def merge_updates(self, all_updates, updates):
- '''
- Add the new_update dict to the all_updates dict. If an entry
- in the new_update already has an entry in all_updates merge
- the two entries sensibly assuming the new entries take
- precedence. Otherwise just add the new entry.
- '''
-
- for new_update in updates:
- for new_dn, new_entry in new_update.iteritems():
- existing_entry = all_updates.get(new_dn)
- if existing_entry:
- # If the existing entry is marked for deletion but the
- # new entry is not also a delete then clear the delete
- # flag otherwise the newer update will be lost.
- if existing_entry.has_key('deleteentry') and not new_entry.has_key('deleteentry'):
- self.warning("ldapupdate: entry '%s' previously marked for deletion but" +
- " this subsequent update reestablishes it: %s", new_dn, new_entry)
- del existing_entry['deleteentry']
- existing_entry.update(new_entry)
- else:
- all_updates[new_dn] = new_entry
-
-
def parse_update_file(self, data_source_name, source_data, all_updates):
"""Parse the update file into a dictonary of lists and apply the update
for each DN in the file."""
@@ -380,11 +335,12 @@ class LDAPUpdate:
def emit_update(update):
'''
- When processing a dn is completed emit the update by merging it into
- the set of all updates.
+ When processing a dn is completed emit the update by appending it
+ into list of all updates
'''
-
- self._combine_updates(all_updates, update)
+ dn = update.get('dn')
+ assert isinstance(dn, DN)
+ all_updates.append(update)
# Iterate over source input lines
for source_line in source_data:
@@ -421,7 +377,6 @@ class LDAPUpdate:
continue
else:
emit_item(logical_line)
- logical_line = ''
logical_line = source_line
if dn is not None:
@@ -784,11 +739,10 @@ class LDAPUpdate:
raise RuntimeError("Offline updates are not supported.")
def _run_updates(self, all_updates):
-
- for dn, update in all_updates.iteritems():
+ for update in all_updates:
self._update_record(update)
- for dn, update in all_updates.iteritems():
+ for update in all_updates:
self._delete_record(update)
def update(self, files, ordered=False):
@@ -798,16 +752,14 @@ class LDAPUpdate:
returns True if anything was changed, otherwise False
"""
self.modified = False
- all_updates = {}
+ all_updates = []
try:
self.create_connection()
if self.plugins:
self.info('PRE_UPDATE')
updates = api.Backend.updateclient.update(PRE_UPDATE, self.dm_password, self.ldapi, self.live_run)
- self.merge_updates(all_updates, updates)
# flush out PRE_UPDATE plugin updates before we begin
- self._run_updates(all_updates)
- all_updates = {}
+ self._run_updates(updates)
upgrade_files = files
if ordered:
@@ -823,13 +775,12 @@ class LDAPUpdate:
self.parse_update_file(f, data, all_updates)
self._run_updates(all_updates)
- all_updates = {}
+ all_updates = []
if self.plugins:
self.info('POST_UPDATE')
updates = api.Backend.updateclient.update(POST_UPDATE, self.dm_password, self.ldapi, self.live_run)
- self.merge_updates(all_updates, updates)
- self._run_updates(all_updates)
+ self._run_updates(updates)
finally:
self.close_connection()