def _test_helper(self, init_db, expected_ret, replace, delete_others=False): _init_db(copy.deepcopy(init_db)) old = _dump_db() new = _dump_db() expected_db = copy.deepcopy(init_db) for dn, attrs in replace.items(): for attr, vals in attrs.items(): vals = [to_bytes(val) for val in vals] if vals: new.setdefault(dn, {})[attr] = list(OrderedSet(vals)) expected_db.setdefault(dn, {})[attr] = OrderedSet(vals) elif dn in expected_db: new[dn].pop(attr, None) expected_db[dn].pop(attr, None) if not expected_db.get(dn, {}): new.pop(dn, None) expected_db.pop(dn, None) if delete_others: dn_to_delete = OrderedSet() for dn, attrs in expected_db.items(): if dn in replace: to_delete = OrderedSet() for attr, vals in attrs.items(): if attr not in replace[dn]: to_delete.add(attr) for attr in to_delete: del attrs[attr] del new[dn][attr] if not attrs: dn_to_delete.add(dn) for dn in dn_to_delete: del new[dn] del expected_db[dn] name = "ldapi:///" expected_ret["name"] = name expected_ret.setdefault("result", True) expected_ret.setdefault("comment", "Successfully updated LDAP entries") expected_ret.setdefault( "changes", { dn: { "old": { attr: vals for attr, vals in old[dn].items() if vals != new.get(dn, {}).get(attr, ()) } if dn in old else None, "new": { attr: vals for attr, vals in new[dn].items() if vals != old.get(dn, {}).get(attr, ()) } if dn in new else None, } for dn in replace if old.get(dn, {}) != new.get(dn, {}) }, ) entries = [ {dn: [{"replace": attrs}, {"delete_others": delete_others}]} for dn, attrs in replace.items() ] actual = salt.states.ldap.managed(name, entries) self.assertDictEqual(expected_ret, actual) self.assertDictEqual(expected_db, db)
def _test_helper(self, init_db, expected_ret, replace, delete_others=False): _init_db(copy.deepcopy(init_db)) old = _dump_db() new = _dump_db() expected_db = copy.deepcopy(init_db) for dn, attrs in six.iteritems(replace): for attr, vals in six.iteritems(attrs): if len(vals): new.setdefault(dn, {})[attr] = list(OrderedSet(vals)) expected_db.setdefault(dn, {})[attr] = OrderedSet(vals) elif dn in expected_db: new[dn].pop(attr, None) expected_db[dn].pop(attr, None) if not len(expected_db.get(dn, {})): new.pop(dn, None) expected_db.pop(dn, None) if delete_others: dn_to_delete = OrderedSet() for dn, attrs in six.iteritems(expected_db): if dn in replace: to_delete = OrderedSet() for attr, vals in six.iteritems(attrs): if attr not in replace[dn]: to_delete.add(attr) for attr in to_delete: del attrs[attr] del new[dn][attr] if not len(attrs): dn_to_delete.add(dn) for dn in dn_to_delete: del new[dn] del expected_db[dn] name = 'ldapi:///' expected_ret['name'] = name expected_ret.setdefault('result', True) expected_ret.setdefault('comment', 'Successfully updated LDAP entries') expected_ret.setdefault( 'changes', dict(((dn, { 'old': dict((attr, vals) for attr, vals in six.iteritems(old[dn]) if vals != new.get(dn, {}).get(attr, ())) if dn in old else None, 'new': dict((attr, vals) for attr, vals in six.iteritems(new[dn]) if vals != old.get(dn, {}).get(attr, ())) if dn in new else None }) for dn in replace if old.get(dn, {}) != new.get(dn, {})))) entries = [{ dn: [{ 'replace': attrs }, { 'delete_others': delete_others }] } for dn, attrs in six.iteritems(replace)] actual = salt.states.ldap.managed(name, entries) self.assertDictEqual(expected_ret, actual) self.assertDictEqual(expected_db, db)
def _test_helper_add(db, expected_ret, add_items, delete_others=False): old = db.dump_db() new = db.dump_db() expected_db = copy.deepcopy(db.db) for dn, attrs in add_items.items(): for attr, vals in attrs.items(): vals = [to_bytes(val) for val in vals] vals.extend(old.get(dn, {}).get(attr, OrderedSet())) vals.sort() if vals: new.setdefault(dn, {})[attr] = list(OrderedSet(vals)) expected_db.setdefault(dn, {})[attr] = OrderedSet(vals) elif dn in expected_db: new[dn].pop(attr, None) expected_db[dn].pop(attr, None) if not expected_db.get(dn, {}): new.pop(dn, None) expected_db.pop(dn, None) if delete_others: dn_to_delete = OrderedSet() for dn, attrs in expected_db.items(): if dn in add_items: to_delete = OrderedSet() for attr, vals in attrs.items(): if attr not in add_items[dn]: to_delete.add(attr) for attr in to_delete: del attrs[attr] del new[dn][attr] if not attrs: dn_to_delete.add(dn) for dn in dn_to_delete: del new[dn] del expected_db[dn] name = "ldapi:///" expected_ret["name"] = name expected_ret.setdefault("result", True) expected_ret.setdefault("comment", "Successfully updated LDAP entries") expected_ret.setdefault( "changes", { dn: { "old": { attr: vals for attr, vals in old[dn].items() if vals != new.get(dn, {}).get(attr, ()) } if dn in old else None, "new": { attr: vals for attr, vals in new[dn].items() if vals != old.get(dn, {}).get(attr, ()) } if dn in new else None, } for dn in add_items if old.get(dn, {}) != new.get(dn, {}) }, ) entries = [{ dn: [{ "add": attrs }, { "delete_others": delete_others }] } for dn, attrs in add_items.items()] actual = salt.states.ldap.managed(name, entries) assert expected_ret == actual assert expected_db == db.db