コード例 #1
0
 def insert_job(self, data: (ExportdJob, dict)) -> int:
     """
     Insert new ExportdJob Object
     Args:
         data: init data
     Returns:
         Public ID of the new ExportdJob in database
     """
     if isinstance(data, dict):
         try:
             new_object = ExportdJob(**data)
         except CMDBError as e:
             raise ExportdJobManagerInsertError(e)
     elif isinstance(data, ExportdJob):
         new_object = data
     try:
         ack = self.dbm.insert(
             collection=ExportdJob.COLLECTION,
             data=new_object.to_database()
         )
         if self._event_queue:
             event = Event("cmdb.exportd.added", {"id": new_object.get_public_id(),
                                                  "active": new_object.scheduling["event"]["active"] and new_object.get_active(),
                                                  "user_id": new_object.get_author_id()})
             self._event_queue.put(event)
     except CMDBError as e:
         raise ExportdJobManagerInsertError(e)
     return ack
コード例 #2
0
def get_exportd_jobs(params: CollectionParameters):
    """Iterate route for exportd jobs"""

    job_manager = ExportDJobManager(current_app.database_manager)
    body = request.method == 'HEAD'

    try:
        iteration_result: IterationResult[ExportdJob] = job_manager.iterate(
            filter=params.filter,
            limit=params.limit,
            skip=params.skip,
            sort=params.sort,
            order=params.order)
        types = [ExportdJob.to_json(type) for type in iteration_result.results]
        api_response = GetMultiResponse(types,
                                        total=iteration_result.total,
                                        params=params,
                                        url=request.url,
                                        model=ExportdJob.MODEL,
                                        body=body)
    except ManagerIterationError as err:
        return abort(400, err.message)
    except ManagerGetError as err:
        return abort(404, err.message)
    return api_response.make_response()
コード例 #3
0
def worker(job: ExportdJob, request_user: UserModel):
    from flask import make_response as make_res
    from cmdb.exportd.exporter_base import ExportdManagerBase
    from cmdb.event_management.event import Event

    try:
        event = Event(
            "cmdb.exportd.run_manual", {
                "id": job.get_public_id(),
                "user_id": request_user.get_public_id(),
                "event": 'manuel'
            })

        content = ExportdManagerBase(job, object_manager, log_manager,
                                     event).execute(
                                         request_user.public_id,
                                         request_user.get_display_name(),
                                         False)
        response = make_res(content.data, content.status)
        response.headers['Content-Type'] = '%s; charset=%s' % (
            content.mimetype, content.charset)
        return response
    except Exception as err:
        LOGGER.error(err)
        return abort(404)
コード例 #4
0
 def get_job(self, public_id: int) -> ExportdJob:
     try:
         result = self.dbm.find_one(collection=ExportdJob.COLLECTION, public_id=public_id)
     except (ExportdJobManagerGetError, Exception) as err:
         LOGGER.error(err)
         raise err
     return ExportdJob(**result)
コード例 #5
0
 def get_all_jobs(self):
     job_list = []
     for founded_job in self.dbm.find_all(collection=ExportdJob.COLLECTION):
         try:
             job_list.append(ExportdJob(**founded_job))
         except CMDBError:
             continue
     return job_list
コード例 #6
0
 def update_job(self, data: (dict, ExportdJob), request_user: UserModel, event_start=True) -> str:
     """
     Update new ExportdJob Object
     Args:
         data: init data
         request_user: current user, to detect who triggered event
         event_start: Controls whether an event should be started
     Returns:
         Public ID of the ExportdJob in database
     """
     if isinstance(data, dict):
         update_object = ExportdJob(**data)
     elif isinstance(data, ExportdJob):
         update_object = data
     else:
         raise ExportdJobManagerUpdateError(f'Could not update job with ID: {data.get_public_id()}')
     update_object.last_execute_date = datetime.now(timezone.utc)
     ack = self._update(
         collection=ExportdJob.COLLECTION,
         public_id=update_object.get_public_id(),
         data=update_object.to_database()
     )
     if self._event_queue and event_start:
         state = update_object.scheduling["event"]["active"] and update_object.get_active()
         event = Event("cmdb.exportd.updated", {"id": update_object.get_public_id(),
                                                "active": state,
                                                "user_id": request_user.get_public_id(),
                                                "event": 'automatic'})
         self._event_queue.put(event)
     return ack.acknowledged
コード例 #7
0
 def get_job_by_event_based(self, state):
     formatted_filter = {'scheduling.event.active': state}
     job_list = []
     for founded_job in self.dbm.find_all(collection=ExportdJob.COLLECTION, filter=formatted_filter):
         try:
             job_list.append(ExportdJob(**founded_job))
         except CMDBError:
             continue
     return job_list
コード例 #8
0
 def get_job_by_args(self, **requirements) -> ExportdJob:
     try:
         found_type_list = self._get_many(collection=ExportdJob.COLLECTION, limit=1, **requirements)
         if len(found_type_list) > 0:
             return ExportdJob(**found_type_list[0])
         else:
             raise ObjectManagerGetError(err='More than 1 type matches this requirement')
     except (CMDBError, Exception) as e:
         raise ObjectManagerGetError(err=e)
コード例 #9
0
def add_job(request_user: UserModel):
    from bson import json_util
    add_data_dump = json.dumps(request.json)
    try:
        new_job_data = json.loads(add_data_dump,
                                  object_hook=json_util.object_hook)
        new_job_data['public_id'] = exportd_manager.get_new_id(
            ExportdJob.COLLECTION)
        new_job_data['last_execute_date'] = datetime.utcnow()
        new_job_data['author_id'] = request_user.get_public_id()
        new_job_data['author_name'] = request_user.get_display_name()
        new_job_data['state'] = ExecuteState.SUCCESSFUL.name
    except TypeError as e:
        LOGGER.warning(e)
        abort(400)
    try:
        job_instance = ExportdJob(**new_job_data)
    except CMDBError as e:
        LOGGER.debug(e)
        return abort(400)
    try:
        ack = exportd_manager.insert_job(job_instance)
    except ExportdJobManagerInsertError:
        return abort(500)

    # Generate new insert log
    try:
        log_params = {
            'job_id': job_instance.get_public_id(),
            'state': True,
            'user_id': request_user.get_public_id(),
            'user_name': request_user.get_display_name(),
            'event': LogAction.CREATE.name,
            'message': '',
        }
        log_manager.insert_log(action=LogAction.CREATE,
                               log_type=ExportdJobLog.__name__,
                               **log_params)
    except LogManagerInsertError as err:
        LOGGER.error(err)

    resp = make_response(ack)
    return resp
コード例 #10
0
def update_job(request_user: UserModel):
    from bson import json_util
    add_data_dump = json.dumps(request.json)
    new_job_data = None
    try:
        new_job_data = json.loads(add_data_dump,
                                  object_hook=json_util.object_hook)
    except TypeError as e:
        LOGGER.warning(e)
        abort(400)
    try:
        state = new_job_data["state"]
        update_job_instance = ExportdJob(**new_job_data)
    except CMDBError:
        return abort(400)
    try:
        exportd_manager.update_job(update_job_instance, request_user, False)
    except ExportdJobManagerUpdateError:
        return abort(500)

    # Generate new insert log
    if state not in ExecuteState.RUNNING.name:
        try:
            log_params = {
                'job_id': update_job_instance.get_public_id(),
                'state': True,
                'user_id': request_user.get_public_id(),
                'user_name': request_user.get_display_name(),
                'event': LogAction.EDIT.name,
                'message': '',
            }
            log_manager.insert_log(action=LogAction.EDIT,
                                   log_type=ExportdJobLog.__name__,
                                   **log_params)
        except LogManagerInsertError as err:
            LOGGER.error(err)

    resp = make_response(update_job_instance)
    return resp