def setUp(self): self.auth_backend = get_auth_backend() self.runway = model.Project.query.filter_by(label="runway").one() self.manhattan = model.Project.query.filter_by(label="manhattan").one() self.auth_backend.set_project(self.manhattan) api.node_connect_network("manhattan_node_0", "boot-nic", "stock_int_pub") deferred.apply_networking()
def delete_networks(): # Query the DB for nodes on this project project = api._must_find(model.Project, 'anvil-nextgen') nodes = project.nodes ports = self.get_all_ports(nodes) # Remove all nodes from their networks. We first build up a list of # the arguments to the API calls, which has no direct references to # database objects, and then make the API calls and invoke # deferred.apply_networking after. This is important -- # The API calls and apply_networking normally run in their own # transaction. We get away with not doing this in the tests because # we serialize everything ourselves, so there's no risk of # interference. If we were to hang on to references to database # objects across such calls however, things could get harry. all_attachments = [] for node in nodes: attachments = model.NetworkAttachment.query \ .filter_by(nic=node.nics[0]).all() for attachment in attachments: all_attachments.append((node.label, node.nics[0].label, attachment.network.label)) for attachment in all_attachments: api.node_detach_network(*attachment) deferred.apply_networking() # Assert that none of the nodes are on any network port_networks = self.get_port_networks(ports) for node in nodes: assert self.get_network(node.nics[0].port, port_networks) == \ set() # Delete the networks api.network_delete('net-0') api.network_delete('net-1')
def delete_networks(): # Query the DB for nodes on this project project = api._must_find(model.Project, 'anvil-nextgen') nodes = project.nodes ports = self.get_all_ports(nodes) # Remove all nodes from their networks. We do this in two different # ways for different ports to test the different mechanisms. For # the first two nodes we explicity remove the attachments. For the # latter two we call port_revert. for node in nodes[:2]: attachment = model.NetworkAttachment.query \ .filter_by(nic=node.nics[0]).one() api.node_detach_network(node.label, node.nics[0].label, attachment.network.label) for node in nodes[2:]: port = node.nics[0].port api.port_revert(port.owner.label, port.label) deferred.apply_networking() # Assert that none of the nodes are on any network port_networks = self.get_port_networks(ports) for node in nodes: assert self.get_network(node.nics[0].port, port_networks) == \ set() # Delete the networks api.network_delete('net-0') api.network_delete('net-1')
def setUp(self): self.auth_backend = get_auth_backend() self.runway = model.Project.query.filter_by(label='runway').one() self.manhattan = model.Project.query.filter_by(label='manhattan').one() self.auth_backend.set_project(self.manhattan) api.node_connect_network('manhattan_node_0', 'boot-nic', 'stock_int_pub') deferred.apply_networking()
def delete_networks(): # Query the DB for nodes on this project project = api._must_find(model.Project, 'anvil-nextgen') nodes = project.nodes ports = self.get_all_ports(nodes) # Remove all nodes from their networks. We first build up a list of # the arguments to the API calls, which has no direct references to # database objects, and then make the API calls and invoke # deferred.apply_networking after. This is important -- # The API calls and apply_networking normally run in their own # transaction. We get away with not doing this in the tests because # we serialize everything ourselves, so there's no risk of # interference. If we were to hang on to references to database # objects across such calls however, things could get harry. all_attachments = [] for node in nodes: attachments = model.NetworkAttachment.query \ .filter_by(nic=node.nics[0]).all() for attachment in attachments: all_attachments.append((node.label, node.nics[0].label, attachment.network.label)) for attachment in all_attachments: api.node_detach_network(*attachment) deferred.apply_networking() # Assert that none of the nodes are on any network port_networks = self.get_port_networks(ports) for node in nodes: assert self.get_network(node.nics[0].port, port_networks) == set() # Delete the networks api.network_delete('net-0') api.network_delete('net-1')
def test_saving_config_file(self): api.project_create('anvil-nextgen') nodes = self.collect_nodes() # Create two networks network_create_simple('net-0', 'anvil-nextgen') network_create_simple('net-1', 'anvil-nextgen') # save the old startup config before performing a networking action old_startup_config = self.get_config('startup') # Connect n0 and n1 to net-0 and net-1 respectively api.node_connect_network(nodes[0].label, nodes[0].nics[0].label, 'net-0') api.node_connect_network(nodes[1].label, nodes[1].nics[0].label, 'net-1') deferred.apply_networking() # get the running config, and the new startup config running_config = self.get_config('running') new_startup_config = self.get_config('startup') assert new_startup_config == running_config assert new_startup_config != old_startup_config # cleanup api.node_detach_network(nodes[0].label, nodes[0].nics[0].label, 'net-0') api.node_detach_network(nodes[1].label, nodes[1].nics[0].label, 'net-1') deferred.apply_networking()
def create_networks(): # Add up to 4 available nodes with nics to the project free_nodes = db.query(model.Node).filter_by(project_id=None).all() nodes = [] for node in free_nodes: if len(node.nics) > 0: api.project_connect_node('anvil-nextgen', node.label) nodes.append(node) if len(nodes) >= 4: break # If there are not enough nodes with nics, raise an exception if len(nodes) < 4: raise api.AllocationError(('At least 4 nodes with at least ' + '1 NIC are required for this test. Only %d node(s) were ' + 'provided.') % len(nodes)) # Create two networks network_create_simple('net-0', 'anvil-nextgen') network_create_simple('net-1', 'anvil-nextgen') # Convert each node to a dict for ease of access nodes = [{'label': n.label, 'nic': n.nics[0].label, 'port': n.nics[0].port.label} for n in nodes] # Assert that n0 and n1 are not on any network vlan_cfgs = get_switch_vlans() assert get_network(nodes[0]['port'], vlan_cfgs) == [] assert get_network(nodes[1]['port'], vlan_cfgs) == [] # Connect n0 and n1 to net-0 and net-1 respectively api.node_connect_network(nodes[0]['label'], nodes[0]['nic'], 'net-0') api.node_connect_network(nodes[1]['label'], nodes[1]['nic'], 'net-1') deferred.apply_networking() # Assert that n0 and n1 are on isolated networks vlan_cfgs = get_switch_vlans() assert get_network(nodes[0]['port'], vlan_cfgs) == [nodes[0]['port']] assert get_network(nodes[1]['port'], vlan_cfgs) == [nodes[1]['port']] # Add n2 and n3 to the same networks as n0 and n1 respectively api.node_connect_network(nodes[2]['label'], nodes[2]['nic'], 'net-0') api.node_connect_network(nodes[3]['label'], nodes[3]['nic'], 'net-1') deferred.apply_networking() # Assert that n2 and n3 have been added to n0 and n1's networks # respectively vlan_cfgs = get_switch_vlans() assert sorted(get_network(nodes[0]['port'], vlan_cfgs)) == sorted([nodes[0]['port'], nodes[2]['port']]) assert sorted(get_network(nodes[1]['port'], vlan_cfgs)) == sorted([nodes[1]['port'], nodes[3]['port']])
def create_networks(): nodes = self.collect_nodes() # Create two networks network_create_simple('net-0', 'anvil-nextgen') network_create_simple('net-1', 'anvil-nextgen') ports = self.get_all_ports(nodes) # Assert that n0 and n1 are not on any network port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set() assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set() # Connect n0 and n1 to net-0 and net-1 respectively api.node_connect_network(nodes[0].label, nodes[0].nics[0].label, 'net-0') api.node_connect_network(nodes[1].label, nodes[1].nics[0].label, 'net-1') deferred.apply_networking() # Assert that n0 and n1 are on isolated networks port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set([nodes[0].nics[0].port]) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port]) # Add n2 and n3 to the same networks as n0 and n1 respectively api.node_connect_network(nodes[2].label, nodes[2].nics[0].label, 'net-0') api.node_connect_network(nodes[3].label, nodes[3].nics[0].label, 'net-1') deferred.apply_networking() # Assert that n2 and n3 have been added to n0 and n1's networks # respectively port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set([nodes[0].nics[0].port, nodes[2].nics[0].port]) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port, nodes[3].nics[0].port])
def delete_networks(): # Query the DB for nodes on this project project = api._must_find(db, model.Project, 'anvil-nextgen') nodes = project.nodes # Remove all nodes from their networks for node in nodes: if node.nics[0].network is not None: api.node_detach_network(node.label, node.nics[0].label) deferred.apply_networking() # Assert that none of the nodes are on any network vlan_cfgs = get_switch_vlans() for node in nodes: assert get_network(node.nics[0].label, vlan_cfgs) == [] # Delete the networks api.network_delete('net-0') api.network_delete('net-1')
def serve_networks(): """Start the HaaS networking server""" from haas import model, deferred from time import sleep model.init_db() while True: # Empty the journal until it's empty; then delay so we don't tight # loop. while deferred.apply_networking(): pass sleep(2)
def delete_networks(): # Query the DB for nodes on this project project = api._must_find(db, model.Project, "anvil-nextgen") nodes = project.nodes ports = self.get_all_ports(nodes) # Remove all nodes from their networks for node in nodes: attachment = db.query(model.NetworkAttachment).filter_by(nic=node.nics[0]).one() api.node_detach_network(node.label, node.nics[0].label, attachment.network.label) deferred.apply_networking() # Assert that none of the nodes are on any network port_networks = self.get_port_networks(ports) for node in nodes: assert self.get_network(node.nics[0].port, port_networks) == set() # Delete the networks api.network_delete("net-0") api.network_delete("net-1")
def test_one_network(self): api.node_connect_network('runway_node_0', 'nic-with-port', 'runway_pxe', 'vlan/native') deferred.apply_networking() net_id = model.Network.query.filter_by(label='runway_pxe')\ .one().network_id assert self.LOCAL_STATE['stock_switch_0']['runway_node_0_port'] == { 'vlan/native': net_id, } api.port_revert('stock_switch_0', 'runway_node_0_port') deferred.apply_networking() assert self.LOCAL_STATE['stock_switch_0']['runway_node_0_port'] == {},\ "port_revert did not detach the port from the networks!" network = model.Network.query.filter_by(label='runway_pxe').one() assert model.NetworkAttachment.query.filter_by( network_id=network.id, ).first() is None, ( "port_revert did not remove the network attachment object in " "the database!")
def create_networks(): nodes = self.collect_nodes(db) # Create two networks network_create_simple('net-0', 'anvil-nextgen') network_create_simple('net-1', 'anvil-nextgen') ports = self.get_all_ports(nodes) # Assert that n0 and n1 are not on any network port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == set() assert self.get_network(nodes[1].nics[0].port, port_networks) == set() # Get the channel ids for the tagged versions of the networks: net_tag = {} net_tag[0] = get_legal_channels('net-0')[1] net_tag[1] = get_legal_channels('net-1')[1] # Connect node 0 to net-0 (native mode) api.node_connect_network(nodes[0].label, nodes[0].nics[0].label, 'net-0') # Connect node 1 to net-1 (tagged mode) api.node_connect_network(nodes[1].label, nodes[1].nics[0].label, 'net-1', channel=net_tag[1]) deferred.apply_networking() # Assert that n0 and n1 are on isolated networks port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set([nodes[0].nics[0].port]) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port]) # Add n2 and n3 to the same networks as n0 and n1 respectively, but # with different channels (native vs. tagged) api.node_connect_network(nodes[2].label, nodes[2].nics[0].label, 'net-0', channel=net_tag[0]) api.node_connect_network(nodes[3].label, nodes[3].nics[0].label, 'net-1') deferred.apply_networking() # Assert that n2 and n3 have been added to n0 and n1's networks # respectively port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set([nodes[0].nics[0].port, nodes[2].nics[0].port]) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port, nodes[3].nics[0].port]) # Verify that we can put nodes on more than one network, with # different channels: api.node_connect_network(nodes[2].label, nodes[2].nics[0].label, 'net-1') deferred.apply_networking() port_networks = self.get_port_networks(ports) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port, nodes[2].nics[0].port, nodes[3].nics[0].port])
def delete_networks(): # Query the DB for nodes on this project project = api._must_find(model.Project, 'anvil-nextgen') nodes = project.nodes ports = self.get_all_ports(nodes) # Remove all nodes from their networks for node in nodes: attachment = model.NetworkAttachment.query \ .filter_by(nic=node.nics[0]).one() api.node_detach_network(node.label, node.nics[0].label, attachment.network.label) deferred.apply_networking() # Assert that none of the nodes are on any network port_networks = self.get_port_networks(ports) for node in nodes: assert self.get_network(node.nics[0].port, port_networks) == \ set() # Delete the networks api.network_delete('net-0') api.network_delete('net-1')
def serve_networks(): """Start the HaaS networking server""" from haas import model, deferred from time import sleep server.init() server.register_drivers() server.validate_state() model.init_db() migrations.check_db_schema() while True: # Empty the journal until it's empty; then delay so we don't tight # loop. while deferred.apply_networking(): pass sleep(2)
def test_two_networks(self): pxe_net_id = model.Network.query.filter_by(label='runway_pxe')\ .one().network_id pub_net_id = model.Network.query.filter_by(label='stock_int_pub')\ .one().network_id api.node_connect_network('runway_node_0', 'nic-with-port', 'runway_pxe', 'vlan/native') deferred.apply_networking() assert self.LOCAL_STATE['stock_switch_0']['runway_node_0_port'] == { 'vlan/native': pxe_net_id, } api.node_connect_network('runway_node_0', 'nic-with-port', 'stock_int_pub', 'vlan/' + pub_net_id) deferred.apply_networking() assert self.LOCAL_STATE['stock_switch_0']['runway_node_0_port'] == { 'vlan/native': pxe_net_id, 'vlan/' + pub_net_id: pub_net_id, } api.port_revert('stock_switch_0', 'runway_node_0_port') deferred.apply_networking() assert self.LOCAL_STATE['stock_switch_0']['runway_node_0_port'] == {}
def create_networks(): nodes = self.collect_nodes() # Create two networks network_create_simple('net-0', 'anvil-nextgen') network_create_simple('net-1', 'anvil-nextgen') ports = self.get_all_ports(nodes) # Assert that n0 and n1 are not on any network port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set() assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set() # Get the channel ids for the tagged versions of the networks: net_tag = {} net_tag[0] = get_legal_channels('net-0')[1] net_tag[1] = get_legal_channels('net-1')[1] # Connect node 0 to net-0 (native mode) api.node_connect_network(nodes[0].label, nodes[0].nics[0].label, 'net-0') # Connect node 1 to net-1 (tagged mode) api.node_connect_network(nodes[1].label, nodes[1].nics[0].label, 'net-1', channel=net_tag[1]) deferred.apply_networking() # Assert that n0 and n1 are on isolated networks port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set([nodes[0].nics[0].port]) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port]) # Add n2 and n3 to the same networks as n0 and n1 respectively, but # with different channels (native vs. tagged) api.node_connect_network(nodes[2].label, nodes[2].nics[0].label, 'net-0', channel=net_tag[0]) api.node_connect_network(nodes[3].label, nodes[3].nics[0].label, 'net-1') deferred.apply_networking() # Assert that n2 and n3 have been added to n0 and n1's networks # respectively port_networks = self.get_port_networks(ports) assert self.get_network(nodes[0].nics[0].port, port_networks) == \ set([nodes[0].nics[0].port, nodes[2].nics[0].port]) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port, nodes[3].nics[0].port]) # Verify that we can put nodes on more than one network, with # different channels: api.node_connect_network(nodes[2].label, nodes[2].nics[0].label, 'net-1') deferred.apply_networking() port_networks = self.get_port_networks(ports) assert self.get_network(nodes[1].nics[0].port, port_networks) == \ set([nodes[1].nics[0].port, nodes[2].nics[0].port, nodes[3].nics[0].port])
def test_no_nic(self): with pytest.raises(api.NotFoundError): # free_port_0 is not attached to a nic. api.port_revert('stock_switch_0', 'free_port_0') deferred.apply_networking() assert self.LOCAL_STATE['stock_switch_0']['free_port_0'] == {}
def create_networks(): # Add up to 4 available nodes with nics to the project free_nodes = db.query(model.Node).filter_by(project_id=None).all() nodes = [] for node in free_nodes: if len(node.nics) > 0: api.project_connect_node('anvil-nextgen', node.label) nodes.append(node) if len(nodes) >= 4: break # If there are not enough nodes with nics, raise an exception if len(nodes) < 4: raise api.AllocationError( ('At least 4 nodes with at least ' + '1 NIC are required for this test. Only %d node(s) were ' + 'provided.') % len(nodes)) # Create two networks network_create_simple('net-0', 'anvil-nextgen') network_create_simple('net-1', 'anvil-nextgen') # Convert each node to a dict for ease of access nodes = [{ 'label': n.label, 'nic': n.nics[0].label, 'port': n.nics[0].port.label } for n in nodes] # Assert that n0 and n1 are not on any network vlan_cfgs = get_switch_vlans() assert get_network(nodes[0]['port'], vlan_cfgs) == [] assert get_network(nodes[1]['port'], vlan_cfgs) == [] # Connect n0 and n1 to net-0 and net-1 respectively api.node_connect_network(nodes[0]['label'], nodes[0]['nic'], 'net-0') api.node_connect_network(nodes[1]['label'], nodes[1]['nic'], 'net-1') deferred.apply_networking() # Assert that n0 and n1 are on isolated networks vlan_cfgs = get_switch_vlans() assert get_network(nodes[0]['port'], vlan_cfgs) == [nodes[0]['port']] assert get_network(nodes[1]['port'], vlan_cfgs) == [nodes[1]['port']] # Add n2 and n3 to the same networks as n0 and n1 respectively api.node_connect_network(nodes[2]['label'], nodes[2]['nic'], 'net-0') api.node_connect_network(nodes[3]['label'], nodes[3]['nic'], 'net-1') deferred.apply_networking() # Assert that n2 and n3 have been added to n0 and n1's networks # respectively vlan_cfgs = get_switch_vlans() assert sorted(get_network(nodes[0]['port'], vlan_cfgs)) == sorted( [nodes[0]['port'], nodes[2]['port']]) assert sorted(get_network(nodes[1]['port'], vlan_cfgs)) == sorted( [nodes[1]['port'], nodes[3]['port']])