~oddbloke/cloud-init/lp1506187

« back to all changes in this revision

Viewing changes to tests/unittests/test_handler/test_handler_power_state.py

  • Committer: Scott Moser
  • Date: 2015-09-08 20:53:59 UTC
  • Revision ID: smoser@ubuntu.com-20150908205359-smh83m5eg2ic3qbd
  power_state: support 'condition' argument
  
  if 'condition' is provided to config in power_state, then
  consult it before powering off.
  
  This allows the user to shut down only if a condition is met, and
  leave the system in a debuggable state otherwise.
  
  An example is as simple as:
   power_state:
     mode: poweroff
     condition: ['sh', '-c', '[ -f /disable-poweroff ]']

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import sys
 
2
 
1
3
from cloudinit.config import cc_power_state_change as psc
2
4
 
3
5
from .. import helpers as t_help
 
6
from ..helpers import mock
4
7
 
5
8
 
6
9
class TestLoadPowerState(t_help.TestCase):
9
12
 
10
13
    def test_no_config(self):
11
14
        # completely empty config should mean do nothing
12
 
        (cmd, _timeout) = psc.load_power_state({})
 
15
        (cmd, _timeout, _condition) = psc.load_power_state({})
13
16
        self.assertEqual(cmd, None)
14
17
 
15
18
    def test_irrelevant_config(self):
16
19
        # no power_state field in config should return None for cmd
17
 
        (cmd, _timeout) = psc.load_power_state({'foo': 'bar'})
 
20
        (cmd, _timeout, _condition) = psc.load_power_state({'foo': 'bar'})
18
21
        self.assertEqual(cmd, None)
19
22
 
20
23
    def test_invalid_mode(self):
53
56
    def test_no_message(self):
54
57
        # if message is not present, then no argument should be passed for it
55
58
        cfg = {'power_state': {'mode': 'poweroff'}}
56
 
        (cmd, _timeout) = psc.load_power_state(cfg)
 
59
        (cmd, _timeout, _condition) = psc.load_power_state(cfg)
57
60
        self.assertNotIn("", cmd)
58
61
        check_lps_ret(psc.load_power_state(cfg))
59
62
        self.assertTrue(len(cmd) == 3)
60
63
 
 
64
    def test_condition_null_raises(self):
 
65
        cfg = {'power_state': {'mode': 'poweroff', 'condition': None}}
 
66
        self.assertRaises(TypeError, psc.load_power_state, cfg)
 
67
 
 
68
    def test_condition_default_is_true(self):
 
69
        cfg = {'power_state': {'mode': 'poweroff'}}
 
70
        _cmd, _timeout, cond = psc.load_power_state(cfg)
 
71
        self.assertEqual(cond, True)
 
72
 
 
73
 
 
74
class TestCheckCondition(t_help.TestCase):
 
75
    def cmd_with_exit(self, rc):
 
76
        return([sys.executable, '-c', 'import sys; sys.exit(%s)' % rc])
 
77
        
 
78
    def test_true_is_true(self):
 
79
        self.assertEqual(psc.check_condition(True), True)
 
80
 
 
81
    def test_false_is_false(self):
 
82
        self.assertEqual(psc.check_condition(False), False)
 
83
 
 
84
    def test_cmd_exit_zero_true(self):
 
85
        self.assertEqual(psc.check_condition(self.cmd_with_exit(0)), True)
 
86
 
 
87
    def test_cmd_exit_one_false(self):
 
88
        self.assertEqual(psc.check_condition(self.cmd_with_exit(1)), False)
 
89
 
 
90
    def test_cmd_exit_nonzero_warns(self):
 
91
        mocklog = mock.Mock()
 
92
        self.assertEqual(
 
93
            psc.check_condition(self.cmd_with_exit(2), mocklog), False)
 
94
        self.assertEqual(mocklog.warn.call_count, 1)
 
95
 
 
96
 
61
97
 
62
98
def check_lps_ret(psc_return, mode=None):
63
 
    if len(psc_return) != 2:
 
99
    if len(psc_return) != 3:
64
100
        raise TypeError("length returned = %d" % len(psc_return))
65
101
 
66
102
    errs = []
67
103
    cmd = psc_return[0]
68
104
    timeout = psc_return[1]
 
105
    condition = psc_return[2]
69
106
 
70
107
    if 'shutdown' not in psc_return[0][0]:
71
108
        errs.append("string 'shutdown' not in cmd")
72
109
 
 
110
    if 'condition' is None:
 
111
        errs.append("condition was not returned")
 
112
 
73
113
    if mode is not None:
74
114
        opt = {'halt': '-H', 'poweroff': '-P', 'reboot': '-r'}[mode]
75
115
        if opt not in psc_return[0]: