def recovery_instance(request, path, instances): for instance in instances: file_path = u.join_path(path, instance['instance_id'] + '.qcow2') image = glance.image_create(request, name=instance['instance_name'] + '-' + uuidutils.generate_uuid()[0:7], container_format='bare', disk_format='qcow2') glance.glanceclient(request).images.upload(image.id, open(file_path, 'rb')) instance['old_image_id'] = instance['id'] instance['image_id'] = image.id return instances
def backup_instance(request, instance_id_list, image_path): for instance_id in instance_id_list: # Create a snapshot of an instance snapshot_name = 'snapshot_of_' + instance_id image_id = nova.snapshot_create(request, instance_id, snapshot_name) # Waiting for creating snapshot image = glance.image_get(request, image_id) while image.status != 'active': time.sleep(5) image = glance.image_get(request, image_id) # Download image data image_data = glance.glanceclient(request).images.data(image.id) image_filename = u.join_path(image_path, instance_id+'.raw') f = io.open(image_filename, 'wb') for chunk in image_data: f.write(chunk) glance.image_delete(request, image.id) # TODO: Transform image format from raw to qcow2 os.system('qemu-img convert -f raw -O qcow2 ' + image_filename + ' ' + image_filename + '.qcow2')
def _ensure_images(name, package, request, step_data=None): glance_client = glance.glanceclient(request, version='2') base_url = packages_consts.MURANO_REPO_URL image_specs = package.images() try: imgs = muranoclient_utils.ensure_images(glance_client=glance_client, image_specs=image_specs, base_url=base_url) for img in imgs: msg = _("Trying to add {0} image to glance. " "Image will be ready for deployment after " "successful upload").format(img['name'], ) messages.warning(request, msg) log_msg = _("Trying to add {0}, {1} image to " "glance. Image will be ready for " "deployment after successful upload")\ .format(img['name'], img['id'],) LOG.info(log_msg) if step_data: step_data['images'].append(img) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, name) messages.error(request, msg) LOG.exception(msg)
def get_data(self): prev_marker = self.request.GET.get( tables.MarkedImagesTable._meta.prev_pagination_param, None) if prev_marker is not None: sort_dir = 'asc' marker = prev_marker else: sort_dir = 'desc' marker = self.request.GET.get( tables.MarkedImagesTable._meta.pagination_param, None) page_size = utils.get_page_size(self.request) request_size = page_size + 1 kwargs = {'filters': {}} if marker: kwargs['marker'] = marker kwargs['sort_dir'] = sort_dir images = [] self._prev = False self._more = False glance_v2_client = glance.glanceclient(self.request, "2") try: images_iter = glance_v2_client.images.list( **kwargs) except Exception: msg = _('Unable to retrieve list of images') uri = reverse('horizon:app-catalog:catalog:index') exceptions.handle(self.request, msg, redirect=uri) marked_images_iter = forms.filter_murano_images( images_iter, request=self.request) images = list(itertools.islice(marked_images_iter, request_size)) # first and middle page condition if len(images) > page_size: images.pop(-1) self._more = True # middle page condition if marker is not None: self._prev = True # first page condition when reached via prev back elif sort_dir == 'asc' and marker is not None: self._more = True # last page condition elif marker is not None: self._prev = True if prev_marker is not None: images.reverse() return images
def get_data(self): prev_marker = self.request.GET.get( tables.MarkedImagesTable._meta.prev_pagination_param, None) if prev_marker is not None: sort_dir = 'asc' marker = prev_marker else: sort_dir = 'desc' marker = self.request.GET.get( tables.MarkedImagesTable._meta.pagination_param, None) page_size = utils.get_page_size(self.request) request_size = page_size + 1 kwargs = {'filters': {}} if marker: kwargs['marker'] = marker kwargs['sort_dir'] = sort_dir images = [] self._prev = False self._more = False glance_v2_client = glance.glanceclient(self.request, "2") try: images_iter = glance_v2_client.images.list(**kwargs) except Exception: msg = _('Unable to retrieve list of images') uri = reverse('horizon:app-catalog:catalog:index') exceptions.handle(self.request, msg, redirect=uri) marked_images_iter = forms.filter_murano_images(images_iter, request=self.request) images = list(itertools.islice(marked_images_iter, request_size)) # first and middle page condition if len(images) > page_size: images.pop(-1) self._more = True # middle page condition if marker is not None: self._prev = True # first page condition when reached via prev back elif sort_dir == 'asc' and marker is not None: self._more = True # last page condition elif marker is not None: self._prev = True if prev_marker is not None: images.reverse() return images
def get_image_list(request): #Fetch the list of all images and loop through them gc = glance.glanceclient(request) image_list = gc.images.list() windows_image_list = {} for image in image_list: #Filtering the Windows/SQL images if "Windows" in image.name or "SQL" in image.name or "Win" in image.name: windows_image_list[image.id] = image.name return windows_image_list
def _ensure_images(name, package, request, step_data=None): try: glance_client = glance.glanceclient(request, version='1') except Exception: glance_client = None base_url = packages_consts.MURANO_REPO_URL image_specs = package.images() if not glance_client and len(image_specs): # NOTE(kzaitsev): no glance_client. Probably v1 client # is not available. Add warning, to let user know that # we were unable to load images automagically # since v2 does not have copy_from download_urls = [] for image_spec in image_specs: download_url = muranoclient_utils.to_url( image_spec.get("Url", image_spec['Name']), base_url=base_url, path='images/', ) download_urls.append(download_url) msg = _("Couldn't initialise glance v1 client, " "therefore could not download images for " "'{0}' package. You may need to download them " "manually from these locations: {1}").format( name, ' '.join(download_urls)) messages.error(request, msg) LOG.error(msg) return try: imgs = muranoclient_utils.ensure_images(glance_client=glance_client, image_specs=package.images(), base_url=base_url) for img in imgs: msg = _("Trying to add {0} image to glance. " "Image will be ready for deployment after " "successful upload").format(img['name'], ) messages.warning(request, msg) log_msg = _("Trying to add {0}, {1} image to " "glance. Image will be ready for " "deployment after successful upload")\ .format(img['name'], img['id'],) LOG.info(log_msg) if step_data: step_data['images'].append(img) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, name) messages.error(request, msg) LOG.exception(msg)
def download_image(request, image, download_path): """ download_image """ file_path = "%s/%s.%s" % (download_path, image.name, image.disk_format) utils.validate_image_format(file_path) LOG.debug("download image file path : {}".format(file_path)) image_file = open(file_path, "w+") image_data_iterable = glanceclient(request).images.data(image.id) try: LOG.debug("Start Image Download") for chunk in image_data_iterable: image_file.write(chunk) LOG.debug("Complete Image Download") finally: image_file.close() return file_path
def _ensure_images(name, package): try: glance_client = glance.glanceclient(self.request, version='1') imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=package.images(), base_url=base_url) for img in imgs: msg = _("Trying to add {0} image to glance. " "Image will be ready for deployment after " "successful upload").format(img['name'],) messages.warning(self.request, msg) log_msg = _("Trying to add {0}, {1} image to " "glance. Image will be ready for " "deployment after successful upload")\ .format(img['name'], img['id'],) LOG.info(log_msg) step_data['images'].append(img) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, name) messages.error(self.request, msg) LOG.exception(msg)
def process_step(self, form): @catalog_views.update_latest_apps def _update_latest_apps(request, app_id): LOG.info('Adding {0} application to the' ' latest apps list'.format(app_id)) step_data = self.get_form_step_data(form) if self.steps.current == 'upload': import_type = form.cleaned_data['import_type'] data = {} f = None base_url = packages_consts.MURANO_REPO_URL if import_type == 'upload': pkg = form.cleaned_data['package'] f = pkg.file elif import_type == 'by_url': f = form.cleaned_data['url'] elif import_type == 'by_name': name = form.cleaned_data['repo_name'] version = form.cleaned_data['repo_version'] f = muranoclient_utils.to_url( name, version=version, path='/apps/', extension='.zip', base_url=base_url, ) try: package = muranoclient_utils.Package.from_file(f) name = package.manifest['FullName'] except Exception as e: msg = _("Package creation failed" "Reason: {0}").format(e) LOG.exception(msg) messages.error(self.request, msg) raise exceptions.Http302( reverse('horizon:murano:packages:index')) def _ensure_images(name, package): try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=package.images(), base_url=base_url) for img in imgs: msg = _("Added {0}, {1} image to glance").format( img['name'], img['id'], ) messages.success(self.request, msg) LOG.info(msg) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, name) messages.error(self.request, msg) LOG.exception(msg) reqs = package.requirements(base_url=base_url) glance_client = glance.glanceclient(self.request, version='1') original_package = reqs.pop(name) step_data['dependencies'] = [] for dep_name, dep_package in reqs.iteritems(): _ensure_images(dep_name, dep_package) try: files = {dep_name: dep_package.file()} package = api.muranoclient(self.request).packages.create( data, files) messages.success( self.request, _('Package {0} uploaded').format(dep_name)) _update_latest_apps(request=self.request, app_id=package.id) step_data['dependencies'].append(package) except exc.HTTPConflict: msg = _("Package {0} already registered.").format(dep_name) messages.warning(self.request, msg) LOG.exception(msg) except Exception as e: msg = _("Error {0} occurred while " "installing package {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) continue # add main packages images _ensure_images(name, original_package) # import main package itself try: files = {name: original_package.file()} package = api.muranoclient(self.request).packages.create( data, files) messages.success(self.request, _('Package {0} uploaded').format(name)) _update_latest_apps(request=self.request, app_id=package.id) step_data['package'] = package except exc.HTTPConflict: msg = _("Package with specified name already exists") LOG.exception(msg) exceptions.handle( self.request, msg, redirect=reverse('horizon:murano:packages:index')) except exc.HTTPInternalServerError as e: self._handle_exception(e) except exc.HTTPException as e: reason = muranodashboard_utils.parse_api_error( getattr(e, 'details', '')) if not reason: raise LOG.exception(reason) exceptions.handle( self.request, reason, redirect=reverse('horizon:murano:packages:index')) except Exception as original_e: self._handle_exception(original_e) return step_data
def process_step(self, form): @catalog_views.update_latest_apps def _update_latest_apps(request, app_id): LOG.info('Adding {0} application to the' ' latest apps list'.format(app_id)) step_data = self.get_form_step_data(form) if self.steps.current == 'upload': import_type = form.cleaned_data['import_type'] data = {} f = None base_url = packages_consts.MURANO_REPO_URL if import_type == 'by_url': f = form.cleaned_data['url'] elif import_type == 'by_name': f = muranoclient_utils.to_url( form.cleaned_data['name'], path='/bundles/', base_url=base_url, extension='.bundle', ) try: bundle = muranoclient_utils.Bundle.from_file(f) except Exception as e: msg = _("Bundle creation failed" "Reason: {0}").format(e) LOG.exception(msg) messages.error(self.request, msg) raise exceptions.Http302( reverse('horizon:murano:packages:index')) glance_client = glance.glanceclient(self.request, version='1') for package_spec in bundle.package_specs(): try: package = muranoclient_utils.Package.from_location( package_spec['Name'], version=package_spec.get('Version'), url=package_spec.get('Url'), base_url=base_url, path=None, ) except Exception as e: msg = _("Error {0} occurred while parsing package {1}")\ .format(e, package_spec.get('Name')) messages.error(self.request, msg) LOG.exception(msg) continue reqs = package.requirements(base_url=base_url) for dep_name, dep_package in reqs.iteritems(): try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=dep_package.images(), base_url=base_url) for img in imgs: msg = _("Added {0}, {1} image to glance").format( img['name'], img['id'], ) messages.success(self.request, msg) LOG.info(msg) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) try: files = {dep_name: dep_package.file()} package = api.muranoclient( self.request).packages.create(data, files) messages.success( self.request, _('Package {0} uploaded').format(dep_name)) _update_latest_apps(request=self.request, app_id=package.id) except exc.HTTPConflict: msg = _("Package {0} already registered.").format( dep_name) messages.warning(self.request, msg) LOG.exception(msg) except exc.HTTPException as e: reason = muranodashboard_utils.parse_api_error( getattr(e, 'details', '')) if not reason: raise msg = _("Package {0} upload failed. {1}").format( dep_name, reason) messages.warning(self.request, msg) LOG.exception(msg) except Exception as e: msg = _("Importing package {0} failed. " "Reason: {1}").format(dep_name, e) messages.warning(self.request, msg) LOG.exception(msg) continue return step_data
def process_step(self, form): @catalog_views.update_latest_apps def _update_latest_apps(request, app_id): LOG.info("Adding {0} application to the" " latest apps list".format(app_id)) step_data = self.get_form_step_data(form) if self.steps.current == "upload": import_type = form.cleaned_data["import_type"] data = {} f = None base_url = packages_consts.MURANO_REPO_URL if import_type == "by_url": f = form.cleaned_data["url"] elif import_type == "by_name": f = muranoclient_utils.to_url( form.cleaned_data["name"], path="/bundles/", base_url=base_url, extension=".bundle" ) try: bundle = muranoclient_utils.Bundle.from_file(f) except Exception as e: msg = _("Bundle creation failed" "Reason: {0}").format(e) LOG.exception(msg) messages.error(self.request, msg) raise exceptions.Http302(reverse("horizon:murano:packages:index")) glance_client = glance.glanceclient(self.request, version="1") for package_spec in bundle.package_specs(): try: package = muranoclient_utils.Package.from_location( package_spec["Name"], version=package_spec.get("Version"), url=package_spec.get("Url"), base_url=base_url, path=None, ) except Exception as e: msg = _("Error {0} occurred while parsing package {1}").format(e, package_spec.get("Name")) messages.error(self.request, msg) LOG.exception(msg) continue reqs = package.requirements(base_url=base_url) for dep_name, dep_package in reqs.iteritems(): try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=dep_package.images(), base_url=base_url ) for img in imgs: msg = _("Added {0}, {1} image to glance").format(img["name"], img["id"]) messages.success(self.request, msg) LOG.info(msg) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) try: files = {dep_name: dep_package.file()} package = api.muranoclient(self.request).packages.create(data, files) messages.success(self.request, _("Package {0} uploaded").format(dep_name)) _update_latest_apps(request=self.request, app_id=package.id) except exc.HTTPConflict: msg = _("Package {0} already registered.").format(dep_name) messages.warning(self.request, msg) LOG.exception(msg) except exc.HTTPException as e: reason = muranodashboard_utils.parse_api_error(getattr(e, "details", "")) if not reason: raise msg = _("Package {0} upload failed. {1}").format(dep_name, reason) messages.warning(self.request, msg) LOG.exception(msg) except Exception as e: msg = _("Importing package {0} failed. " "Reason: {1}").format(dep_name, e) messages.warning(self.request, msg) LOG.exception(msg) continue return step_data
def process_step(self, form): @catalog_views.update_latest_apps def _update_latest_apps(request, app_id): LOG.info("Adding {0} application to the" " latest apps list".format(app_id)) step_data = self.get_form_step_data(form) if self.steps.current == "upload": import_type = form.cleaned_data["import_type"] data = {} f = None base_url = packages_consts.MURANO_REPO_URL if import_type == "upload": pkg = form.cleaned_data["package"] f = pkg.file elif import_type == "by_url": f = form.cleaned_data["url"] elif import_type == "by_name": name = form.cleaned_data["repo_name"] version = form.cleaned_data["repo_version"] f = muranoclient_utils.to_url(name, version=version, path="/apps/", extension=".zip", base_url=base_url) try: package = muranoclient_utils.Package.from_file(f) name = package.manifest["FullName"] except Exception as e: msg = _("Package creation failed" "Reason: {0}").format(e) LOG.exception(msg) messages.error(self.request, msg) raise exceptions.Http302(reverse("horizon:murano:packages:index")) def _ensure_images(name, package): try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=package.images(), base_url=base_url ) for img in imgs: msg = _("Added {0}, {1} image to glance").format(img["name"], img["id"]) messages.success(self.request, msg) LOG.info(msg) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, name) messages.error(self.request, msg) LOG.exception(msg) reqs = package.requirements(base_url=base_url) glance_client = glance.glanceclient(self.request, version="1") original_package = reqs.pop(name) step_data["dependencies"] = [] for dep_name, dep_package in reqs.iteritems(): _ensure_images(dep_name, dep_package) try: files = {dep_name: dep_package.file()} package = api.muranoclient(self.request).packages.create(data, files) messages.success(self.request, _("Package {0} uploaded").format(dep_name)) _update_latest_apps(request=self.request, app_id=package.id) step_data["dependencies"].append(package) except exc.HTTPConflict: msg = _("Package {0} already registered.").format(dep_name) messages.warning(self.request, msg) LOG.exception(msg) except Exception as e: msg = _("Error {0} occurred while " "installing package {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) continue # add main packages images _ensure_images(name, original_package) # import main package itself try: files = {name: original_package.file()} package = api.muranoclient(self.request).packages.create(data, files) messages.success(self.request, _("Package {0} uploaded").format(name)) _update_latest_apps(request=self.request, app_id=package.id) step_data["package"] = package except exc.HTTPConflict: msg = _("Package with specified name already exists") LOG.exception(msg) exceptions.handle(self.request, msg, redirect=reverse("horizon:murano:packages:index")) except exc.HTTPInternalServerError as e: self._handle_exception(e) except exc.HTTPException as e: reason = muranodashboard_utils.parse_api_error(getattr(e, "details", "")) if not reason: raise LOG.exception(reason) exceptions.handle(self.request, reason, redirect=reverse("horizon:murano:packages:index")) except Exception as original_e: self._handle_exception(original_e) return step_data
def done(self, form_list, **kwargs): data = self.get_all_cleaned_data() app_id = self.storage.get_step_data('upload')['package'].id # Remove package file from result data for key in ('package', 'import_type', 'url', 'repo_version', 'repo_name'): del data[key] dep_pkgs = self.storage.get_step_data('upload').get('dependencies', []) installed_images = self.storage.get_step_data('upload').get( 'images', []) redirect = reverse('horizon:murano:packages:index') dep_data = {'enabled': data['enabled'], 'is_public': data['is_public']} murano_client = api.muranoclient(self.request) for dep_pkg in dep_pkgs: try: murano_client.packages.update(dep_pkg.id, dep_data) LOG.debug('Success update for package {0}.'.format(dep_pkg.id)) except Exception as e: msg = _("Couldn't update package {0} parameters. Error: {1}")\ .format(dep_pkg.fully_qualified_name, e) LOG.warning(msg) messages.warning(self.request, msg) # Images have been imported as private images during the 'upload' step # If the package is public, make the required images public if data['is_public']: glance_client = glance.glanceclient(self.request, version='1') for img in installed_images: try: glance_client.images.update(img['id'], is_public=True) LOG.debug('Success update for image {0}'.format(img['id'])) except Exception as e: msg = _("Error {0} occurred while setting image {1}, {2} " "public").format(e, img['name'], img['id']) messages.error(self.request, msg) LOG.exception(msg) try: data['tags'] = [t.strip() for t in data['tags'].split(',')] murano_client.packages.update(app_id, data) except exc.HTTPForbidden: msg = _("You are not allowed to change" " this properties of the package") LOG.exception(msg) exceptions.handle( self.request, msg, redirect=reverse('horizon:murano:packages:index')) except (exc.HTTPException, Exception): LOG.exception(_('Modifying package failed')) exceptions.handle(self.request, _('Unable to modify package'), redirect=redirect) else: msg = _('Package parameters successfully updated.') LOG.info(msg) messages.success(self.request, msg) return http.HttpResponseRedirect(redirect)
def process_step(self, form): @catalog_views.update_latest_apps def _update_latest_apps(request, app_id): LOG.info('Adding {0} application to the' ' latest apps list'.format(app_id)) step_data = self.get_form_step_data(form) if self.steps.current == 'upload': import_type = form.cleaned_data['import_type'] data = {} f = None base_url = packages_consts.MURANO_REPO_URL if import_type == 'upload': pkg = form.cleaned_data['package'] f = pkg.file elif import_type == 'by_url': f = form.cleaned_data['url'] elif import_type == 'by_name': name = form.cleaned_data['repo_name'] version = form.cleaned_data['repo_version'] f = muranoclient_utils.to_url( name, version=version, path='/apps/', extension='.zip', base_url=base_url, ) try: package = muranoclient_utils.Package.from_file(f) name = package.manifest['FullName'] except Exception as e: msg = _("Package creation failed" "Reason: {0}").format(e) LOG.exception(msg) messages.error(self.request, msg) raise exceptions.Http302( reverse('horizon:murano:packages:index')) reqs = package.requirements(base_url=base_url) glance_client = glance.glanceclient(self.request, version='1') original_package = reqs.pop(name) step_data['dependencies'] = [] for dep_name, dep_package in reqs.iteritems(): try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=dep_package.images(), base_url=base_url) for img in imgs: msg = _("Added {0}, {1} image to glance").format( img['name'], img['id'], ) messages.success(self.request, msg) LOG.info(msg) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) try: files = {dep_name: dep_package.file()} package = api.muranoclient(self.request).packages.create( data, files) messages.success( self.request, _('Package {0} uploaded').format(dep_name) ) _update_latest_apps( request=self.request, app_id=package.id) step_data['dependencies'].append(package) except exc.HTTPConflict: msg = _("Package {0} already registered.").format( dep_name) messages.warning(self.request, msg) LOG.exception(msg) except Exception as e: msg = _("Error {0} occurred while " "installing package {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) continue # install main package images try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=original_package.images(), base_url=base_url) for img in imgs: msg = _("Added {0}, {1} image to glance").format( img['name'], img['id'], ) messages.success(self.request, msg) LOG.info(msg) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, name) messages.error(self.request, msg) LOG.exception(msg) # install main package images try: files = {name: original_package.file()} package = api.muranoclient(self.request).packages.create( data, files) messages.success(self.request, _('Package {0} uploaded').format(name)) _update_latest_apps(request=self.request, app_id=package.id) step_data['package'] = package except exc.HTTPConflict: msg = _("Package with specified name already exists") LOG.exception(msg) exceptions.handle( self.request, msg, redirect=reverse('horizon:murano:packages:index')) except Exception as e: msg = _("Uploading package failed. {0}").format(e.message) LOG.exception(msg) exceptions.handle( self.request, msg, redirect=reverse('horizon:murano:packages:index')) return step_data
def process_step(self, form): @catalog_views.update_latest_apps def _update_latest_apps(request, app_id): LOG.info('Adding {0} application to the' ' latest apps list'.format(app_id)) step_data = self.get_form_step_data(form) if self.steps.current == 'upload': import_type = form.cleaned_data['import_type'] data = {} f = None base_url = packages_consts.MURANO_REPO_URL if import_type == 'upload': pkg = form.cleaned_data['package'] f = pkg.file elif import_type == 'by_url': f = form.cleaned_data['url'] elif import_type == 'by_name': name = form.cleaned_data['repo_name'] version = form.cleaned_data['repo_version'] f = muranoclient_utils.to_url( name, version=version, path='apps/', extension='.zip', base_url=base_url, ) try: package = muranoclient_utils.Package.from_file(f) name = package.manifest['FullName'] except Exception as e: if '(404)' in e.message: msg = _("Package creation failed." "Reason: Can't find Package name from repository.") else: msg = _("Package creation failed." "Reason: {0}").format(e) LOG.exception(msg) messages.error(self.request, msg) raise exceptions.Http302( reverse('horizon:murano:packages:index')) def _ensure_images(name, package): try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=package.images(), base_url=base_url) for img in imgs: msg = _("Trying to add {0} image to glance. " "Image will be ready for deployment after " "successful upload").format(img['name'],) messages.warning(self.request, msg) log_msg = _("Trying to add {0}, {1} image to " "glance. Image will be ready for " "deployment after successful upload")\ .format(img['name'], img['id'],) LOG.info(log_msg) step_data['images'].append(img) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, name) messages.error(self.request, msg) LOG.exception(msg) reqs = package.requirements(base_url=base_url) glance_client = glance.glanceclient(self.request, version='1') original_package = reqs.pop(name) step_data['dependencies'] = [] step_data['images'] = [] for dep_name, dep_package in six.iteritems(reqs): _ensure_images(dep_name, dep_package) try: files = {dep_name: dep_package.file()} package = api.muranoclient(self.request).packages.create( data, files) messages.success( self.request, _('Package {0} uploaded').format(dep_name) ) _update_latest_apps( request=self.request, app_id=package.id) step_data['dependencies'].append(package) except exc.HTTPConflict: msg = _("Package {0} already registered.").format( dep_name) messages.warning(self.request, msg) LOG.exception(msg) except Exception as e: msg = _("Error {0} occurred while " "installing package {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) continue # add main packages images _ensure_images(name, original_package) # import main package itself try: files = {name: original_package.file()} package = api.muranoclient(self.request).packages.create( data, files) messages.success(self.request, _('Package {0} uploaded').format(name)) _update_latest_apps(request=self.request, app_id=package.id) step_data['package'] = package except exc.HTTPConflict: msg = _("Package with specified name already exists") LOG.exception(msg) exceptions.handle( self.request, msg, redirect=reverse('horizon:murano:packages:index')) except exc.HTTPInternalServerError as e: self._handle_exception(e) except exc.HTTPException as e: reason = muranodashboard_utils.parse_api_error( getattr(e, 'details', '')) if not reason: raise LOG.exception(reason) exceptions.handle( self.request, reason, redirect=reverse('horizon:murano:packages:index')) except Exception as original_e: self._handle_exception(original_e) return step_data
def done(self, form_list, **kwargs): data = self.get_all_cleaned_data() app_id = self.storage.get_step_data('upload')['package'].id # Remove package file from result data for key in ('package', 'import_type', 'url', 'repo_version', 'repo_name'): del data[key] dep_pkgs = self.storage.get_step_data('upload').get( 'dependencies', []) installed_images = self.storage.get_step_data('upload').get( 'images', []) redirect = reverse('horizon:murano:packages:index') dep_data = {'enabled': data['enabled'], 'is_public': data['is_public']} murano_client = api.muranoclient(self.request) for dep_pkg in dep_pkgs: try: murano_client.packages.update(dep_pkg.id, dep_data) LOG.debug('Success update for package {0}.'.format(dep_pkg.id)) except Exception as e: msg = _("Couldn't update package {0} parameters. Error: {1}")\ .format(dep_pkg.fully_qualified_name, e) LOG.warning(msg) messages.warning(self.request, msg) # Images have been imported as private images during the 'upload' step # If the package is public, make the required images public if data['is_public']: glance_client = glance.glanceclient(self.request, version='1') for img in installed_images: try: glance_client.images.update(img['id'], is_public=True) LOG.debug('Success update for image {0}'.format(img['id'])) except Exception as e: msg = _("Error {0} occurred while setting image {1}, {2} " "public").format(e, img['name'], img['id']) messages.error(self.request, msg) LOG.exception(msg) try: data['tags'] = [t.strip() for t in data['tags'].split(',')] murano_client.packages.update(app_id, data) except exc.HTTPForbidden: msg = _("You are not allowed to change" " this properties of the package") LOG.exception(msg) exceptions.handle( self.request, msg, redirect=reverse('horizon:murano:packages:index')) except (exc.HTTPException, Exception): LOG.exception(_('Modifying package failed')) exceptions.handle(self.request, _('Unable to modify package'), redirect=redirect) else: msg = _('Package parameters successfully updated.') LOG.info(msg) messages.success(self.request, msg) return http.HttpResponseRedirect(redirect)
def process_step(self, form): @catalog_views.update_latest_apps def _update_latest_apps(request, app_id): LOG.info('Adding {0} application to the' ' latest apps list'.format(app_id)) step_data = self.get_form_step_data(form) if self.steps.current == 'upload': import_type = form.cleaned_data['import_type'] data = {} f = None base_url = packages_consts.MURANO_REPO_URL if import_type == 'by_url': f = form.cleaned_data['url'] elif import_type == 'by_name': f = muranoclient_utils.to_url( form.cleaned_data['name'], path='bundles/', base_url=base_url, extension='.bundle', ) try: bundle = muranoclient_utils.Bundle.from_file(f) except Exception as e: if '(404)' in e.message: msg = _("Bundle creation failed." "Reason: Can't find Bundle name from repository.") else: msg = _("Bundle creation failed." "Reason: {0}").format(e) LOG.exception(msg) messages.error(self.request, msg) raise exceptions.Http302( reverse('horizon:murano:packages:index')) glance_client = glance.glanceclient(self.request, version='1') for package_spec in bundle.package_specs(): try: package = muranoclient_utils.Package.from_location( package_spec['Name'], version=package_spec.get('Version'), url=package_spec.get('Url'), base_url=base_url, path=None, ) except Exception as e: msg = _("Error {0} occurred while parsing package {1}")\ .format(e, package_spec.get('Name')) messages.error(self.request, msg) LOG.exception(msg) continue reqs = package.requirements(base_url=base_url) for dep_name, dep_package in six.iteritems(reqs): try: imgs = muranoclient_utils.ensure_images( glance_client=glance_client, image_specs=dep_package.images(), base_url=base_url) for img in imgs: msg = _("Trying to add {0} image to glance. " "Image will be ready for deployment after" " successful upload").format(img['name'],) messages.warning(self.request, msg) log_msg = _("Trying to add {0}, {1} image to " "glance. Image will be ready for " "deployment after successful upload")\ .format(img['name'], img['id'],) LOG.info(log_msg) except Exception as e: msg = _("Error {0} occurred while installing " "images for {1}").format(e, dep_name) messages.error(self.request, msg) LOG.exception(msg) try: files = {dep_name: dep_package.file()} package = api.muranoclient( self.request).packages.create(data, files) messages.success( self.request, _('Package {0} uploaded').format(dep_name) ) _update_latest_apps( request=self.request, app_id=package.id) except exc.HTTPConflict: msg = _("Package {0} already registered.").format( dep_name) messages.warning(self.request, msg) LOG.exception(msg) except exc.HTTPException as e: reason = muranodashboard_utils.parse_api_error( getattr(e, 'details', '')) if not reason: raise msg = _("Package {0} upload failed. {1}").format( dep_name, reason) messages.warning(self.request, msg) LOG.exception(msg) except Exception as e: msg = _("Importing package {0} failed. " "Reason: {1}").format(dep_name, e) messages.warning(self.request, msg) LOG.exception(msg) continue return step_data
def get_data(self): prev_marker = self.request.GET.get( tables.MarkedImagesTable._meta.prev_pagination_param, None) if prev_marker is not None: sort_dir = 'asc' marker = prev_marker else: sort_dir = 'desc' marker = self.request.GET.get( tables.MarkedImagesTable._meta.pagination_param, None) page_size = utils.get_page_size(self.request) request_size = page_size + 1 kwargs = {'filters': {}} if marker: kwargs['marker'] = marker kwargs['sort_dir'] = sort_dir images = [] self._prev = False self._more = False # TODO(kzaitsev) add v2 client support for marking images try: glance_v1_client = glance.glanceclient(self.request, "1") except Exception: # Horizon seems to raise ImportError which doesn't look # specific enough. Let's catch any exceptions. msg = _('Unable to create v1 glance client. Marking images ' 'from murano-dashboard will be unavailable.') uri = reverse('horizon:app-catalog:catalog:index') exceptions.handle(self.request, msg, redirect=uri) try: images_iter = glance_v1_client.images.list(**kwargs) except Exception: msg = _('Unable to retrieve list of images') uri = reverse('horizon:app-catalog:catalog:index') exceptions.handle(self.request, msg, redirect=uri) marked_images_iter = forms.filter_murano_images(images_iter, request=self.request) images = list(itertools.islice(marked_images_iter, request_size)) # first and middle page condition if len(images) > page_size: images.pop(-1) self._more = True # middle page condition if marker is not None: self._prev = True # first page condition when reached via prev back elif sort_dir == 'asc' and marker is not None: self._more = True # last page condition elif marker is not None: self._prev = True if prev_marker is not None: images.reverse() return images