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)