components/openstack/nova/patches/08-CVE-2014-3608.patch
author Danek Duvall <danek.duvall@oracle.com>
Tue, 30 Sep 2014 13:39:00 -0700
changeset 2127 9574188edd5d
permissions -rw-r--r--
19715056 problem in SERVICE/NOVA
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2127
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     1
This upstream patch addresses CVE-2014-3608 and is tracked under Launchpad
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     2
bug 1319182.  It is addressed in Juno 2014.2 and Icehouse 2014.1.3.  It has
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     3
been modified to apply cleanly into our current Havana implementation.
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     4
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     5
From 8ff170dc95bf3101fe38a2624e941bfa3b7c1138 Mon Sep 17 00:00:00 2001
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     6
From: "Leandro I. Costantino" <[email protected]>
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     7
Date: Mon, 19 May 2014 19:58:47 -0300
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     8
Subject: [PATCH] VM in rescue state must have a restricted set of actions
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     9
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    10
Right now it is possible to pause, suspend and stop a VM in state RESCUED,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    11
so after the state is changed, it's not possible to trigger unrescue anymore
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    12
since the original state is lost.
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    13
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    14
This patch remove vm_states.RESCUED as valid state from stop,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    15
pause and suspend actions.
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    16
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    17
The vm_states devref is also updated to reflect this change including the
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    18
current reboot flow.( vm_states.RESCUED cannot be rebooted as per
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    19
today code)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    20
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    21
DocImpact
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    22
Closes-Bug: #1319182
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    23
Co-Authored-By: Cyril Roelandt <[email protected]>
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    24
Change-Id: I531dea5a5499bf93c24bea37850d562134dee281
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    25
---
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    26
 doc/source/devref/vmstates.rst         |  7 ++++--
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    27
 nova/compute/api.py                    |  7 +++---
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    28
 nova/tests/compute/test_compute_api.py | 46 ++++++++++++++++++++++++++++++++--
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    29
 3 files changed, 52 insertions(+), 8 deletions(-)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    30
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    31
--- nova-2013.2.3/doc/source/devref/vmstates.rst	2014-04-03 11:49:38.000000000 -0700
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    32
+++ nova-2013.2.3/doc/source/devref/vmstates.rst	2014-09-29 10:32:35.921504377 -0700
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    33
@@ -88,6 +88,7 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    34
     rescue -> error
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    35
     active -> rescue
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    36
     stopped -> rescue
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    37
+    error -> rescue
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    38
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    39
     unrescue [shape="rectangle"]
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    40
     unrescue -> active
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    41
@@ -139,7 +140,9 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    42
     reboot -> error
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    43
     active -> reboot
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    44
     stopped -> reboot
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    45
-    rescued -> reboot
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    46
+    paused -> reboot
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    47
+    suspended -> reboot
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    48
+    error -> reboot
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    49
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    50
     live_migrate [shape="rectangle"]
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    51
     live_migrate -> active
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    52
@@ -159,4 +162,4 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    53
 power states when a new VM instance is created.
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    54
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    55
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    56
-.. image:: /images/run_instance_walkthrough.png
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    57
\ No newline at end of file
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    58
+.. image:: /images/run_instance_walkthrough.png
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    59
--- nova-2013.2.3/nova/compute/api.py	2014-04-03 11:49:46.000000000 -0700
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    60
+++ nova-2013.2.3/nova/compute/api.py	2014-09-29 10:32:50.868945930 -0700
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    61
@@ -1619,8 +1619,7 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    62
     @check_instance_lock
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    63
     @check_instance_host
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    64
     @check_instance_cell
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    65
-    @check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.RESCUED,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    66
-                                    vm_states.ERROR],
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    67
+    @check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.RESCUED],
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    68
                           task_state=[None])
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    69
     def stop(self, context, instance, do_cast=True):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    70
         """Stop an instance."""
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    71
@@ -2429,7 +2428,7 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    72
     @wrap_check_policy
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    73
     @check_instance_lock
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    74
     @check_instance_cell
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    75
-    @check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.RESCUED])
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    76
+    @check_instance_state(vm_state=[vm_states.ACTIVE])
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    77
     def pause(self, context, instance):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    78
         """Pause the given instance."""
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    79
         instance.task_state = task_states.PAUSING
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    80
@@ -2456,7 +2455,7 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    81
     @wrap_check_policy
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    82
     @check_instance_lock
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    83
     @check_instance_cell
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    84
-    @check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.RESCUED])
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    85
+    @check_instance_state(vm_state=[vm_states.ACTIVE])
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    86
     def suspend(self, context, instance):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    87
         """Suspend the given instance."""
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    88
         instance.task_state = task_states.SUSPENDING
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    89
--- nova-2013.2.3/nova/tests/compute/test_compute_api.py	2014-04-03 11:49:46.000000000 -0700
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    90
+++ nova-2013.2.3/nova/tests/compute/test_compute_api.py	2014-09-29 10:32:35.926521781 -0700
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    91
@@ -56,6 +56,16 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    92
         self.context = context.RequestContext(self.user_id,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    93
                                               self.project_id)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    94
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    95
+    def _get_vm_states(self, exclude_states=None):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    96
+        vm_state = set([vm_states.ACTIVE, vm_states.BUILDING, vm_states.PAUSED,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    97
+                    vm_states.SUSPENDED, vm_states.RESCUED, vm_states.STOPPED,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    98
+                    vm_states.RESIZED, vm_states.SOFT_DELETED,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    99
+                    vm_states.DELETED, vm_states.ERROR, vm_states.SHELVED,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   100
+                    vm_states.SHELVED_OFFLOADED])
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   101
+        if not exclude_states:
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   102
+            exclude_states = set()
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   103
+        return vm_state - exclude_states
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   104
+
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   105
     def _create_flavor(self, params=None):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   106
         flavor = {'id': 1,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   107
                   'flavorid': 1,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   108
@@ -193,6 +203,19 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   109
         self.assertEqual(task_states.SUSPENDING,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   110
                          instance.task_state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   111
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   112
+    def _test_suspend_fails(self, vm_state):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   113
+        params = dict(vm_state=vm_state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   114
+        instance = self._create_instance_obj(params=params)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   115
+        self.assertIsNone(instance.task_state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   116
+        self.assertRaises(exception.InstanceInvalidState,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   117
+                          self.compute_api.suspend,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   118
+                          self.context, instance)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   119
+
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   120
+    def test_suspend_fails_invalid_states(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   121
+        invalid_vm_states = self._get_vm_states(set([vm_states.ACTIVE]))
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   122
+        for state in invalid_vm_states:
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   123
+            self._test_suspend_fails(state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   124
+
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   125
     def test_resume(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   126
         # Ensure instance can be resumed (if suspended).
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   127
         instance = self._create_instance_obj(
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   128
@@ -298,13 +321,19 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   129
     def test_stop_stopped_instance_with_bypass(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   130
         self._test_stop(vm_states.STOPPED, force=True)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   131
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   132
-    def test_stop_invalid_state(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   133
-        params = dict(vm_state=vm_states.PAUSED)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   134
+    def _test_stop_invalid_state(self, vm_state):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   135
+        params = dict(vm_state=vm_state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   136
         instance = self._create_instance_obj(params=params)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   137
         self.assertRaises(exception.InstanceInvalidState,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   138
                           self.compute_api.stop,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   139
                           self.context, instance)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   140
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   141
+    def test_stop_fails_invalid_states(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   142
+        invalid_vm_states = self._get_vm_states(set([vm_states.ACTIVE,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   143
+                                                     vm_states.ERROR]))
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   144
+        for state in invalid_vm_states:
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   145
+            self._test_stop_invalid_state(state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   146
+
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   147
     def test_stop_a_stopped_inst(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   148
         params = {'vm_state': vm_states.STOPPED}
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   149
         instance = self._create_instance_obj(params=params)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   150
@@ -1075,6 +1104,19 @@
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   151
         self.assertEqual(task_states.PAUSING,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   152
                          instance.task_state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   153
 
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   154
+    def _test_pause_fails(self, vm_state):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   155
+        params = dict(vm_state=vm_state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   156
+        instance = self._create_instance_obj(params=params)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   157
+        self.assertIsNone(instance.task_state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   158
+        self.assertRaises(exception.InstanceInvalidState,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   159
+                          self.compute_api.pause,
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   160
+                          self.context, instance)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   161
+
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   162
+    def test_pause_fails_invalid_states(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   163
+        invalid_vm_states = self._get_vm_states(set([vm_states.ACTIVE]))
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   164
+        for state in invalid_vm_states:
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   165
+            self._test_pause_fails(state)
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   166
+
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   167
     def test_unpause(self):
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   168
         # Ensure instance can be unpaused.
9574188edd5d 19715056 problem in SERVICE/NOVA
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   169
         params = dict(vm_state=vm_states.PAUSED)