FORCE_PULL = False
# Automatically deploy SAPs (endpoints) of the service as new containers
+# Attention: This is not a configuration switch but a global variable! Don't change its default value.
DEPLOY_SAP = False
+# flag to indicate if we use bidirectional forwarding rules in the automatic chaining process
+BIDIRECTIONAL_CHAIN = False
+
class Gatekeeper(object):
def __init__(self):
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
# 3. compute placement of this service instance (adds DC names to VNFDs)
if not GK_STANDALONE_MODE:
- self._calculate_placement(FirstDcPlacement)
+ #self._calculate_placement(FirstDcPlacement)
+ self._calculate_placement(RoundRobinDcPlacement)
# iterate over all vnfds that we have to start
for vnfd in self.vnfds.itervalues():
vnfi = None
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, priority=10)
+ bidirectional=BIDIRECTIONAL_CHAIN, 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 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
+ # E-LAN relies on the learning switch capability of Ryu which has to be turned on in the topology
+ # (DCNetwork(controller=RemoteController, enable_learning=True)), 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)
# set of the connection_point ids found in the nsd (in the examples this is 'ns')
self.sap_identifiers.add(sap_vnf_id)
- sap_docker_name = sap.replace(':', '_')
+ sap_docker_name = "%s_%s" % (sap_vnf_id, sap_vnf_interface)
# add SAP to self.vnfds
sapfile = pkg_resources.resource_filename(__name__, "sap_vnfd.yml")
vnfd["dc"] = list(dcs.itervalues())[0]
+class RoundRobinDcPlacement(object):
+ """
+ Placement: Distribute VNFs across all available DCs in a round robin fashion.
+ """
+ def place(self, nsd, vnfds, dcs):
+ c = 0
+ dcs_list = list(dcs.itervalues())
+ for name, vnfd in vnfds.iteritems():
+ vnfd["dc"] = dcs_list[c % len(dcs_list)]
+ c += 1 # inc. c to use next DC
+
+
+
+
"""
Resource definitions and API endpoints
"""
s = Service(service_uuid, file_hash, upload_path)
GK.register_service_package(service_uuid, s)
# generate the JSON result
- return {"service_uuid": service_uuid, "size": size, "sha1": file_hash, "error": None}
+ return {"service_uuid": service_uuid, "size": size, "sha1": file_hash, "error": None}, 201
except Exception as ex:
LOG.exception("Service package upload failed:")
return {"service_uuid": None, "size": 0, "sha1": None, "error": "upload failed"}, 500