예제 #1
0
class Hub(object):

    _lock = threading.Lock()

    @staticmethod
    def _to_dict(pairs):
        if isinstance(pairs, dict):
            pairs = pairs.items()
        return {i: j for i, j in pairs}

    def __init__(self, hub_uri, description, resources=None, *args, **kwargs):
        self._hub = ServerProxy(hub_uri, *args, **kwargs)
        self._id = None
        self._description = str(description)
        self._resources = Hub._to_dict(resources) if resources is not None else None

    def ping(self):
        with self._lock:
            return self._hub.ping(self._id)

    def register_machine(self, capacity):
        with self._lock:
            args = [self._description, float(capacity)]
            kwargs = dict()
            if self._resources is not None:
                kwargs['resources'] = self._resources
            if self._id is not None:
                kwargs['previous_id'] = self._id
            if len(kwargs):
                args.append(kwargs)
            self._id = self._hub.register_machine(*args)
            assert self._id is not None
            return self._id

    def unregister_machine(self):
        with self._lock:
            return self._hub.unregister_machine(self._id)

    def set_capacity(self, capacity):
        with self._lock:
            return self._hub.set_capacity(self._id, float(capacity))

    def set_resource_uri(self, resource, uri):
        with self._lock:
            return self._hub.set_resource_uri(self._id, resource, uri)

    def increase_capacity(self, delta=1):
        with self._lock:
            return self._hub.increase_capacity(self._id, float(delta))

    def decrease_capacity(self, delta=1):
        with self._lock:
            return self._hub.decrease_capacity(self._id, float(delta))

    def add_resources(self, resources):
        with self._lock:
            return self._hub.add_resources(self._id, Hub._to_dict(resources))

    def add_resource(self, resource, uri):
        with self._lock:
            return self._hub.add_resource(self._id, resource, uri)

    def remove_resource(self, resource):
        with self._lock:
            return self._hub.remove_resource(self._id, resource)

    def select_resource(self, resource):
        return self._hub.select_resource(resource)

    def context(self, *args, **kwargs):
        hub = self
        class Context(object):
            def __enter__(self):
                hub.register_machine(*args, **kwargs)
            def __exit__(self, exc_type, exc_value, traceback):
                hub.unregister_machine()
        return Context()
예제 #2
0
 def __init__(self, hub_uri, description, resources=None, *args, **kwargs):
     self._hub = ServerProxy(hub_uri, *args, **kwargs)
     self._id = None
     self._description = str(description)
     self._resources = Hub._to_dict(resources) if resources is not None else None