def test_ensure_master_returns_oldest_nodegroup(self): first_nodegroup = NodeGroup.objects.new( factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) NodeGroup.objects.new( factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) self.assertEqual(first_nodegroup, NodeGroup.objects.ensure_master())
def test_ensure_master_returns_oldest_nodegroup(self): first_nodegroup = NodeGroup.objects.new(factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) NodeGroup.objects.new(factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) self.assertEqual(first_nodegroup, NodeGroup.objects.ensure_master())
def test_update_leases_adds_new_ip_to_mac(self): nodegroup = factory.make_node_group() mac = factory.getRandomMACAddress() ip1 = factory.getRandomIPAddress() ip2 = factory.getRandomIPAddress() factory.make_dhcp_lease(nodegroup=nodegroup, mac=mac, ip=ip1) DHCPLease.objects.update_leases(nodegroup, {ip1: mac, ip2: mac}) self.assertEqual({ip1: mac, ip2: mac}, map_leases(nodegroup))
def test_update_leases_deletes_only_obsolete_ips(self): nodegroup = factory.make_node_group() mac = factory.getRandomMACAddress() obsolete_ip = factory.getRandomIPAddress() current_ip = factory.getRandomIPAddress() factory.make_dhcp_lease(nodegroup=nodegroup, mac=mac, ip=obsolete_ip) factory.make_dhcp_lease(nodegroup=nodegroup, mac=mac, ip=current_ip) DHCPLease.objects.update_leases(nodegroup, {current_ip: mac}) self.assertEqual({current_ip: mac}, map_leases(nodegroup))
def test_new_stores_dhcp_key_on_nodegroup(self): key = generate_omapi_key() nodegroup = NodeGroup.objects.new( factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress(), dhcp_key=key) self.assertEqual(key, nodegroup.dhcp_key)
def test_new_requires_all_dhcp_settings_or_none(self): name = factory.make_name('nodegroup') uuid = factory.make_name('uuid') ip = factory.getRandomIPAddress() self.assertRaises( AssertionError, NodeGroup.objects.new, name, uuid, ip, subnet_mask='255.0.0.0')
def test_update_leases_replaces_reassigned_ip(self): nodegroup = factory.make_node_group() ip = factory.getRandomIPAddress() factory.make_dhcp_lease(nodegroup=nodegroup, ip=ip) new_mac = factory.getRandomMACAddress() DHCPLease.objects.update_leases(nodegroup, {ip: new_mac}) self.assertEqual({ip: new_mac}, map_leases(nodegroup))
def test_new_stores_dhcp_key_on_nodegroup(self): key = generate_omapi_key() nodegroup = NodeGroup.objects.new(factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress(), dhcp_key=key) self.assertEqual(key, nodegroup.dhcp_key)
def test_update_leases_combines_additions_deletions_and_replacements(self): nodegroup = factory.make_node_group() mac1 = factory.getRandomMACAddress() mac2 = factory.getRandomMACAddress() obsolete_lease = factory.make_dhcp_lease( nodegroup=nodegroup, mac=mac1) # The obsolete lease won't be in the update, so it'll disappear. ignore_unused(obsolete_lease) unchanged_lease = factory.make_dhcp_lease( nodegroup=nodegroup, mac=mac1) reassigned_lease = factory.make_dhcp_lease( nodegroup=nodegroup, mac=mac1) new_ip = factory.getRandomIPAddress() DHCPLease.objects.update_leases(nodegroup, { reassigned_lease.ip: mac2, unchanged_lease.ip: mac1, new_ip: mac1, }) self.assertEqual( { reassigned_lease.ip: mac2, unchanged_lease.ip: mac1, new_ip: mac1, }, map_leases(nodegroup))
def test_new_assigns_token_and_key_for_worker_user(self): nodegroup = NodeGroup.objects.new( factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) self.assertIsNotNone(nodegroup.api_token) self.assertIsNotNone(nodegroup.api_key) self.assertEqual(get_worker_user(), nodegroup.api_token.user) self.assertEqual(nodegroup.api_key, nodegroup.api_token.key)
def test_new_assigns_token_and_key_for_worker_user(self): nodegroup = NodeGroup.objects.new(factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) self.assertIsNotNone(nodegroup.api_token) self.assertIsNotNone(nodegroup.api_key) self.assertEqual(get_worker_user(), nodegroup.api_token.user) self.assertEqual(nodegroup.api_key, nodegroup.api_token.key)
def test_new_creates_nodegroup_with_interface(self): name = factory.make_name('nodegroup') uuid = factory.getRandomUUID() ip = factory.getRandomIPAddress() nodegroup = NodeGroup.objects.new(name, uuid, ip) interface = get_one(nodegroup.nodegroupinterface_set.all()) self.assertEqual((name, uuid, ip), (nodegroup.name, nodegroup.uuid, interface.ip))
def test_get_maas_facing_server_address_resolves_hostname(self): ip = factory.getRandomIPAddress() resolver = FakeMethod(result=ip) self.patch(server_address, 'gethostbyname', resolver) hostname = self.make_hostname() self.set_DEFAULT_MAAS_URL(hostname=hostname) self.assertEqual( (ip, [(hostname, )]), (get_maas_facing_server_address(), resolver.extract_args()))
def test_new_creates_nodegroup_with_interface(self): name = factory.make_name('nodegroup') uuid = factory.getRandomUUID() ip = factory.getRandomIPAddress() nodegroup = NodeGroup.objects.new(name, uuid, ip) interface = get_one(nodegroup.nodegroupinterface_set.all()) self.assertEqual( (name, uuid, ip), (nodegroup.name, nodegroup.uuid, interface.ip))
def test_get_dns_server_address_resolves_hostname(self): ip = factory.getRandomIPAddress() resolver = FakeMethod(result=ip) self.patch(server_address, 'gethostbyname', resolver) hostname = factory.make_hostname() self.patch_DEFAULT_MAAS_URL_with_random_values(hostname=hostname) self.assertEqual( (ip, [(hostname, )]), (dns.get_dns_server_address(), resolver.extract_args()))
def test_get_maas_facing_server_address_resolves_hostname(self): ip = factory.getRandomIPAddress() resolver = FakeMethod(result=ip) self.patch(server_address, 'gethostbyname', resolver) hostname = self.make_hostname() self.set_DEFAULT_MAAS_URL(hostname=hostname) self.assertEqual( (ip, [(hostname, )]), (get_maas_facing_server_address(), resolver.extract_args()))
def test_new_requires_all_dhcp_settings_or_none(self): name = factory.make_name('nodegroup') uuid = factory.make_name('uuid') ip = factory.getRandomIPAddress() self.assertRaises(AssertionError, NodeGroup.objects.new, name, uuid, ip, subnet_mask='255.0.0.0')
def test_get_dns_server_address_uses_nodegroup_maas_url(self): ip = factory.getRandomIPAddress() resolver = FakeMethod(result=ip) self.patch(server_address, 'gethostbyname', resolver) hostname = factory.make_hostname() maas_url = 'http://%s' % hostname nodegroup = factory.make_node_group(maas_url=maas_url) self.assertEqual( (ip, [(hostname, )]), (dns.get_dns_server_address(nodegroup), resolver.extract_args()))
def test_write_full_dns_passes_upstream_dns_parameter(self): self.patch(settings, 'DNS_CONNECT', True) self.create_managed_nodegroup() random_ip = factory.getRandomIPAddress() Config.objects.set_config("upstream_dns", random_ip) patched_task = self.patch(dns.tasks.write_full_dns_config, "delay") dns.write_full_dns_config() patched_task.assert_called_once_with(zones=ANY, callback=ANY, upstream_dns=random_ip)
def test_update_does_not_work_for_normal_user(self): nodegroup = NodeGroup.objects.ensure_master() interface = factory.make_node_group_interface( nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP) log_in_as_normal_user(self.client) response = self.client_put( reverse('nodegroupinterface_handler', args=[nodegroup.uuid, interface.interface]), {'ip_range_high': factory.getRandomIPAddress()}) self.assertEqual(httplib.FORBIDDEN, response.status_code, response.content)
def test_init(self): nodegroup = factory.make_node_group() ip = factory.getRandomIPAddress() mac = factory.getRandomMACAddress() lease = DHCPLease(nodegroup=nodegroup, ip=ip, mac=mac) lease.save() self.assertItemsEqual([lease], get_leases(nodegroup)) self.assertEqual(nodegroup, lease.nodegroup) self.assertEqual(ip, lease.ip) self.assertEqual(mac, lease.mac)
def test_update_does_not_work_for_normal_user(self): nodegroup = NodeGroup.objects.ensure_master() interface = factory.make_node_group_interface( nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP) log_in_as_normal_user(self.client) response = self.client_put( reverse( 'nodegroupinterface_handler', args=[nodegroup.uuid, interface.interface]), {'ip_range_high': factory.getRandomIPAddress()}) self.assertEqual( httplib.FORBIDDEN, response.status_code, response.content)
def test_update_foreign_dhcp_ip_sets_value(self): self.become_admin() nodegroup = factory.make_node_group() interface = nodegroup.get_managed_interface() ip = factory.getRandomIPAddress() response = self.client_put( reverse('nodegroupinterface_handler', args=[nodegroup.uuid, interface.interface]), { 'foreign_dhcp_ip': ip, }) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(ip, reload_object(interface).foreign_dhcp_ip)
def test_dns_config_has_NS_record(self): ip = factory.getRandomIPAddress() self.patch(settings, 'DEFAULT_MAAS_URL', 'http://%s/' % ip) nodegroup, node, lease = self.create_nodegroup_with_lease() self.patch(settings, 'DNS_CONNECT', True) dns.write_full_dns_config() # Get the NS record for the zone 'nodegroup.name'. ns_record = dig_call(port=self.bind.config.port, commands=[nodegroup.name, 'NS', '+short']) # Resolve that hostname. ip_of_ns_record = dig_call(port=self.bind.config.port, commands=[ns_record, '+short']) self.assertEqual(ip, ip_of_ns_record)
def test_update_foreign_dhcp_ip_sets_value(self): self.become_admin() nodegroup = factory.make_node_group() interface = nodegroup.get_managed_interface() ip = factory.getRandomIPAddress() response = self.client_put( reverse( 'nodegroupinterface_handler', args=[nodegroup.uuid, interface.interface]), { 'foreign_dhcp_ip': ip, }) self.assertEqual(httplib.OK, response.status_code) self.assertEqual(ip, reload_object(interface).foreign_dhcp_ip)
def test_dhcp_config_uses_dns_server_from_cluster_controller(self): mocked_task = self.patch(dhcp, 'write_dhcp_config') ip = factory.getRandomIPAddress() maas_url = 'http://%s/' % ip nodegroup = factory.make_node_group( maas_url=maas_url, status=NODEGROUP_STATUS.ACCEPTED, dhcp_key=factory.getRandomString(), interface=factory.make_name('eth'), network=IPNetwork("192.168.102.0/22")) self.patch(settings, "DHCP_CONNECT", True) configure_dhcp(nodegroup) kwargs = mocked_task.apply_async.call_args[1]['kwargs'] self.assertEqual(ip, kwargs['dns_servers'])
def test_dhcp_config_uses_dns_server_from_cluster_controller(self): mocked_task = self.patch(dhcp, 'write_dhcp_config') ip = factory.getRandomIPAddress() maas_url = 'http://%s/' % ip nodegroup = factory.make_node_group( maas_url=maas_url, status=NODEGROUP_STATUS.ACCEPTED, dhcp_key=factory.getRandomString(), interface=factory.make_name('eth'), network=IPNetwork("192.168.102.0/22")) self.patch(settings, "DHCP_CONNECT", True) configure_dhcp(nodegroup) kwargs = mocked_task.apply_async.call_args[1]['kwargs'] self.assertEqual(ip, kwargs['dns_servers'])
def test_dhcp_config_gets_written_when_ntp_server_changes(self): # When the "ntp_server" Config item is changed, check that all # nodegroups get their DHCP config re-written. num_active_nodegroups = random.randint(1, 10) num_inactive_nodegroups = random.randint(1, 10) for x in range(num_active_nodegroups): factory.make_node_group(status=NODEGROUP_STATUS.ACCEPTED) for x in range(num_inactive_nodegroups): factory.make_node_group(status=NODEGROUP_STATUS.PENDING) self.patch(settings, "DHCP_CONNECT", True) self.patch(dhcp, 'write_dhcp_config') Config.objects.set_config("ntp_server", factory.getRandomIPAddress()) self.assertEqual(num_active_nodegroups, dhcp.write_dhcp_config.apply_async.call_count)
def test_dhcp_config_gets_written_when_ntp_server_changes(self): # When the "ntp_server" Config item is changed, check that all # nodegroups get their DHCP config re-written. num_active_nodegroups = random.randint(1, 10) num_inactive_nodegroups = random.randint(1, 10) for x in range(num_active_nodegroups): factory.make_node_group(status=NODEGROUP_STATUS.ACCEPTED) for x in range(num_inactive_nodegroups): factory.make_node_group(status=NODEGROUP_STATUS.PENDING) self.patch(settings, "DHCP_CONNECT", True) self.patch(dhcp, 'write_dhcp_config') Config.objects.set_config("ntp_server", factory.getRandomIPAddress()) self.assertEqual( num_active_nodegroups, dhcp.write_dhcp_config.apply_async.call_count)
def test_configure_dhcp_writes_dhcp_config(self): mocked_task = self.patch(dhcp, 'write_dhcp_config') self.patch( settings, 'DEFAULT_MAAS_URL', 'http://%s/' % factory.getRandomIPAddress()) nodegroup = factory.make_node_group( status=NODEGROUP_STATUS.ACCEPTED, dhcp_key=factory.getRandomString(), interface=factory.make_name('eth'), network=IPNetwork("192.168.102.0/22")) self.patch(settings, "DHCP_CONNECT", True) configure_dhcp(nodegroup) dhcp_params = [ 'subnet_mask', 'broadcast_ip', 'router_ip', 'ip_range_low', 'ip_range_high', ] interface = nodegroup.get_managed_interface() expected_params = { param: getattr(interface, param) for param in dhcp_params} expected_params["omapi_key"] = nodegroup.dhcp_key expected_params["dns_servers"] = get_dns_server_address() expected_params["ntp_server"] = get_default_config()['ntp_server'] expected_params["domain_name"] = nodegroup.name expected_params["subnet"] = '192.168.100.0' expected_params["dhcp_interfaces"] = interface.interface args, kwargs = mocked_task.apply_async.call_args result_params = kwargs['kwargs'] # The check that the callback is correct is done in # test_configure_dhcp_restart_dhcp_server. del result_params['callback'] self.assertEqual(expected_params, result_params)
def test_configure_dhcp_writes_dhcp_config(self): mocked_task = self.patch(dhcp, 'write_dhcp_config') self.patch(settings, 'DEFAULT_MAAS_URL', 'http://%s/' % factory.getRandomIPAddress()) nodegroup = factory.make_node_group( status=NODEGROUP_STATUS.ACCEPTED, dhcp_key=factory.getRandomString(), interface=factory.make_name('eth'), network=IPNetwork("192.168.102.0/22")) self.patch(settings, "DHCP_CONNECT", True) configure_dhcp(nodegroup) dhcp_params = [ 'subnet_mask', 'broadcast_ip', 'router_ip', 'ip_range_low', 'ip_range_high', ] interface = nodegroup.get_managed_interface() expected_params = { param: getattr(interface, param) for param in dhcp_params } expected_params["omapi_key"] = nodegroup.dhcp_key expected_params["dns_servers"] = get_dns_server_address() expected_params["ntp_server"] = get_default_config()['ntp_server'] expected_params["domain_name"] = nodegroup.name expected_params["subnet"] = '192.168.100.0' expected_params["dhcp_interfaces"] = interface.interface args, kwargs = mocked_task.apply_async.call_args result_params = kwargs['kwargs'] # The check that the callback is correct is done in # test_configure_dhcp_restart_dhcp_server. del result_params['callback'] self.assertEqual(expected_params, result_params)
def test_find_nodegroup_returns_None_if_not_found(self): self.assertIsNone( find_nodegroup(get_request(factory.getRandomIPAddress())))
def test_new_creates_nodegroup_with_empty_dhcp_key(self): nodegroup = NodeGroup.objects.new( factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) self.assertEqual('', nodegroup.dhcp_key)
def test_get_maas_facing_server_host_returns_ip_if_ip_configured(self): ip = factory.getRandomIPAddress() self.set_DEFAULT_MAAS_URL(ip) self.assertEqual(ip, server_address.get_maas_facing_server_host())
def test_find_nodegroup_returns_None_if_not_found(self): self.assertIsNone( find_nodegroup(get_request(factory.getRandomIPAddress())))
def test_get_maas_facing_server_address_returns_IP(self): ip = factory.getRandomIPAddress() self.set_DEFAULT_MAAS_URL(hostname=ip) self.assertEqual(ip, get_maas_facing_server_address())
def get_default_params(self): return { "local": factory.getRandomIPAddress(), "remote": factory.getRandomIPAddress(), }
def test_new_creates_nodegroup_with_empty_dhcp_key(self): nodegroup = NodeGroup.objects.new(factory.make_name('nodegroup'), factory.make_name('uuid'), factory.getRandomIPAddress()) self.assertEqual('', nodegroup.dhcp_key)
def get_default_params(self): return { "local": factory.getRandomIPAddress(), "remote": factory.getRandomIPAddress(), }
def test_get_maas_facing_server_host_returns_ip_if_ip_configured(self): ip = factory.getRandomIPAddress() self.set_DEFAULT_MAAS_URL(ip) self.assertEqual(ip, server_address.get_maas_facing_server_host())
def test_get_maas_facing_server_address_returns_IP(self): ip = factory.getRandomIPAddress() self.set_DEFAULT_MAAS_URL(hostname=ip) self.assertEqual(ip, get_maas_facing_server_address())