示例#1
0
文件: service.py 项目: 00mjk/weaver
 def execute_job(self, process_id, wps_inputs, wps_outputs, mode, job_uuid):
     """
     Real execution of the process by active Celery Worker.
     """
     execution = WPSExecution(version="2.0", url="localhost")
     xml_request = execution.buildRequest(process_id,
                                          wps_inputs,
                                          wps_outputs,
                                          mode=mode,
                                          lineage=True)
     wps_request = WPSRequest()
     wps_request.identifier = process_id
     wps_request.set_version("2.0.0")
     request_parser = wps_request._post_request_parser(
         wps_request.WPS.Execute().tag)  # noqa: W0212
     request_parser(xml_request)
     # NOTE:
     #  Setting 'status = false' will disable async execution of 'pywps.app.Process.Process'
     #  but this is needed since this job is running within Celery worker already async
     #  (daemon process can't have children processes)
     #  Because if how the code in PyWPS is made, we have to re-enable creation of status file
     wps_request.status = "false"
     wps_response = super(WorkerService,
                          self).execute(process_id, wps_request, job_uuid)
     wps_response.store_status_file = True
     # update execution status with actual status file and apply required references
     execution = check_wps_status(
         location=wps_response.process.status_location,
         settings=self.settings)
     execution.request = xml_request
     return execution
示例#2
0
    def checkStatus(cls, instance):
        if not instance.is_initialized():
            exception = Exception("Not initialized!")
            log.exception("Not initialized!")
            raise exception

        if instance.execution and isinstance(
                instance.execution,
                WebProcessingServiceExecution) and instance.execution.response:
            _e = WPSExecution(version=instance.version,
                              url=instance.url,
                              username=instance.username,
                              password=instance.password,
                              verbose=False)
            _e.request = instance.execution.request
            _e.statusLocation = instance.execution.status_location
            _e.serviceInstance = instance.service_instance
            try:
                _e.checkStatus(sleepSecs=3)
            except:
                log.exception(
                    "Exception while Checking WPS Execution Status {}".format(
                        _e))
            if _e.status:
                cls._update_instance_execution_status(instance, _e)
            else:
                raise Exception("Status check failed")
            return instance.execution.status
        else:
            exception = Exception("No running executions!")
            log.exception("No running executions!")
            raise exception
示例#3
0
    def execute_job(
            self,
            job,  # type: Job
            wps_inputs,  # type: List[WPS_InputData]
            wps_outputs,  # type: List[WPS_OutputRequested]
            remote_process,  # type: Optional[Process]
            headers,  # type: Optional[AnyHeadersContainer]
    ):  # type: (...) -> WPSExecution
        """
        Real execution of the process by active Celery Worker.
        """
        process_id = job.process
        execution = WPSExecution(version="2.0", url="localhost")
        xml_request = execution.buildRequest(process_id,
                                             wps_inputs,
                                             wps_outputs,
                                             mode=job.execution_mode,
                                             lineage=True)
        wps_request = WorkerRequest(http_headers=headers)
        wps_request.identifier = process_id
        wps_request.check_and_set_language(job.accept_language)
        wps_request.set_version("2.0.0")
        request_parser = wps_request._post_request_parser(
            wps_request.WPS.Execute().tag)  # noqa: W0212
        request_parser(
            xml_request
        )  # parses the submitted inputs/outputs data and request parameters

        # NOTE:
        #  Setting 'status = false' will disable async execution of 'pywps.app.Process.Process'
        #  but this is needed since this job is running within Celery worker already async
        #  (daemon process can't have children processes).
        wps_request.status = "false"

        # When 'execute' is called, pywps will in turn call 'prepare_process_for_execution',
        # which then setups and retrieves currently loaded 'local' processes.
        # Since only local processes were defined by 'get_pywps_service',
        # a temporary process must be added for remote providers execution.
        if not remote_process:
            worker_process_id = process_id
        else:
            worker_process_id = f"wps_package-{process_id}-{job.uuid}"
            self.dispatched_processes[worker_process_id] = remote_process

        wps_response = super(WorkerService,
                             self).execute(worker_process_id, wps_request,
                                           job.uuid)
        # re-enable creation of status file so we can find it since we disabled 'status' earlier for sync execution
        wps_response.store_status_file = True
        # update execution status with actual status file and apply required references
        execution = check_wps_status(
            location=wps_response.process.status_location,
            settings=self.settings)
        execution.request = xml_request
        return execution