def unseal_and_process_data( cls, sealed_data ): """ Unseal data, and then process it. Make sure no more than one instance of this request is being processed. """ locked = cls.processing_lock.acquire( False ) if not locked: # failed to aquire return -errno.EAGAIN config = get_config() slice_secret = get_cached_slice_secret( config ) if slice_secret is None: # no secret on file cls.processing_lock.release() log.error("No slice secret") return -errno.EAGAIN # unseal the data rc, data_text = unseal_observer_data( slice_secret, sealed_data ) if rc != 0: # failed to read cls.processing_lock.release() log.error("unseal_observer_data rc = %s" % rc) return -errno.EINVAL # parse the data rc, data = observer_cred.parse_observer_data( data_text ) if rc != 0: # failed to parse cls.processing_lock.release() log.error("parse_observer_data rc = %s" % rc) return -errno.EINVAL if data is not None: # start all gateways for this volume rc = observer_startstop.start_stop_volume( config, data, slice_secret, hostname=config['hostname'], gateway_uid_name=GATEWAY_UID_NAME, gateway_gid_name=GATEWAY_GID_NAME, debug=config['debug'] ) if rc != 0: log.error("ensure_running rc = %s" % rc) cls.processing_lock.release() return rc
def poll_opencloud_volume_data( config, slice_name, volume_name ): """ Download, verify, and parse Observer data. Return (0, data) on success Return (nonzero, None) on error """ url = config['observer_url'] volume_url = os.path.join( url, slice_name, volume_name ) data_str = download_validate_unseal_data( config, volume_url ) if data_str is None: log.error("Failed to read data from %s" % url) return None rc, data = observer_cred.parse_observer_data( data_str ) if rc != 0: log.error("Failed to read Observer data, rc = %s" % rc ) return None return data