Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
workloadmgr / usr / lib / python3 / dist-packages / workloadmgr / api / views / migrations.py
Size: Mime:
# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright (c) 2013 TrilioData, Inc.
# All Rights Reserved.

import pickle as pickle

from workloadmgr.openstack.common import log as logging
from workloadmgr.api import common


LOG = logging.getLogger(__name__)


class ViewBuilder(common.ViewBuilder):
    """Model migrations API responses as a python dictionary."""

    _collection_name = "migrations"

    def __init__(self):
        """Initialize view builder."""
        super(ViewBuilder, self).__init__()

    def summary_list(self, request, migrations):
        """Show a list of migrations without many details."""
        return self._list_view(self.summary, request, migrations)

    def detail_list(self, request, migrations):
        """Detailed view of a list of migrations ."""
        return self._list_view(self.detail, request, migrations)

    def summary(self, request, migration):
        """Generic, non-detailed view of a migration."""
        d = {}
        d["id"] = migration["id"]
        d["status"] = migration["status"]
        d["migration_type"] = migration["migration_type"]
        if migration.get("migration_plan_id"):
            d["migration_plan_id"] = migration["migration_plan_id"]

        if "vms" in migration:
            vms = []
            for vm in migration["vms"]:
                vm_inst = {
                    "id": vm["id"],
                    "name": vm["name"],
                    "status": vm["status"],
                    "metadata": vm["metadata"],
                }
                if "flavor" in vm:
                    vm_inst["flavor"] = vm["flavor"]
                if "nics" in vm:
                    vm_inst["nics"] = vm["nics"]
                vms.append(vm_inst)

            d["vms"] = vms

        if "networks" in migration:
            d["networks"] = migration["networks"]
        if "subnets" in migration:
            d["subnets"] = migration["subnets"]
        if "routers" in migration:
            d["routers"] = migration["routers"]
        if "flavors" in migration:
            d["flavors"] = migration["flavors"]
        if "flavors" in migration:
            d["flavors"] = migration["flavors"]
        d["links"] = self._get_links(request, migration["id"])
        d["name"] = migration["display_name"]
        d["description"] = migration["display_description"]
        d["host"] = migration["host"]

        return {"migration": d}

    def detail(self, request, migration):
        """Detailed view of a single migration."""
        d = {}
        d["id"] = migration["id"]
        d["created_at"] = migration["created_at"]
        d["updated_at"] = migration["created_at"]
        d["finished_at"] = migration["finished_at"]
        d["user_id"] = migration["user_id"]
        d["project_id"] = migration["project_id"]
        d["status"] = migration["status"]
        d["migration_type"] = migration["migration_type"]
        d["migration_plan_id"] = migration["migration_plan_id"]

        if "instances" in migration:
            instances = []
            for vm in migration["instances"]:
                instance = {
                    "id": vm["id"],
                    "name": vm["name"],
                    "status": vm["status"],
                    "metadata": vm["metadata"],
                }
                if "flavor" in vm:
                    instance["flavor"] = vm["flavor"]
                if "nics" in vm:
                    instance["nics"] = vm["nics"]
                instances.append(instance)

            d["instances"] = instances

        if "networks" in migration:
            d["networks"] = migration["networks"]
        if "subnets" in migration:
            d["subnets"] = migration["subnets"]
        if "routers" in migration:
            d["routers"] = migration["routers"]

        d["links"] = self._get_links(request, migration["id"])
        d["name"] = migration["display_name"]
        d["description"] = migration["display_description"]
        d["host"] = migration["host"]
        d["progress_percent"] = migration["progress_percent"]
        d["progress_msg"] = migration["progress_msg"]
        d["warning_msg"] = migration["warning_msg"]
        d["error_msg"] = migration["error_msg"]
        d["time_taken"] = migration["time_taken"]

        d["migration_options"] = {}
        if hasattr(migration, "pickle") and migration.pickle:
            d["migration_options"] = pickle.loads(
                bytes(migration.pickle, "utf-8")
            )

        # For backword compatibilty decoding only when name or desc is encoded.
        if d["migration_options"].get("name") and isinstance(d["migration_options"]["name"], bytes):
            d["migration_options"]["name"] = d["migration_options"]["name"].decode(encoding='UTF-8')

        if d["migration_options"].get("description") and isinstance(d["migration_options"]["description"], bytes):
            d["migration_options"]["description"] = d["migration_options"]["description"].decode(encoding='UTF-8')

        if hasattr(migration, "metadata") or "metadata" in migration:
            d["metadata"] = migration["metadata"]
        else:
            d["metadata"] = []
        return {"migration": d}

    def _list_view(self, func, request, migrations):
        """Provide a view for a list of restores."""
        migrations_list = [func(request, migration)["migration"] for migration in migrations]
        migrations_links = self._get_collection_links(
            request, migrations, self._collection_name
        )
        migrations_dict = dict(migrations=migrations_list)

        if migrations_links:
            migrations_dict["migrations_links"] = migrations_links

        return migrations_dict