Exemple #1
0
 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]
Exemple #2
0
        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))))
Exemple #3
0
 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()
Exemple #4
0
 def __init__(self,prefix = None,deleted = None):
     super(LogicalPortSet,self).__init__(prefix = prefix,
             deleted = deleted)
     self.set = DataObjectSet()
Exemple #5
0
 def __init__(self,prefix = None,deleted = None):
     super(LogicalNetworkMap,self).__init__(
             prefix = prefix,deleted = deleted)
     self.ports = DataObjectSet()
     self.subnets = DataObjectSet()
Exemple #6
0
    def __init__(self,prefix = None,deleted = None):
        super(PhysicalNetworkSet,self).__init__(
                prefix = prefix,deleted = deleted)

        self.set = DataObjectSet()
Exemple #7
0
 def __init__(self,prefix=None,deleted=None):
     super(VRouterSet,self).__init__(prefix=prefix,deleted=deleted)
     self.set = DataObjectSet()
Exemple #8
0
 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()
Exemple #9
0
 def __init__(self,prefix=None,deleted=None):
     super(VRouter,self).__init__(prefix=prefix,deleted=deleted)
     self.interfaces = DataObjectSet()
     self.routes = list()
Exemple #10
0
 def __init__(self, prefix=None, deleted=False):
     DataObject.__init__(self, prefix=prefix, deleted=deleted)
     self.ports = DataObjectSet()
Exemple #11
0
 def __init__(self, prefix=None, deleted=False):
     DataObject.__init__(self, prefix=prefix, deleted=deleted)
     self.networks = DataObjectSet()
     self.network_allocation = dict()
     self.ports = DataObjectSet()