def test__init__(instance): with pytest.raises(BadConfigError): # Must define a unique 'name' per vCenter instance VSphereLegacyCheck('vsphere', {}, [{'': ''}]) init_config = { 'clean_morlist_interval': 50, 'refresh_morlist_interval': 42, 'refresh_metrics_metadata_interval': -42, 'batch_property_collector_size': -1, } check = VSphereLegacyCheck('vsphere', init_config, [instance]) i_key = check._instance_key(instance) assert check.time_started > 0 assert not check.server_instances assert check.cache_config.get_interval(CacheConfig.Morlist, i_key) == 42 assert check.cache_config.get_interval(CacheConfig.Metadata, i_key) == -42 assert check.clean_morlist_interval == 50 assert len(check.event_config) == 1 assert 'vsphere_mock' in check.event_config assert not check.registry assert not check.latest_event_query assert check.batch_collector_size == 0 assert check.batch_morlist_size == 50 assert check.excluded_host_tags == []
def test__should_cache(instance): now = time.time() # do not use fixtures for the check instance, some params are set at # __init__ time and we need to instantiate the check multiple times check = VSphereLegacyCheck('vsphere', {}, [instance]) i_key = check._instance_key(instance) # first run should always cache assert check._should_cache(instance, CacheConfig.Morlist) assert check._should_cache(instance, CacheConfig.Metadata) # explicitly set cache expiration times, don't use defaults so we also test # configuration is properly propagated init_config = { 'refresh_morlist_interval': 2 * REFRESH_MORLIST_INTERVAL, 'refresh_metrics_metadata_interval': 2 * REFRESH_METRICS_METADATA_INTERVAL, } check = VSphereLegacyCheck('vsphere', init_config, [instance]) # simulate previous runs, set the last execution time in the past check.cache_config.set_last(CacheConfig.Morlist, i_key, now - (2 * REFRESH_MORLIST_INTERVAL)) check.cache_config.set_last(CacheConfig.Metadata, i_key, now - (2 * REFRESH_METRICS_METADATA_INTERVAL)) with mock.patch("time.time", return_value=now): assert not check._should_cache(instance, CacheConfig.Morlist) assert not check._should_cache(instance, CacheConfig.Metadata)
def vsphere(): """ Provide a check instance with mocked parts """ # mock the server server_mock = get_mocked_server() # create a check instance check = VSphereLegacyCheck('vsphere', {}, [_instance()]) # patch the check instance check._get_server_instance = mock.MagicMock(return_value=server_mock) # return the check after disabling the thread pool return disable_thread_pool(check)
def test_excluded_host_tags(vsphere, instance, aggregator): # Check default value and precedence of instance config over init config check = VSphereLegacyCheck('vsphere', {}, [instance]) assert check.excluded_host_tags == [] check = VSphereLegacyCheck('vsphere', {"excluded_host_tags": ["vsphere_host"]}, [instance]) assert check.excluded_host_tags == ["vsphere_host"] instance["excluded_host_tags"] = [] check = VSphereLegacyCheck('vsphere', {"excluded_host_tags": ["vsphere_host"]}, [instance]) assert check.excluded_host_tags == [] # Test host tags are excluded from external host metadata, but still stored in the cache for metrics vsphere.excluded_host_tags = ["vsphere_host"] mocked_vm = MockedMOR(spec="VirtualMachine") mocked_host = MockedMOR(spec="HostSystem") mocked_mors_attrs = { mocked_vm: { "name": "mocked_vm", "parent": mocked_host, "runtime.powerState": vim.VirtualMachinePowerState.poweredOn, }, mocked_host: {"name": "mocked_host", "parent": None}, } with mock.patch( "datadog_checks.vsphere.legacy.vsphere_legacy.VSphereLegacyCheck._collect_mors_and_attributes", return_value=mocked_mors_attrs, ): server_instance = vsphere._get_server_instance(instance) result = MagicMock() result.value = [23.4] server_instance.content.perfManager.QueryPerf.return_value = [MagicMock(value=[result], entity=mocked_vm)] vsphere.metadata_cache = MagicMock() vsphere.metadata_cache.get_metadata.return_value = {"name": "mymetric", "unit": "kb"} vsphere.in_compatibility_mode = MagicMock() vsphere.in_compatibility_mode.return_value = False vsphere.check(instance) ext_host_tags = vsphere.get_external_host_tags() # vsphere_host tag not in external metadata for host, source_tags in ext_host_tags: if host == u"mocked_vm": tags = source_tags["vsphere"] for tag in tags: assert "vsphere_host:" not in tag break # vsphere_host tag still in cache for sending with metrics aggregator.assert_metric('vsphere.mymetric', value=23.4, hostname="mocked_vm", count=1) aggregator.assert_metric_has_tag('vsphere.mymetric', tag="vsphere_host:mocked_host", count=1)
def test_service_check_ko(aggregator, instance): check = disable_thread_pool(VSphereLegacyCheck('disk', {}, [instance])) with mock.patch( 'datadog_checks.vsphere.legacy.vsphere_legacy.connect.SmartConnect' ) as SmartConnect: # SmartConnect fails SmartConnect.side_effect = Exception() with pytest.raises(ConnectionError): check.check(instance) aggregator.assert_service_check(VSphereLegacyCheck.SERVICE_CHECK_NAME, status=VSphereLegacyCheck.CRITICAL, count=1, tags=SERVICE_CHECK_TAGS) aggregator.reset() # SmartConnect succeeds, CurrentTime fails server = MagicMock() server.CurrentTime.side_effect = Exception() SmartConnect.side_effect = None SmartConnect.return_value = server with pytest.raises(ConnectionError): check.check(instance) aggregator.assert_service_check(VSphereLegacyCheck.SERVICE_CHECK_NAME, status=VSphereLegacyCheck.CRITICAL, count=1, tags=SERVICE_CHECK_TAGS)
def __new__(cls, name, init_config, instances): """For backward compatibility reasons, there are two side-by-side implementations of the VSphereCheck. Instantiating this class will return an instance of the legacy integration for existing users and an instance of the new implementation for new users.""" if is_affirmative(instances[0].get('use_legacy_check_version', True)): from datadog_checks.vsphere.legacy.vsphere_legacy import VSphereLegacyCheck return VSphereLegacyCheck(name, init_config, instances) return super(VSphereCheck, cls).__new__(cls)
def test_service_check_ok(aggregator, instance): check = disable_thread_pool(VSphereLegacyCheck('disk', {}, [instance])) with mock.patch('datadog_checks.vsphere.legacy.vsphere_legacy.vmodl'): with mock.patch('datadog_checks.vsphere.legacy.vsphere_legacy.connect.SmartConnect') as SmartConnect: SmartConnect.return_value = get_mocked_server() check.check(instance) aggregator.assert_service_check( VSphereLegacyCheck.SERVICE_CHECK_NAME, status=VSphereLegacyCheck.OK, tags=SERVICE_CHECK_TAGS )
def test__is_excluded(): """ * Exclude hosts/vms not compliant with the user's `*_include` configuration. * Exclude "non-labeled" virtual machines when the user configuration instructs to. """ # Sample(s) include_regexes = {'host_include': "f[o]+", 'vm_include': "f[o]+"} # OK included_host = MockedMOR(spec="HostSystem", name="foo") included_vm = MockedMOR(spec="VirtualMachine", name="foo") assert not VSphereLegacyCheck._is_excluded(included_host, {"name": included_host.name}, include_regexes, None) assert not VSphereLegacyCheck._is_excluded(included_vm, {"name": included_vm.name}, include_regexes, None) # Not OK! excluded_host = MockedMOR(spec="HostSystem", name="bar") excluded_vm = MockedMOR(spec="VirtualMachine", name="bar") assert VSphereLegacyCheck._is_excluded(excluded_host, {"name": excluded_host.name}, include_regexes, None) assert VSphereLegacyCheck._is_excluded(excluded_vm, {"name": excluded_vm.name}, include_regexes, None) # Sample(s) include_regexes = None include_only_marked = True # OK included_vm = MockedMOR(spec="VirtualMachine", name="foo", label=True) assert not VSphereLegacyCheck._is_excluded( included_vm, {"customValue": included_vm.customValue}, include_regexes, include_only_marked ) # Not OK included_vm = MockedMOR(spec="VirtualMachine", name="foo") assert VSphereLegacyCheck._is_excluded(included_vm, {"customValue": []}, include_regexes, include_only_marked)