summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorMikyung Kang <mkkang@isi.edu>2012-11-10 10:20:45 +0900
committerArata Notsu <notsu@virtualtech.jp>2012-11-10 10:20:45 +0900
commit885cf0949ab2e116da39143c2f6469362367ec7d (patch)
tree3eb769baee1d77955b6ae357466e66bccf993690 /nova/virt
parent910a5487352dc0d36a4520f5b2787ec2290d965f (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.py2
-rw-r--r--nova/virt/driver.py18
-rw-r--r--nova/virt/fake.py51
-rw-r--r--nova/virt/hyperv/driver.py2
-rw-r--r--nova/virt/libvirt/driver.py3
-rw-r--r--nova/virt/powervm/driver.py2
-rw-r--r--nova/virt/vmwareapi/driver.py2
-rw-r--r--nova/virt/xenapi/driver.py3
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
"""