def __call__(self, req): LOG.debug('Request: %s', req) path = req.path_info if path == '' or path[0] != '/': path = '/' + path path = posixpath.normpath(path) path_tokens = path.split('/')[1:] if path_tokens in ([''], ['ec2']): resp = api.get_version_list() return self._add_response_data(req.response, resp) try: if path_tokens[0] == 'openstack': return self._proxy_request(req) elif path_tokens[0] == 'ec2': path_tokens = path_tokens[1:] resp = self._get_metadata(req, path_tokens) return self._add_response_data(req.response, resp) except exception.EC2MetadataNotFound: return webob.exc.HTTPNotFound() except Exception: LOG.exception(_LE("Unexpected error.")) msg = _('An unknown error has occurred. ' 'Please try your request again.') return webob.exc.HTTPInternalServerError(explanation=unicode(msg))
def __call__(self, req): LOG.debug('Request: %s', req) path = req.path_info if path == '' or path[0] != '/': path = '/' + path path = posixpath.normpath(path) path_tokens = path.split('/')[1:] if path_tokens[0] == 'ec2': path_tokens = path_tokens[1:] if path_tokens == ['']: resp = api.get_version_list() return self._add_response_data(req.response, resp) try: requester = self._get_requester(req) if path_tokens[0] == 'openstack': return self._proxy_request(req, requester) resp = self._get_metadata(path_tokens, requester) return self._add_response_data(req.response, resp) except exception.EC2MetadataNotFound: return webob.exc.HTTPNotFound() except Exception: LOG.exception(_LE("Unexpected error.")) msg = _('An unknown error has occurred. ' 'Please try your request again.') return webob.exc.HTTPInternalServerError( explanation=six.text_type(msg))
def get_os_public_network(context): neutron = clients.neutron(context) search_opts = {'router:external': True, 'name': CONF.external_network} os_networks = neutron.list_networks(**search_opts)['networks'] if len(os_networks) != 1: if CONF.external_network: if len(os_networks) == 0: msg = _LE("No external network with name '%s' is found") else: msg = _LE("More than one external network with name '%s' " "is found") LOG.error(msg, CONF.external_network) else: if len(os_networks) == 0: msg = _LE('No external network is found') else: msg = _LE('More than one external network is found') LOG.error(msg) raise exception.Unsupported(_('Feature is restricted by OS admin')) return os_networks[0]
def delayed_create(context, image, name, os_instance): try: os_instance.stop() # wait instance for really stopped start_time = time.time() while os_instance.status != 'SHUTOFF': time.sleep(1) os_instance.get() # NOTE(yamahata): timeout and error. 1 hour for now for safety. # Is it too short/long? # Or is there any better way? timeout = 1 * 60 * 60 if time.time() > start_time + timeout: err = (_("Couldn't stop instance within %d sec") % timeout) raise exception.EC2Exception(message=err) # NOTE(ft): create an image with ec2_id metadata to let other code # link os and db objects in race conditions os_image_id = os_instance.create_image( name, metadata={'ec2_id': image['id']}) image['os_id'] = os_image_id db_api.update_item(context, image) except Exception: LOG.exception(_LE('Failed to complete image %s creation'), image.id) try: image['state'] = 'failed' db_api.update_item(context, image) except Exception: LOG.warning(_LW("Couldn't set 'failed' state for db image %s"), image.id, exc_info=True) try: os_instance.start() except Exception: LOG.warning(_LW('Failed to start instance %(i_id)s after ' 'completed creation of image %(image_id)s'), { 'i_id': instance['id'], 'image_id': image['id'] }, exc_info=True)
def delayed_create(context, image, name, os_instance): try: os_instance.stop() # wait instance for really stopped start_time = time.time() while os_instance.status != 'SHUTOFF': time.sleep(1) os_instance.get() # NOTE(yamahata): timeout and error. 1 hour for now for safety. # Is it too short/long? # Or is there any better way? timeout = 1 * 60 * 60 if time.time() > start_time + timeout: err = (_("Couldn't stop instance within %d sec") % timeout) raise exception.EC2Exception(message=err) # NOTE(ft): create an image with ec2_id metadata to let other code # link os and db objects in race conditions os_image_id = os_instance.create_image( name, metadata={'ec2_id': image['id']}) image['os_id'] = os_image_id db_api.update_item(context, image) except Exception: LOG.exception(_LE('Failed to complete image %s creation'), image.id) try: image['state'] = 'failed' db_api.update_item(context, image) except Exception: LOG.warning(_LW("Couldn't set 'failed' state for db image %s"), image.id, exc_info=True) try: os_instance.start() except Exception: LOG.warning(_LW('Failed to start instance %(i_id)s after ' 'completed creation of image %(image_id)s'), {'i_id': instance['id'], 'image_id': image['id']}, exc_info=True)
def delayed_create(): """This handles the fetching and decrypting of the part files.""" context.update_store() try: image_path = tempfile.mkdtemp(dir=CONF.image_decryption_dir) log_vars = { 'image_location': image_location, 'image_path': image_path } _update_image_state('downloading') try: parts = [] for part_name in image_parts: part = _s3_download_file(bucket, part_name, image_path) parts.append(part) # NOTE(vish): this may be suboptimal, should we use cat? enc_filename = os.path.join(image_path, 'image.encrypted') with open(enc_filename, 'w') as combined: for filename in parts: with open(filename) as part: shutil.copyfileobj(part, combined) except Exception: LOG.exception( _LE('Failed to download %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_download') return _update_image_state('decrypting') try: dec_filename = os.path.join(image_path, 'image.tar.gz') _s3_decrypt_image(context, enc_filename, encrypted_key, encrypted_iv, dec_filename) except Exception: LOG.exception( _LE('Failed to decrypt %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_decrypt') return _update_image_state('untarring') try: unz_filename = _s3_untarzip_image(image_path, dec_filename) except Exception: LOG.exception( _LE('Failed to untar %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_untar') return _update_image_state('uploading') try: with open(unz_filename) as image_file: image.update(data=image_file) except Exception: LOG.exception( _LE('Failed to upload %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_upload') return _update_image_state('available') shutil.rmtree(image_path) except glance_exception.HTTPNotFound: LOG.info(_LI('Image %swas deleted underneath us'), image.id) except Exception: LOG.exception(_LE('Failed to complete image %s creation'), image.id)
def delayed_create(): """This handles the fetching and decrypting of the part files.""" context.update_store() try: image_path = tempfile.mkdtemp(dir=CONF.image_decryption_dir) log_vars = {'image_location': image_location, 'image_path': image_path} _update_image_state('downloading') try: parts = [] for part_name in image_parts: part = _s3_download_file(bucket, part_name, image_path) parts.append(part) # NOTE(vish): this may be suboptimal, should we use cat? enc_filename = os.path.join(image_path, 'image.encrypted') with open(enc_filename, 'w') as combined: for filename in parts: with open(filename) as part: shutil.copyfileobj(part, combined) except Exception: LOG.exception(_LE('Failed to download %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_download') return _update_image_state('decrypting') try: dec_filename = os.path.join(image_path, 'image.tar.gz') _s3_decrypt_image(context, enc_filename, encrypted_key, encrypted_iv, dec_filename) except Exception: LOG.exception(_LE('Failed to decrypt %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_decrypt') return _update_image_state('untarring') try: unz_filename = _s3_untarzip_image(image_path, dec_filename) except Exception: LOG.exception(_LE('Failed to untar %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_untar') return _update_image_state('uploading') try: with open(unz_filename) as image_file: image.update(data=image_file) except Exception: LOG.exception(_LE('Failed to upload %(image_location)s ' 'to %(image_path)s'), log_vars) _update_image_state('failed_upload') return _update_image_state('available') shutil.rmtree(image_path) except glance_exception.HTTPNotFound: LOG.info(_LI('Image %swas deleted underneath us'), image.id) except Exception: LOG.exception(_LE('Failed to complete image %s creation'), image.id)