3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
20 from cmframework.server.cmprocessor import CMProcessor
21 from cmframework.apis.cmerror import CMError
22 from cmframework.server.cmcsn import CMCSN
24 # TODO:Add the checking for calling the changemonitorhandle
27 class CMProcessorNodeActivationTest(unittest.TestCase):
29 def backend_get_property(key):
30 if key == 'cloud.cmframework':
31 return '{"csn": {"global": 101, "nodes": {"node-a": 99, "node-b": 100, "node-c": 101}}}'
33 return '{"foo": "bar"}'
35 @mock.patch('cmframework.server.cmprocessor.logging')
36 @mock.patch('cmframework.server.cmprocessor.cmactivationwork.CMActivationWork')
37 def test_get_property(self, mock_work, mock_logging):
38 mock_backend = mock.MagicMock()
39 mock_backend.get_property = CMProcessorNodeActivationTest.backend_get_property
41 mock_validator = mock.MagicMock()
42 mock_activator = mock.MagicMock()
43 mock_changemonitor = mock.MagicMock()
44 mock_activationstate_handler = mock.MagicMock()
45 mock_snapshot_handler = mock.MagicMock()
47 mock_work.OPER_SET = mock.MagicMock()
49 processor = CMProcessor(mock_backend, mock_validator, mock_activator,
50 mock_changemonitor, mock_activationstate_handler,
51 mock_snapshot_handler)
53 self.assertEqual(json.loads(processor.get_property('foo'))['foo'], 'bar')
55 @mock.patch('cmframework.server.cmprocessor.logging')
56 @mock.patch('cmframework.server.cmprocessor.cmactivationwork.CMActivationWork')
57 def test_set_property(self, mock_work, mock_logging):
58 mock_backend = mock.MagicMock()
59 mock_backend.get_property = CMProcessorNodeActivationTest.backend_get_property
61 mock_validator = mock.MagicMock()
62 mock_activator = mock.MagicMock()
63 mock_changemonitor = mock.MagicMock()
64 mock_activationstate_handler = mock.MagicMock()
65 mock_snapshot_handler = mock.MagicMock()
67 mock_work.OPER_SET = mock.MagicMock()
69 processor = CMProcessor(mock_backend, mock_validator, mock_activator,
70 mock_changemonitor, mock_activationstate_handler,
71 mock_snapshot_handler)
73 processor.set_property('foo', 'barbar')
75 mock_validator.validate_set.assert_called_once_with({'foo': 'barbar'})
76 mock_backend.set_properties.called_once_with({'foo': 'barbar'})
77 mock_work.assert_called_once_with(mock_work.OPER_SET, 102, {'foo': 'barbar'})
78 mock_activator.add_work.assert_called_once_with(mock_work.return_value)
80 @mock.patch('cmframework.server.cmprocessor.logging')
81 @mock.patch('cmframework.server.cmprocessor.cmactivationwork.CMActivationWork')
82 @mock.patch('cmframework.server.cmprocessor.cmalarm.CMActivationFailedAlarm')
83 def test_activate_node_no_change(self, mock_alarm, mock_work, mock_logging):
84 mock_backend = mock.MagicMock()
85 mock_backend.get_property = CMProcessorNodeActivationTest.backend_get_property
87 mock_validator = mock.MagicMock()
88 mock_activator = mock.MagicMock()
89 mock_changemonitor = mock.MagicMock()
90 mock_activationstate_handler = mock.MagicMock()
91 mock_snapshot_handler = mock.MagicMock()
93 mock_work.return_value.get_result = mock.MagicMock()
94 mock_work.return_value.get_result.return_value = None
96 mock_work.OPER_NODE = mock.MagicMock()
98 processor = CMProcessor(mock_backend, mock_validator, mock_activator,
99 mock_changemonitor, mock_activationstate_handler,
100 mock_snapshot_handler)
102 self.assertEqual(processor.activate_node('node-c'), False)
104 mock_alarm.assert_not_called()
105 mock_activator.add_work.assert_not_called()
107 @mock.patch('cmframework.server.cmprocessor.logging')
108 @mock.patch('cmframework.server.cmprocessor.cmactivationwork.CMActivationWork')
109 @mock.patch('cmframework.server.cmprocessor.cmalarm.CMActivationFailedAlarm')
110 @mock.patch.object(CMProcessor, '_clear_reboot_requests')
111 @mock.patch.object(CMCSN, 'sync_node_csn')
112 def test_activate_node_changed_no_reboot(self, mock_sync_node_csn, mock_clear_reboot_requests,
113 mock_alarm, mock_work, mock_logging):
114 mock_backend = mock.MagicMock()
115 mock_backend.get_property = CMProcessorNodeActivationTest.backend_get_property
117 mock_validator = mock.MagicMock()
118 mock_activator = mock.MagicMock()
119 mock_changemonitor = mock.MagicMock()
120 mock_activationstate_handler = mock.MagicMock()
121 mock_snapshot_handler = mock.MagicMock()
123 mock_work.return_value.get_result = mock.MagicMock()
124 mock_work.return_value.get_result.return_value = None
126 mock_work.OPER_NODE = mock.MagicMock()
128 processor = CMProcessor(mock_backend, mock_validator, mock_activator,
129 mock_changemonitor, mock_activationstate_handler,
130 mock_snapshot_handler)
132 self.assertEqual(processor.activate_node('node-b'), False)
134 mock_clear_reboot_requests.assert_called_once()
135 mock_work.assert_called_once_with(mock_work.OPER_NODE, 101, {}, 'node-b')
136 mock_activator.add_work.assert_called_once_with(mock_work.return_value)
137 mock_alarm.return_value.cancel_alarm_for_node.assert_called_once_with('node-b')
138 mock_work.return_value.get_result.assert_called_once()
139 mock_sync_node_csn.assert_called_once()
140 mock_alarm.return_value.raise_alarm_for_node.assert_not_called()
142 @mock.patch('cmframework.server.cmprocessor.logging')
143 @mock.patch('cmframework.server.cmprocessor.cmactivationwork.CMActivationWork')
144 @mock.patch('cmframework.server.cmprocessor.cmalarm.CMActivationFailedAlarm')
145 @mock.patch.object(CMProcessor, '_clear_reboot_requests')
146 @mock.patch.object(CMCSN, 'sync_node_csn')
147 def test_activate_node_changed_and_reboot(self, mock_sync_node_csn, mock_clear_reboot_requests,
148 mock_alarm, mock_work, mock_logging):
149 mock_backend = mock.MagicMock()
150 mock_backend.get_property = CMProcessorNodeActivationTest.backend_get_property
152 mock_validator = mock.MagicMock()
153 mock_activator = mock.MagicMock()
154 mock_changemonitor = mock.MagicMock()
155 mock_activationstate_handler = mock.MagicMock()
156 mock_snapshot_handler = mock.MagicMock()
158 mock_work.return_value.get_result = mock.MagicMock()
159 mock_work.return_value.get_result.return_value = None
161 mock_work.OPER_NODE = mock.MagicMock()
163 processor = CMProcessor(mock_backend, mock_validator, mock_activator,
164 mock_changemonitor, mock_activationstate_handler,
165 mock_snapshot_handler)
167 processor.reboot_request('node-b')
169 self.assertEqual(processor.activate_node('node-b'), True)
171 mock_clear_reboot_requests.assert_called_once()
172 mock_work.assert_called_once_with(mock_work.OPER_NODE, 101, {}, 'node-b')
173 mock_activator.add_work.assert_called_once_with(mock_work.return_value)
174 mock_alarm.return_value.cancel_alarm_for_node.assert_called_once_with('node-b')
175 mock_work.return_value.get_result.assert_called_once()
176 mock_sync_node_csn.assert_called_once()
177 mock_alarm.return_value.raise_alarm_for_node.assert_not_called()
179 @mock.patch('cmframework.server.cmprocessor.logging')
180 @mock.patch('cmframework.server.cmprocessor.cmactivationwork.CMActivationWork')
181 @mock.patch('cmframework.server.cmprocessor.cmalarm.CMActivationFailedAlarm')
182 @mock.patch.object(CMCSN, 'sync_node_csn')
183 def test_activate_node_changed_activation_fails(self, mock_sync_node_csn,
184 mock_alarm, mock_work, mock_logging):
185 mock_backend = mock.MagicMock()
186 mock_backend.get_property = CMProcessorNodeActivationTest.backend_get_property
188 mock_validator = mock.MagicMock()
189 mock_activator = mock.MagicMock()
190 mock_changemonitor = mock.MagicMock()
191 mock_activationstate_handler = mock.MagicMock()
192 mock_snapshot_handler = mock.MagicMock()
194 mock_work.return_value.get_result = mock.MagicMock()
195 mock_work.return_value.get_result.return_value = {'test handler': ['test error']}
197 mock_work.OPER_NODE = mock.MagicMock()
199 processor = CMProcessor(mock_backend, mock_validator, mock_activator,
200 mock_changemonitor, mock_activationstate_handler,
201 mock_snapshot_handler)
203 processor.activate_node('node-b')
205 mock_work.assert_called_once_with(mock_work.OPER_NODE, 101, {}, 'node-b')
206 mock_activator.add_work.assert_called_once_with(mock_work.return_value)
207 mock_work.return_value.get_result.assert_called_once()
208 mock_sync_node_csn.assert_not_called()
209 mock_alarm.return_value.assert_has_calls(
210 [call.cancel_alarm_for_node('node-b'),
211 call.raise_alarm_for_node('node-b', {'failed activators': ['test error']})])
213 if __name__ == '__main__':