aboutsummaryrefslogtreecommitdiffstats
path: root/moonv4/moon_orchestrator
diff options
context:
space:
mode:
authorThomas Duval <thomas.duval@orange.com>2017-11-03 15:07:12 +0100
committerThomas Duval <thomas.duval@orange.com>2017-11-03 15:07:12 +0100
commitfa11d78e728029bcefa0ad6608d422715ae8f0be (patch)
tree99aa1b2e44b6008b34d4d8e01c6af56eca6ca773 /moonv4/moon_orchestrator
parent0418b00f6d811c7b407bd8abbe80064605e37c06 (diff)
Fix the Moon platform startup and fix some bugs in startup.
Change-Id: I9014071c755ec5ef0c9eb0d575af29d5f3ad3533
Diffstat (limited to 'moonv4/moon_orchestrator')
-rw-r--r--moonv4/moon_orchestrator/Dockerfile2
-rw-r--r--moonv4/moon_orchestrator/moon_orchestrator/api/pods.py9
-rw-r--r--moonv4/moon_orchestrator/moon_orchestrator/drivers.py50
-rw-r--r--moonv4/moon_orchestrator/moon_orchestrator/http_server.py40
-rw-r--r--moonv4/moon_orchestrator/requirements.txt3
5 files changed, 55 insertions, 49 deletions
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