def result(self, unit_id=None, uuid=None, group=None, status=None): """ get action status Checks the result of the action by its UUID or returns the actions for the specified unit. Args: unit_id: unit id or uuid: action uuid Optional: group: filter by unit group status: filter by action status: Q for queued, R for running, F for finished Returns: list or single serialized action object Raises: ResourceNotFound: unit or action is not found @var_out exitcode Exit code @var_out status Action status """ if unit_id: unit = eva.lm.controller.uc_pool.get_unit( oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return ecall( eva.lm.controller.uc_pool.result(oid_to_id(unit_id, 'unit'), uuid, group, status))
def action_toggle(self, unit_id, wait=0, uuid=None, priority=None): """ toggle unit status Create unit control action to toggle its status (1->0, 0->1). if using OID, you can also call "toggle(..)" with the same effect. Args: unit_id: unit id Optional: value: desired unit value wait: wait for the completion for the specified number of seconds uuid: action UUID (will be auto generated if none specified) priority: queue priority (default is 100, lower is better) Returns: Serialized action object (dict) Raises: FunctionFailed: action is "dead" ResourceNotFound: unit is not found @var_out exitcode Exit code @var_out status Action status """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return ecall( eva.lm.controller.uc_pool.action_toggle(unit_id=oid_to_id(unit_id), wait=wait, uuid=uuid, priority=priority))
def clone_item(item_id, new_item_id=None, group=None, save=False): i = get_item(item_id) ni = get_item((group + '/') if group else '' + new_item_id) if not i or not new_item_id or i.is_destroyed() or \ i.item_type not in ['unit', 'sensor']: raise ResourceNotFound if ni: raise ResourceAlreadyExists(ni.oid) if group and new_item_id.find('/') != -1: raise InvalidParameter('Group specified but item id contains /') if is_oid(new_item_id): if oid_type(new_item_id) != i.item_type: return InvalidParameter('oids should be equal') _ni = oid_to_id(new_item_id) else: _ni = new_item_id if _ni.find('/') == -1: ni_id = _ni _g = i.group if group is None else group else: ni_id = _ni.split('/')[-1] _g = '/'.join(_ni.split('/')[:-1]) ni = create_item(ni_id, i.item_type, _g, start=False, save=False) cfg = i.serialize(props=True) if 'description' in cfg: del cfg['description'] ni.update_config(cfg) if save: ni.save() ni.start_processors() return ni
def unit_value(self, unit_id, default=''): """ get unit value Args: unit_id: unit id Optional: default: value if null (default is empty string) Returns: unit value Raises: ResourceNotFound: unit is not found """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound if unit.value == '': return default try: v = float(unit.value) except: v = unit.value return v
def sensor_value(self, sensor_id, default=''): """ get sensor value Args: sensor_id: sensor id Optional: default: value if null (default is empty string) Returns: sensor value Raises: ResourceNotFound: sensor is not found """ sensor = eva.lm.controller.uc_pool.get_sensor( oid_to_id(sensor_id, 'sensor')) if not sensor: raise ResourceNotFound if sensor.value == '': return default try: v = float(sensor.value) except: v = sensor.value return v
def remove_controller(controller_id): _controller_id = oid_to_id(controller_id, 'remote_uc') if not _controller_id: raise InvalidParameter('controller id not specified') if _controller_id.find('/') != -1: _controller_id = _controller_id.split('/')[-1] if _controller_id not in remote_ucs: raise ResourceNotFound controller_lock.acquire() try: i = remote_ucs[_controller_id] i.destroy() if eva.core.config.db_update == 1 and i.config_file_exists: try: os.unlink(i.get_fname()) except: logging.error('Can not remove controller %s config' % \ _controller_id) eva.core.log_traceback() elif i.config_file_exists: configs_to_remove.add(i.get_fname()) del (remote_ucs[_controller_id]) logging.info('controller %s removed' % _controller_id) return True except Exception as e: eva.core.log_traceback() raise FunctionFailed(e) finally: controller_lock.release()
def create_cycle(m_id, group=None, save=False): _m_id = oid_to_id(m_id, 'lcycle') if not _m_id: raise InvalidParameter('macro id not specified') if group and _m_id.find('/') != -1: raise InvalidParameter('group specified but cycle id contains /') if _m_id.find('/') == -1: i = _m_id grp = group else: i = _m_id.split('/')[-1] grp = '/'.join(_m_id.split('/')[:-1]) if not grp: grp = 'nogroup' if not re.match("^[A-Za-z0-9_\.-]*$", i) or \ not re.match("^[A-Za-z0-9_\./-]*$", grp): raise InvalidParameter('Invalid symbols in cycle id') i_full = grp + '/' + i if i in cycles_by_id or i_full in cycles_by_full_id: raise ResourceAlreadyExists m = eva.lm.plc.Cycle(i) if grp: m.update_config({'group': grp}) cycles_by_id[i] = m cycles_by_full_id[m.full_id] = m if save: m.save() m.notify() logging.info('cycle "%s" created' % m.full_id) return m
def unit_nvalue(self, unit_id, default=''): """ get unit nvalue nvalue is the value which is set to unit after the current running action is completed. the function may be called with an alias "nvalue(...)" Args: unit_id: unit id Returns: unit nvalue Raises: ResourceNotFound: unit is not found """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound if unit.nvalue == '': return default try: v = float(unit.nvalue) except: v = unit.nvalue return v
def format_job_id(r_id): if is_oid(r_id): r_id = oid_to_id(r_id, required='job') if not isinstance(r_id, str): return None if r_id.find('/') != -1: g, r_id = r_id.split('/') if g != 'jobs': return None return r_id
def format_rule_id(r_id): if is_oid(r_id): r_id = oid_to_id(r_id, required='dmatrix_rule') if not isinstance(r_id, str): return None if r_id.find('/') != -1: g, r_id = r_id.split('/') if g != 'dm_rules': return None return r_id
def get_cycle(cycle_id): _cycle_id = oid_to_id(cycle_id, 'lcycle') if not _cycle_id: return None if _cycle_id.find('/') > -1: if _cycle_id in cycles_by_full_id: return cycles_by_full_id[_cycle_id] else: if _cycle_id in cycles_by_id: return cycles_by_id[_cycle_id] return None
def get_unit(unit_id): if not unit_id: return None if is_oid(unit_id) and oid_type(unit_id) != 'unit': return None i = oid_to_id(unit_id) if i.find('/') > -1: if i in units_by_full_id: return units_by_full_id[i] elif not eva.core.config.enterprise_layout and i in units_by_id: return units_by_id[i] return None
def get_lvar(lvar_id): if not lvar_id: return None if is_oid(lvar_id) and oid_type(lvar_id) != 'lvar': return None i = oid_to_id(lvar_id) if i.find('/') > -1: if i in lvars_by_full_id: return lvars_by_full_id[i] elif not eva.core.config.enterprise_layout and i in lvars_by_id: return lvars_by_id[i] return None
def kill(self, unit_id): """ kill unit actions Apart from canceling all queued commands, this function also terminates the current running action. Args: unit_id: unit id Raises: ResourceNotFound: unit is not found """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return ecall( eva.lm.controller.uc_pool.kill(unit_id=oid_to_id(unit_id, 'unit')))
def get_mu(mu_id): if not mu_id: return None if is_oid(mu_id) and oid_type(mu_id) != 'mu': return None i = oid_to_id(mu_id) if i.find('/') > -1: if i in mu_by_full_id: return mu_by_full_id[i] elif not eva.core.config.enterprise_layout and i in mu_by_id: return mu_by_id[i] return None
def q_clean(self, unit_id): """ clean action queue of unit Cancels all queued actions, keeps the current action running. Args: unit_id: unit id Raises: ResourceNotFound: unit is not found """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return ecall( eva.lm.controller.uc_pool.q_clean( unit_id=oid_to_id(unit_id, 'unit')))
def action(self, unit_id, status, value=None, wait=0, uuid=None, priority=None): """ unit control action The call is considered successful when action is put into the action queue of selected unit. Args: unit_id: unit id status: desired unit status Optional: value: desired unit value wait: wait for the completion for the specified number of seconds uuid: action UUID (will be auto generated if none specified) priority: queue priority (default is 100, lower is better) Returns: Serialized action object (dict) Raises: FunctionFailed: action is "dead" ResourceNotFound: unit is not found @var_out exitcode Exit code @var_out status Action status """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return ecall( eva.lm.controller.uc_pool.action(unit_id=oid_to_id( unit_id, 'unit'), status=status, value=value, wait=wait, uuid=uuid, priority=priority))
def get_sensor(sensor_id): if not sensor_id: return None if is_oid(sensor_id) and oid_type(sensor_id) != 'sensor': return None i = oid_to_id(sensor_id) if i.find('/') > -1: if i in sensors_by_full_id: return sensors_by_full_id[i] elif not eva.core.config.enterprise_layout and i in sensors_by_id: return sensors_by_id[i] return None
def get_macro(macro_id, pfm=False): if pfm and macro_id and macro_id.startswith('@'): f = macro_id[1:] m = eva.lm.plc.pf_macros.get(f) if not m: m = eva.lm.plc.VFMacro(f) return m _macro_id = oid_to_id(macro_id, 'lmacro') if not _macro_id: return None if _macro_id.find('/') > -1: if _macro_id in macros_by_full_id: return macros_by_full_id[_macro_id] else: if _macro_id in macros_by_id: return macros_by_id[_macro_id] return None
def terminate(self, unit_id=None, uuid=None): """ terminate action execution Terminates or cancel the action if it is still queued Args: unit_id: action uuid or uuid: unit id Returns: Raises: ResourceNotFound: if unit/action is not found or action is already finished """ if unit_id: unit = eva.lm.controller.uc_pool.get_unit( oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return ecall( eva.lm.controller.uc_pool.terminate(oid_to_id(unit_id, 'unit'), uuid))
def get_controller(controller_id): controller_lock.acquire() try: _controller_id = oid_to_id(controller_id, 'remote_uc') if not _controller_id: raise InvalidParameter('controller id not specified') if _controller_id.find('/') > -1: i = _controller_id.split('/') if len(i) > 2 or i[0] != 'uc': raise InvalidParameter('controller type unknown') if i[1] in remote_ucs: return remote_ucs[i[1]] else: if _controller_id in remote_ucs: return remote_ucs[_controller_id] raise ResourceNotFound finally: controller_lock.release()
def unit_status(self, unit_id): """ get unit status Args: unit_id: unit id Returns: unit status (integer) Raises: ResourceNotFound: unit is not found """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return unit.status
def is_busy(self, unit_id): """ is unit busy Args: unit_id: unit id Returns: True, if unit is busy (action is executed) Raises: ResourceNotFound: unit is not found """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return unit.status != unit.nstatus or unit.value != unit.nvalue
def sensor_status(self, sensor_id): """ get sensor status Args: sensor_id: sensor id Returns: sensor status (integer) Raises: ResourceNotFound: sensor is not found """ sensor = eva.lm.controller.uc_pool.get_sensor( oid_to_id(sensor_id, 'sensor')) if not sensor: raise ResourceNotFound return sensor.status
def unit_nstatus(self, unit_id): """ get unit nstatus nstatus is the status which is set to unit after the current running action is completed. the function may be called with an alias "nstatus(...)" Args: unit_id: unit id Returns: unit nstatus (integer) Raises: ResourceNotFound: unit is not found """ unit = eva.lm.controller.uc_pool.get_unit(oid_to_id(unit_id, 'unit')) if not unit: raise ResourceNotFound return unit.nstatus
def action_start(self, unit_id, value=None, wait=0, uuid=None, priority=None): """ start unit Create unit control action to set its status to 1 Args: unit_id: unit id Optional: value: desired unit value wait: wait for the completion for the specified number of seconds uuid: action UUID (will be auto generated if none specified) priority: queue priority (default is 100, lower is better) Returns: Serialized action object (dict) Raises: FunctionFailed: action is "dead" ResourceNotFound: unit is not found @var_out exitcode Exit code @var_out status Action status """ return self.action(unit_id=oid_to_id(unit_id, 'unit'), status=1, value=value, wait=wait, uuid=uuid, priority=priority)
def run(self, macro, argv=None, kwargs=None, wait=0, uuid=None, priority=None): """ execute another macro Execute a macro with the specified arguments. Args: macro: macro id Optional: args: macro arguments, array or space separated kwargs: macro keyword arguments, name=value, comma separated or dict wait: wait for the completion for the specified number of seconds uuid: action UUID (will be auto generated if none specified) priority: queue priority (default is 100, lower is better) Returns: Serialized macro action object (dict) Raises: ResourceNotFound: macro is not found @var_out exitcode Exit code @var_out status Action status @var_out out Macro "out" variable """ _argv = [] if isinstance(argv, str): try: _argv = shlex.split(argv) except: _argv = argv.split(' ') elif isinstance(argv, float) or isinstance(argv, int): _argv = [argv] elif isinstance(argv, list): _argv = argv if isinstance(kwargs, str): try: kw = dict_from_str(kwargs) except: kw = {} elif isinstance(kwargs, dict): kw = kwargs else: kw = {} a = eva.lm.controller.exec_macro(macro=oid_to_id(macro, 'lmacro'), argv=_argv, kwargs=kw, priority=priority, action_uuid=uuid, wait=wait) if not a: raise ResourceNotFound elif a.is_status_dead(): raise FunctionFailed('queue error') else: return a.serialize()