self.eline_subnets_src = generate_subnet_strings(50, start=200, subnet_size=24, ip=1)
self.eline_subnets_dst = generate_subnet_strings(50, start=200, subnet_size=24, ip=2)
+
def onboard(self):
"""
Do all steps to prepare this service to be instantiated
else:
self._load_docker_urls()
self._pull_predefined_dockerimages()
- LOG.info("On-boarded service: %r" % self.manifest.get("package_name"))
+ LOG.info("On-boarded service: %r" % self.manifest.get("name"))
def start_service(self):
"""
vlinks = self.nsd["virtual_links"]
fwd_links = self.nsd["forwarding_graphs"][0]["constituent_virtual_links"]
eline_fwd_links = [l for l in vlinks if (l["id"] in fwd_links) and (l["connectivity_type"] == "E-Line")]
+ elan_fwd_links = [l for l in vlinks if (l["id"] in fwd_links) and (l["connectivity_type"] == "E-LAN")]
- cookie = 1 # not clear why this is needed - to check with Steven
+ # 3a. deploy E-Line links
+ # cookie is used as identifier for the flowrules installed by the dummygatekeeper
+ # eg. different services get a unique cookie for their flowrules
+ cookie = 1
for link in eline_fwd_links:
src_id, src_if_name = link["connection_points_reference"][0].split(":")
dst_id, dst_if_name = link["connection_points_reference"][1].split(":")
ret = network.setChain(
src_docker_name, dst_docker_name,
vnf_src_interface=src_if_name, vnf_dst_interface=dst_if_name,
- bidirectional=True, cmd="add-flow", cookie=cookie)
- cookie += 1
+ bidirectional=True, cmd="add-flow", cookie=cookie, priority=10)
# re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-Link
src_vnfi = self._get_vnf_instance(instance_uuid, src_name)
if dst_vnfi is not None:
self._vnf_reconfigure_network(dst_vnfi, dst_if_name, self.eline_subnets_dst.pop(0))
+ # 3b. deploy E-LAN links
+ base = 10
+ for link in elan_fwd_links:
+ # generate lan ip address
+ ip = 1
+ for intf in link["connection_points_reference"]:
+ ip_address = generate_lan_string("10.0", base, subnet_size=24, ip=ip)
+ vnf_id, intf_name = intf.split(":")
+ vnf_name = vnf_id2vnf_name[vnf_id]
+ LOG.debug(
+ "Setting up E-LAN link. %s(%s:%s) -> %s" % (
+ vnf_name, vnf_id, intf_name, ip_address))
+
+ if vnf_name in self.vnfds:
+ # re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-LAN
+ # E-LAN relies on the learning switch capability of the infrastructure switch in dockernet,
+ # so no explicit chaining is necessary
+ vnfi = self._get_vnf_instance(instance_uuid, vnf_name)
+ if vnfi is not None:
+ self._vnf_reconfigure_network(vnfi, intf_name, ip_address)
+ # increase for the next ip address on this E-LAN
+ ip += 1
+ # increase the base ip address for the next E-LAN
+ base += 1
+
+
+
# 4. run the emulator specific entrypoint scripts in the VNFIs of this service instance
self._trigger_emulator_start_scripts_in_vnfis(self.instances[instance_uuid]["vnf_instances"])
# 3. do the dc.startCompute(name="foobar") call to run the container
# TODO consider flavors, and other annotations
intfs = vnfd.get("connection_points")
- self.vnf_name2docker_name[vnf_name] = GK.get_next_vnf_name()
+
+ # use the vnf_id in the nsd as docker name
+ # so deployed containers can be easily mapped back to the nsd
+ vnf_name2id = defaultdict(lambda: "NotExistingNode",
+ reduce(lambda x, y: dict(x, **y),
+ map(lambda d: {d["vnf_name"]: d["vnf_id"]},
+ self.nsd["network_functions"])))
+ self.vnf_name2docker_name[vnf_name] = vnf_name2id[vnf_name]
+ # self.vnf_name2docker_name[vnf_name] = GK.get_next_vnf_name()
+
LOG.info("Starting %r as %r in DC %r" % (vnf_name, self.vnf_name2docker_name[vnf_name], vnfd.get("dc")))
LOG.debug("Interfaces for %r: %r" % (vnf_name, intfs))
vnfi = target_dc.startCompute(self.vnf_name2docker_name[vnf_name], network=intfs, image=docker_name, flavor_name="small")
Return a list of UUID's of uploaded service packages.
:return: dict/list
"""
+ LOG.info("GET /packages")
return {"service_uuid_list": list(GK.services.iterkeys())}
Returns a list of UUIDs containing all running services.
:return: dict / list
"""
- return {"service_instance_list": [
+ LOG.info("GET /instantiations")
+ return {"service_instantiations_list": [
list(s.instances.iterkeys()) for s in GK.services.itervalues()]}
return path
+def generate_lan_string(prefix, base, subnet_size=24, ip=0):
+ """
+ Helper to generate different network configuration strings.
+ """
+ r = "%s.%d.%d/%d" % (prefix, base, ip, subnet_size)
+ return r
+
+
def generate_subnet_strings(n, start=1, subnet_size=24, ip=0):
"""
Helper to generate different network configuration strings.