419
431
def test_PUT_omitted_hostname(self):
420
432
hostname = factory.make_name('hostname')
421
node = factory.make_node(hostname=hostname, owner=self.logged_in_user)
433
arch = make_usable_architecture(self)
434
node = factory.make_node(
435
hostname=hostname, owner=self.logged_in_user, architecture=arch)
422
436
response = self.client_put(
423
437
self.get_node_uri(node),
424
{'architecture': factory.getRandomChoice(ARCHITECTURE_CHOICES)})
438
{'architecture': arch})
425
439
self.assertEqual(httplib.OK, response.status_code, response.content)
426
440
self.assertTrue(Node.objects.filter(hostname=hostname).exists())
428
442
def test_PUT_ignores_unknown_fields(self):
429
443
node = factory.make_node(
430
444
owner=self.logged_in_user,
431
after_commissioning_action=(
432
NODE_AFTER_COMMISSIONING_ACTION.DEFAULT))
445
architecture=make_usable_architecture(self))
433
446
field = factory.getRandomString()
434
447
response = self.client_put(
435
448
self.get_node_uri(node),
861
887
url = reverse('node_handler', args=['does-not-exist'])
862
888
response = self.client.get(url, {'op': 'details'})
863
889
self.assertEqual(httplib.NOT_FOUND, response.status_code)
866
class TestListConnectedNetworks(APITestCase):
867
"""Tests for /api/1.0/nodes/<node>/?op=list_connected_networks."""
869
def test_returns_connected_networks(self):
870
networks = [factory.make_network() for i in range(5)]
871
connected_networks = networks[:3]
872
node = factory.make_node(networks=connected_networks)
873
url = reverse('node_handler', args=[node.system_id])
875
response = self.client.get(url, {'op': 'list_connected_networks'})
877
self.assertEqual(httplib.OK, response.status_code)
878
connected_networks_names = [
879
network.name for network in connected_networks]
880
self.assertItemsEqual(
881
connected_networks_names,
882
[network['name'] for network in json.loads(response.content)])
885
class TestConnectNetworks(APITestCase):
886
"""Tests for /api/1.0/nodes/<node>/?op=connect_networks."""
888
def test_connect_networks_connects_networks(self):
890
networks = [factory.make_network() for i in range(3)]
891
node = factory.make_node()
893
response = self.client.post(
894
reverse('node_handler', args=[node.system_id]),
896
'op': 'connect_networks',
897
'networks': [network.name for network in networks],
900
self.assertEqual(httplib.OK, response.status_code)
901
self.assertItemsEqual(networks, node.networks.all())
903
def test_connect_networks_ignores_already_connected_networks(self):
905
networks = [factory.make_network() for i in range(3)]
906
node = factory.make_node(networks=networks)
908
response = self.client.post(
909
reverse('node_handler', args=[node.system_id]),
911
'op': 'connect_networks',
912
'networks': [network.name for network in networks],
915
self.assertEqual(httplib.OK, response.status_code)
916
self.assertItemsEqual(networks, node.networks.all())
918
def test_connect_networks_fails_for_unknown_networks(self):
920
unknown_network_name = factory.make_name('agent-name')
921
node = factory.make_node()
923
response = self.client.post(
924
reverse('node_handler', args=[node.system_id]),
926
'op': 'connect_networks',
927
'networks': [unknown_network_name],
934
'Unknown network(s): %s.' % unknown_network_name]},
936
(response.status_code, json.loads(response.content)))
938
def test_connect_networks_requires_admin(self):
939
node = factory.make_node()
940
response = self.client.post(
941
reverse('node_handler', args=[node.system_id]),
943
'op': 'connect_networks',
946
self.assertEqual(httplib.FORBIDDEN, response.status_code)
949
class TestDisconnectNetworks(APITestCase):
950
"""Tests for /api/1.0/nodes/<node>/?op=disconnect_networks."""
952
def test_disconnect_networks_disconnects_networks(self):
954
networks = [factory.make_network() for i in range(3)]
955
other_networks = [factory.make_network() for i in range(3)]
956
node = factory.make_node(networks=(networks + other_networks))
958
response = self.client.post(
959
reverse('node_handler', args=[node.system_id]),
961
'op': 'disconnect_networks',
962
'networks': [network.name for network in networks],
965
self.assertEqual(httplib.OK, response.status_code)
966
self.assertItemsEqual(other_networks, node.networks.all())
968
def test_disconnect_networks_ignores_already_disconnected_networks(self):
970
networks = [factory.make_network() for i in range(3)]
971
other_networks = [factory.make_network() for i in range(3)]
972
node = factory.make_node(networks=networks)
974
response = self.client.post(
975
reverse('node_handler', args=[node.system_id]),
977
'op': 'disconnect_networks',
978
'networks': [network.name for network in other_networks],
981
self.assertEqual(httplib.OK, response.status_code)
982
self.assertItemsEqual(networks, node.networks.all())
984
def test_disconnect_networks_requires_admin(self):
985
node = factory.make_node()
986
response = self.client.post(
987
reverse('node_handler', args=[node.system_id]),
989
'op': 'disconnect_networks',
992
self.assertEqual(httplib.FORBIDDEN, response.status_code)