"""
+Copyright (c) 2015 SONATA-NFV and Paderborn University
+ALL RIGHTS RESERVED.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]
+nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written
+permission.
+
+This work has been performed in the framework of the SONATA project,
+funded by the European Commission under Grant number 671517 through
+the Horizon 2020 and 5G-PPP programmes. The authors would like to
+acknowledge the contributions of their colleagues of the SONATA
+partner consortium (www.sonata-nfv.eu).
+"""
+"""
This module implements a simple REST API that behaves like SONATA's gatekeeper.
It is only used to support the development of SONATA's SDK tools and to demonstrate
from docker import Client as DockerClient
from flask import Flask, request
import flask_restful as fr
+from collections import defaultdict
logging.basicConfig()
LOG = logging.getLogger("sonata-dummy-gatekeeper")
GK_STANDALONE_MODE = False
# should a new version of an image be pulled even if its available
-FORCE_PULL = True
-
+FORCE_PULL = False
class Gatekeeper(object):
self.local_docker_files = dict()
self.remote_docker_image_urls = dict()
self.instances = dict()
+ self.vnfname2num = dict()
def onboard(self):
"""
self.instances[instance_uuid]["vnf_instances"].append(vnfi)
# 3. Configure the chaining of the network functions (currently only E-Line links supported)
+ nfid2name = defaultdict(lambda :"NotExistingNode",
+ reduce(lambda x,y: dict(x, **y),
+ map(lambda d:{d["vnf_id"]:d["vnf_name"]},
+ self.nsd["network_functions"])))
+
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")]
+ cookie = 1 # not clear why this is needed - to check with Steven
for link in eline_fwd_links:
src_node, src_port = link["connection_points_reference"][0].split(":")
dst_node, dst_port = link["connection_points_reference"][1].split(":")
- network = self.vnfds[src_node].get("dc").net # there should be a cleaner way to find the DCNetwork
- network.setChain(src_node, dst_node, vnf_src_interface=src_port, vnf_dst_interface=dst_port)
+ srcname = nfid2name[src_node]
+ dstname = nfid2name[dst_node]
+ LOG.debug("src name: "+srcname+" dst name: "+dstname)
+
+ if (srcname in self.vnfds) and (dstname in self.vnfds) :
+ network = self.vnfds[srcname].get("dc").net # there should be a cleaner way to find the DCNetwork
+ src_vnf = self.vnfname2num[srcname]
+ dst_vnf = self.vnfname2num[dstname]
+ ret = network.setChain(src_vnf, dst_vnf, vnf_src_interface=src_port, vnf_dst_interface=dst_port, bidirectional = True, cmd="add-flow", cookie = cookie)
+ cookie += 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"])
LOG.info("Service started. Instance id: %r" % instance_uuid)
return instance_uuid
# 3. do the dc.startCompute(name="foobar") call to run the container
# TODO consider flavors, and other annotations
intfs = vnfd.get("connection_points")
- vnfi = target_dc.startCompute(GK.get_next_vnf_name(), network=intfs, image=docker_name, flavor_name="small")
- # 6. store references to the compute objects in self.instances
+ self.vnfname2num[vnf_name] = GK.get_next_vnf_name()
+ LOG.info("Starting %r as %r in DC %r" % (vnf_name, self.vnfname2num[vnf_name], vnfd.get("dc")))
+ LOG.debug("Interfaces for %r: %r" % (vnf_name, intfs))
+ vnfi = target_dc.startCompute(self.vnfname2num[vnf_name], network=intfs, image=docker_name, flavor_name="small")
return vnfi
+ def _trigger_emulator_start_scripts_in_vnfis(self, vnfi_list):
+ for vnfi in vnfi_list:
+ config = vnfi.dcinfo.get("Config", dict())
+ env = config.get("Env", list())
+ for env_var in env:
+ if "SON_EMU_CMD=" in env_var:
+ cmd = str(env_var.split("=")[1])
+ LOG.info("Executing entrypoint script in %r: %r" % (vnfi.name, cmd))
+ vnfi.cmdPrint(cmd)
+
def _unpack_service_package(self):
"""
unzip *.son file and store contents in CATALOG_FOLDER/services/<service_uuid>/