mirror of https://github.com/Aidaho12/haproxy-wi
parent
102f3becd0
commit
8405d1f11f
18
api/api.py
18
api/api.py
|
@ -91,7 +91,10 @@ def index():
|
||||||
'keepalived/<id,hostname,ip>/action/restart': 'restart Keepalived service by id or hostname or ip. METHOD: GET',
|
'keepalived/<id,hostname,ip>/action/restart': 'restart Keepalived service by id or hostname or ip. METHOD: GET',
|
||||||
'keepalived/<id,hostname,ip>/config': 'get Keepalived config from a server by id or hostname or ip. METHOD: GET',
|
'keepalived/<id,hostname,ip>/config': 'get Keepalived config from a server by id or hostname or ip. METHOD: GET',
|
||||||
'keepalived/<id,hostname,ip>/config': 'upload Keepalived config to a server by id or hostname or ip. Headers: action: save/reload/restart. Body must consist a whole Keepalived config. METHOD: POST',
|
'keepalived/<id,hostname,ip>/config': 'upload Keepalived config to a server by id or hostname or ip. Headers: action: save/reload/restart. Body must consist a whole Keepalived config. METHOD: POST',
|
||||||
'ha/create': 'Create HA cluster. Body be JSON body: master_ip: str, slave_ip: str, vrrp_ip: str, master_eth: str, slave_eth: str, virt_server: int, haproxy: int, nginx: int, syn_flood: int, return_to_master: int. METHOD: POST',
|
'ha': 'HA clusters list. METHOD: GET',
|
||||||
|
'ha': 'Create HA cluster. Body must be JSON: name: str, desc: str, cluster_id: 0, router_id: "", vip: str, servers: {server_id: dict:{eth: str, ip: str, name: str, master: int}}, service: dict: {{haproxy: int, docker: int}, {nginx: int, docker: int}}, virt_server: int, syn_flood: int, return_to_master: int. METHOD: POST',
|
||||||
|
'ha': 'Edit HA cluster. Body must be JSON: name: str, desc: str, cluster_id: int, router_id: "", vip: str, servers: {server_id: dict:{eth: str, ip: str, name: str, master: int}}, service: dict: {{haproxy: int, docker: int}, {nginx: int, docker: int}}, virt_server: int, syn_flood: int, return_to_master: int. METHOD: PUT',
|
||||||
|
'ha': 'Delete HA cluster. Body must be JSON: cluster_id: int. METHOD: DELETE',
|
||||||
}
|
}
|
||||||
return dict(help=data)
|
return dict(help=data)
|
||||||
|
|
||||||
|
@ -243,11 +246,18 @@ def add_acl(haproxy_id):
|
||||||
return api_funct.add_acl(haproxy_id)
|
return api_funct.add_acl(haproxy_id)
|
||||||
|
|
||||||
|
|
||||||
@route('/ha/create', method=['POST'])
|
@route('/ha', method=['GET', 'POST', 'PUT', 'DELETE'])
|
||||||
def create_ha():
|
def create_ha():
|
||||||
if not check_login(required_service=3):
|
if not check_login(required_service=5):
|
||||||
return dict(error=_error_auth)
|
return dict(error=_error_auth)
|
||||||
return api_funct.install_keepalived()
|
if request.method == 'POST':
|
||||||
|
return api_funct.create_ha_cluster()
|
||||||
|
elif request.method == 'PUT':
|
||||||
|
return api_funct.update_cluster()
|
||||||
|
elif request.method == 'DELETE':
|
||||||
|
return api_funct.delete_ha_cluster()
|
||||||
|
elif request.method == 'GET':
|
||||||
|
return api_funct.cluster_list()
|
||||||
|
|
||||||
|
|
||||||
@route('/<service>/<server_id>', method=['GET'])
|
@route('/<service>/<server_id>', method=['GET'])
|
||||||
|
|
154
api/api_funct.py
154
api/api_funct.py
|
@ -18,6 +18,7 @@ import modules.roxywi.user as roxywi_user
|
||||||
import modules.roxywi.common as roxywi_common
|
import modules.roxywi.common as roxywi_common
|
||||||
import modules.service.common as service_common
|
import modules.service.common as service_common
|
||||||
import modules.service.installation as service_mod
|
import modules.service.installation as service_mod
|
||||||
|
import modules.service.ha_cluster as ha_cluster
|
||||||
|
|
||||||
get_config_var = roxy_wi_tools.GetConfigVar()
|
get_config_var = roxy_wi_tools.GetConfigVar()
|
||||||
|
|
||||||
|
@ -828,67 +829,96 @@ def create_server():
|
||||||
return dict(data)
|
return dict(data)
|
||||||
|
|
||||||
|
|
||||||
def install_keepalived():
|
def cluster_list():
|
||||||
body = request.body.getvalue().decode('utf-8')
|
token = request.headers.get('token')
|
||||||
json_loads = json.loads(body)
|
login, group_id, role_id = sql.get_username_groupid_from_api_token(token)
|
||||||
master = json_loads['master_ip']
|
clusters = sql.select_clusters(group_id)
|
||||||
slave = json_loads['slave_ip']
|
data = {}
|
||||||
vrrp_ip = json_loads['vrrp_ip']
|
for cluster in clusters:
|
||||||
eth = json_loads['master_eth']
|
data.setdefault(cluster.id, cluster.name)
|
||||||
eth_slave = json_loads['slave_eth']
|
|
||||||
haproxy = int(json_loads['haproxy'])
|
|
||||||
nginx = int(json_loads['nginx'])
|
|
||||||
virt_server = int(json_loads['virt_server'])
|
|
||||||
syn_flood = int(json_loads['syn_flood'])
|
|
||||||
return_to_master = int(json_loads['return_to_master'])
|
|
||||||
router_id = random.randint(1, 255)
|
|
||||||
data = {'status': dict()}
|
|
||||||
data['status'][master] = dict()
|
|
||||||
data['status'][slave] = dict()
|
|
||||||
|
|
||||||
try:
|
|
||||||
service_mod.keepalived_master_install(master, eth, eth_slave, vrrp_ip, virt_server, syn_flood, return_to_master,
|
|
||||||
haproxy, nginx, router_id, 1)
|
|
||||||
except Exception as e:
|
|
||||||
data['status'][master]['keepalived'] = f'error: {e}'
|
|
||||||
else:
|
|
||||||
data['status'][master]['keepalived'] = 'done'
|
|
||||||
|
|
||||||
try:
|
|
||||||
service_mod.keepalived_slave_install(master, slave, eth, eth_slave, vrrp_ip, syn_flood, haproxy, nginx, router_id, 1)
|
|
||||||
except Exception as e:
|
|
||||||
data['status'][slave]['keepalived'] = f'error: {e}'
|
|
||||||
else:
|
|
||||||
data['status'][slave]['keepalived'] = 'done'
|
|
||||||
|
|
||||||
if haproxy:
|
|
||||||
try:
|
|
||||||
service_mod.install_haproxy(master, 1)
|
|
||||||
except Exception as e:
|
|
||||||
data['status'][master]['haproxy'] = f'error: {e}'
|
|
||||||
else:
|
|
||||||
data['status'][master]['haproxy'] = 'done'
|
|
||||||
|
|
||||||
try:
|
|
||||||
service_mod.install_haproxy(slave, 1)
|
|
||||||
except Exception as e:
|
|
||||||
data['status'][slave]['haproxy'] = f'error: {e}'
|
|
||||||
else:
|
|
||||||
data['status'][slave]['haproxy'] = 'done'
|
|
||||||
|
|
||||||
if nginx:
|
|
||||||
try:
|
|
||||||
service_mod.install_service(master, 'nginx', '0', 1)
|
|
||||||
except Exception as e:
|
|
||||||
data['status'][master]['nginx'] = f'error: {e}'
|
|
||||||
else:
|
|
||||||
data['status'][master]['nginx'] = 'done'
|
|
||||||
|
|
||||||
try:
|
|
||||||
service_mod.install_service(slave, 'nginx', '0', 1)
|
|
||||||
except Exception as e:
|
|
||||||
data['status'][slave]['nginx'] = f'error: {e}'
|
|
||||||
else:
|
|
||||||
data['status'][slave]['nginx'] = 'done'
|
|
||||||
|
|
||||||
return dict(data)
|
return dict(data)
|
||||||
|
|
||||||
|
|
||||||
|
def create_ha_cluster():
|
||||||
|
token = request.headers.get('token')
|
||||||
|
body = request.body.getvalue().decode('utf-8')
|
||||||
|
json_loads = json.loads(body)
|
||||||
|
login, group_id, role_id = sql.get_username_groupid_from_api_token(token)
|
||||||
|
data = {'status': dict()}
|
||||||
|
|
||||||
|
try:
|
||||||
|
ha_cluster.create_cluster(json_loads, group_id)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'] = f'error: Cannot create HA cluster: {e}'
|
||||||
|
return data['status']
|
||||||
|
try:
|
||||||
|
service_mod.install_service('keepalived', body)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'].setdefault('keepalived', f'error: {e}')
|
||||||
|
else:
|
||||||
|
data['status'].setdefault('keepalived', 'done')
|
||||||
|
|
||||||
|
if json_loads['services']['haproxy']['enabled']:
|
||||||
|
try:
|
||||||
|
service_mod.install_service('haproxy', body)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'].setdefault('haproxy', f'error: {e}')
|
||||||
|
else:
|
||||||
|
data['status'].setdefault('haproxy', 'done')
|
||||||
|
|
||||||
|
if json_loads['services']['nginx']['enabled']:
|
||||||
|
try:
|
||||||
|
service_mod.install_service('nginx', body)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'].setdefault('nginx', f'error: {e}')
|
||||||
|
else:
|
||||||
|
data['status'].setdefault('nginx', 'done')
|
||||||
|
|
||||||
|
return dict(data)
|
||||||
|
|
||||||
|
|
||||||
|
def update_cluster():
|
||||||
|
token = request.headers.get('token')
|
||||||
|
body = request.body.getvalue().decode('utf-8')
|
||||||
|
json_loads = json.loads(body)
|
||||||
|
login, group_id, role_id = sql.get_username_groupid_from_api_token(token)
|
||||||
|
data = {'status': dict()}
|
||||||
|
|
||||||
|
try:
|
||||||
|
ha_cluster.update_cluster(json_loads, group_id)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'] = f'error: Cannot create HA cluster: {e}'
|
||||||
|
return data['status']
|
||||||
|
|
||||||
|
if json_loads['services']['haproxy']['enabled']:
|
||||||
|
try:
|
||||||
|
service_mod.install_service('haproxy', body)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'].setdefault('haproxy', f'error: {e}')
|
||||||
|
else:
|
||||||
|
data['status'].setdefault('haproxy', 'done')
|
||||||
|
|
||||||
|
if json_loads['services']['nginx']['enabled']:
|
||||||
|
try:
|
||||||
|
service_mod.install_service('nginx', body)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'].setdefault('nginx', f'error: {e}')
|
||||||
|
else:
|
||||||
|
data['status'].setdefault('nginx', 'done')
|
||||||
|
|
||||||
|
return dict(data)
|
||||||
|
|
||||||
|
|
||||||
|
def delete_ha_cluster():
|
||||||
|
body = request.body.getvalue().decode('utf-8')
|
||||||
|
json_loads = json.loads(body)
|
||||||
|
cluster_id = json_loads['cluster_id']
|
||||||
|
data = {'status': dict()}
|
||||||
|
try:
|
||||||
|
ha_cluster.delete_cluster(cluster_id)
|
||||||
|
except Exception as e:
|
||||||
|
data['status'] = f'error: {e}'
|
||||||
|
else:
|
||||||
|
data['status'] = 'done'
|
||||||
|
return dict(data)
|
||||||
|
|
|
@ -111,8 +111,9 @@ def update_cluster(cluster: object, group_id: int) -> str:
|
||||||
|
|
||||||
|
|
||||||
def delete_cluster(cluster_id: int) -> str:
|
def delete_cluster(cluster_id: int) -> str:
|
||||||
|
router_id = sql.get_router_id(cluster_id, default_router=1)
|
||||||
|
slaves = sql.select_cluster_slaves(cluster_id, router_id)
|
||||||
HaCluster.delete().where(HaCluster.id == cluster_id).execute()
|
HaCluster.delete().where(HaCluster.id == cluster_id).execute()
|
||||||
slaves = sql.select_cluster_slaves(cluster_id)
|
|
||||||
|
|
||||||
for slave in slaves:
|
for slave in slaves:
|
||||||
slave_ip = sql.select_server_ip_by_id(slave.server_id)
|
slave_ip = sql.select_server_ip_by_id(slave.server_id)
|
||||||
|
|
|
@ -184,7 +184,6 @@ def grafana_install():
|
||||||
|
|
||||||
|
|
||||||
def generate_kp_inv(json_data: json, install_service) -> object:
|
def generate_kp_inv(json_data: json, install_service) -> object:
|
||||||
json_data = json.loads(json_data)
|
|
||||||
inv = {"server": {"hosts": {}}}
|
inv = {"server": {"hosts": {}}}
|
||||||
server_ips = []
|
server_ips = []
|
||||||
cluster_id = int(json_data['cluster_id'])
|
cluster_id = int(json_data['cluster_id'])
|
||||||
|
@ -224,7 +223,6 @@ def generate_kp_inv(json_data: json, install_service) -> object:
|
||||||
|
|
||||||
|
|
||||||
def generate_haproxy_inv(json_data: json, install_service: str) -> object:
|
def generate_haproxy_inv(json_data: json, install_service: str) -> object:
|
||||||
json_data = json.loads(json_data)
|
|
||||||
inv = {"server": {"hosts": {}}}
|
inv = {"server": {"hosts": {}}}
|
||||||
slaves = []
|
slaves = []
|
||||||
server_ips = []
|
server_ips = []
|
||||||
|
@ -276,7 +274,6 @@ def generate_haproxy_inv(json_data: json, install_service: str) -> object:
|
||||||
|
|
||||||
|
|
||||||
def generate_service_inv(json_data: json, install_service: str) -> object:
|
def generate_service_inv(json_data: json, install_service: str) -> object:
|
||||||
json_data = json.loads(json_data)
|
|
||||||
inv = {"server": {"hosts": {}}}
|
inv = {"server": {"hosts": {}}}
|
||||||
server_ips = []
|
server_ips = []
|
||||||
stats_user = sql.get_setting(f'{install_service}_stats_user')
|
stats_user = sql.get_setting(f'{install_service}_stats_user')
|
||||||
|
@ -384,7 +381,6 @@ def run_ansible(inv: object, server_ips: str, ansible_role: str) -> object:
|
||||||
|
|
||||||
def service_actions_after_install(server_ips: str, service: str, json_data) -> None:
|
def service_actions_after_install(server_ips: str, service: str, json_data) -> None:
|
||||||
is_docker = None
|
is_docker = None
|
||||||
json_data = json.loads(json_data)
|
|
||||||
update_functions = {
|
update_functions = {
|
||||||
'haproxy': sql.update_haproxy,
|
'haproxy': sql.update_haproxy,
|
||||||
'nginx': sql.update_nginx,
|
'nginx': sql.update_nginx,
|
||||||
|
@ -405,3 +401,24 @@ def service_actions_after_install(server_ips: str, service: str, json_data) -> N
|
||||||
if is_docker == '1' and service != 'keepalived':
|
if is_docker == '1' and service != 'keepalived':
|
||||||
sql.insert_or_update_service_setting(server_id, service, 'dockerized', '1')
|
sql.insert_or_update_service_setting(server_id, service, 'dockerized', '1')
|
||||||
sql.insert_or_update_service_setting(server_id, service, 'restart', '1')
|
sql.insert_or_update_service_setting(server_id, service, 'restart', '1')
|
||||||
|
|
||||||
|
|
||||||
|
def install_service(service: str, json_data: object) -> object:
|
||||||
|
try:
|
||||||
|
json_data = json.loads(json_data)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(f'error: Cannot parse JSON: {e}')
|
||||||
|
|
||||||
|
generate_functions = {
|
||||||
|
'haproxy': generate_haproxy_inv,
|
||||||
|
'nginx': generate_service_inv,
|
||||||
|
'apache': generate_service_inv,
|
||||||
|
'keepalived': generate_kp_inv,
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
inv, server_ips = generate_functions[service](json_data, service)
|
||||||
|
service_actions_after_install(server_ips, service, json_data)
|
||||||
|
return run_ansible(inv, server_ips, service), 201
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(f'error: Cannot install {service}: {e}')
|
||||||
|
|
|
@ -39,19 +39,7 @@ def install_monitoring():
|
||||||
@check_services
|
@check_services
|
||||||
def install_service(service):
|
def install_service(service):
|
||||||
json_data = request.form.get('jsonData')
|
json_data = request.form.get('jsonData')
|
||||||
generate_functions = {
|
service_mod.install_service(service, json_data)
|
||||||
'haproxy': service_mod.generate_haproxy_inv,
|
|
||||||
'nginx': service_mod.generate_service_inv,
|
|
||||||
'apache': service_mod.generate_service_inv,
|
|
||||||
'keepalived': service_mod.generate_kp_inv,
|
|
||||||
}
|
|
||||||
|
|
||||||
try:
|
|
||||||
inv, server_ips = generate_functions[service](json_data, service)
|
|
||||||
service_mod.service_actions_after_install(server_ips, service, json_data)
|
|
||||||
return service_mod.run_ansible(inv, server_ips, service), 201
|
|
||||||
except Exception as e:
|
|
||||||
return str(e)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/<service>/version/<server_ip>')
|
@bp.route('/<service>/version/<server_ip>')
|
||||||
|
|
Loading…
Reference in New Issue