Loading ccserver/db.py +37 −35 Original line number Diff line number Diff line Loading @@ -2,11 +2,13 @@ tags database provided in cc-commons. """ from abc import abstractproperty from datetime import datetime from collections import defaultdict from sjrpc.core import AsyncWatcher from cloudcontrol.common.tql.db.tag import BaseTag from cloudcontrol.common.tql.db.tag import BaseTag, BaseTagInterface from cloudcontrol.common.tql.db.object import TqlObject from cloudcontrol.common.tql.db.requestor import StaticRequestor, fetcher Loading @@ -16,56 +18,55 @@ class SObject(TqlObject): """ A TQL object with features specific to cc-server. """ def __init__(self, *args, **kwargs): super(SObject, self).__init__(*args, **kwargs) self._overridden = defaultdict(lambda: []) def register(self, tag, override=False): """ Register a tag on this object (or override). """ # If the tag must override another one, move the old one on the # overridden tags dict: if override: self._tags[tag.name] = OverrideTag(tag.name, tag, self._tags.get(tag.name)) else: if tag.name in self._tags: self._overridden[tag.name].append(self._tags[tag.name]) del self._tags[tag.name] return super(SObject, self).register(tag) def unregister(self, name, override=False): """ Unregister a tag on this object (or remove override). """ if override: if isinstance(self._tags.get(name), OverrideTag): if self._tags[name].replaced is not None: self._tags[name] = self._tags[name].replaced else: super(SObject, self).unregister(name) else: if isinstance(self._tags.get(name), OverrideTag): self._tags[name].replaced = None else: super(SObject, self).unregister(name) # If a tag is overriden, replace it on the tag list: if override and name in self._overridden: self._tags[name] = self._overridden[name].pop() def is_overriding(self, name): """ Return True if a tag is overriding another one for the name. If the tag is not found, False is returned. """ return isinstance(self._tags.get(name), OverrideTag) return bool(self._overridden[name]) class OverrideTag(BaseTag): class CCSAsyncTagInterface(BaseTagInterface): """ A tag to override another one. @abstractproperty def client(self): """ The client on which do the fetch. """ def __init__(self, name, override, replaced=None): super(OverrideTag, self).__init__(name) self.override = override self.replaced = replaced self.interface = self.override.interface @property def value(self): return self.override.value @abstractproperty def cached(self): """ The cached value stored in the tag. Can raise an OutdatedCacheError if the cache is out of date. """ @value.setter def value(self, value): self.override.value = value @cached.setter def cached(self): """ Write the new cached value. """ class RemoteTag(BaseTag): Loading @@ -73,8 +74,6 @@ class RemoteTag(BaseTag): """ A tag which is available remotely on a client. """ interface = 'cc-server.async' def __init__(self, name, client, ttl=None): super(RemoteTag, self).__init__(name) self._client = client Loading Loading @@ -125,9 +124,12 @@ class RemoteTag(BaseTag): pass CCSAsyncTagInterface.register(RemoteTag) class SRequestor(StaticRequestor): @fetcher('cc-server.async') @fetcher(CCSAsyncTagInterface) def fetcher_ccs_async(self, map): """ Fetching method using asynchronous call from sjrpc to get values from the remote client. Loading Loading
ccserver/db.py +37 −35 Original line number Diff line number Diff line Loading @@ -2,11 +2,13 @@ tags database provided in cc-commons. """ from abc import abstractproperty from datetime import datetime from collections import defaultdict from sjrpc.core import AsyncWatcher from cloudcontrol.common.tql.db.tag import BaseTag from cloudcontrol.common.tql.db.tag import BaseTag, BaseTagInterface from cloudcontrol.common.tql.db.object import TqlObject from cloudcontrol.common.tql.db.requestor import StaticRequestor, fetcher Loading @@ -16,56 +18,55 @@ class SObject(TqlObject): """ A TQL object with features specific to cc-server. """ def __init__(self, *args, **kwargs): super(SObject, self).__init__(*args, **kwargs) self._overridden = defaultdict(lambda: []) def register(self, tag, override=False): """ Register a tag on this object (or override). """ # If the tag must override another one, move the old one on the # overridden tags dict: if override: self._tags[tag.name] = OverrideTag(tag.name, tag, self._tags.get(tag.name)) else: if tag.name in self._tags: self._overridden[tag.name].append(self._tags[tag.name]) del self._tags[tag.name] return super(SObject, self).register(tag) def unregister(self, name, override=False): """ Unregister a tag on this object (or remove override). """ if override: if isinstance(self._tags.get(name), OverrideTag): if self._tags[name].replaced is not None: self._tags[name] = self._tags[name].replaced else: super(SObject, self).unregister(name) else: if isinstance(self._tags.get(name), OverrideTag): self._tags[name].replaced = None else: super(SObject, self).unregister(name) # If a tag is overriden, replace it on the tag list: if override and name in self._overridden: self._tags[name] = self._overridden[name].pop() def is_overriding(self, name): """ Return True if a tag is overriding another one for the name. If the tag is not found, False is returned. """ return isinstance(self._tags.get(name), OverrideTag) return bool(self._overridden[name]) class OverrideTag(BaseTag): class CCSAsyncTagInterface(BaseTagInterface): """ A tag to override another one. @abstractproperty def client(self): """ The client on which do the fetch. """ def __init__(self, name, override, replaced=None): super(OverrideTag, self).__init__(name) self.override = override self.replaced = replaced self.interface = self.override.interface @property def value(self): return self.override.value @abstractproperty def cached(self): """ The cached value stored in the tag. Can raise an OutdatedCacheError if the cache is out of date. """ @value.setter def value(self, value): self.override.value = value @cached.setter def cached(self): """ Write the new cached value. """ class RemoteTag(BaseTag): Loading @@ -73,8 +74,6 @@ class RemoteTag(BaseTag): """ A tag which is available remotely on a client. """ interface = 'cc-server.async' def __init__(self, name, client, ttl=None): super(RemoteTag, self).__init__(name) self._client = client Loading Loading @@ -125,9 +124,12 @@ class RemoteTag(BaseTag): pass CCSAsyncTagInterface.register(RemoteTag) class SRequestor(StaticRequestor): @fetcher('cc-server.async') @fetcher(CCSAsyncTagInterface) def fetcher_ccs_async(self, map): """ Fetching method using asynchronous call from sjrpc to get values from the remote client. Loading