From b850f07e5abce7545243eeb674495b6960d6d105 Mon Sep 17 00:00:00 2001 From: earrage Date: Thu, 11 Oct 2018 14:11:31 -0700 Subject: Add nginx services control functionality - Modify nginx server template to use clover-controller in clover-system namespace for file upload - Add ability to set nginx server paths and move uploaded files in clover-controller and set/get file upload metadata - Add cloverctl commands to set nginx server and lb configurations - Add example yaml files to configure nginx server and lb v1/v2 from cloverctl - Modify service definition for http-lb versions to distinguish the two versions for GRPC messaging from clover-controller in SDC deployment yaml Change-Id: I5c6866c5ff3de358939c58ea8c0bde64a69c6eca Signed-off-by: earrage --- clover/controller/control/__init__.py | 11 ------- clover/controller/control/api/file_upload.py | 38 +++++++++++++++++---- clover/controller/control/api/nginx.py | 49 +++++++++++++++++++++++----- 3 files changed, 72 insertions(+), 26 deletions(-) (limited to 'clover/controller/control') diff --git a/clover/controller/control/__init__.py b/clover/controller/control/__init__.py index d67a6c0..e69de29 100644 --- a/clover/controller/control/__init__.py +++ b/clover/controller/control/__init__.py @@ -1,11 +0,0 @@ -from flask import Flask, Response - - -app = Flask(__name__) - -@app.route("/") -def index(): - return Response("It works!"), 200 - -if __name__ == "__main__": - app.run(debug=True) diff --git a/clover/controller/control/api/file_upload.py b/clover/controller/control/api/file_upload.py index a479c30..a532bc8 100644 --- a/clover/controller/control/api/file_upload.py +++ b/clover/controller/control/api/file_upload.py @@ -5,24 +5,50 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 -from flask import Blueprint, request, Response +from flask import Blueprint, request, Response, jsonify import redis import logging file_upload = Blueprint('file_upload', __name__) -HOST_IP = 'redis' +HOST_IP = 'redis.default' @file_upload.route("/upload", methods=['GET', 'POST']) -def upload_meta(): +def set_upload_metadata(): try: + response = "Uploaded file(s) successfully" content = request.form + logging.debug(content) r = redis.StrictRedis(host=HOST_IP, port=6379, db=0) - response = content.get('upload.name') - r.set('upload_meta', response) + # Try various variable names + upload_var_names = ['upload', 'file1', 'file2', 'file3', + 'file4', 'file5', 'file6'] + for n in upload_var_names: + try: + param_name = n + '.name' + meta_name = content.get(param_name) + if meta_name: + param_path = n + '.path' + param_server = n + '.server' + meta_path = content.get(param_path) + meta_server = content.get(param_server) + entry = meta_name + ':' + meta_path + ':' + meta_server + r.sadd('upload_metadata', entry) + except Exception as e: + print("no metadata") except Exception as e: logging.debug(e) - r.set('upload_meta', "failure") return Response('Unable to write file metadata to redis', status=400) return response + + +@file_upload.route("/upload/get", methods=['GET', 'POST']) +def get_upload_metadata(): + try: + r = redis.StrictRedis(host=HOST_IP, port=6379, db=0) + response = jsonify(list(r.smembers('upload_metadata'))) + except Exception as e: + logging.debug(e) + return Response('Unable to retrieve upload metadata', status=400) + return response diff --git a/clover/controller/control/api/nginx.py b/clover/controller/control/api/nginx.py index ba99b94..a7d902d 100644 --- a/clover/controller/control/api/nginx.py +++ b/clover/controller/control/api/nginx.py @@ -15,28 +15,28 @@ import logging nginx = Blueprint('nginx', __name__) -@nginx.route("/nginx/slb", methods=['GET', 'POST']) -def slblist(): +@nginx.route("/nginx/lb", methods=['GET', 'POST']) +def modify_lb(): grpc_port = '50054' try: p = request.json try: - slb_name = p['slb_name'] - nginx_grpc = slb_name + ':' + grpc_port + lb_name = p['lb_name'] + nginx_grpc = lb_name + ':' + grpc_port channel = grpc.insecure_channel(nginx_grpc) stub = nginx_pb2_grpc.ControllerStub(channel) s_list = [] - for s in p['slb_list']: + for s in p['lb_list']: s_list.append(s['url']) - slb_list = pickle.dumps(s_list) + lb_list = pickle.dumps(s_list) response = stub.ModifyLB(nginx_pb2.ConfigLB( server_port=p['server_port'], server_name=p['server_name'], - slb_list=slb_list, - slb_group=p['slb_group'], lb_path=p['lb_path'])) + slb_list=lb_list, + slb_group=p['lb_group'], lb_path=p['lb_path'])) except (KeyError, ValueError) as e: logging.debug(e) - return Response('Invalid value in test plan json/yaml', status=400) + return Response('Invalid value in LB json/yaml', status=400) except Exception as e: logging.debug(e) if e.__class__.__name__ == "_Rendezvous": @@ -46,6 +46,37 @@ def slblist(): return response.message +@nginx.route("/nginx/server", methods=['GET', 'POST']) +def modify_server(): + grpc_port = '50054' + try: + p = request.json + try: + server_name = p['server_name'] + nginx_grpc = server_name + ':' + grpc_port + channel = grpc.insecure_channel(nginx_grpc) + stub = nginx_pb2_grpc.ControllerStub(channel) + + locations = pickle.dumps(p['locations']) + files = pickle.dumps(p['files']) + response = stub.ModifyServer(nginx_pb2.ConfigServer( + server_port=p['server_port'], server_name=p['server_name'], + site_root=p['site_root'], locations=locations, files=files, + site_index=p['site_index'], + upload_path_config=p['upload_path_config'], + upload_path_test=p['upload_path_test'])) + except (KeyError, ValueError) as e: + logging.debug(e) + return Response('Invalid value in server json/yaml', status=400) + except Exception as e: + logging.debug(e) + if e.__class__.__name__ == "_Rendezvous": + return Response("Error connecting to server via gRPC", status=400) + else: + return Response("Error modifying server", status=400) + return response.message + + @nginx.route("/nginx/test") def test(): return "

Nginx API Test Response

" -- cgit 1.2.3-korg