class PolicyInformationPoint(object): def __init__(self, node, request): self.attributes = { "subject": { "actor_signer": self._get_actor_signer }, "action": { "requires": self._get_requires }, "environment": { "current_date": self._get_current_date, "current_time": self._get_current_time } } self.node = node self.request = request self.actorstore = GlobalStore(node=node) self.actor_desc = None def get_attribute_value(self, attribute_type, attribute): """Return the specified attribute if it exists in attributes dictionary""" value = self.attributes[attribute_type][attribute] if hasattr(value, '__call__'): # The value is a function, call the function. func_value = value() # Cache the value (replace function) since same value should be used for future tests when handling this request. self.attributes[attribute_type][attribute] = func_value return func_value return value def _get_actor_signer(self): return self.actor_desc["signer"] def _get_requires(self): return ["runtime"] + self.actor_desc["requires"] def _get_current_date(self): return datetime.now().strftime('%Y-%m-%d') def _get_current_time(self): return datetime.now().strftime('%H:%M') def actor_desc_lookup(self, actorstore_signature, callback): desc_iter = self.actorstore.global_lookup_iter( actorstore_signature, node_id=self.request["resource"]["node_id"]) desc_iter.set_cb(self._set_actor_desc, desc_iter, callback) self._set_actor_desc(desc_iter, callback) def _set_actor_desc(self, desc_iter, callback): while True: try: desc = desc_iter.next() except StopIteration: callback(pip=self) return except dynops.PauseIteration: return self.actor_desc = desc
class PolicyInformationPoint(object): def __init__(self, node, request): self.attributes = { "subject": { "actor_signer": self._get_actor_signer }, "action": { "requires": self._get_requires }, "environment": { "current_date": self._get_current_date, "current_time": self._get_current_time } } self.node = node self.request = request self.actorstore = GlobalStore(node=node) self.actor_desc = None def get_attribute_value(self, attribute_type, attribute): """Return the specified attribute if it exists in attributes dictionary""" value = self.attributes[attribute_type][attribute] if hasattr(value, '__call__'): # The value is a function, call the function. func_value = value() # Cache the value (replace function) since same value should be used for future tests when handling this request. self.attributes[attribute_type][attribute] = func_value return func_value return value def _get_actor_signer(self): return self.actor_desc["signer"] def _get_requires(self): return ["runtime"] + self.actor_desc["requires"] def _get_current_date(self): return datetime.now().strftime('%Y-%m-%d') def _get_current_time(self): return datetime.now().strftime('%H:%M') def actor_desc_lookup(self, actorstore_signature, callback): desc_iter = self.actorstore.global_lookup_iter(actorstore_signature, node_id=self.request["resource"]["node_id"]) desc_iter.set_cb(self._set_actor_desc, desc_iter, callback) self._set_actor_desc(desc_iter, callback) def _set_actor_desc(self, desc_iter, callback): while True: try: desc = desc_iter.next() except StopIteration: callback(pip=self) return except dynops.PauseIteration: return self.actor_desc = desc
def resolve_remote(self, actor_name, info, cb=None): # FIXME: no list needed since it is only done for one actor all_desc_iters = dynops.List() store = GlobalStore(node=self.node) desc_iter = store.global_lookup_iter(info['signature'], info['args'].keys()) all_desc_iters.append((actor_name, desc_iter), trigger_iter=desc_iter) all_desc_iters.final() collect_desc_iter = dynops.Collect(all_desc_iters).set_name("collected_desc") select_iter = dynops.Map(self.select_actor, collect_desc_iter, done=False, priority={k:[] for k in self.deployable['actors'].keys()}, eager=True).set_name("select_actor") select_iter.set_cb(self.deploy_unhandled_actor, select_iter, cb) self.deploy_unhandled_actor(select_iter, cb)
def resolve_remote(self, deployables): all_desc_iters = dynops.List() store = GlobalStore(node=self.node) for actor_name, info in deployables.iteritems(): desc_iter = store.global_lookup_iter(info['signature'], info['args'].keys()) all_desc_iters.append((actor_name, desc_iter), trigger_iter=desc_iter) all_desc_iters.final() collect_desc_iter = dynops.Collect(all_desc_iters).set_name("collected_desc") select_iter = dynops.Map(self.select_actor, collect_desc_iter, done=False, priority={k:[] for k in self.deployable['actors'].keys()}, eager=True).set_name("select_actor") select_iter.set_cb(self.deploy_unhandled_actors, select_iter) self.deploy_unhandled_actors(select_iter)
def resolve_remote(self, actor_name, info, cb=None): # FIXME: no list needed since it is only done for one actor all_desc_iters = dynops.List() store = GlobalStore(node=self.node) desc_iter = store.global_lookup_iter(info['signature'], info['args'].keys()) all_desc_iters.append((actor_name, desc_iter), trigger_iter=desc_iter) all_desc_iters.final() collect_desc_iter = dynops.Collect(all_desc_iters).set_name( "collected_desc") select_iter = dynops.Map( self.select_actor, collect_desc_iter, done=False, priority={k: [] for k in self.deployable['actors'].keys()}, eager=True).set_name("select_actor") select_iter.set_cb(self.deploy_unhandled_actor, select_iter, cb) self.deploy_unhandled_actor(select_iter, cb)