From fa11d78e728029bcefa0ad6608d422715ae8f0be Mon Sep 17 00:00:00 2001 From: Thomas Duval Date: Fri, 3 Nov 2017 15:07:12 +0100 Subject: Fix the Moon platform startup and fix some bugs in startup. Change-Id: I9014071c755ec5ef0c9eb0d575af29d5f3ad3533 --- moonv4/moon_orchestrator/Dockerfile | 2 +- .../moon_orchestrator/api/pods.py | 9 ++-- .../moon_orchestrator/moon_orchestrator/drivers.py | 50 ++++++++-------------- .../moon_orchestrator/http_server.py | 40 +++++++++++------ moonv4/moon_orchestrator/requirements.txt | 3 +- 5 files changed, 55 insertions(+), 49 deletions(-) (limited to 'moonv4/moon_orchestrator') diff --git a/moonv4/moon_orchestrator/Dockerfile b/moonv4/moon_orchestrator/Dockerfile index 70eef9a8..aafe1784 100644 --- a/moonv4/moon_orchestrator/Dockerfile +++ b/moonv4/moon_orchestrator/Dockerfile @@ -9,7 +9,7 @@ RUN pip3 install pip --upgrade ADD . /root WORKDIR /root/ RUN pip3 install -r requirements.txt --upgrade -RUN pip3 install /root/dist/* --upgrade +#RUN pip3 install /root/dist/* --upgrade RUN pip3 install . --upgrade CMD ["python3", "-m", "moon_orchestrator"] \ No newline at end of file diff --git a/moonv4/moon_orchestrator/moon_orchestrator/api/pods.py b/moonv4/moon_orchestrator/moon_orchestrator/api/pods.py index 524f8e4e..a7ca1cbc 100644 --- a/moonv4/moon_orchestrator/moon_orchestrator/api/pods.py +++ b/moonv4/moon_orchestrator/moon_orchestrator/api/pods.py @@ -8,7 +8,7 @@ from flask_restful import Resource from moon_utilities.security_functions import check_auth import logging -LOG = logging.getLogger("moon.orchestrator.api.containers") +LOG = logging.getLogger("moon.orchestrator.api.pods") class Pods(Resource): @@ -42,12 +42,15 @@ class Pods(Resource): :internal_api: get_pdp """ pods = {} - LOG.info("pods={}".format(self.driver.get_pods())) + # LOG.info("pods={}".format(self.driver.get_pods())) + if uuid: + return {"pods": self.driver.get_pods(uuid)} for _pod_key, _pod_values in self.driver.get_pods().items(): + pods[_pod_key] = [] for _pod_value in _pod_values: if _pod_value['namespace'] != "moon": continue - pods[_pod_key] = _pod_value + pods[_pod_key].append(_pod_value) return {"pods": pods} @check_auth diff --git a/moonv4/moon_orchestrator/moon_orchestrator/drivers.py b/moonv4/moon_orchestrator/moon_orchestrator/drivers.py index 970914a2..63631c00 100644 --- a/moonv4/moon_orchestrator/moon_orchestrator/drivers.py +++ b/moonv4/moon_orchestrator/moon_orchestrator/drivers.py @@ -6,7 +6,6 @@ from kubernetes import client, config import logging import urllib3.exceptions -import time from moon_utilities import configuration logger = logging.getLogger("moon.orchestrator.drivers") @@ -14,12 +13,10 @@ logger = logging.getLogger("moon.orchestrator.drivers") def get_driver(): try: - driver = K8S() + return K8S() except urllib3.exceptions.MaxRetryError as e: logger.exception(e) return Docker() - else: - return K8S() class Driver: @@ -60,25 +57,19 @@ class K8S(Driver): self.client = client.CoreV1Api() def get_pods(self, name=None): - # pods = self.client.list_pod_for_all_namespaces(watch=False) - # if not namespace: - # return pods - # # TODO: get pods with specific namespace - # for pod in pods: - # logger.info("%s\t%s\t%s" % (pod.status.pod_ip, - # pod.metadata.namespace, - # pod.metadata.name)) - # return pods if name: pods = self.client.list_pod_for_all_namespaces(watch=False) - for pod in pods: - if pod.metadata.name == name: + for pod in pods.items: + logger.info("get_pods {}".format(pod.metadata.name)) + if name in pod.metadata.name: return pod else: return None + logger.info("get_pods cache={}".format(self.cache)) return self.cache - def __create_pod(self, client, data): + @staticmethod + def __create_pod(client, data): pod_manifest = { 'apiVersion': 'extensions/v1beta1', 'kind': 'Deployment', @@ -89,7 +80,7 @@ class K8S(Driver): 'replicas': 1, 'template': { 'metadata': {'labels': {'app': data[0].get('name')}}, - # 'hostname': data.get('name'), + 'hostname': data[0].get('name'), 'spec': { 'containers': [] } @@ -101,6 +92,7 @@ class K8S(Driver): { 'image': _data.get('container', "busybox"), 'name': _data.get('name'), + 'hostname': _data.get('name'), 'ports': [ {"containerPort": _data.get('port', 80)}, ], @@ -118,9 +110,12 @@ class K8S(Driver): resp = client.create_namespaced_deployment(body=pod_manifest, namespace='moon') logger.info("Pod {} created!".format(data[0].get('name'))) + # logger.info(yaml.dump(pod_manifest, sys.stdout)) + # logger.info(resp) return resp - def __create_service(self, client, data, expose=False): + @staticmethod + def __create_service(client, data, expose=False): service_manifest = { 'apiVersion': 'v1', 'kind': 'Service', @@ -154,26 +149,17 @@ class K8S(Driver): def load_pod(self, data, api_client=None, ext_client=None, expose=False): _client = api_client if api_client else self.client - logger.info("Creating pod/service {}".format(data[0].get('name'))) - logger.info("Creating pod/service {}".format(data)) pod = self.__create_pod(client=ext_client, data=data) service = self.__create_service(client=_client, data=data[0], expose=expose) - # logger.info("data={}".format(data)) - # logger.info("service={}".format(service)) + # logger.info("load_poad data={}".format(data)) + # logger.info("pod.metadata.uid={}".format(pod.metadata.uid)) self.cache[pod.metadata.uid] = data - # { - # "ip": "", - # "hostname": pod.metadata.name, - # "port": service.spec.ports[0].node_port, - # "pdp": "", - # "keystone_project_id": data[0].get('keystone_project_id'), - # "plugin_names": [d.get('genre') for d in data], - # "namespace": "moon" - # } def delete_pod(self, uuid=None, name=None): logger.info("Deleting pod {}".format(uuid)) + # TODO: delete_namespaced_deployment + # https://github.com/kubernetes-incubator/client-python/blob/master/kubernetes/client/apis/extensions_v1beta1_api.py def get_slaves(self): contexts, active_context = config.list_kube_config_contexts() @@ -184,6 +170,8 @@ class Docker(Driver): def load_pod(self, data, api_client=None, ext_client=None): logger.info("Creating pod {}".format(data[0].get('name'))) + raise NotImplementedError def delete_pod(self, uuid=None, name=None): logger.info("Deleting pod {}".format(uuid)) + raise NotImplementedError diff --git a/moonv4/moon_orchestrator/moon_orchestrator/http_server.py b/moonv4/moon_orchestrator/moon_orchestrator/http_server.py index a0738f4d..70c5e2d2 100644 --- a/moonv4/moon_orchestrator/moon_orchestrator/http_server.py +++ b/moonv4/moon_orchestrator/moon_orchestrator/http_server.py @@ -10,6 +10,7 @@ import logging from kubernetes import client, config import random import requests +import time from moon_orchestrator import __version__ from moon_orchestrator.api.pods import Pods from moon_orchestrator.api.generic import Logs, Status @@ -17,7 +18,7 @@ from moon_utilities import configuration, exceptions from moon_utilities.misc import get_random_name from moon_orchestrator.drivers import get_driver -logger = logging.getLogger("moon.orchestrator.http") +LOG = logging.getLogger("moon.orchestrator.http") class Server: @@ -106,13 +107,26 @@ class HTTPServer(Server): # CORS(self.app) self.api = Api(self.app) self.driver = get_driver() - logger.info("Driver = {}".format(self.driver.__class__)) + LOG.info("Driver = {}".format(self.driver.__class__)) self.__set_route() self.__hook_errors() + pdp = None + while True: + try: + pdp = requests.get( + "http://{}:{}/pdp".format(self.manager_hostname, + self.manager_port)) + except requests.exceptions.ConnectionError: + LOG.warning("Manager is not ready, standby...") + time.sleep(1) + except KeyError: + LOG.warning("Manager is not ready, standby...") + time.sleep(1) + else: + if "pdps" in pdp.json(): + break + LOG.debug("pdp={}".format(pdp)) self.create_wrappers() - pdp = requests.get("http://{}:{}/pdp".format(self.manager_hostname, - self.manager_port)) - logger.info("pdp={}".format(pdp)) for _pdp_key, _pdp_value in pdp.json()['pdps'].items(): if _pdp_value.get('keystone_project_id'): # TODO: select context to add security function @@ -151,8 +165,8 @@ class HTTPServer(Server): def create_wrappers(self): contexts, active_context = self.driver.get_slaves() - logger.info("contexts: {}".format(contexts)) - logger.info("active_context: {}".format(active_context)) + LOG.debug("contexts: {}".format(contexts)) + LOG.debug("active_context: {}".format(active_context)) conf = configuration.get_configuration("components/wrapper") hostname = conf["components/wrapper"].get( "hostname", "wrapper") @@ -162,7 +176,7 @@ class HTTPServer(Server): "wukongsun/moon_wrapper:v4.3") for _ctx in contexts: _config = config.new_client_from_config(context=_ctx['name']) - logger.info("_config={}".format(_config)) + LOG.debug("_config={}".format(_config)) api_client = client.CoreV1Api(_config) ext_client = client.ExtensionsV1beta1Api(_config) # TODO: get data from consul @@ -173,7 +187,7 @@ class HTTPServer(Server): "namespace": "moon" }, ] pod = self.driver.load_pod(data, api_client, ext_client, expose=True) - logger.info('wrapper pod={}'.format(pod)) + LOG.debug('wrapper pod={}'.format(pod)) def create_security_function(self, keystone_project_id, pdp_id, policy_ids, active_context=None, @@ -189,11 +203,11 @@ class HTTPServer(Server): security function in all context (ie, in all slaves) :return: None """ - logger.info(self.driver.get_pods()) + LOG.debug(self.driver.get_pods()) for key, value in self.driver.get_pods().items(): for _pod in value: if _pod.get('keystone_project_id') == keystone_project_id: - logger.warning("A pod for this Keystone project {} " + LOG.warning("A pod for this Keystone project {} " "already exists.".format(keystone_project_id)) return plugins = configuration.get_plugins() @@ -247,14 +261,14 @@ class HTTPServer(Server): active_context = _active_context _config = config.new_client_from_config( context=active_context['name']) - logger.info("_config={}".format(_config)) + LOG.debug("_config={}".format(_config)) api_client = client.CoreV1Api(_config) ext_client = client.ExtensionsV1beta1Api(_config) self.driver.load_pod(data, api_client, ext_client) return for _ctx in contexts: _config = config.new_client_from_config(context=_ctx['name']) - logger.info("_config={}".format(_config)) + LOG.debug("_config={}".format(_config)) api_client = client.CoreV1Api(_config) ext_client = client.ExtensionsV1beta1Api(_config) self.driver.load_pod(data, api_client, ext_client) diff --git a/moonv4/moon_orchestrator/requirements.txt b/moonv4/moon_orchestrator/requirements.txt index 29885a49..6197f10f 100644 --- a/moonv4/moon_orchestrator/requirements.txt +++ b/moonv4/moon_orchestrator/requirements.txt @@ -4,4 +4,5 @@ flask_cors werkzeug moon_utilities moon_db -kubernetes \ No newline at end of file +kubernetes +pyaml \ No newline at end of file -- cgit 1.2.3-korg