summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-08-18 12:34:01 -0400
committerBrian Lamar <brian.lamar@rackspace.com>2011-08-18 12:34:01 -0400
commitcab13dbfd652d1fcf9443e796e50f7eb374fc3fc (patch)
tree5da76f57c882dd6c8360914e05a475f26c64274a
parent1d1d027554d6be355bd9b52b2d87081d06f05045 (diff)
downloadnova-cab13dbfd652d1fcf9443e796e50f7eb374fc3fc.tar.gz
nova-cab13dbfd652d1fcf9443e796e50f7eb374fc3fc.tar.xz
nova-cab13dbfd652d1fcf9443e796e50f7eb374fc3fc.zip
Updated a number of items to pave the way for new states.
-rw-r--r--nova/compute/manager.py31
-rw-r--r--nova/db/sqlalchemy/api.py4
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/037_update_instance_states.py2
-rw-r--r--nova/db/sqlalchemy/models.py16
-rw-r--r--nova/scheduler/driver.py11
-rw-r--r--nova/tests/scheduler/test_scheduler.py13
-rw-r--r--nova/tests/test_compute.py29
7 files changed, 51 insertions, 55 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 34c6bc1ea..cb19a19cc 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -241,11 +241,6 @@ class ComputeManager(manager.SchedulerDependentManager):
def _setup_block_device_mapping(self, context, instance_id):
"""setup volumes for block device mapping"""
- self.db.instance_set_state(context,
- instance_id,
- power_state.NOSTATE,
- 'block_device_mapping')
-
volume_api = volume.API()
block_device_mapping = []
swap = None
@@ -472,8 +467,7 @@ class ComputeManager(manager.SchedulerDependentManager):
for volume in volumes:
self._detach_volume(context, instance_id, volume['id'], False)
- if (instance['state'] == power_state.SHUTOFF and
- instance['state_description'] != 'stopped'):
+ if instance['power_state'] == power_state.SHUTOFF:
self.db.instance_destroy(context, instance_id)
raise exception.Error(_('trying to destroy already destroyed'
' instance: %s') % instance_id)
@@ -532,16 +526,22 @@ class ComputeManager(manager.SchedulerDependentManager):
self._instance_update(context,
instance_id,
- power_state=current_power_state,
vm_state=vm_state.REBUILD,
- task_state=task_state.SPAWN)
+ task_state=task_state.BLOCK_DEVICE_MAPPING)
+
+ bd_mapping = self._setup_block_device_mapping(context, instance_id)
image_ref = kwargs.get('image_ref')
instance_ref.image_ref = image_ref
instance_ref.injected_files = kwargs.get('injected_files', [])
network_info = self.network_api.get_instance_nw_info(context,
- instance_ref)
- bd_mapping = self._setup_block_device_mapping(context, instance_id)
+ instance_ref)
+
+ self._instance_update(context,
+ instance_id,
+ vm_state=vm_state.REBUILD,
+ task_state=task_state.SPAWN)
+
self.driver.spawn(context, instance_ref, network_info, bd_mapping)
current_power_state = self._get_power_state(context, instance_ref)
@@ -709,7 +709,7 @@ class ComputeManager(manager.SchedulerDependentManager):
for i in xrange(max_tries):
instance_ref = self.db.instance_get(context, instance_id)
instance_id = instance_ref["id"]
- instance_state = instance_ref["state"]
+ instance_state = instance_ref["power_state"]
expected_state = power_state.RUNNING
if instance_state != expected_state:
@@ -744,7 +744,7 @@ class ComputeManager(manager.SchedulerDependentManager):
context = context.elevated()
instance_ref = self.db.instance_get(context, instance_id)
instance_id = instance_ref['id']
- instance_state = instance_ref['state']
+ instance_state = instance_ref['power_state']
expected_state = power_state.RUNNING
if instance_state != expected_state:
LOG.warn(_('trying to inject a file into a non-running '
@@ -762,7 +762,7 @@ class ComputeManager(manager.SchedulerDependentManager):
context = context.elevated()
instance_ref = self.db.instance_get(context, instance_id)
instance_id = instance_ref['id']
- instance_state = instance_ref['state']
+ instance_state = instance_ref['power_state']
expected_state = power_state.RUNNING
if instance_state != expected_state:
LOG.warn(_('trying to update agent on a non-running '
@@ -1092,7 +1092,7 @@ class ComputeManager(manager.SchedulerDependentManager):
def get_diagnostics(self, context, instance_id):
"""Retrieve diagnostics for an instance on this host."""
instance_ref = self.db.instance_get(context, instance_id)
- if instance_ref["state"] == power_state.RUNNING:
+ if instance_ref["power_state"] == power_state.RUNNING:
LOG.audit(_("instance %s: retrieving diagnostics"), instance_id,
context=context)
return self.driver.get_diagnostics(instance_ref)
@@ -1682,6 +1682,7 @@ class ComputeManager(manager.SchedulerDependentManager):
"""
vm_instances = self.driver.list_instances_detail()
+ vm_instances = dict((vm.name, vm) for vm in vm_instances)
db_instances = self.db.instance_get_all_by_host(context, self.host)
num_vm_instances = len(vm_instances)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index e7d02cb5d..67736dea2 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1079,8 +1079,8 @@ def instance_stop(context, instance_id):
session.query(models.Instance).\
filter_by(id=instance_id).\
update({'host': None,
- 'state': power_state.SHUTOFF,
- 'state_description': 'stopped',
+ 'vm_state': vm_state.STOP,
+ 'task_state': None,
'updated_at': literal_column('updated_at')})
session.query(models.SecurityGroupInstanceAssociation).\
filter_by(instance_id=instance_id).\
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/037_update_instance_states.py b/nova/db/sqlalchemy/migrate_repo/versions/037_update_instance_states.py
index 0bbe39def..07efbf90f 100644
--- a/nova/db/sqlalchemy/migrate_repo/versions/037_update_instance_states.py
+++ b/nova/db/sqlalchemy/migrate_repo/versions/037_update_instance_states.py
@@ -14,7 +14,7 @@
# License for the specific language governing permissions and limitations
# under the License.
-from sqlalchemy import MetaData, Table
+from sqlalchemy import MetaData, Table, Column, String
meta = MetaData()
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index f2a4680b0..d2987cacc 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -193,8 +193,9 @@ class Instance(BASE, NovaBase):
key_name = Column(String(255))
key_data = Column(Text)
- state = Column(Integer)
- state_description = Column(String(255))
+ power_state = Column(Integer)
+ vm_state = Column(String(255))
+ task_state = Column(String(255))
memory_mb = Column(Integer)
vcpus = Column(Integer)
@@ -232,17 +233,6 @@ class Instance(BASE, NovaBase):
root_device_name = Column(String(255))
- # TODO(vish): see Ewan's email about state improvements, probably
- # should be in a driver base class or some such
- # vmstate_state = running, halted, suspended, paused
- # power_state = what we have
- # task_state = transitory and may trigger power state transition
-
- #@validates('state')
- #def validate_state(self, key, state):
- # assert(state in ['nostate', 'running', 'blocked', 'paused',
- # 'shutdown', 'shutoff', 'crashed'])
-
class InstanceActions(BASE, NovaBase):
"""Represents a guest VM's actions and results"""
diff --git a/nova/scheduler/driver.py b/nova/scheduler/driver.py
index f28353f05..b788b996f 100644
--- a/nova/scheduler/driver.py
+++ b/nova/scheduler/driver.py
@@ -30,6 +30,8 @@ from nova import log as logging
from nova import rpc
from nova import utils
from nova.compute import power_state
+from nova.compute import task_state
+from nova.compute import vm_state
from nova.api.ec2 import ec2utils
@@ -104,10 +106,8 @@ class Scheduler(object):
dest, block_migration)
# Changing instance_state.
- db.instance_set_state(context,
- instance_id,
- power_state.PAUSED,
- 'migrating')
+ values = {"vm_state": vm_state.MIGRATE}
+ db.instance_update(context, instance_id, values)
# Changing volume state
for volume_ref in instance_ref['volumes']:
@@ -129,8 +129,7 @@ class Scheduler(object):
"""
# Checking instance is running.
- if (power_state.RUNNING != instance_ref['state'] or \
- 'running' != instance_ref['state_description']):
+ if instance_ref['power_state'] != power_state.RUNNING:
instance_id = ec2utils.id_to_ec2_id(instance_ref['id'])
raise exception.InstanceNotRunning(instance_id=instance_id)
diff --git a/nova/tests/scheduler/test_scheduler.py b/nova/tests/scheduler/test_scheduler.py
index 158df2a27..1b5e131c9 100644
--- a/nova/tests/scheduler/test_scheduler.py
+++ b/nova/tests/scheduler/test_scheduler.py
@@ -40,6 +40,7 @@ from nova.scheduler import driver
from nova.scheduler import manager
from nova.scheduler import multi
from nova.compute import power_state
+from nova.compute import vm_state
FLAGS = flags.FLAGS
@@ -94,6 +95,9 @@ class SchedulerTestCase(test.TestCase):
inst['vcpus'] = kwargs.get('vcpus', 1)
inst['memory_mb'] = kwargs.get('memory_mb', 10)
inst['local_gb'] = kwargs.get('local_gb', 20)
+ inst['vm_state'] = kwargs.get('vm_state', vm_state.ACTIVE)
+ inst['power_state'] = kwargs.get('power_state', power_state.RUNNING)
+ inst['task_state'] = kwargs.get('task_state', None)
return db.instance_create(ctxt, inst)
def test_fallback(self):
@@ -271,8 +275,9 @@ class SimpleDriverTestCase(test.TestCase):
inst['memory_mb'] = kwargs.get('memory_mb', 20)
inst['local_gb'] = kwargs.get('local_gb', 30)
inst['launched_on'] = kwargs.get('launghed_on', 'dummy')
- inst['state_description'] = kwargs.get('state_description', 'running')
- inst['state'] = kwargs.get('state', power_state.RUNNING)
+ inst['vm_state'] = kwargs.get('vm_state', vm_state.ACTIVE)
+ inst['task_state'] = kwargs.get('task_state', None)
+ inst['power_state'] = kwargs.get('power_state', power_state.RUNNING)
return db.instance_create(self.context, inst)['id']
def _create_volume(self):
@@ -664,14 +669,14 @@ class SimpleDriverTestCase(test.TestCase):
block_migration=False)
i_ref = db.instance_get(self.context, instance_id)
- self.assertTrue(i_ref['state_description'] == 'migrating')
+ self.assertTrue(i_ref['vm_state'] == vm_state.MIGRATE)
db.instance_destroy(self.context, instance_id)
db.volume_destroy(self.context, v_ref['id'])
def test_live_migration_src_check_instance_not_running(self):
"""The instance given by instance_id is not running."""
- instance_id = self._create_instance(state_description='migrating')
+ instance_id = self._create_instance(power_state=power_state.NOSTATE)
i_ref = db.instance_get(self.context, instance_id)
try:
diff --git a/nova/tests/test_compute.py b/nova/tests/test_compute.py
index e2fa3b140..f310eaff6 100644
--- a/nova/tests/test_compute.py
+++ b/nova/tests/test_compute.py
@@ -23,6 +23,7 @@ from nova import compute
from nova.compute import instance_types
from nova.compute import manager as compute_manager
from nova.compute import power_state
+from nova.compute import vm_state
from nova import context
from nova import db
from nova.db.sqlalchemy import models
@@ -747,8 +748,8 @@ class ComputeTestCase(test.TestCase):
'block_migration': False,
'disk': None}}).\
AndRaise(rpc.RemoteError('', '', ''))
- dbmock.instance_update(c, i_ref['id'], {'state_description': 'running',
- 'state': power_state.RUNNING,
+ dbmock.instance_update(c, i_ref['id'], {'vm_state': vm_state.ACTIVE,
+ 'task_state': None,
'host': i_ref['host']})
for v in i_ref['volumes']:
dbmock.volume_update(c, v['id'], {'status': 'in-use'})
@@ -779,8 +780,8 @@ class ComputeTestCase(test.TestCase):
'block_migration': False,
'disk': None}}).\
AndRaise(rpc.RemoteError('', '', ''))
- dbmock.instance_update(c, i_ref['id'], {'state_description': 'running',
- 'state': power_state.RUNNING,
+ dbmock.instance_update(c, i_ref['id'], {'vm_state': vm_state.ACTIVE,
+ 'task_state': None,
'host': i_ref['host']})
self.compute.db = dbmock
@@ -825,8 +826,8 @@ class ComputeTestCase(test.TestCase):
c = context.get_admin_context()
instance_id = self._create_instance()
i_ref = db.instance_get(c, instance_id)
- db.instance_update(c, i_ref['id'], {'state_description': 'migrating',
- 'state': power_state.PAUSED})
+ db.instance_update(c, i_ref['id'], {'vm_state': vm_state.MIGRATE,
+ 'power_state': power_state.PAUSED})
v_ref = db.volume_create(c, {'size': 1, 'instance_id': instance_id})
fix_addr = db.fixed_ip_create(c, {'address': '1.1.1.1',
'instance_id': instance_id})
@@ -887,7 +888,7 @@ class ComputeTestCase(test.TestCase):
instances = db.instance_get_all(context.get_admin_context())
LOG.info(_("After force-killing instances: %s"), instances)
self.assertEqual(len(instances), 1)
- self.assertEqual(power_state.SHUTOFF, instances[0]['state'])
+ self.assertEqual(power_state.NOSTATE, instances[0]['power_state'])
def test_get_all_by_name_regexp(self):
"""Test searching instances by name (display_name)"""
@@ -1307,25 +1308,25 @@ class ComputeTestCase(test.TestCase):
"""Test searching instances by state"""
c = context.get_admin_context()
- instance_id1 = self._create_instance({'state': power_state.SHUTDOWN})
+ instance_id1 = self._create_instance({'power_state': power_state.SHUTDOWN})
instance_id2 = self._create_instance({
'id': 2,
- 'state': power_state.RUNNING})
+ 'power_state': power_state.RUNNING})
instance_id3 = self._create_instance({
'id': 10,
- 'state': power_state.RUNNING})
+ 'power_state': power_state.RUNNING})
instances = self.compute_api.get_all(c,
- search_opts={'state': power_state.SUSPENDED})
+ search_opts={'power_state': power_state.SUSPENDED})
self.assertEqual(len(instances), 0)
instances = self.compute_api.get_all(c,
- search_opts={'state': power_state.SHUTDOWN})
+ search_opts={'power_state': power_state.SHUTDOWN})
self.assertEqual(len(instances), 1)
self.assertEqual(instances[0].id, instance_id1)
instances = self.compute_api.get_all(c,
- search_opts={'state': power_state.RUNNING})
+ search_opts={'power_state': power_state.RUNNING})
self.assertEqual(len(instances), 2)
instance_ids = [instance.id for instance in instances]
self.assertTrue(instance_id2 in instance_ids)
@@ -1333,7 +1334,7 @@ class ComputeTestCase(test.TestCase):
# Test passing a list as search arg
instances = self.compute_api.get_all(c,
- search_opts={'state': [power_state.SHUTDOWN,
+ search_opts={'power_state': [power_state.SHUTDOWN,
power_state.RUNNING]})
self.assertEqual(len(instances), 3)