Example #1
0
    def setUp(self):
        """
        Initialize and patch the check, i.e.
        """
        global account_id
        with open(relative_path("../stackstate_checks/aws_topology.yaml"),
                  "r") as stream:
            data_loaded = yaml.safe_load(stream)
        top.reset()
        aggregator.reset()
        init_config = InitConfig({
            "aws_access_key_id":
            data_loaded["init_config"]["aws_access_key_id"],
            "aws_secret_access_key":
            data_loaded["init_config"]["aws_secret_access_key"],
            "external_id":
            data_loaded["init_config"]["external_id"],
        })
        role = data_loaded["instances"][0]["role_arn"]
        account_id = role.split(":")[4]
        instance = {
            "role_arn": role,
            "regions": regions,
        }
        instance.update({"apis_to_run": ["redshift"]})

        self.check = AwsTopologyCheck(self.CHECK_NAME, InitConfig(init_config),
                                      [instance])
def dynatrace_check(test_instance):
    check = DynatraceCheck('dynatrace', {}, instances=[test_instance])
    yield check
    aggregator.reset()
    telemetry.reset()
    topology.reset()
    check.commit_state(None)
Example #3
0
    def setUp(self):
        """
        Initialize and patch the check, i.e.
        """
        config = InitConfig({
            "aws_access_key_id": "some_key",
            "aws_secret_access_key": "some_secret",
            "external_id": "secret_string"
        })
        self.patcher = patch("botocore.client.BaseClient._make_api_call")
        self.mock_object = self.patcher.start()
        self.api_results = deepcopy(API_RESULTS)
        topology.reset()
        aggregator.reset()
        self.check = AwsTopologyCheck(self.CHECK_NAME, config, [self.instance])

        def results(operation_name, api_params):
            if operation_name == "AssumeRole" and "ExternalId" not in api_params:
                raise ClientError({"Error": {
                    "Code": "AccessDenied"
                }}, operation_name)
            else:
                return self.api_results.get(operation_name) or {}

        self.mock_object.side_effect = results
Example #4
0
    def test_zabbix_no_problems(self):
        """
        When there are no problems, we are expecting all host components to go to green.
        To make this happen we need to send an event that says all is OK.
        """
        # TODO this is needed because the aggregator retains events data across tests
        aggregator.reset()

        def _mocked_method_request(url, name, auth=None, params={}, request_id=1):
            if name == "apiinfo.version":
                return self._apiinfo_response()
            elif name == "host.get":
                return self._zabbix_host_response()
            elif name == "problem.get":
                response = self._zabbix_problem()
                response['result'] = []
                return response
            else:
                self.fail("TEST FAILED on making invalid request")

        self.check.method_request = _mocked_method_request
        self.check.login = lambda url, user, password: "******"

        self.check.check(self.instance)
        events = aggregator.events
        self.assertEqual(len(events), 1)
        self.assertEqual(events[0]['source_type_name'], 'Zabbix')
        tags = events[0]['tags']

        for tag in ['host_id:10084', 'severity:0', "triggers:[]",
                    "host:zabbix01.example.com", "host_name:Zabbix server"]:
            if tag not in tags:
                self.fail("Event does not have tag '%s', got: %s." % (tag, tags))
        self.assertEqual(len(tags), 5)
    def setUp(self):
        """
        Initialize and patch the check, i.e.
        """
        config = InitConfig({
            "aws_access_key_id":
            "some_key",
            "aws_secret_access_key":
            "some_secret",
            "external_id":
            "disable_external_id_this_is_unsafe",
        })
        self.patcher = patch("botocore.client.BaseClient._make_api_call")
        self.mock_object = self.patcher.start()
        self.api_results = deepcopy(API_RESULTS)
        topology.reset()
        aggregator.reset()
        self.check = AwsTopologyCheck(self.CHECK_NAME, config, [self.instance])
        state_descriptor = self.check._get_state_descriptor()
        # clear the state
        self.check.state_manager.clear(state_descriptor)

        def results(operation_name, kwarg):
            return self.api_results.get(operation_name) or {}

        self.mock_object.side_effect = results
 def setUp(self):
     """
     Initialize and patch the check, i.e.
     """
     self.check = MockedSplunkTopology(self.CHECK_NAME, {}, {},
                                       [self.instance])
     topology.reset()
     aggregator.reset()
     self.check.commit_state(None)
 def setUp(self):
     """
     Initialize and patch the check, i.e.
     """
     self.check = ServicenowCheck('servicenow', {}, {}, [self.instance])
     topology.reset()
     aggregator.reset()
     telemetry.reset()
     self.check.commit_state(None)
Example #8
0
    def test_missing_relation_type_field(self, mock):
        # TODO this is needed because the topology retains data across tests
        aggregator.reset()

        self.check.run()
        service_checks = aggregator.service_checks("StaticTopology")
        self.assertEqual(service_checks[0].status, 2)
        self.assertEqual(service_checks[0].message,
                         "CSV header type not found in relation csv.")
 def setUp(self):
     """
     Initialize and patch the check, i.e.
     """
     config = {}
     self.check = AgentIntegrationSampleCheck(self.CHECK_NAME,
                                              config,
                                              instances=[self.instance])
     # TODO this is needed because the topology retains data across tests
     topology.reset()
     aggregator.reset()
     health.reset()
     telemetry.reset()
Example #10
0
    def test_empty_relation_file(self):
        config = {
            'init_config': {},
            'instances': [{
                'type': 'csv',
                'components_file': '/ignored/',
                'relations_file': '/dev/null',
                'delimiter': ';'
            }]
        }

        # TODO this is needed because the topology retains data across tests
        aggregator.reset()

        self.check.check(config["instances"][0])
        service_checks = aggregator.service_checks("StaticTopology")
        self.assertEqual(service_checks[0].status, 2)
Example #11
0
    def test_zabbix_disabled_triggers(self):
        """
        When there are no triggers enabled and return empty list for `trigger.get` call, then we are expecting no
        problems and host will become green if it was red because there will be an event without any severity/problems.
        """
        # TODO this is needed because the aggregator retains events data across tests
        aggregator.reset()

        def _mocked_method_request(url, name, auth=None, params={}, request_id=1):
            if name == "apiinfo.version":
                return self._apiinfo_response()
            elif name == "host.get":
                return self._zabbix_host_response()
            elif name == "problem.get":
                response = self._zabbix_problem()
                return response
            elif name == "trigger.get":
                response = self._zabbix_trigger()
                response['result'] = []
                return response
            else:
                self.fail("TEST FAILED on making invalid request")

        self.check.method_request = _mocked_method_request
        self.check.login = lambda url, user, password: "******"

        self.check.check(self.instance)
        events = aggregator.events
        self.assertEqual(len(events), 1)
        tags = events[0]['tags']
        for tag in [
            'host_id:10084',
            "host:zabbix01.example.com",
            "host_name:Zabbix server",
            "severity:0",
            "triggers:[]"
        ]:
            if tag not in tags:
                self.fail("Event does not have tag '%s', got: %s." % (tag, tags))
        self.assertEqual(len(tags), 5)

        # check if OK service check generated
        service_checks = aggregator.service_checks('Zabbix')
        self.assertEqual(AgentCheck.OK, service_checks[0].status)
    def test_check_invalid_initial_token(self):
        """
            Splunk check should not work with invalid initial token and stop the check
        """
        instance = {
            'url': 'http://localhost:8089',
            'authentication': {
                'token_auth': {
                    'name': "admin",
                    'initial_token':
                    "dsfdgfhgjhkjuyr567uhfe345ythu7y6tre456sdx",
                    'audience': "search",
                    'renewal_days': 10
                }
            },
            'component_saved_searches': [{
                "name": "components",
                "parameters": {}
            }],
            'relation_saved_searches': [],
            'tags': ['mytag', 'mytag2']
        }

        self.check = MockedSplunkTopology(self.CHECK_NAME, {}, {}, [instance])
        # Run once to initialize
        assert self.check.run() == ''
        aggregator.reset()

        self.check.instance_data.splunk_client.invalid_token = True
        assert self.check.run() == ''

        msg = "Current in use authentication token is expired. Please provide a valid token in the YAML and restart " \
              "the Agent"

        service_checks = aggregator.service_checks(
            SplunkTopology.SERVICE_CHECK_NAME)
        self.assertEqual(service_checks[0].status, 2)
        self.assertEqual(service_checks[0].message, msg)
Example #13
0
    def test_zabbix_problems(self):

        # TODO this is needed because the aggregator retains events data across tests
        aggregator.reset()

        def _mocked_method_request(url, name, auth=None, params={}, request_id=1):
            if name == "apiinfo.version":
                return self._apiinfo_response()
            elif name == "host.get":
                return self._zabbix_host_response()
            elif name == "problem.get":
                return self._zabbix_problem()
            elif name == "trigger.get":
                return self._zabbix_trigger()
            elif name == "event.get":
                return self._zabbix_event()
            else:
                self.fail("TEST FAILED on making invalid request")

        self.check.method_request = _mocked_method_request
        self.check.login = lambda url, user, password: "******"

        self.check.check(self.instance)

        events = aggregator.events

        self.assertEqual(len(events), 1)
        self.assertEqual(events[0]['source_type_name'], 'Zabbix')
        tags = events[0]['tags']

        for tag in ['host_id:10084', 'severity:3',
                    "triggers:['Zabbix agent on {HOST.NAME} is unreachable for 5 minutes']",
                    "host:zabbix01.example.com", "host_name:Zabbix server"]:
            if tag not in tags:
                self.fail("Event does not have tag '%s', got: %s." % (tag, tags))
        self.assertEqual(len(tags), 5)
Example #14
0
    def test_zabbix_acknowledge_problem(self):
        """
        When there are problems, we are expecting all host components to go to yellow/red.
        But acknowledging the problem should make the host components go back to green
        To make this happen we need to send an event that says the problem is `acknowledged`.
        """
        # TODO this is needed because the aggregator retains events data across tests
        aggregator.reset()

        self.event_response = {}
        self.second_run = False

        def _mocked_method_request(url, name, auth=None, params={}, request_id=1):
            if name == "apiinfo.version":
                return self._apiinfo_response()
            elif name == "host.get":
                return self._zabbix_host_response()
            elif name == "problem.get":
                response = self._zabbix_problem()
                return response
            elif name == "trigger.get":
                response = self._zabbix_trigger()
                return response
            elif name == "event.get":
                self.event_response = self._zabbix_event()
                if not self.second_run:
                    # acknowledge the problem
                    self.event_response['result'][0]['acknowledged'] = '1'
                    self.second_run = True
                else:
                    self.event_response['result'][0]['acknowledged'] = '0'
                return self.event_response
            else:
                self.fail("TEST FAILED on making invalid request")

        self.check.method_request = _mocked_method_request
        self.check.login = lambda url, user, password: "******"

        self.check.check(self.instance)
        events = aggregator.events
        self.assertEqual(len(events), 1)
        tags = events[0]['tags']
        for tag in [
            'host_id:10084',
            "host:zabbix01.example.com",
            "host_name:Zabbix server",
            "severity:0",
            "triggers:[]"
        ]:
            if tag not in tags:
                self.fail("Event does not have tag '%s', got: %s." % (tag, tags))
        self.assertEqual(len(tags), 5)

        aggregator.reset()
        # second run to revert the acknowledged problem to create the event again
        self.check.check(self.instance)
        events = aggregator.events
        self.assertEqual(len(events), 1)
        tags = events[0]['tags']
        for tag in [
            'host_id:10084',
            "host:zabbix01.example.com",
            "host_name:Zabbix server",
            "severity:3",
            "triggers:['Zabbix agent on {HOST.NAME} is unreachable for 5 minutes']"
        ]:
            if tag not in tags:
                self.fail("Event does not have tag '%s', got: %s." % (tag, tags))
        self.assertEqual(len(tags), 5)
Example #15
0
    def test_zabbix_determine_most_severe_state(self):
        """
            A host can have multiple active problems.
            From the active problems we determine the most severe state and send that to StackState
        """
        # TODO this is needed because the aggregator retains events data across tests
        aggregator.reset()

        def _mocked_method_request(url, name, auth=None, params={}, request_id=1):
            if name == "apiinfo.version":
                return self._apiinfo_response()
            elif name == "host.get":
                return self._zabbix_host_response()
            elif name == "problem.get":
                response = self._zabbix_problem()
                response['result'].append({
                    "eventid": "100",
                    "source": "0",
                    "object": "0",
                    "objectid": "111",
                    "clock": "1549878981",
                    "ns": "221836547",
                    "r_eventid": "0",
                    "r_clock": "0",
                    "r_ns": "0",
                    "correlationid": "0",
                    "userid": "0",
                    "name": "My very own problem",
                    "acknowledged": "0",
                    "severity": "5",
                    "acknowledges": [],
                    "suppressed": 0
                })
                return response
            elif name == "trigger.get":
                return self._zabbix_trigger()
            elif name == "event.get":
                response = self._zabbix_event()
                response['result'].append({
                    "eventid": "100",
                    "value": "1",
                    "severity": "5",
                    "acknowledged": "0",
                    "hosts": [
                        {
                            "hostid": "10084"
                        }
                    ],
                    "relatedObject": {
                        "triggerid": "111",
                        "description": "My very own problem",
                        "priority": "5"
                    }
                })
                return response
            else:
                self.fail("TEST FAILED on making invalid request")

        self.check.method_request = _mocked_method_request
        self.check.login = lambda url, user, password: "******"

        self.check.check(self.instance)
        events = aggregator.events

        self.assertEqual(len(events), 1)
        self.assertEqual(events[0]['source_type_name'], 'Zabbix')
        tags = events[0]['tags']

        for tag in [
            'host_id:10084',
            'severity:5',
            "triggers:['Zabbix agent on {HOST.NAME} is unreachable for 5 minutes', 'My very own problem']",
            "host:zabbix01.example.com",
            "host_name:Zabbix server"
        ]:
            if tag not in tags:
                self.fail("Event does not have tag '%s', got: %s." % (tag, tags))
        self.assertEqual(len(tags), 5)
Example #16
0
def solarwinds_check(test_instance):
    check = SolarWindsCheck("solarwinds", {}, {}, instances=[test_instance])
    yield check
    aggregator.reset()
    telemetry.reset()
    topology.reset()
def aggregator():
    from stackstate_checks.base.stubs import aggregator

    aggregator.reset()
    return aggregator
Example #18
0
    def setUp(self):
        """
        Initialize and patch the check, i.e.
        """
        self.recorder = []
        method = getattr(self, self._testMethodName)
        not_authorized = []
        if hasattr(method, "not_authorized"):
            not_authorized = method.not_authorized
        events_file = None
        if hasattr(method, "events_file"):
            events_file = method.events_file
        subdirectory = ""
        if hasattr(method, "subdirectory"):
            subdirectory = method.subdirectory
        log_bucket_name = ""
        if hasattr(method, "log_bucket_name"):
            log_bucket_name = method.log_bucket_name
        flowlog_bucket_name = ""
        if hasattr(method, 'flowlog_bucket_name'):
            flowlog_bucket_name = method.flowlog_bucket_name
        use_gz = False
        if hasattr(method, "gz"):
            use_gz = method.gz
        self.patcher = patch("botocore.client.BaseClient._make_api_call",
                             autospec=True)
        self.extra_patch = patch(
            "stackstate_checks.aws_topology.AwsTopologyCheck.must_run_full",
            return_value=False)
        self.mock_object = self.patcher.start()
        self.extra_patch.start()

        top.reset()
        aggregator.reset()
        init_config = InitConfig({
            "aws_access_key_id":
            "some_key",
            "aws_secret_access_key":
            "some_secret",
            "external_id":
            "disable_external_id_this_is_unsafe",
        })
        regions = self.get_region()
        if not isinstance(regions, list):
            regions = [regions]
        instance = {
            "role_arn":
            "arn:aws:iam::{}:role/RoleName".format(self.get_account_id()),
            "regions":
            regions
        }
        if log_bucket_name:
            instance.update({"log_bucket_name": log_bucket_name})
        if flowlog_bucket_name:
            instance.update({'flowlog_bucket_name': flowlog_bucket_name})
        apis = []
        instance.update({"apis_to_run": apis})

        self.check = AwsTopologyCheck(self.CHECK_NAME, InitConfig(init_config),
                                      [instance])
        self.check.last_full_topology = datetime(2021, 5, 1, 0, 0,
                                                 0).replace(tzinfo=pytz.utc)
        state_descriptor = self.check._get_state_descriptor()
        # clear the state
        self.check.state_manager.clear(state_descriptor)
        self.mock_object.side_effect = wrapper(self,
                                               not_authorized,
                                               subdirectory,
                                               use_gz,
                                               events_file=events_file)
    def setUp(self):
        """
        Initialize and patch the check, i.e.
        """
        method = getattr(self, self._testMethodName)
        not_authorized = []
        if hasattr(method, "not_authorized"):
            not_authorized = method.not_authorized
        cloudtrail_event = None
        if hasattr(method, "cloudtrail_event"):
            cloudtrail_event = method.cloudtrail_event
        eventbridge_event = None
        if hasattr(method, "eventbridge_event"):
            eventbridge_event = method.eventbridge_event
        filter = ""
        if hasattr(method, "filter"):
            filter = method.filter
        subdirectory = ""
        if hasattr(method, "subdirectory"):
            subdirectory = method.subdirectory
        self.patcher = patch("botocore.client.BaseClient._make_api_call",
                             autospec=True)
        self.mock_object = self.patcher.start()
        top.reset()
        aggregator.reset()
        init_config = InitConfig({
            "aws_access_key_id":
            "some_key",
            "aws_secret_access_key":
            "some_secret",
            "external_id":
            "disable_external_id_this_is_unsafe",
        })
        regions = self.get_region()
        if not isinstance(regions, list):
            regions = [regions]
        instance = {
            "role_arn":
            "arn:aws:iam::{}:role/RoleName".format(self.get_account_id()),
            "regions":
            regions
        }
        api = self.get_api()
        apis = None
        if api:
            if filter:
                apis = [api + "|" + filter]
            else:
                apis = [api]
        if cloudtrail_event:
            apis = []
        instance.update({"apis_to_run": apis})

        self.check = AwsTopologyCheck(self.CHECK_NAME, InitConfig(init_config),
                                      [instance])
        self.check.last_full_topology = datetime(2021, 5, 1, 0, 0,
                                                 0).replace(tzinfo=pytz.utc)

        def ignore_callback(self, *args, **kwargs):
            return

        self.check.get_flowlog_update = ignore_callback
        if cloudtrail_event is None and eventbridge_event is None:
            self.check.get_topology_update = ignore_callback
        self.mock_object.side_effect = wrapper(
            api,
            not_authorized,
            subdirectory,
            event_name=cloudtrail_event,
            eventbridge_event_name=eventbridge_event)
        self.components_checked = 0
        self.relations_checked = 0
Example #20
0
 def aggregator():
     """This fixture returns a mocked Agent aggregator with state cleared."""
     __aggregator.reset()
     return __aggregator
    def setUp(self):
        """
        Initialize and patch the check, i.e.
        """
        self.recorder = []
        method = getattr(self, self._testMethodName)
        not_authorized = []
        if hasattr(method, "not_authorized"):
            not_authorized = method.not_authorized
        events_file = None
        if hasattr(method, "events_file"):
            events_file = method.events_file
        subdirectory = ""
        if hasattr(method, "subdirectory"):
            subdirectory = method.subdirectory
        log_bucket_name = ""
        if hasattr(method, "log_bucket_name"):
            log_bucket_name = method.log_bucket_name
        use_gz = False
        if hasattr(method, "gz"):
            use_gz = method.gz
        self.patcher = patch("botocore.client.BaseClient._make_api_call",
                             autospec=True)
        self.extrapatch = patch(
            "stackstate_checks.aws_topology.AwsTopologyCheck.must_run_full",
            return_value=False)
        self.regpatch = patch(
            "stackstate_checks.aws_topology.resources.ResourceRegistry.CLOUDTRAIL",
            {
                "test": {
                    "test": CollectorMock
                },
                "lambda.amazonaws.com": {
                    "PublishVersion20150331": CollectorMock,
                    "UpdateFunctionConfiguration20150331v2": CollectorMock
                }
            })
        self.mock_object = self.patcher.start()
        self.extrapatch.start()
        self.regpatch.start()

        top.reset()
        aggregator.reset()
        init_config = InitConfig({
            "aws_access_key_id":
            "some_key",
            "aws_secret_access_key":
            "some_secret",
            "external_id":
            "disable_external_id_this_is_unsafe",
        })
        regions = self.get_region()
        if not isinstance(regions, list):
            regions = [regions]
        instance = {
            "role_arn":
            "arn:aws:iam::{}:role/RoleName".format(self.get_account_id()),
            "regions":
            regions,
            "state": {
                "last_full_topology": "2021-05-01T00:00:00"
            },
        }
        if log_bucket_name:
            instance.update({"log_bucket_name": log_bucket_name})
        apis = []
        instance.update({"apis_to_run": apis})

        self.check = AwsTopologyCheck(self.CHECK_NAME, InitConfig(init_config),
                                      [instance])
        state_descriptor = self.check._get_state_descriptor()
        # clear the state
        self.check.state_manager.clear(state_descriptor)
        self.mock_object.side_effect = wrapper(self,
                                               not_authorized,
                                               subdirectory,
                                               use_gz,
                                               events_file=events_file)
    def setUp(self):
        """
        Initialize and patch the check, i.e.
        """
        method = getattr(self, self._testMethodName)
        not_authorized = []
        if hasattr(method, "not_authorized"):
            not_authorized = method.not_authorized
        cloudtrail_event = None
        if hasattr(method, "cloudtrail_event"):
            cloudtrail_event = method.cloudtrail_event
        eventbridge_event = None
        if hasattr(method, "eventbridge_event"):
            eventbridge_event = method.eventbridge_event
        filter = ""
        if hasattr(method, "filter"):
            filter = method.filter
        subdirectory = ""
        if hasattr(method, "subdirectory"):
            subdirectory = method.subdirectory
        self.patcher = patch("botocore.client.BaseClient._make_api_call",
                             autospec=True)
        self.mock_object = self.patcher.start()
        top.reset()
        aggregator.reset()
        init_config = InitConfig({
            "aws_access_key_id":
            "some_key",
            "aws_secret_access_key":
            "some_secret",
            "external_id":
            "disable_external_id_this_is_unsafe",
        })
        regions = self.get_region()
        if not isinstance(regions, list):
            regions = [regions]
        instance = {
            "role_arn":
            "arn:aws:iam::{}:role/RoleName".format(self.get_account_id()),
            "regions":
            regions,
            "state": {
                "last_full_topology": "2021-05-01T00:00:00"
            },
        }
        api = self.get_api()
        apis = None
        if api:
            if filter:
                apis = [api + "|" + filter]
            else:
                apis = [api]
        if cloudtrail_event:
            apis = []
        instance.update({"apis_to_run": apis})

        self.check = AwsTopologyCheck(self.CHECK_NAME, InitConfig(init_config),
                                      [instance])
        state_descriptor = self.check._get_state_descriptor()
        # clear the state
        self.check.state_manager.clear(state_descriptor)
        self.mock_object.side_effect = wrapper(
            api,
            not_authorized,
            subdirectory,
            event_name=cloudtrail_event,
            eventbridge_event_name=eventbridge_event)
        self.components_checked = 0
        self.relations_checked = 0