def get_capabilities(self, method='GET'):
        """ Builds and attempts a GetCapabilities request. """
        if method.lower() == 'get':
            params = {
                'service': 'WPS',
                'request': 'GetCapabilities',
            }

            if self.version is not None:
                params['acceptversions'] = self.version

            if self.language is not None:
                params['language'] = self.language

            response = self.request(method, params=params)
        elif method.lower() == 'post':
            bds.reset()

            data = wps.get_capabilities().toxml(bds=bds)

            response = self.request(method, data=data)
        else:
            raise cwt.WPSError('{} method is unsupported'.format(method))

        if response is None:
            raise cwt.WPSError('Recieved invalid response')

        self.capabilities = CapabilitiesWrapper(response, self)

        return self.capabilities
Example #2
0
    def wait(self, stale_threshold=None, timeout=None, sleep=None):
        if sleep is None:
            sleep = 1.0

        if stale_threshold is None:
            stale_threshold = 4

        status_hist = {}

        stale_count = 0

        last_update = None

        def update_history(status):
            global stale_count
            global last_update

            if status not in status_hist:
                status_hist[status] = True

                print status

                stale_count = 0

                last_update = datetime.datetime.now()
            else:
                stale_count += 1

        update_history(self.status)

        start = datetime.datetime.now()

        while self.processing:
            update_history(self.status)

            time.sleep(sleep)

            elapsed = datetime.datetime.now() - start

            if timeout is not None and elapsed.total_seconds() > timeout:
                raise cwt.WPSError('Job has timed out after "{!s}" seconds', elapsed.total_seconds())

            if stale_count > stale_threshold and timeout is None:
                raise cwt.WPSError('Job appears to be stale no update since "{!s}"', last_update)

        update_history(self.status)

        return True if self.succeeded else False
Example #3
0
    def __init__(self, dimensions=None, mask=None, name=None, **kwargs):
        """ Domain init. """
        super(Domain, self).__init__(name)

        if dimensions is None:
            dimensions = []

        for name, value in kwargs.iteritems():
            if isinstance(value, slice):
                args = [name, value.start, value.stop, cwt.INDICES, value.step]
            elif isinstance(value, (list, tuple)):
                if len(value) < 2:
                    raise cwt.WPSError(
                        'Must provide a minimum of two values (start, stop) for dimension "{dim}"',
                        dim=name)

                if len(value) > 2:
                    step = value[3]
                else:
                    step = 1

                if all(isinstance(x, (float, int)) for x in value[:2]):
                    crs = cwt.VALUES
                elif all(isinstance(x, str) for x in value[:2]):
                    crs = cwt.TIMESTAMPS
                else:
                    raise cwt.WPSError('Could not determin dimension crs')

                args = [name, value[0], value[1], crs, step]
            else:
                raise cwt.WPSError(
                    'Dimension\'s value cannot be of type "{type}"',
                    type=type(value))

            dimensions.append(cwt.Dimension(*args))

        self.dimensions = dimensions
        self.mask = mask
    def describe_process(self, process, method='GET'):
        """ Return a DescribeProcess response.
        
        Args:
            process: An object of type Process to describe.
            method: A string HTTP method to use.

        Returns:
            A DescribeProcessResponse object.
        """
        if not isinstance(process, list):
            process = [process]

        identifier = ','.join([x.identifier for x in process])

        if method.lower() == 'get':
            params = {
                'service': 'WPS',
                'request': 'DescribeProcess',
                'version': '1.0.0',
                'identifier': identifier,
            }

            if self.language is not None:
                params['language'] = self.language

            response = self.request(method, params=params)
        elif method.lower() == 'post':
            bds.reset()

            data = wps.describe_process(identifier, '1.0.0').toxml(bds=bds)

            response = self.request(method, data=data)
        else:
            raise cwt.WPSError('{} method is unsupported'.format(method))

        for x in response.ProcessDescription:
            try:
                p = [
                    y for y in process if y.identifier == x.Identifier.value()
                ][0]
            except IndexError:
                raise cwt.CWTError('Error matching description "{name}"',
                                   name=x.identifier)

            p.description = ProcessDescriptionWrapper(x)

        return [x.description for x in process]
Example #5
0
    def status(self):
        if self.response is not None and self.response.Status is not None:
            if self.response.Status.ProcessAccepted is not None:
                return 'ProcessAccepted {}'.format(self.response.Status.ProcessAccepted)
            elif self.response.Status.ProcessStarted is not None:
                message = self.response.Status.ProcessStarted.value()

                percent = self.response.Status.ProcessStarted.percentCompleted

                return 'ProcessStarted {} {}'.format(message, percent)
            elif self.response.Status.ProcessPaused is not None:
                message = self.response.Status.ProcessPaused.value()

                percent = self.response.Status.ProcessPaused.percentCompleted

                return 'ProcessStarted {} {}'.format(message, percent)
            elif self.response.Status.ProcessFailed is not None:
                raise cwt.WPSError('ProcessFailed {}'.format(self.exception_message))
            elif self.response.Status.ProcessSucceeded is not None:
                return 'ProcessSucceeded {}'.format(self.response.Status.ProcessSucceeded)

        return 'No Status'
    def execute(self,
                process,
                inputs=None,
                domain=None,
                method='POST',
                block=False,
                **kwargs):
        """ Execute the process on the WPS server. 
        
        Args:
            process: A Process object to be executed on the WPS server.
            inputs: A list in Variables/Processes.
            domain: A Domain object to be used.
            kwargs: A dict containing additional arguments.
        """
        process.set_client(self)

        if inputs is None:
            inputs = []

        if method.lower() == 'get':
            params = {
                'service': 'WPS',
                'request': 'Execute',
                'version': '1.0.0',
                'identifier': process.identifier,
            }

            params['datainputs'] = self.prepare_data_inputs(
                process, inputs, domain, **kwargs)

            response = self.request(method, params=params)
        elif method.lower() == 'post':
            data_inputs = self.prepare_data_inputs(process, inputs, domain,
                                                   **kwargs)

            variables = wps.data_input('variable', 'Variable',
                                       json.dumps(data_inputs['variable']))

            domains = wps.data_input('domain', 'Domain',
                                     json.dumps(data_inputs['domain']))

            operation = wps.data_input('operation', 'Operation',
                                       json.dumps(data_inputs['operation']))

            bds.reset()

            data = wps.execute(process.identifier, '1.0.0',
                               [variables, domains, operation]).toxml(bds=bds)

            response = self.request(method, data=data)
        else:
            raise cwt.WPSError('{} method is unsupported'.format(method))

        process.response = response

        if block:
            process.wait()

        if process.failed:
            raise Exception(process.exception_message)

        if block:
            return process.output