def test_extract_none():
    """Test Loop Instance extract operational policy name."""
    loop = LoopInstance(template="template", name="test", details={})
    loop.details = {"operationalPolicies":[]}
    with pytest.raises(ValueError):
        policy_name = loop.extract_operational_policy_name(policy_type="Drools")
        assert policy_name == None
def test_update_loop_details(mock_send_message_json):
    """Test Loop instance methode."""
    loop = LoopInstance(template="template", name="test", details={})
    mock_send_message_json.return_value = LOOP_DETAILS
    loop.details = loop._update_loop_details()
    mock_send_message_json.assert_called_once_with(
        'GET', 'Get loop details', (f"{loop.base_url()}/loop/LOOP_test"))
    assert loop.details == LOOP_DETAILS
def test_restart_policy(mock_send_message, mock_refresh):
    """Test submit policies to policy engine."""
    loop = LoopInstance(template="template", name="test", details=LOOP_DETAILS)
    action = loop.act_on_loop_policy(loop.restart)
    mock_send_message.assert_called_once_with(
        'PUT', 'restart policy', (f"{loop.base_url()}/loop/restart/LOOP_test"))
    mock_refresh.assert_called_once()
    loop.details = SUBMITED_POLICY
    assert loop.details["components"]["POLICY"]["componentState"][
        "stateName"] == "SENT_AND_DEPLOYED"
def test_stop_policy(mock_send_message, mock_refresh):
    """Test submit policies to policy engine."""
    loop = LoopInstance(template="template", name="test", details=LOOP_DETAILS)
    action = loop.act_on_loop_policy(loop.stop)
    mock_send_message.assert_called_once_with('PUT',
                                            'stop policy',
                                            (f"{loop.base_url()}/loop/stop/LOOP_test"),
                                            cert=loop.cert,
                                            exception=ValueError)
    mock_refresh.assert_called_once()
    loop.details = {"components":{"POLICY":{"componentState":{"stateName":"SENT"}}}}
    assert loop.details["components"]["POLICY"]["componentState"]["stateName"] == "SENT"
def test_not_submited_policy(mock_send_message, mock_refresh):
    """Test submit policies to policy engine."""
    loop = LoopInstance(template="template", name="test", details=LOOP_DETAILS)
    mock_refresh.return_value = NOT_SUBMITED_POLICY
    action = loop.act_on_loop_policy(loop.submit)
    mock_send_message.assert_called_once_with('PUT',
                                            'submit policy',
                                            (f"{loop.base_url()}/loop/submit/LOOP_test"),
                                            cert=loop.cert,
                                            exception=ValueError)
    mock_refresh.assert_called_once()
    loop.details = NOT_SUBMITED_POLICY
    assert loop.details["components"]["POLICY"]["componentState"]["stateName"] == "SENT"
def test_extract_operational_policy_name():
    """Test Loop Instance extract operational policy name."""
    loop = LoopInstance(template="template", name="test", details={})
    loop.details = {
        "operationalPolicies": [{
            "name": "test",
            "policyModel": {
                "policyAcronym": "Drools"
            }
        }]
    }
    policy_name = loop.extract_operational_policy_name(policy_type="Drools")
    assert policy_name == 'test'
def test_add_operational_policy_key_parameter_error(mock_send_message_json):
    """Test adding an op policy - key doesn't exist."""
    loop = LoopInstance(template="template", name="test", details={})
    loop.details = {}
    with pytest.raises(ParameterError) as exc:
        mock_send_message_json.return_value = loop.details
        loop.add_operational_policy(policy_type="FrequencyLimiter",
                                    policy_version="not_correct")
        mock_send_message_json.assert_called_once_with(
            'PUT', 'Create Operational Policy',
            (f"{loop.base_url()}/loop/addOperationaPolicy/{loop.name}/policyModel/FrequencyLimiter/not_correct"
             ))
        assert exc.type is ParameterError
    def instantiate_loop(self):
        """Instantiate the control loop."""
        loop = LoopInstance(template=self.template,
                            name=self.loop_name,
                            details={})
        details = loop.create()
        if details:
            self._logger.info("Loop instance %s successfully created !!",
                              self.loop_name)
        else:
            self._logger.error(
                "An error occured while creating the loop instance")

        self.add_policies(loop=loop)
        self.configure_policies(loop=loop)
        self.deploy(loop=loop)

        loop.details = loop._update_loop_details()
        return loop
def test_add_operational_policy(mock_send_message_json):
    """Test adding an op policy."""
    loop = LoopInstance(template="template", name="test", details={})
    loop.details = {
        "name" : "LOOP_test",
        "operationalPolicies" : None,
        "microServicePolicies" : [
            {
                "name" : "MICROSERVICE_test"
            }
        ]
    }
    mock_send_message_json.return_value = LOOP_DETAILS
    loop.add_operational_policy(policy_type="FrequencyLimiter", policy_version="1.0.0")
    mock_send_message_json.assert_called_once_with('PUT', 'Create Operational Policy',
        (f"{loop.base_url()}/loop/addOperationaPolicy/{loop.name}/policyModel/FrequencyLimiter/1.0.0"),
        cert=loop.cert)
    assert loop.name == "LOOP_test"
    assert len(loop.details["operationalPolicies"]) > 0
def test_not_add_operational_policy(mock_send_message_json):
    """Test adding an op policy."""
    loop = LoopInstance(template="template", name="test", details={})
    loop.details = {
        "name" : "LOOP_test",
        "operationalPolicies" : [],
        "microServicePolicies" : [
            {
                "name" : "MICROSERVICE_test"
            }
        ]
    }
    with pytest.raises(ValueError):
        mock_send_message_json.return_value = loop.details
        #mistaken policy version
        loop.add_operational_policy(policy_type="FrequencyLimiter", policy_version="not_correct")
        mock_send_message_json.assert_called_once_with('PUT', 'Create Operational Policy',
            (f"{loop.base_url()}/loop/addOperationaPolicy/{loop.name}/policyModel/FrequencyLimiter/not_correct"),
            cert=loop.cert)
        assert len(loop.details["operationalPolicies"]) == 0
def test_validate_details():
    """Test Loop instance details validation."""
    loop = LoopInstance(template="template", name="test", details=LOOP_DETAILS)
    loop.details = {"test":"test"}
    valid = loop.validate_details()
    assert  not valid