Example #1
0
    def get(self, many=False):
        """Function retrieves predefined log files from worker"""
        if not self.node.is_online():
            raise NodeIsNotOperational()

        single_log_file = self.data.get('logname', None)

        if single_log_file:
            # make sure that file is among allowed files,
            # otherwise any file with read permission can be retrieved
            if single_log_file in self.log_files:
                self.log_files = (single_log_file, )
            else:
                logger.error(
                    'Error retrieving log file %s, file not among allowed files!',
                    single_log_file)
                raise ObjectNotFound(object_name=single_log_file)

        worker = self.node.worker('fast')
        logger.debug('Retrieving log files from node "%s"', self.node)
        log_files_result = worker_command('system_read_logs',
                                          worker,
                                          log_files=self.log_files,
                                          timeout=10)

        if log_files_result is None:
            raise GatewayTimeout('Node worker is not responding')

        return SuccessTaskResponse(self.request,
                                   log_files_result,
                                   dc_bound=self.dc_bound)
Example #2
0
    def _update(self, version, key=None, cert=None):
        node = self.node
        worker = node.worker(Q_FAST)
        logger.debug('Running node "%s" system update to version: "%s"', node,
                     version)
        reply = worker_command('system_update',
                               worker,
                               version=version,
                               key=key,
                               cert=cert,
                               timeout=600)

        if reply is None:
            raise GatewayTimeout('Node worker is not responding')

        response_class, result = process_update_reply(reply, node, version)
        response = response_class(self.request,
                                  result,
                                  task_id=self.task_id,
                                  obj=node,
                                  msg=LOG_SYSTEM_UPDATE,
                                  detail_dict=result,
                                  dc_bound=False)

        if response.status_code == 200:
            # Restart all erigonesd workers
            ctrl = NodeServiceControl(node)

            for service in ctrl.app_services:
                ctrl.restart(service)

        return response
Example #3
0
    def _execute_cmd(self, cmd, **kwargs):
        """Run a worker panel command and return the command dict"""
        cmd = cmd.format(**kwargs)
        worker = self.node.worker('fast')
        reply = worker_command('execute', worker, cmd=cmd.split())

        if reply is None:
            raise GatewayTimeout('Node worker is not responding')

        return reply
Example #4
0
    def system_version(self):
        from que.utils import worker_command

        version = cache.get(self._system_version_key)

        if not version:
            worker = self.worker('fast')
            version = worker_command('system_version', worker,
                                     timeout=0.5) or ''

            if version:
                cache.set(self._system_version_key, version,
                          self.SYSTEM_VERSION_EXPIRES)

        return version
Example #5
0
    def _update_v2(self, version, key=None, cert=None):
        from api.system.update.utils import process_update_reply

        node = self.node
        worker = node.worker(Q_FAST)
        logger.info(
            'Running oldstyle (v2.x) node "%s" system update to version: "%s"',
            node, version)
        reply = worker_command('system_update',
                               worker,
                               version=version,
                               key=key,
                               cert=cert,
                               timeout=600)

        if reply is None:
            raise GatewayTimeout('Node worker is not responding')

        result, error = process_update_reply(reply, node, version)

        if error:
            response_class = FailureTaskResponse
        else:
            response_class = SuccessTaskResponse

        detail_dict = result.copy()
        detail_dict['version'] = version
        response = response_class(self.request,
                                  result,
                                  obj=node,
                                  msg=LOG_SYSTEM_UPDATE,
                                  dc_bound=False,
                                  detail_dict=detail_dict)

        if response.status_code == 200:
            # Restart all erigonesd workers
            ctrl = NodeServiceControl(node)

            for service in ctrl.app_services:
                ctrl.restart(service)

        return response
Example #6
0
    def system_version(self):
        from que.utils import worker_command
        worker = self.worker('fast')

        return worker_command('system_version', worker, timeout=0.3) or ''
Example #7
0
    def put(self):
        assert self.request.dc.is_default()

        ser = UpdateSerializer(self.request, data=self.data)

        if not ser.is_valid():
            return FailureTaskResponse(self.request,
                                       ser.errors,
                                       dc_bound=False)

        node = self.node
        version = ser.data['version']
        key = ser.data.get('key')
        cert = ser.data.get('cert')
        del node.system_version  # Request latest version in next command
        node_version = node.system_version

        if not (isinstance(node_version, text_type) and node_version):
            raise NodeIsNotOperational(
                'Node version information could not be retrieved')

        node_version = node_version.split(':')[-1]  # remove edition prefix

        if version == ('v' + node_version) and not ser.data.get('force'):
            raise PreconditionRequired('Node is already up-to-date')

        if node.status != node.OFFLINE:
            raise NodeIsNotOperational(
                'Unable to perform update on node that is not in maintenance state'
            )

        if node_version.startswith('2.'):
            # Old-style (pre 3.0) update mechanism
            return self._update_v2(version, key=key, cert=cert)

        # Upload key and cert and get command array
        worker = node.worker(Q_FAST)
        update_cmd = worker_command('system_update_command',
                                    worker,
                                    version=version,
                                    key=key,
                                    cert=cert,
                                    force=ser.data.get('force'),
                                    timeout=10)

        if update_cmd is None:
            raise GatewayTimeout('Node worker is not responding')

        if not isinstance(update_cmd, list):
            raise PreconditionRequired(
                'Node update command could be retrieved')

        msg = LOG_SYSTEM_UPDATE
        _apiview_ = {
            'view': 'system_node_update',
            'method': self.request.method,
            'hostname': node.hostname,
            'version': version,
        }
        meta = {
            'apiview': _apiview_,
            'msg': msg,
            'node_uuid': node.uuid,
            'output': {
                'returncode': 'returncode',
                'stdout': 'message'
            },
            'check_returncode': True,
        }
        lock = self.LOCK % node.hostname
        cmd = '%s 2>&1' % ' '.join(update_cmd)

        tid, err = execute(self.request,
                           node.owner.id,
                           cmd,
                           meta=meta,
                           lock=lock,
                           queue=node.fast_queue,
                           tg=TG_DC_UNBOUND)

        if err:
            return FailureTaskResponse(self.request, err, dc_bound=False)
        else:
            return TaskResponse(self.request,
                                tid,
                                msg=msg,
                                obj=node,
                                api_view=_apiview_,
                                data=self.data,
                                dc_bound=False,
                                detail_dict=ser.detail_dict(force_full=True))