def initialize(phynetset, lognetset, logportset, phyportset): if phynetset is None: phynetset = PhysicalNetworkSet() phynetset.set = DataObjectSet() if lognetset is None: lognetset = LogicalNetworkSet() lognetset.set = DataObjectSet() if logportset is None: logportset = LogicalPortSet() logportset.set = DataObjectSet() if phyportset is None: phyportset = PhysicalPortSet() phyportset.set = DataObjectSet() return [phynetset, lognetset, logportset, phyportset]
def updater_with_key(keys, values, timestamp): # Automatically manage extra keys remove_uniquekeys = [] remove_multikeys = [] update_uniquekeys = [] update_multikeys = [] keystart = orig_len + len(auto_remove_keys) for v in values[:keystart]: if v is not None: if hasattr(v, 'kvdb_uniquekeys'): remove_uniquekeys.extend((k, v.create_weakreference()) for k in v.kvdb_uniquekeys()) if hasattr(v, 'kvdb_multikeys'): remove_multikeys.extend((k, v.create_weakreference()) for k in v.kvdb_multikeys()) if self.debuggingupdater: # Updater may be called more than once, ensure that this updater does not crash # on multiple calls kc = keys[:orig_len] vc = [ v.clone_instance() if v is not None and hasattr(v, 'clone_instance') else deepcopy(v) for v in values[:orig_len] ] if withtime: updated_keys, updated_values = updater(kc, vc, timestamp) else: updated_keys, updated_values = updater(kc, vc) if withtime: updated_keys, updated_values = updater(keys[:orig_len], values[:orig_len], timestamp) else: updated_keys, updated_values = updater(keys[:orig_len], values[:orig_len]) for v in updated_values: if v is not None: if hasattr(v, 'kvdb_uniquekeys'): update_uniquekeys.extend((k, v.create_weakreference()) for k in v.kvdb_uniquekeys()) if hasattr(v, 'kvdb_multikeys'): update_multikeys.extend((k, v.create_weakreference()) for k in v.kvdb_multikeys()) extrakeysdict = dict( zip(keys[keystart:keystart + len(extra_keys)], values[keystart:keystart + len(extra_keys)])) extrakeysetdict = dict( zip( keys[keystart + len(extra_keys):keystart + len(extra_keys) + len(extra_key_set)], values[keystart + len(extra_keys):keystart + len(extra_keys) + len(extra_key_set)])) tempdict = {} old_values = dict(zip(keys, values)) updated_keyset = set(updated_keys) try: append_remove = set() autoremove_keys = set() # Use DFS to find auto remove keys def dfs(k): if k in autoremove_keys: return autoremove_keys.add(k) if k not in old_values: append_remove.add(k) else: oldv = old_values[k] if oldv is not None and hasattr( oldv, 'kvdb_autoremove'): for k2 in oldv.kvdb_autoremove(): dfs(k2) for k, v in zip(updated_keys, updated_values): if v is None: dfs(k) if append_remove: raise _NeedMoreKeysException() for k, v in remove_uniquekeys: if v.getkey() not in updated_keyset and v.getkey( ) not in auto_remove_keys: # This key is not updated, keep the indices untouched continue if k not in extrakeysdict: raise _NeedMoreKeysException() elif extrakeysdict[k] is not None and extrakeysdict[ k].ref.getkey() == v.getkey(): # If the unique key does not reference to the correct object # there may be an error, but we ignore this. # Save in a temporary dictionary. We may restore it later. tempdict[k] = extrakeysdict[k] extrakeysdict[k] = None setkey = UniqueKeyReference.get_keyset_from_key(k) if setkey not in extrakeysetdict: raise _NeedMoreKeysException() else: ks = extrakeysetdict[setkey] if ks is None: ks = UniqueKeySet.create_from_key(setkey) extrakeysetdict[setkey] = ks ks.set.dataset().discard(WeakReferenceObject(k)) for k, v in remove_multikeys: if v.getkey() not in updated_keyset and v.getkey( ) not in auto_remove_keys: # This key is not updated, keep the indices untouched continue if k not in extrakeysdict: raise _NeedMoreKeysException() else: mk = extrakeysdict[k] if mk is not None: mk.set.dataset().discard(v) if not mk.set.dataset(): tempdict[k] = extrakeysdict[k] extrakeysdict[k] = None setkey = MultiKeyReference.get_keyset_from_key( k) if setkey not in extrakeysetdict: raise _NeedMoreKeysException() else: ks = extrakeysetdict[setkey] if ks is None: ks = MultiKeySet.create_from_key( setkey) extrakeysetdict[setkey] = ks ks.set.dataset().discard( WeakReferenceObject(k)) for k, v in update_uniquekeys: if k not in extrakeysdict: raise _NeedMoreKeysException() elif extrakeysdict[k] is not None and extrakeysdict[ k].ref.getkey() != v.getkey(): raise AlreadyExistsException('Unique key conflict for %r and %r, with key %r' % \ (extrakeysdict[k].ref.getkey(), v.getkey(), k)) elif extrakeysdict[k] is None: lv = tempdict.get(k, None) if lv is not None and lv.ref.getkey() == v.getkey(): # Restore this value nv = lv else: nv = UniqueKeyReference.create_from_key(k) nv.ref = ReferenceObject(v.getkey()) extrakeysdict[k] = nv setkey = UniqueKeyReference.get_keyset_from_key(k) if setkey not in extrakeysetdict: raise _NeedMoreKeysException() else: ks = extrakeysetdict[setkey] if ks is None: ks = UniqueKeySet.create_from_key(setkey) extrakeysetdict[setkey] = ks ks.set.dataset().add(nv.create_weakreference()) for k, v in update_multikeys: if k not in extrakeysdict: raise _NeedMoreKeysException() else: mk = extrakeysdict[k] if mk is None: mk = tempdict.get(k, None) if mk is None: mk = MultiKeyReference.create_from_key(k) mk.set = DataObjectSet() setkey = MultiKeyReference.get_keyset_from_key(k) if setkey not in extrakeysetdict: raise _NeedMoreKeysException() else: ks = extrakeysetdict[setkey] if ks is None: ks = MultiKeySet.create_from_key(setkey) extrakeysetdict[setkey] = ks ks.set.dataset().add(mk.create_weakreference()) mk.set.dataset().add(v) extrakeysdict[k] = mk except _NeedMoreKeysException: # Prepare the keys extra_keys[:] = list( set( itertools.chain((k for k, v in remove_uniquekeys if v.getkey() in updated_keyset or v.getkey() in autoremove_keys), (k for k, v in remove_multikeys if v.getkey() in updated_keyset or v.getkey() in autoremove_keys), (k for k, _ in update_uniquekeys), (k for k, _ in update_multikeys)))) extra_key_set[:] = list( set( itertools.chain( (UniqueKeyReference.get_keyset_from_key(k) for k, v in remove_uniquekeys if v.getkey() in updated_keyset or v.getkey() in autoremove_keys), (MultiKeyReference.get_keyset_from_key(k) for k, v in remove_multikeys if v.getkey() in updated_keyset or v.getkey() in autoremove_keys), (UniqueKeyReference.get_keyset_from_key(k) for k, _ in update_uniquekeys), (MultiKeyReference.get_keyset_from_key(k) for k, _ in update_multikeys)))) auto_remove_keys.clear() auto_remove_keys.update( autoremove_keys.difference(keys[:orig_len]).difference( extra_keys).difference(extra_key_set)) raise else: extrakeys_list = list(extrakeysdict.items()) extrakeyset_list = list(extrakeysetdict.items()) autoremove_list = list( autoremove_keys.difference(updated_keys).difference( extrakeysdict.keys()).difference( extrakeysetdict.keys())) return (tuple( itertools.chain(updated_keys, (k for k, _ in extrakeys_list), (k for k, _ in extrakeyset_list), autoremove_list)), tuple( itertools.chain(updated_values, (v for _, v in extrakeys_list), (v for _, v in extrakeyset_list), [None] * len(autoremove_list))))
def __init__(self, prefix=None, deleted=None): super(SubNetMap, self).__init__( prefix=prefix, deleted=deleted) self.allocated_ips = dict() self.routers = DataObjectSet() self.routerports = dict()
def __init__(self,prefix = None,deleted = None): super(LogicalPortSet,self).__init__(prefix = prefix, deleted = deleted) self.set = DataObjectSet()
def __init__(self,prefix = None,deleted = None): super(LogicalNetworkMap,self).__init__( prefix = prefix,deleted = deleted) self.ports = DataObjectSet() self.subnets = DataObjectSet()
def __init__(self,prefix = None,deleted = None): super(PhysicalNetworkSet,self).__init__( prefix = prefix,deleted = deleted) self.set = DataObjectSet()
def __init__(self,prefix=None,deleted=None): super(VRouterSet,self).__init__(prefix=prefix,deleted=deleted) self.set = DataObjectSet()
def __init__(self, prefix = None, deleted = False): super(PhysicalNetworkMap,self).__init__( prefix = prefix,deleted = deleted) self.logicnetworks = DataObjectSet() self.network_allocation = dict() self.ports = DataObjectSet()
def __init__(self,prefix=None,deleted=None): super(VRouter,self).__init__(prefix=prefix,deleted=deleted) self.interfaces = DataObjectSet() self.routes = list()
def __init__(self, prefix=None, deleted=False): DataObject.__init__(self, prefix=prefix, deleted=deleted) self.ports = DataObjectSet()
def __init__(self, prefix=None, deleted=False): DataObject.__init__(self, prefix=prefix, deleted=deleted) self.networks = DataObjectSet() self.network_allocation = dict() self.ports = DataObjectSet()