Commit d5191bbb authored by Antoine Millet's avatar Antoine Millet
Browse files

Fixed db interface usage

Also changed the way overridden tags are working (stored in separate dict
instead of wrapping class).
parent 99669c01
Loading
Loading
Loading
Loading
+37 −35
Original line number Diff line number Diff line
@@ -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

@@ -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):
@@ -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
@@ -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.