def test__returns_expected_last_scan(self):
     expected_last_scan = random.randint(1, 1000)
     Config.objects.set_config("active_discovery_last_scan",
                               expected_last_scan)
     service = ActiveDiscoveryService(Clock())
     enabled, interval, last_scan = service.get_active_discovery_config()
     self.assertThat(last_scan, Equals(expected_last_scan))
 def test__returns_expected_interval(self):
     expected_interval = random.randint(1, 1000)
     Config.objects.set_config("active_discovery_interval",
                               expected_interval)
     service = ActiveDiscoveryService(Clock())
     enabled, interval, last_scan = service.get_active_discovery_config()
     self.assertThat(interval, Equals(expected_interval))
     # Enabled is True if interval is > 0
     self.assertThat(enabled, Equals(True))
 def test__returns_disabled_if_interval_is_zero(self):
     expected_interval = 0
     expected_last_scan = 0
     Config.objects.set_config("active_discovery_last_scan",
                               expected_last_scan)
     Config.objects.set_config("active_discovery_interval",
                               expected_interval)
     service = ActiveDiscoveryService(Clock())
     enabled, interval, last_scan = service.get_active_discovery_config()
     self.assertThat(enabled, Equals(False))
 def test_run_calls_scanIfNeeded_if_discovery_enabled(self):
     clock = Clock()
     service = ActiveDiscoveryService(clock)
     self.patch(service, "refreshDiscoveryConfig")
     scanIfNeeded = self.patch(service, "scanIfNeeded")
     service.startService()
     # Pretend the call to refreshDiscoveryConfig enabled discovery,
     # as expected.
     service.discovery_enabled = True
     clock.advance(300)
     self.assertThat(scanIfNeeded, MockCalledOnceWith())
 def test__returns_disabled_if_interval_is_invalid(self):
     expected_interval = factory.make_name()
     expected_last_scan = factory.make_name()
     Config.objects.set_config("active_discovery_last_scan",
                               expected_last_scan)
     Config.objects.set_config("active_discovery_interval",
                               expected_interval)
     service = ActiveDiscoveryService(Clock())
     enabled, interval, last_scan = service.get_active_discovery_config()
     self.assertThat(enabled, Equals(False))
     self.assertThat(interval, Equals(0))
     self.assertThat(last_scan, Equals(0))
 def test_run_handles_refresh_failure(self):
     clock = Clock()
     service = ActiveDiscoveryService(clock)
     refreshDiscoveryConfig = self.patch(service, "refreshDiscoveryConfig")
     refreshDiscoveryConfig.side_effect = Exception
     with TwistedLoggerFixture() as logger:
         service.startService()
     self.assertThat(
         logger.output, DocTestMatches(dedent("""\
             ...: error refreshing discovery configuration.
             Traceback (most recent call last):
             ...""")))
 def setUp(self):
     super().setUp()
     self.service = ActiveDiscoveryService(Clock())
     self.get_active_discovery_config = self.patch(
         self.service, "get_active_discovery_config")
     self.getCurrentTimestamp = self.patch(
         self.service, "getCurrentTimestamp")
     self.get_network_discovery_config = self.patch(
         active_discovery.Config.objects, "get_network_discovery_config")
     self.get_cidr_list = self.patch(
         active_discovery.Subnet.objects,
         "get_cidr_list_for_periodic_active_scan")
     self.mock_discovery_config = Mock()
     self.get_network_discovery_config.return_value = (
         self.mock_discovery_config)
 def test__stores_correct_values_and_fires_timer(self):
     expected_last_scan = random.randint(1, 1000)
     expected_interval = random.randint(1, 1000)
     yield deferToDatabase(self.set_interval, expected_interval)
     yield deferToDatabase(self.set_last_scan, expected_last_scan)
     service = ActiveDiscoveryService(Clock())
     run = self.patch(service, "run")
     with TwistedLoggerFixture() as logger:
         yield service.refreshDiscoveryConfig()
     self.assertThat(logger.output,
                     DocTestMatches("...Discovery interval set to..."))
     self.assertThat(service.discovery_enabled, Equals(True))
     self.assertThat(service.discovery_interval, Equals(expected_interval))
     self.assertThat(service.discovery_last_scan,
                     Equals(expected_last_scan))
     self.assertThat(run, MockCalledOnceWith())
 def test_monitorServices_handles_scan_failure(self):
     clock = Clock()
     service = ActiveDiscoveryService(clock)
     self.patch(service, "refreshDiscoveryConfig")
     scanIfNeeded = self.patch(service, "scanIfNeeded")
     scanIfNeeded.side_effect = Exception
     # Pretend the call to refreshDiscoveryConfig enabled discovery,
     # as expected.
     service.discovery_enabled = True
     with TwistedLoggerFixture() as logger:
         service.run()
     self.assertThat(
         logger.output, DocTestMatches(dedent("""\
             ...: periodic scan failed.
             Traceback (most recent call last):
             ...""")))
 def test__disables_discovery_if_interval_is_zero(self):
     expected_last_scan = random.randint(1, 1000)
     expected_interval = random.randint(1, 1000)
     yield deferToDatabase(self.set_interval, expected_interval)
     yield deferToDatabase(self.set_last_scan, expected_last_scan)
     service = ActiveDiscoveryService(Clock())
     self.patch(service, "run")
     yield service.refreshDiscoveryConfig()
     yield deferToDatabase(self.set_interval, 0)
     with TwistedLoggerFixture() as logger:
         yield service.refreshDiscoveryConfig()
     self.assertThat(logger.output,
                     DocTestMatches("...discovery is disabled..."))
     self.assertThat(service.discovery_enabled, Equals(False))
     self.assertThat(service.discovery_interval, Equals(0))
     self.assertThat(service.discovery_last_scan,
                     Equals(expected_last_scan))
 def test_scanIfNeeded_logs_success(self):
     service = ActiveDiscoveryService(Clock())
     try_lock_and_scan = self.patch(service, "try_lock_and_scan")
     try_lock_and_scan.return_value = "happy"
     service.discovery_enabled = True
     service.discovery_last_scan = 0
     service.discovery_interval = 1
     service.startService()
     with TwistedLoggerFixture() as logger:
         yield service.run()
     self.assertThat(logger.output,
                     DocTestMatches("...Active network discovery: happy"))
 def test_registers_and_unregisters_listener(self):
     mock_listener = Mock()
     register = mock_listener.register = Mock()
     unregister = mock_listener.unregister = Mock()
     clock = Clock()
     run = self.patch(ActiveDiscoveryService, "run")
     service = ActiveDiscoveryService(clock, mock_listener)
     # Make sure the service doesn't actually do anything.
     service.startService()
     self.assertThat(
         service,
         MatchesStructure.byEquality(
             call=(run, (), {}),
             step=active_discovery.CHECK_INTERVAL,
             clock=clock,
         ),
     )
     self.assertThat(
         register,
         MockCalledOnceWith("config", service.refreshDiscoveryConfig),
     )
     self.assertThat(unregister, MockNotCalled())
     service.stopService()
     self.assertThat(
         unregister,
         MockCalledOnceWith("config", service.refreshDiscoveryConfig),
     )
 def test_run_calls_refreshDiscoveryConfig(self):
     clock = Clock()
     service = ActiveDiscoveryService(clock)
     refreshDiscoveryConfig = self.patch(service, "refreshDiscoveryConfig")
     service.startService()
     self.assertThat(refreshDiscoveryConfig, MockCalledOnceWith())
class TestTryLockAndScan(MAASTransactionServerTestCase):
    """ActiveDiscoveryService.check_settings_and_scan_rack_networks tests."""
    def setUp(self):
        super().setUp()
        self.service = ActiveDiscoveryService(Clock())
        self.get_active_discovery_config = self.patch(
            self.service, "get_active_discovery_config")
        self.getCurrentTimestamp = self.patch(self.service,
                                              "getCurrentTimestamp")
        self.get_network_discovery_config = self.patch(
            active_discovery.Config.objects, "get_network_discovery_config")
        self.get_cidr_list = self.patch(
            active_discovery.Subnet.objects,
            "get_cidr_list_for_periodic_active_scan",
        )
        self.mock_discovery_config = Mock()
        self.get_network_discovery_config.return_value = (
            self.mock_discovery_config)

    def test__aborts_if_passive_discovery_is_disabled(self):
        self.mock_discovery_config.passive = False
        result = self.service.try_lock_and_scan()
        self.assertThat(
            result, DocTestMatches("...discovery is disabled. Skipping..."))

    def test__aborts_if_periodic_discovery_is_disabled(self):
        self.mock_discovery_config.passive = True
        self.get_active_discovery_config.return_value = (False, 0, 0)
        result = self.service.try_lock_and_scan()
        self.assertThat(
            result,
            DocTestMatches(
                "...Skipping active scan...discovery is now disabled."),
        )

    def test__aborts_if_periodic_discovery_if_last_scan_too_recent(self):
        self.mock_discovery_config.passive = True
        self.get_active_discovery_config.return_value = (True, 10, 91)
        self.getCurrentTimestamp.return_value = 100
        result = self.service.try_lock_and_scan()
        self.assertThat(
            result,
            DocTestMatches("Another region controller is already scanning..."),
        )

    def test__aborts_if_periodic_discovery_if_no_subnets_enabled(self):
        self.mock_discovery_config.passive = True
        self.get_active_discovery_config.return_value = (True, 10, 90)
        self.getCurrentTimestamp.return_value = 100
        self.get_cidr_list.return_value = []
        result = self.service.try_lock_and_scan()
        self.assertThat(
            result,
            DocTestMatches("Active scanning is not enabled on any subnet..."),
        )

    def test__calls_scan_all_rack_networks_if_everything_is_okay(self):
        self.mock_discovery_config.passive = True
        self.get_active_discovery_config.return_value = (True, 10, 90)
        self.getCurrentTimestamp.return_value = 100
        cidrs = [IPNetwork(factory.make_ipv4_network())]
        self.get_cidr_list.return_value = cidrs
        scan_all_rack_networks = self.patch(active_discovery,
                                            "scan_all_rack_networks")
        rpc_results = Mock()
        rpc_results.available = ["rack1"]
        scan_all_rack_networks.return_value = rpc_results
        get_result_string = self.patch(active_discovery,
                                       "get_scan_result_string_for_humans")
        get_result_string.return_value = "sensational"
        result = self.service.try_lock_and_scan()
        self.assertThat(result, Equals("sensational"))
        self.assertThat(scan_all_rack_networks,
                        MockCalledOnceWith(cidrs=cidrs))
Exemple #15
0
def make_ActiveDiscoveryService(postgresListener):
    from maasserver.regiondservices.active_discovery import (
        ActiveDiscoveryService)
    return ActiveDiscoveryService(reactor, postgresListener)