diff options
| author | Eric Day <eday@oddments.org> | 2010-12-30 19:55:00 -0800 |
|---|---|---|
| committer | Eric Day <eday@oddments.org> | 2010-12-30 19:55:00 -0800 |
| commit | 806e4e5621ada77c1a072a89fa9981a5ab40dd10 (patch) | |
| tree | 64580425d5925f4011d5f680e51343559e65bb12 /nova/compute | |
| parent | 750a0c9b413ad3912d522355332cffadd9667d0c (diff) | |
| parent | 1ee171f37b7fbb2b5c4e97a5d95757d0649446bf (diff) | |
| download | nova-806e4e5621ada77c1a072a89fa9981a5ab40dd10.tar.gz nova-806e4e5621ada77c1a072a89fa9981a5ab40dd10.tar.xz nova-806e4e5621ada77c1a072a89fa9981a5ab40dd10.zip | |
Merged trunk.
Diffstat (limited to 'nova/compute')
| -rw-r--r-- | nova/compute/__init__.py | 54 | ||||
| -rw-r--r-- | nova/compute/manager.py | 62 | ||||
| -rw-r--r-- | nova/compute/power_state.py | 4 |
3 files changed, 112 insertions, 8 deletions
diff --git a/nova/compute/__init__.py b/nova/compute/__init__.py index fd1cdcd1b..f096dab63 100644 --- a/nova/compute/__init__.py +++ b/nova/compute/__init__.py @@ -239,9 +239,9 @@ class API(base.Base): rpc.cast(context, self.db.queue_get_for(context, FLAGS.compute_topic, host), {"method": "terminate_instance", - "args": {"instance_id": instance['id']}}) + "args": {"instance_id": instance_id}}) else: - self.db.instance_destroy(context, instance['id']) + self.db.instance_destroy(context, instance_id) def get(self, context, instance_id=None, project_id=None, reservation_id=None, fixed_ip=None): @@ -265,6 +265,15 @@ class API(base.Base): project_id) return self.db.instance_get_all(context) + def snapshot(self, context, instance_id, name): + """Snapshot the given instance.""" + instance = self.get(context, instance_id) + host = instance['host'] + rpc.cast(context, + self.db.queue_get_for(context, FLAGS.compute_topic, host), + {"method": "snapshot_instance", + "args": {"instance_id": instance_id, "name": name}}) + def reboot(self, context, instance_id): """Reboot the given instance.""" instance = self.get(context, instance_id) @@ -272,7 +281,7 @@ class API(base.Base): rpc.cast(context, self.db.queue_get_for(context, FLAGS.compute_topic, host), {"method": "reboot_instance", - "args": {"instance_id": instance['id']}}) + "args": {"instance_id": instance_id}}) def pause(self, context, instance_id): """Pause the given instance.""" @@ -281,7 +290,7 @@ class API(base.Base): rpc.cast(context, self.db.queue_get_for(context, FLAGS.compute_topic, host), {"method": "pause_instance", - "args": {"instance_id": instance['id']}}) + "args": {"instance_id": instance_id}}) def unpause(self, context, instance_id): """Unpause the given instance.""" @@ -290,7 +299,38 @@ class API(base.Base): rpc.cast(context, self.db.queue_get_for(context, FLAGS.compute_topic, host), {"method": "unpause_instance", - "args": {"instance_id": instance['id']}}) + "args": {"instance_id": instance_id}}) + + def get_diagnostics(self, context, instance_id): + """Retrieve diagnostics for the given instance.""" + instance = self.get(context, instance_id) + host = instance["host"] + return rpc.call(context, + self.db.queue_get_for(context, FLAGS.compute_topic, host), + {"method": "get_diagnostics", + "args": {"instance_id": instance_id}}) + + def get_actions(self, context, instance_id): + """Retrieve actions for the given instance.""" + return self.db.instance_get_actions(context, instance_id) + + def suspend(self, context, instance_id): + """suspend the instance with instance_id""" + instance = self.get(context, instance_id) + host = instance['host'] + rpc.cast(context, + self.db.queue_get_for(context, FLAGS.compute_topic, host), + {"method": "suspend_instance", + "args": {"instance_id": instance_id}}) + + def resume(self, context, instance_id): + """resume the instance with instance_id""" + instance = self.get(context, instance_id) + host = instance['host'] + rpc.cast(context, + self.db.queue_get_for(context, FLAGS.compute_topic, host), + {"method": "resume_instance", + "args": {"instance_id": instance_id}}) def rescue(self, context, instance_id): """Rescue the given instance.""" @@ -299,7 +339,7 @@ class API(base.Base): rpc.cast(context, self.db.queue_get_for(context, FLAGS.compute_topic, host), {"method": "rescue_instance", - "args": {"instance_id": instance['id']}}) + "args": {"instance_id": instance_id}}) def unrescue(self, context, instance_id): """Unrescue the given instance.""" @@ -308,7 +348,7 @@ class API(base.Base): rpc.cast(context, self.db.queue_get_for(context, FLAGS.compute_topic, host), {"method": "unrescue_instance", - "args": {"instance_id": instance['id']}}) + "args": {"instance_id": instance_id}}) def attach_volume(self, context, instance_id, volume_id, device): if not re.match("^/dev/[a-z]d[a-z]+$", device): diff --git a/nova/compute/manager.py b/nova/compute/manager.py index d77e8e2bc..c586f11fa 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -225,6 +225,27 @@ class ComputeManager(manager.Manager): self._update_state(context, instance_id) @exception.wrap_exception + def snapshot_instance(self, context, instance_id, name): + """Snapshot an instance on this server.""" + context = context.elevated() + instance_ref = self.db.instance_get(context, instance_id) + + #NOTE(sirp): update_state currently only refreshes the state field + # if we add is_snapshotting, we will need this refreshed too, + # potentially? + self._update_state(context, instance_id) + + logging.debug(_('instance %s: snapshotting'), instance_ref['name']) + if instance_ref['state'] != power_state.RUNNING: + logging.warn(_('trying to snapshot a non-running ' + 'instance: %s (state: %s excepted: %s)'), + instance_id, + instance_ref['state'], + power_state.RUNNING) + + self.driver.snapshot(instance_ref, name) + + @exception.wrap_exception def rescue_instance(self, context, instance_id): """Rescue an instance on this server.""" context = context.elevated() @@ -293,6 +314,47 @@ class ComputeManager(manager.Manager): result)) @exception.wrap_exception + def get_diagnostics(self, context, instance_id): + """Retrieve diagnostics for an instance on this server.""" + instance_ref = self.db.instance_get(context, instance_id) + + if instance_ref["state"] == power_state.RUNNING: + logging.debug(_("instance %s: retrieving diagnostics"), + instance_id) + return self.driver.get_diagnostics(instance_ref) + + def suspend_instance(self, context, instance_id): + """suspend the instance with instance_id""" + context = context.elevated() + instance_ref = self.db.instance_get(context, instance_id) + + logging.debug(_('instance %s: suspending'), instance_id) + self.db.instance_set_state(context, instance_id, + power_state.NOSTATE, + 'suspending') + self.driver.suspend(instance_ref, + lambda result: self._update_state_callback(self, + context, + instance_id, + result)) + + @exception.wrap_exception + def resume_instance(self, context, instance_id): + """resume the suspended instance with instance_id""" + context = context.elevated() + instance_ref = self.db.instance_get(context, instance_id) + + logging.debug(_('instance %s: resuming'), instance_id) + self.db.instance_set_state(context, instance_id, + power_state.NOSTATE, + 'resuming') + self.driver.resume(instance_ref, + lambda result: self._update_state_callback(self, + context, + instance_id, + result)) + + @exception.wrap_exception def get_console_output(self, context, instance_id): """Send the console output for an instance.""" context = context.elevated() diff --git a/nova/compute/power_state.py b/nova/compute/power_state.py index cefdf2d9e..37039d2ec 100644 --- a/nova/compute/power_state.py +++ b/nova/compute/power_state.py @@ -26,6 +26,7 @@ PAUSED = 0x03 SHUTDOWN = 0x04 SHUTOFF = 0x05 CRASHED = 0x06 +SUSPENDED = 0x07 def name(code): @@ -36,5 +37,6 @@ def name(code): PAUSED: 'paused', SHUTDOWN: 'shutdown', SHUTOFF: 'shutdown', - CRASHED: 'crashed'} + CRASHED: 'crashed', + SUSPENDED: 'suspended'} return d[code] |
