blob: b4bcbd285fc93ee2f84a9bcd6b019a91495ff6ca [file] [log] [blame]
"""
Network Data Model Test
1) Create a slice1
2) Create instance1 on slice1
3) Verify one quantum network created for instance1
4) Create a private network, network1
5) Connect network1 to slice1
6) Create instance1_2 on slice1
7) Verify two quantum networks created for instance1_2
"""
import os
import json
import sys
import time
sys.path.append("/opt/xos")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
from openstack.manager import OpenStackManager
from core.models import Slice, Instance, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice
from planetstacktest import PlanetStackTest, fail_unless, fail
class NetworkTest(PlanetStackTest):
def __init__(self):
PlanetStackTest.__init__(self)
def wait_for_ports(self, instance, count=1, max_time=120):
print "waiting for %d ports on %s" % (count, str(instance))
while max_time>0:
ports = self.manager.driver.shell.quantum.list_ports(device_id=instance.instance_id)["ports"]
if len(ports)==count:
return ports
fail_unless(len(ports)<=count, "too many ports")
time.sleep(10)
max_time = max_time - 10
fail("timed out while waiting for port creation")
def ports_to_networks(self, ports):
networks = []
for port in ports:
port_networks = networks + self.manager.driver.shell.quantum.list_networks(id=port["network_id"])["networks"]
for network in port_networks:
if not (network in networks):
networks.append(network)
return networks
def ports_to_network_names(self, ports):
network_names = []
for network in self.ports_to_networks(ports):
network_names.append(network["name"])
return network_names
def verify_network_names(self, ports, network_names):
port_network_names = sorted(self.ports_to_network_names(ports))
network_names = sorted(network_names)
fail_unless(port_network_names == network_names, "mismatched network names: %s != %s" % (str(port_network_names), str(network_names)))
print " verified network ports to", ",".join(port_network_names)
def test_slice1(self):
slice1Name = self.make_slice_name()
slice1 = Slice(name = slice1Name,
omf_friendly=True,
site=self.testSite,
creator=self.testUser)
slice1=self.save_and_wait_for_enacted(slice1, nonempty_fields=["tenant_id"])
instance1 = Instance(image = self.testImage,
creator=self.testUser,
slice=slice1,
node=self.testNode,
deploymentNetwork=self.testDeployment)
instance1=self.save_and_wait_for_enacted(instance1, nonempty_fields=["instance_id", "ip"])
# instance1 should have only one port, its private network
ports = self.wait_for_ports(instance1, count=1)
self.verify_network_names(ports, [slice1.name])
network1 = Network(name = slice1Name + "-pvt",
template = self.get_network_template("private"),
owner = slice1)
network1=self.save_and_wait_for_enacted(network1, nonempty_fields=["network_id", "subnet_id", "router_id", "subnet"])
network1_slice1 = NetworkSlice(network=network1, slice=slice1)
network1_slice1.save() # does not need to be enacted
instance1_2 = Instance(image = self.testImage,
creator=self.testUser,
slice=slice1,
node=self.testNode,
deploymentNetwork=self.testDeployment)
instance1_2=self.save_and_wait_for_enacted(instance1_2, nonempty_fields=["instance_id", "ip"])
ports = self.wait_for_ports(instance1_2, count=2)
self.verify_network_names(ports, [slice1.name, network1.name])
self.slice1 = slice1
self.network1 = network1
def test_slice2(self):
slice2Name = self.make_slice_name()
slice2 = Slice(name = slice2Name,
omf_friendly=True,
site=self.testSite,
creator=self.testUser)
slice2=self.save_and_wait_for_enacted(slice2, nonempty_fields=["tenant_id"])
network2 = Network(name = slice2Name + "-pvt",
template = self.get_network_template("private"),
owner = slice2)
network2=self.save_and_wait_for_enacted(network2, nonempty_fields=["network_id", "subnet_id", "router_id", "subnet"])
network2_slice2 = NetworkSlice(network=network2, slice=slice2)
network2_slice2.save() # does not need to be enacted
instance2_1 = Instance(image = self.testImage,
creator=self.testUser,
slice=slice2,
node=self.testNode,
deploymentNetwork=self.testDeployment)
instance2_1=self.save_and_wait_for_enacted(instance2_1, nonempty_fields=["instance_id", "ip"])
ports = self.wait_for_ports(instance2_1, count=2)
self.verify_network_names(ports, [slice2.name, network2.name])
self.slice2 = slice2
self.network2 = network2
def test_shared_private_net(self):
# connect network2 to slice1
self.network2.permittedSlices.add(self.slice1)
network2_slice1 = NetworkSlice(network=self.network2, slice=self.slice1)
network2_slice1.save()
instance1_3 = Instance(image = self.testImage,
creator=self.testUser,
slice=self.slice1,
node=self.testNode,
deploymentNetwork=self.testDeployment)
instance1_3=self.save_and_wait_for_enacted(instance1_3, nonempty_fields=["instance_id", "ip"])
ports = self.wait_for_ports(instance1_3, count=3)
self.verify_network_names(ports, [self.slice1.name, self.network1.name, self.network2.name])
def test_nat_net(self):
slice3Name = self.make_slice_name()
slice3 = Slice(name = slice3Name,
omf_friendly=True,
site=self.testSite,
creator=self.testUser)
slice3=self.save_and_wait_for_enacted(slice3, nonempty_fields=["tenant_id"])
network3 = Network(name = slice3Name + "-nat",
template = self.get_network_template("private-nat"),
owner = slice3)
# note that router_id will not be filled in for nat-net, since nat-net has no routers
network3=self.save_and_wait_for_enacted(network3, nonempty_fields=["network_id", "subnet_id", "subnet"])
network3_slice3 = NetworkSlice(network=network3, slice=slice3)
network3_slice3.save() # does not need to be enacted
instance3_1 = Instance(image = self.testImage,
creator=self.testUser,
slice=slice3,
node=self.testNode,
deploymentNetwork=self.testDeployment)
instance3_1=self.save_and_wait_for_enacted(instance3_1, nonempty_fields=["instance_id", "ip"])
ports = self.wait_for_ports(instance3_1, count=2)
self.verify_network_names(ports, [slice3.name, "nat-net"])
def run(self):
self.setup()
try:
self.test_slice1()
self.test_slice2()
self.test_shared_private_net()
self.test_nat_net()
print "SUCCESS"
finally:
self.cleanup()
def main():
NetworkTest().run()
if __name__=="__main__":
main()