Exemple #1
0
    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))
Exemple #2
0
    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))
Exemple #3
0
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
Exemple #4
0
    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
Exemple #5
0
    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
Exemple #6
0
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()
Exemple #7
0
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
Exemple #8
0
    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
Exemple #9
0
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
Exemple #10
0
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
Exemple #11
0
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
Exemple #12
0
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
Exemple #13
0
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
Exemple #14
0
    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')))
Exemple #15
0
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
Exemple #16
0
    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')))
Exemple #17
0
    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))
Exemple #18
0
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
Exemple #19
0
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
Exemple #20
0
    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))
Exemple #21
0
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()
Exemple #22
0
    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
Exemple #23
0
    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
Exemple #24
0
    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
Exemple #25
0
    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
Exemple #26
0
    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)
Exemple #27
0
    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()