def scan(self, parameters): """Scan the subnet for connected neighbours. :return: user-friendly scan results (as defined by the `user_friendly_scan_results()` function). """ # Circular imports. from maasserver.api.discoveries import ( scan_all_rack_networks, user_friendly_scan_results, ) subnet = self.get_object(parameters) assert self.user.has_perm(NodePermission.admin, Discovery), "Permission denied." cidr = subnet.get_ipnetwork() if cidr.version != 4: raise ValueError( "Cannot scan subnet: only IPv4 subnets can be scanned.") cidrs = [cidr] if RackController.objects.filter_by_subnet_cidrs(cidrs).count() == 0: raise ValueError("Subnet must be configured on a rack controller.") rpc_results = scan_all_rack_networks(cidrs=[cidr]) maaslog.info( "User '%s' initiated a neighbour discovery scan against subnet: " "%s" % (self.user.username, cidr)) return user_friendly_scan_results(rpc_results)
def test__populates_results_correctly(self): result = user_friendly_scan_results(scan_all_rack_networks()) self.assertThat(result, Equals( { "result": self.result, "scan_started_on": get_controller_summary(self.started), "scan_failed_on": get_controller_summary(self.failed), "scan_attempted_on": get_controller_summary(self.available), "failed_to_connect_to": get_controller_summary(self.unavailable), "rpc_call_timed_out_on": get_controller_summary(self.timed_out), "failures": get_failure_summary(self.failures), } ))
def test__results_can_be_converted_to_json_and_back(self): result = user_friendly_scan_results(scan_all_rack_networks()) json_result = json.dumps(result) self.assertThat(json.loads(json_result), Equals(result))