X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Fopenstack%2Fopenstack_api_endpoint.py;h=e340a3ae907fc9e8aa90aa8815d48fe8df823607;hp=127c3e846d845d034ffedc08fd9b6c9946e28b55;hb=4e5c81ecd37e7383c52dad55079f91b90dec22fe;hpb=f88a31dacf0bfa8dba7357d866c3e5bdece8c05c diff --git a/src/emuvim/api/openstack/openstack_api_endpoint.py b/src/emuvim/api/openstack/openstack_api_endpoint.py old mode 100644 new mode 100755 index 127c3e8..e340a3a --- a/src/emuvim/api/openstack/openstack_api_endpoint.py +++ b/src/emuvim/api/openstack/openstack_api_endpoint.py @@ -1,9 +1,38 @@ +""" +Copyright (c) 2017 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, Paderborn University +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). +""" from manage import OpenstackManage from openstack_dummies import * import logging import threading import compute import requests +import socket +import time class OpenstackApiEndpoint(): @@ -55,26 +84,38 @@ class OpenstackApiEndpoint(): logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % ( self.__class__.__name__, self.ip, self.port)) - def start(self): + def start(self, wait_for_port=False): """ Start all connected OpenStack endpoints that are connected to this API endpoint. """ - for component in self.openstack_endpoints.values(): - component.compute = self.compute - component.manage = self.manage - thread = threading.Thread(target=component._start_flask, args=()) - thread.daemon = True - thread.name = component.__class__ - thread.start() - + for c in self.openstack_endpoints.values(): + c.compute = self.compute + c.manage = self.manage + c.server_thread = threading.Thread(target=c._start_flask, args=()) + c.server_thread.daemon = True + c.server_thread.name = c.__class__.__name__ + c.server_thread.start() + if wait_for_port: + self._wait_for_port(c.ip, c.port) + def stop(self): """ Stop all connected OpenStack endpoints that are connected to this API endpoint. """ - for component in self.openstack_endpoints.values(): - url = "http://" + component.ip + ":" + str(component.port) + "/shutdown" - try: - requests.get(url) - except: - # seems to be stopped - pass + for c in self.openstack_endpoints.values(): + c.stop() + #for c in self.openstack_endpoints.values(): + # if c.server_thread: + # print("Waiting for WSGIServers to be stopped ...") + # c.server_thread.join() + + def _wait_for_port(self, ip, port): + for i in range(0, 10): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(1) # 1 Second Timeout + r = s.connect_ex((ip, port)) + if r == 0: + break # port is open proceed + else: + logging.warning("Waiting for {}:{} ... ({}/10)".format(ip, port, i + 1)) + time.sleep(1)