diff options
| author | Mikyung Kang <mkkang@isi.edu> | 2012-11-10 10:20:45 +0900 |
|---|---|---|
| committer | Arata Notsu <notsu@virtualtech.jp> | 2012-11-10 10:20:45 +0900 |
| commit | 885cf0949ab2e116da39143c2f6469362367ec7d (patch) | |
| tree | 3eb769baee1d77955b6ae357466e66bccf993690 /nova/virt | |
| parent | 910a5487352dc0d36a4520f5b2787ec2290d965f (diff) | |
Updated scheduler and compute for multiple capabilities.
Part 1 of 6: blueprint general-bare-metal-provisioning-framework.
This patch includes updates on scheduler and compute codes for
multiple capabilities. This feature is needed in bare-metal
provisioning which is implemented in later patches --- a bare-metal
nova-compute manages multiple bare-metal nodes where instances are
provisioned. Nova DB's compute_nodes entry needs to be created for
each bare-metal node, and a scheduler can choose an appropriate
bare-metal node to provision an instance.
With this patch, one service entry with multiple compute_node entries
can be registered by nova-compute. Distinct 'node name' is given for
each node and is stored at compute_node['hypervisor_hostname'].
And we added a new column "node" to "instances" table in Nova DB to
associate instances with compute_node. FilterScheduler puts <nodename>
to the column when it provisions the instance. And nova-computes
respect <nodename> when run/stop instances and when calculate
resources.
Also, 'capability’ is extended from a dictionary to a list of
dictionaries to describe the multiple capabilities of the multiple
nodes.
Change-Id: I527febe4dbd887b2e6596ce7226c1ae3386e2ae6
Co-authored-by: Mikyung Kang <mkkang@isi.edu>
Co-authored-by: David Kang <dkang@isi.edu>
Co-authored-by: Ken Igarashi <igarashik@nttdocomo.co.jp>
Co-authored-by: Arata Notsu <notsu@virtualtech.jp>
Diffstat (limited to 'nova/virt')
| -rw-r--r-- | nova/virt/baremetal/driver.py | 2 | ||||
| -rw-r--r-- | nova/virt/driver.py | 18 | ||||
| -rw-r--r-- | nova/virt/fake.py | 51 | ||||
| -rw-r--r-- | nova/virt/hyperv/driver.py | 2 | ||||
| -rw-r--r-- | nova/virt/libvirt/driver.py | 3 | ||||
| -rw-r--r-- | nova/virt/powervm/driver.py | 2 | ||||
| -rw-r--r-- | nova/virt/vmwareapi/driver.py | 2 | ||||
| -rw-r--r-- | nova/virt/xenapi/driver.py | 3 |
8 files changed, 72 insertions, 11 deletions
diff --git a/nova/virt/baremetal/driver.py b/nova/virt/baremetal/driver.py index b0576aa38..4e63d35ed 100644 --- a/nova/virt/baremetal/driver.py +++ b/nova/virt/baremetal/driver.py @@ -661,7 +661,7 @@ class BareMetalDriver(driver.ComputeDriver): # Bare metal doesn't currently support security groups pass - def get_available_resource(self): + def get_available_resource(self, nodename): """Updates compute manager resource info on ComputeNode table. This method is called when nova-coompute launches, and diff --git a/nova/virt/driver.py b/nova/virt/driver.py index cb960466f..d5edcffed 100644 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -347,12 +347,15 @@ class ComputeDriver(object): """Restore the specified instance""" raise NotImplementedError() - def get_available_resource(self): + def get_available_resource(self, nodename): """Retrieve resource information. This method is called when nova-compute launches, and as part of a periodic task + :param nodename: + node which the caller want to get resources from + a driver that manages only one node can safely ignore this :returns: Dictionary describing resources """ raise NotImplementedError() @@ -735,3 +738,16 @@ class ComputeDriver(object): } """ raise NotImplementedError() + + def get_available_nodes(self): + """Returns nodenames of all nodes managed by the compute service. + + This method is for multi compute-nodes support. If a driver supports + multi compute-nodes, this method returns a list of nodenames managed + by the service. Otherwise, this method should return + [hypervisor_hostname]. + """ + stats = self.get_host_stats(refresh=True) + if not isinstance(stats, list): + stats = [stats] + return [s['hypervisor_hostname'] for s in stats] diff --git a/nova/virt/fake.py b/nova/virt/fake.py index 79d98c5cf..f2415e131 100644 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -36,6 +36,32 @@ from nova.virt import virtapi LOG = logging.getLogger(__name__) +_FAKE_NODES = ['fake-mini'] + + +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 + + +def restore_nodes(): + """Resets FakeDriver's node list modified by set_nodes(). + + Usually called from tearDown(). + """ + global _FAKE_NODES + _FAKE_NODES = ['fake-mini'] + + class FakeInstance(object): def __init__(self, name, state): @@ -56,7 +82,7 @@ class FakeDriver(driver.ComputeDriver): def __init__(self, virtapi, read_only=False): super(FakeDriver, self).__init__(virtapi) self.instances = {} - self.host_status = { + self.host_status_base = { 'host_name-description': 'Fake Host', 'host_hostname': 'fake-mini', 'host_memory_total': 8000000000, @@ -252,12 +278,14 @@ class FakeDriver(driver.ComputeDriver): def refresh_provider_fw_rules(self): pass - def get_available_resource(self): + 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: + raise exception.NovaException("node %s is not found" % nodename) dic = {'vcpus': 1, 'memory_mb': 8192, @@ -267,7 +295,7 @@ class FakeDriver(driver.ComputeDriver): 'local_gb_used': 0, 'hypervisor_type': 'fake', 'hypervisor_version': '1.0', - 'hypervisor_hostname': 'fake-mini', + 'hypervisor_hostname': nodename, 'cpu_info': '?'} return dic @@ -319,7 +347,19 @@ class FakeDriver(driver.ComputeDriver): def get_host_stats(self, refresh=False): """Return fake Host Status of ram, disk, network.""" - return self.host_status + 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 def host_power_action(self, host, action): """Reboots, shuts down or powers up the host.""" @@ -341,6 +381,9 @@ class FakeDriver(driver.ComputeDriver): def get_volume_connector(self, instance): return {'ip': '127.0.0.1', 'initiator': 'fake', 'host': 'fakehost'} + def get_available_nodes(self): + return _FAKE_NODES + class FakeVirtAPI(virtapi.VirtAPI): def instance_update(self, context, instance_uuid, updates): diff --git a/nova/virt/hyperv/driver.py b/nova/virt/hyperv/driver.py index 6d9f66ff8..c9a7ed855 100644 --- a/nova/virt/hyperv/driver.py +++ b/nova/virt/hyperv/driver.py @@ -122,7 +122,7 @@ class HyperVDriver(driver.ComputeDriver): def poll_rescued_instances(self, timeout): pass - def get_available_resource(self): + def get_available_resource(self, nodename): return self._hostops.get_available_resource() def get_host_stats(self, refresh=False): diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 7f962b45d..b0806537b 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -2204,12 +2204,13 @@ class LibvirtDriver(driver.ComputeDriver): def refresh_provider_fw_rules(self): self.firewall_driver.refresh_provider_fw_rules() - def get_available_resource(self): + def get_available_resource(self, nodename): """Retrieve resource info. This method is called as a periodic task and is used only in live migration currently. + :param nodename: ignored in this driver :returns: dictionary containing resource info """ dic = {'vcpus': self.get_vcpu_total(), diff --git a/nova/virt/powervm/driver.py b/nova/virt/powervm/driver.py index 7a0da0b88..eea6e482d 100644 --- a/nova/virt/powervm/driver.py +++ b/nova/virt/powervm/driver.py @@ -142,7 +142,7 @@ class PowerVMDriver(driver.ComputeDriver): """Power on the specified instance""" self._powervm.power_on(instance['name']) - def get_available_resource(self): + def get_available_resource(self, nodename): """Retrieve resource info.""" return self._powervm.get_available_resource() diff --git a/nova/virt/vmwareapi/driver.py b/nova/virt/vmwareapi/driver.py index 25cd05778..9a8d350d9 100644 --- a/nova/virt/vmwareapi/driver.py +++ b/nova/virt/vmwareapi/driver.py @@ -197,7 +197,7 @@ class VMWareESXDriver(driver.ComputeDriver): 'username': CONF.vmwareapi_host_username, 'password': CONF.vmwareapi_host_password} - def get_available_resource(self): + def get_available_resource(self, nodename): """This method is supported only by libvirt.""" return diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index 55b67a931..ce45ca9de 100644 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -390,12 +390,13 @@ class XenAPIDriver(driver.ComputeDriver): 'username': CONF.xenapi_connection_username, 'password': CONF.xenapi_connection_password} - def get_available_resource(self): + def get_available_resource(self, nodename): """Retrieve resource info. This method is called when nova-compute launches, and as part of a periodic task. + :param nodename: ignored in this driver :returns: dictionary describing resources """ |
