¡@

Home 

OpenStack Study: fake.py

OpenStack Index

**** CubicPower OpenStack Study ****

# Copyright 2010 United States Government as represented by the

# Administrator of the National Aeronautics and Space Administration.

# All Rights Reserved.

# Copyright (c) 2010 Citrix Systems, Inc.

#

# Licensed under the Apache License, Version 2.0 (the "License"); you may

# not use this file except in compliance with the License. You may obtain

# a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

# License for the specific language governing permissions and limitations

# under the License.

"""

A fake (in-memory) hypervisor+api.

Allows nova testing w/o a hypervisor. This module also documents the

semantics of real hypervisor connections.

"""

import contextlib

from oslo.config import cfg

from nova.compute import power_state

from nova.compute import task_states

from nova import db

from nova import exception

from nova.openstack.common.gettextutils import _

from nova.openstack.common import jsonutils

from nova.openstack.common import log as logging

from nova import utils

from nova.virt import driver

from nova.virt import virtapi

CONF = cfg.CONF

CONF.import_opt('host', 'nova.netconf')

LOG = logging.getLogger(__name__)

_FAKE_NODES = None

**** CubicPower OpenStack Study ****

def set_nodes(nodes):

    """Sets FakeDriver's node.list.

    It has effect on the following methods:

        get_available_nodes()

        get_available_resource

        get_host_stats()

    To restore the change, call restore_nodes()

    """

    global _FAKE_NODES

    _FAKE_NODES = nodes

**** CubicPower OpenStack Study ****

def restore_nodes():

    """Resets FakeDriver's node list modified by set_nodes().

    Usually called from tearDown().

    """

    global _FAKE_NODES

    _FAKE_NODES = [CONF.host]

**** CubicPower OpenStack Study ****

class FakeInstance(object):

**** CubicPower OpenStack Study ****

    def __init__(self, name, state):

        self.name = name

        self.state = state

**** CubicPower OpenStack Study ****

    def __getitem__(self, key):

        return getattr(self, key)

**** CubicPower OpenStack Study ****

class FakeDriver(driver.ComputeDriver):

capabilities = {

"has_imagecache": True,

"supports_recreate": True,

}

"""Fake hypervisor driver."""

**** CubicPower OpenStack Study ****

    def __init__(self, virtapi, read_only=False):

        super(FakeDriver, self).__init__(virtapi)

        self.instances = {}

        self.host_status_base = {

          'vcpus': 100000,

          'memory_mb': 8000000000,

          'local_gb': 600000000000,

          'vcpus_used': 0,

          'memory_mb_used': 0,

          'local_gb_used': 100000000000,

          'hypervisor_type': 'fake',

          'hypervisor_version': utils.convert_version_to_int('1.0'),

          'hypervisor_hostname': CONF.host,

          'cpu_info': {},

          'disk_available_least': 500000000000,

          'supported_instances': [(None, 'fake', None)],

          }

        self._mounts = {}

        self._interfaces = {}

        if not _FAKE_NODES:

            set_nodes([CONF.host])

**** CubicPower OpenStack Study ****

    def init_host(self, host):

        return

**** CubicPower OpenStack Study ****

    def list_instances(self):

        return self.instances.keys()

**** CubicPower OpenStack Study ****

    def plug_vifs(self, instance, network_info):

        """Plug VIFs into networks."""

        pass

**** CubicPower OpenStack Study ****

    def unplug_vifs(self, instance, network_info):

        """Unplug VIFs from networks."""

        pass

**** CubicPower OpenStack Study ****

    def spawn(self, context, instance, image_meta, injected_files,

              admin_password, network_info=None, block_device_info=None):

        name = instance['name']

        state = power_state.RUNNING

        fake_instance = FakeInstance(name, state)

        self.instances[name] = fake_instance

**** CubicPower OpenStack Study ****

    def snapshot(self, context, instance, name, update_task_state):

        if instance['name'] not in self.instances:

            raise exception.InstanceNotRunning(instance_id=instance['uuid'])

        update_task_state(task_state=task_states.IMAGE_UPLOADING)

**** CubicPower OpenStack Study ****

    def reboot(self, context, instance, network_info, reboot_type,

               block_device_info=None, bad_volumes_callback=None):

        pass

    @staticmethod

**** CubicPower OpenStack Study ****

    def get_host_ip_addr():

        return '192.168.0.1'

**** CubicPower OpenStack Study ****

    def set_admin_password(self, instance, new_pass):

        pass

**** CubicPower OpenStack Study ****

    def inject_file(self, instance, b64_path, b64_contents):

        pass

**** CubicPower OpenStack Study ****

    def resume_state_on_host_boot(self, context, instance, network_info,

                                  block_device_info=None):

        pass

**** CubicPower OpenStack Study ****

    def rescue(self, context, instance, network_info, image_meta,

               rescue_password):

        pass

**** CubicPower OpenStack Study ****

    def unrescue(self, instance, network_info):

        pass

**** CubicPower OpenStack Study ****

    def poll_rebooting_instances(self, timeout, instances):

        pass

**** CubicPower OpenStack Study ****

    def migrate_disk_and_power_off(self, context, instance, dest,

                                   flavor, network_info,

                                   block_device_info=None):

        pass

**** CubicPower OpenStack Study ****

    def finish_revert_migration(self, context, instance, network_info,

                                block_device_info=None, power_on=True):

        pass

**** CubicPower OpenStack Study ****

    def post_live_migration_at_destination(self, context, instance,

                                           network_info,

                                           block_migration=False,

                                           block_device_info=None):

        pass

**** CubicPower OpenStack Study ****

    def power_off(self, instance):

        pass

**** CubicPower OpenStack Study ****

    def power_on(self, context, instance, network_info, block_device_info):

        pass

**** CubicPower OpenStack Study ****

    def soft_delete(self, instance):

        pass

**** CubicPower OpenStack Study ****

    def restore(self, instance):

        pass

**** CubicPower OpenStack Study ****

    def pause(self, instance):

        pass

**** CubicPower OpenStack Study ****

    def unpause(self, instance):

        pass

**** CubicPower OpenStack Study ****

    def suspend(self, instance):

        pass

**** CubicPower OpenStack Study ****

    def resume(self, context, instance, network_info, block_device_info=None):

        pass

**** CubicPower OpenStack Study ****

    def destroy(self, context, instance, network_info, block_device_info=None,

                destroy_disks=True):

        key = instance['name']

        if key in self.instances:

            del self.instances[key]

        else:

            LOG.warning(_("Key '%(key)s' not in instances '%(inst)s'") %

                        {'key': key,

                         'inst': self.instances}, instance=instance)

**** CubicPower OpenStack Study ****

    def cleanup(self, context, instance, network_info, block_device_info=None,

                destroy_disks=True):

        pass

**** CubicPower OpenStack Study ****

    def attach_volume(self, context, connection_info, instance, mountpoint,

                      disk_bus=None, device_type=None, encryption=None):

        """Attach the disk to the instance at mountpoint using info."""

        instance_name = instance['name']

        if instance_name not in self._mounts:

            self._mounts[instance_name] = {}

        self._mounts[instance_name][mountpoint] = connection_info

        return True

**** CubicPower OpenStack Study ****

    def detach_volume(self, connection_info, instance, mountpoint,

                      encryption=None):

        """Detach the disk attached to the instance."""

        try:

            del self._mounts[instance['name']][mountpoint]

        except KeyError:

            pass

        return True

**** CubicPower OpenStack Study ****

    def swap_volume(self, old_connection_info, new_connection_info,

                    instance, mountpoint):

        """Replace the disk attached to the instance."""

        instance_name = instance['name']

        if instance_name not in self._mounts:

            self._mounts[instance_name] = {}

        self._mounts[instance_name][mountpoint] = new_connection_info

        return True

**** CubicPower OpenStack Study ****

    def attach_interface(self, instance, image_meta, vif):

        if vif['id'] in self._interfaces:

            raise exception.InterfaceAttachFailed('duplicate')

        self._interfaces[vif['id']] = vif

**** CubicPower OpenStack Study ****

    def detach_interface(self, instance, vif):

        try:

            del self._interfaces[vif['id']]

        except KeyError:

            raise exception.InterfaceDetachFailed('not attached')

**** CubicPower OpenStack Study ****

    def get_info(self, instance):

        if instance['name'] not in self.instances:

            raise exception.InstanceNotFound(instance_id=instance['name'])

        i = self.instances[instance['name']]

        return {'state': i.state,

                'max_mem': 0,

                'mem': 0,

                'num_cpu': 2,

                'cpu_time': 0}

**** CubicPower OpenStack Study ****

    def get_diagnostics(self, instance_name):

        return {'cpu0_time': 17300000000,

                'memory': 524288,

                'vda_errors': -1,

                'vda_read': 262144,

                'vda_read_req': 112,

                'vda_write': 5778432,

                'vda_write_req': 488,

                'vnet1_rx': 2070139,

                'vnet1_rx_drop': 0,

                'vnet1_rx_errors': 0,

                'vnet1_rx_packets': 26701,

                'vnet1_tx': 140208,

                'vnet1_tx_drop': 0,

                'vnet1_tx_errors': 0,

                'vnet1_tx_packets': 662,

        }

**** CubicPower OpenStack Study ****

    def get_all_bw_counters(self, instances):

        """Return bandwidth usage counters for each interface on each

           running VM.

        """

        bw = []

        return bw

**** CubicPower OpenStack Study ****

    def get_all_volume_usage(self, context, compute_host_bdms):

        """Return usage info for volumes attached to vms on

           a given host.

        """

        volusage = []

        return volusage

**** CubicPower OpenStack Study ****

    def get_host_cpu_stats(self):

        stats = {'kernel': 5664160000000L,

                'idle': 1592705190000000L,

                'user': 26728850000000L,

                'iowait': 6121490000000L}

        stats['frequency'] = 800

        return stats

**** CubicPower OpenStack Study ****

    def block_stats(self, instance_name, disk_id):

        return [0L, 0L, 0L, 0L, None]

**** CubicPower OpenStack Study ****

    def interface_stats(self, instance_name, iface_id):

        return [0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L]

**** CubicPower OpenStack Study ****

    def get_console_output(self, context, instance):

        return 'FAKE CONSOLE OUTPUT\nANOTHER\nLAST LINE'

**** CubicPower OpenStack Study ****

    def get_vnc_console(self, context, instance):

        return {'internal_access_path': 'FAKE',

                'host': 'fakevncconsole.com',

                'port': 6969}

**** CubicPower OpenStack Study ****

    def get_spice_console(self, context, instance):

        return {'internal_access_path': 'FAKE',

                'host': 'fakespiceconsole.com',

                'port': 6969,

                'tlsPort': 6970}

**** CubicPower OpenStack Study ****

    def get_rdp_console(self, context, instance):

        return {'internal_access_path': 'FAKE',

                'host': 'fakerdpconsole.com',

                'port': 6969}

**** CubicPower OpenStack Study ****

    def get_console_pool_info(self, console_type):

        return {'address': '127.0.0.1',

                'username': 'fakeuser',

                'password': 'fakepassword'}

**** CubicPower OpenStack Study ****

    def refresh_security_group_rules(self, security_group_id):

        return True

**** CubicPower OpenStack Study ****

    def refresh_security_group_members(self, security_group_id):

        return True

**** CubicPower OpenStack Study ****

    def refresh_instance_security_rules(self, instance):

        return True

**** CubicPower OpenStack Study ****

    def refresh_provider_fw_rules(self):

        pass

**** CubicPower OpenStack Study ****

    def get_available_resource(self, nodename):

        """Updates compute manager resource info on ComputeNode table.

           Since we don't have a real hypervisor, pretend we have lots of

           disk and ram.

        """

        if nodename not in _FAKE_NODES:

            return {}

        dic = {'vcpus': 1,

               'memory_mb': 8192,

               'local_gb': 1028,

               'vcpus_used': 0,

               'memory_mb_used': 0,

               'local_gb_used': 0,

               'hypervisor_type': 'fake',

               'hypervisor_version': '1.0',

               'hypervisor_hostname': nodename,

               'disk_available_least': 0,

               'cpu_info': '?',

               'supported_instances': jsonutils.dumps([(None, 'fake', None)])

              }

        return dic

**** CubicPower OpenStack Study ****

    def ensure_filtering_rules_for_instance(self, instance_ref, network_info):

        return

**** CubicPower OpenStack Study ****

    def get_instance_disk_info(self, instance_name):

        return

**** CubicPower OpenStack Study ****

    def live_migration(self, context, instance_ref, dest,

                       post_method, recover_method, block_migration=False,

                       migrate_data=None):

        post_method(context, instance_ref, dest, block_migration,

                            migrate_data)

        return

**** CubicPower OpenStack Study ****

    def check_can_live_migrate_destination_cleanup(self, ctxt,

                                                   dest_check_data):

        return

**** CubicPower OpenStack Study ****

    def check_can_live_migrate_destination(self, ctxt, instance_ref,

                                           src_compute_info, dst_compute_info,

                                           block_migration=False,

                                           disk_over_commit=False):

        return {}

**** CubicPower OpenStack Study ****

    def check_can_live_migrate_source(self, ctxt, instance_ref,

                                      dest_check_data):

        return

**** CubicPower OpenStack Study ****

    def finish_migration(self, context, migration, instance, disk_info,

                         network_info, image_meta, resize_instance,

                         block_device_info=None, power_on=True):

        return

**** CubicPower OpenStack Study ****

    def confirm_migration(self, migration, instance, network_info):

        return

**** CubicPower OpenStack Study ****

    def pre_live_migration(self, context, instance_ref, block_device_info,

                           network_info, disk, migrate_data=None):

        return

**** CubicPower OpenStack Study ****

    def unfilter_instance(self, instance_ref, network_info):

        return

**** CubicPower OpenStack Study ****

    def test_remove_vm(self, instance_name):

        """Removes the named VM, as if it crashed. For testing."""

        self.instances.pop(instance_name)

**** CubicPower OpenStack Study ****

    def get_host_stats(self, refresh=False):

        """Return fake Host Status of ram, disk, network."""

        stats = []

        for nodename in _FAKE_NODES:

            host_status = self.host_status_base.copy()

            host_status['hypervisor_hostname'] = nodename

            host_status['host_hostname'] = nodename

            host_status['host_name_label'] = nodename

            stats.append(host_status)

        if len(stats) == 0:

            raise exception.NovaException("FakeDriver has no node")

        elif len(stats) == 1:

            return stats[0]

        else:

            return stats

**** CubicPower OpenStack Study ****

    def host_power_action(self, host, action):

        """Reboots, shuts down or powers up the host."""

        return action

**** CubicPower OpenStack Study ****

    def host_maintenance_mode(self, host, mode):

        """Start/Stop host maintenance window. On start, it triggers

        guest VMs evacuation.

        """

        if not mode:

            return 'off_maintenance'

        return 'on_maintenance'

**** CubicPower OpenStack Study ****

    def set_host_enabled(self, host, enabled):

        """Sets the specified host's ability to accept new instances."""

        if enabled:

            return 'enabled'

        return 'disabled'

**** CubicPower OpenStack Study ****

    def get_disk_available_least(self):

        pass

**** CubicPower OpenStack Study ****

    def get_volume_connector(self, instance):

        return {'ip': '127.0.0.1', 'initiator': 'fake', 'host': 'fakehost'}

**** CubicPower OpenStack Study ****

    def get_available_nodes(self, refresh=False):

        return _FAKE_NODES

**** CubicPower OpenStack Study ****

    def instance_on_disk(self, instance):

        return False

**** CubicPower OpenStack Study ****

    def list_instance_uuids(self):

        return []

**** CubicPower OpenStack Study ****

class FakeVirtAPI(virtapi.VirtAPI):

**** CubicPower OpenStack Study ****

    def instance_update(self, context, instance_uuid, updates):

        return db.instance_update_and_get_original(context,

                                                   instance_uuid,

                                                   updates)

**** CubicPower OpenStack Study ****

    def provider_fw_rule_get_all(self, context):

        return db.provider_fw_rule_get_all(context)

**** CubicPower OpenStack Study ****

    def agent_build_get_by_triple(self, context, hypervisor, os, architecture):

        return db.agent_build_get_by_triple(context,

                                            hypervisor, os, architecture)

    @contextlib.contextmanager

**** CubicPower OpenStack Study ****

    def wait_for_instance_event(self, instance, event_names, deadline=300,

                                error_callback=None):

        # NOTE(danms): Don't actually wait for any events, just

        # fall through

        yield