summaryrefslogtreecommitdiffstats
path: root/clover/controller/control/api/nginx.py
blob: a7d902d1f84be4a13b234bdd2bba9f3f93fe43eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Copyright (c) Authors of Clover
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0

from flask import Blueprint, request, Response
import grpc
import nginx_pb2
import nginx_pb2_grpc
import pickle
import logging

nginx = Blueprint('nginx', __name__)


@nginx.route("/nginx/lb", methods=['GET', 'POST'])
def modify_lb():
    grpc_port = '50054'
    try:
        p = request.json
        try:
            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['lb_list']:
                s_list.append(s['url'])
            lb_list = pickle.dumps(s_list)
            response = stub.ModifyLB(nginx_pb2.ConfigLB(
                server_port=p['server_port'], server_name=p['server_name'],
                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 LB json/yaml', status=400)
    except Exception as e:
        logging.debug(e)
        if e.__class__.__name__ == "_Rendezvous":
            return Response("Error connecting to LB via gRPC", status=400)
        else:
            return Response("Error modifying LB server list", status=400)
    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 "<h1 style='color:blue'>Nginx API Test Response</h1>"