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
Exemple #2
0
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')
Exemple #3
0
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)
Exemple #4
0
    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
Exemple #5
0
    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
Exemple #7
0
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)
Exemple #8
0
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
Exemple #9
0
 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)
Exemple #10
0
    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
Exemple #11
0
    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
Exemple #12
0
    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
Exemple #13
0
    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
Exemple #14
0
    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)
Exemple #15
0
    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
Exemple #19
0
    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