def setUp(self): super(TestHealthPolicy, self).setUp() self.context = utils.dummy_context() self.spec = { 'type': 'senlin.policy.health', 'version': '1.0', 'properties': { 'detection': { 'type': 'NODE_STATUS_POLLING', 'options': { 'interval': 60 } }, 'recovery': { 'fencing': ['COMPUTE'], 'actions': ['REBUILD'] } } } cluster = mock.Mock() cluster.id = 'CLUSTER_ID' node = mock.Mock() node.status = 'ACTIVE' cluster.nodes = [node] self.cluster = cluster self.patch('senlin.rpc.client.EngineClient') self.hp = health_policy.HealthPolicy('test-policy', self.spec)
def setUp(self): super(TestHealthPolicy, self).setUp() self.context = utils.dummy_context() self.spec = { 'type': 'senlin.policy.health', 'version': '1.0', 'properties': { 'detection': { 'type': 'NODE_STATUS_POLLING', 'options': { 'interval': 60 } }, 'recovery': { 'fencing': ['COMPUTE'], 'actions': [{ 'name': 'REBUILD' }] } } } fake_profile = mock.Mock( type_name='os.nova.server', type='os.nova.server-1.0', ) fake_node = mock.Mock(status='ACTIVE') fake_cluster = mock.Mock(id='CLUSTER_ID', nodes=[fake_node], rt={'profile': fake_profile}) self.cluster = fake_cluster self.patch('senlin.rpc.client.EngineClient') self.hp = health_policy.HealthPolicy('test-policy', self.spec)
def test_validate_valid_interval(self): spec = copy.deepcopy(self.spec) spec["properties"]["detection"]["interval"] = 20 self.hp = health_policy.HealthPolicy('test-policy', spec) cfg.CONF.set_override('health_check_interval_min', 20) self.hp.validate(self.context)
def test_validate(self): spec = copy.deepcopy(self.spec) spec["properties"]["recovery"]["actions"] = [{ "name": "REBUILD" }, { "name": "RECREATE" }] self.hp = health_policy.HealthPolicy('test-policy', spec) ex = self.assertRaises(exc.ESchema, self.hp.validate, self.context) self.assertEqual("Only one 'actions' is supported for now.", str(ex))
def test_attach_failed_action_matching_reboot(self, mock_hm_reg): spec = copy.deepcopy(self.spec) spec['properties']['recovery']['actions'] = [{'name': 'REBOOT'}] hp = health_policy.HealthPolicy('test-policy-1', spec) fake_profile = mock.Mock(type_name='os.heat.stack-1.0', type='os.heat.stack') fake_cluster = mock.Mock(id='CLUSTER_ID', rt={'profile': fake_profile}) res, data = hp.attach(fake_cluster) self.assertFalse(res) self.assertEqual("Recovery action REBOOT is only applicable to " "os.nova.server clusters.", data)
def test_validate_invalid_interval(self): spec = copy.deepcopy(self.spec) spec["properties"]["detection"]["interval"] = 10 self.hp = health_policy.HealthPolicy('test-policy', spec) cfg.CONF.set_override('health_check_interval_min', 20) ex = self.assertRaises(exc.InvalidSpec, self.hp.validate, self.context) expected_error = ("Specified interval of %(interval)d seconds has to " "be larger than health_check_interval_min of " "%(min_interval)d seconds set in configuration.") % { "interval": 10, "min_interval": 20 } self.assertEqual(expected_error, six.text_type(ex))
def test_policy_init(self): DetectionMode = namedtuple('DetectionMode', [self.hp.DETECTION_TYPE] + list(self.hp._DETECTION_OPTIONS)) detection_modes = [ DetectionMode(type='NODE_STATUS_POLLING', poll_url='', poll_url_ssl_verify=True, poll_url_conn_error_as_unhealthy=True, poll_url_healthy_response='', poll_url_retry_limit='', poll_url_retry_interval='') ] spec = { 'type': 'senlin.policy.health', 'version': '1.1', 'properties': { 'detection': { "detection_modes": [ { 'type': 'NODE_STATUS_POLLING' }, ], 'interval': 60 }, 'recovery': { 'fencing': ['COMPUTE'], 'actions': [{ 'name': 'REBUILD' }] } } } hp = health_policy.HealthPolicy('test-policy', spec) self.assertIsNone(hp.id) self.assertEqual('test-policy', hp.name) self.assertEqual('senlin.policy.health-1.1', hp.type) self.assertEqual(detection_modes, hp.detection_modes) self.assertEqual(60, hp.interval) self.assertEqual([{ 'name': 'REBUILD', 'params': None }], hp.recover_actions)
def test_policy_init_ops(self): spec = { 'type': 'senlin.policy.health', 'version': '1.1', 'properties': { 'detection': { "detection_modes": [ { 'type': 'NODE_STATUS_POLLING' }, { 'type': 'NODE_STATUS_POLL_URL' }, ], 'interval': 60 }, 'recovery': { 'fencing': ['COMPUTE'], 'actions': [{ 'name': 'REBUILD' }] } } } operations = [None, 'ALL_FAILED', 'ANY_FAILED'] for op in operations: # set operation in spec if op: spec['properties']['detection']['recovery_conditional'] = op # test __init__ hp = health_policy.HealthPolicy('test-policy', spec) # check result self.assertIsNone(hp.id) self.assertEqual('test-policy', hp.name) self.assertEqual('senlin.policy.health-1.1', hp.type) self.assertEqual(60, hp.interval) self.assertEqual([{ 'name': 'REBUILD', 'params': None }], hp.recover_actions)