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
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
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]
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