You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haproxy-wi/app/views/service/haproxy_section_views.py

1562 lines
50 KiB

import os
from typing import Union, Literal
from flask.views import MethodView
from flask_pydantic import validate
from flask import jsonify, g
from flask_jwt_extended import jwt_required
from playhouse.shortcuts import model_to_dict
import app.modules.db.add as add_sql
import app.modules.db.server as server_sql
import app.modules.config.config as config_mod
import app.modules.config.common as config_common
import app.modules.service.installation as service_mod
import app.modules.roxywi.common as roxywi_common
from app.middleware import get_user_params, page_for_admin, check_group, check_services
from app.modules.db.db_model import Server
from app.modules.roxywi.class_models import BaseResponse, DataStrResponse, HaproxyConfigRequest, GenerateConfigRequest, \
HaproxyUserListRequest, HaproxyPeersRequest, HaproxyGlobalRequest, HaproxyDefaultsRequest, IdDataStrResponse, \
ErrorResponse
from app.modules.common.common_classes import SupportClass
class HaproxySectionView(MethodView):
methods = ['GET', 'POST', 'PUT', 'DELETE']
decorators = [jwt_required(), get_user_params(), check_services, page_for_admin(level=3), check_group()]
def get(self, service: Literal['haproxy'], section_type: str, section_name: str, server_id: Union[int, str]):
try:
server_id = SupportClass().return_server_ip_or_id(server_id)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, '')
try:
_ = server_sql.get_server_with_group(server_id, g.user_params['group_id'])
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot find a server')
try:
section = add_sql.get_section(server_id, section_type, section_name)
output = {'server_id': section.server_id.server_id, **model_to_dict(section, recurse=False)}
output['id'] = f'{server_id}-{section_name}'
output.update(section.config)
return jsonify(output)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot get HAProxy section')
def post(self,
service: Literal['haproxy'],
section_type: str,
server_id: Union[int, str],
body: Union[HaproxyConfigRequest, HaproxyUserListRequest, HaproxyPeersRequest],
query: GenerateConfigRequest
):
try:
server_id = SupportClass().return_server_ip_or_id(server_id)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, '')
try:
server = server_sql.get_server_with_group(server_id, g.user_params['group_id'])
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot find a server')
if query.generate:
cfg = '/tmp/haproxy-generated-config.cfg'
os.system(f'touch {cfg}')
inv = service_mod.generate_haproxy_section_inv(body.model_dump(mode='json'), cfg)
try:
output = service_mod.run_ansible_locally(inv, 'haproxy_section')
if len(output['failures']) > 0 or len(output['dark']) > 0:
raise Exception('Cannot create HAProxy section. Check Apache error log')
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, f'Cannot create HAProxy section: {e}')
try:
with open(cfg, 'r') as file:
conf = file.read()
except Exception as e:
raise Exception(f'error: Cannot read config file: {e}')
os.remove(cfg)
return DataStrResponse(data=conf).model_dump(mode='json'), 200
try:
output = self._edit_config(service, server, body, 'create')
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot create HAProxy section')
if 'Fatal' in output or 'error' in output:
return ErrorResponse(error=output).model_dump(mode='json'), 500
try:
add_sql.insert_new_section(server_id, section_type, body.name, body)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot add HAProxy section')
return IdDataStrResponse(data=output, id=f'{server_id}-{body.name}').model_dump(mode='json'), 201
def put(self,
service: Literal['haproxy'],
section_type: str,
section_name: str,
server_id: Union[int, str],
body: Union[HaproxyConfigRequest, HaproxyUserListRequest, HaproxyPeersRequest, HaproxyGlobalRequest, HaproxyDefaultsRequest]
):
try:
server_id = SupportClass().return_server_ip_or_id(server_id)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, '')
try:
server = server_sql.get_server_with_group(server_id, g.user_params['group_id'])
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot find a server')
try:
output = self._edit_config(service, server, body, 'create')
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot create HAProxy section')
if 'Fatal' in output or 'error' in output:
return ErrorResponse(error=output).model_dump(mode='json'), 500
else:
try:
if section_name in ('global', 'defaults'):
add_sql.insert_or_update_new_section(server_id, section_name, section_name, body)
else:
add_sql.update_section(server_id, section_type, section_name, body)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot update HAProxy section')
return DataStrResponse(data=output).model_dump(mode='json'), 201
def delete(self, service: Literal['haproxy'], section_type: str, section_name: str, server_id: Union[int, str]):
try:
server_id = SupportClass().return_server_ip_or_id(server_id)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, '')
try:
server = server_sql.get_server_with_group(server_id, g.user_params['group_id'])
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot find a server')
try:
self._edit_config(service, server, '', 'delete', section_type=section_type, section_name=section_name)
add_sql.delete_section(server_id, section_type, section_name)
except Exception as e:
return roxywi_common.handler_exceptions_for_json_data(e, 'Cannot delete HAProxy section')
return BaseResponse().model_dump(mode='json'), 204
@staticmethod
def _edit_config(service, server: Server, body: HaproxyConfigRequest, action: Literal['create', 'delete'], **kwargs) -> str:
cfg = config_common.generate_config_path(service, server.ip)
if action == 'create':
inv = service_mod.generate_haproxy_section_inv(body.model_dump(mode='json'), cfg)
else:
inv = service_mod.generate_haproxy_section_inv_for_del(cfg, kwargs.get('section_type'), kwargs.get('section_name'))
try:
config_mod.get_config(server.ip, cfg, service=service)
except Exception as e:
raise e
try:
output = service_mod.run_ansible_locally(inv, 'haproxy_section')
except Exception as e:
raise e
if len(output['failures']) > 0 or len(output['dark']) > 0:
raise Exception('Cannot create HAProxy section. Check Apache error log')
if body:
if body.action:
action = str(body.action)
else:
action = 'save'
output = config_mod.master_slave_upload_and_restart(server.ip, cfg, action, 'haproxy')
return output
class ListenSectionView(HaproxySectionView):
methods = ['GET', 'POST', 'PUT', 'DELETE']
decorators = [jwt_required(), get_user_params(), check_services, page_for_admin(level=3), check_group()]
@validate()
def get(self, service: Literal['haproxy'], section_type: Literal['listen', 'frontend', 'backend'], section_name: str, server_id: Union[int, str]):
"""
HaproxySectionView API
This is the HaproxySectionView API where you can get configurations of HAProxy sections.
---
tags:
- HAProxy section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_type
in: path
type: string
required: true
enum:
- listen
- frontend
- backend
description: The type of section to fetch.
- name: section_name
in: path
type: string
required: true
description: The name of the section to fetch.
responses:
200:
description: Haproxy section configuration.
schema:
type: object
properties:
config:
type: object
properties:
acls:
type: array
items:
type: object
antibot:
type: integer
backend_servers:
type: array
items:
type: object
properties:
backup:
type: boolean
maxconn:
type: integer
port:
type: integer
port_check:
type: integer
send_proxy:
type: boolean
server:
type: string
balance:
type: string
binds:
type: array
items:
type: object
properties:
ip:
type: string
port:
type: integer
blacklist:
type: string
cache:
type: integer
compression:
type: integer
cookie:
type: object
ddos:
type: integer
forward_for:
type: integer
headers:
type: array
items:
type: object
health_check:
type: object
maxconn:
type: integer
mode:
type: string
name:
type: string
option:
type: string
redispatch:
type: integer
servers_check:
type: object
slow_attack:
type: integer
ssl_offloading:
type: integer
type:
type: string
waf:
type: integer
antibot:
type: integer
ddos:
type: integer
whitelist:
type: string
id:
type: integer
name:
type: string
server_id:
type: integer
type:
type: string
400:
description: Invalid parameters.
404:
description: Section not found.
500:
description: Internal server error.
"""
return super().get(service, section_type, section_name, server_id)
@validate(body=HaproxyConfigRequest, query=GenerateConfigRequest)
def post(self,
service: Literal['haproxy'],
section_type: Literal['listen', 'frontend', 'backend'],
server_id: Union[int, str],
body: HaproxyConfigRequest,
query: GenerateConfigRequest
):
"""
HaproxySectionView API
This is the HaproxySectionView API where you can create HAProxy sections.
---
tags:
- HAProxy section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_type
in: path
type: string
required: true
enum:
- listen
- frontend
- backend
description: The type of section to create.
- name: body
in: body
required: true
schema:
type: object
properties:
acls:
type: array
items:
type: object
properties:
acl_if:
type: string
acl_value:
type: string
acl_then:
type: string
acl_then_value:
type: string
binds:
type: array
items:
type: object
properties:
ip:
type: string
port:
type: string
headers:
type: array
items:
type: object
properties:
path:
type: string
method:
type: string
name:
type: string
value:
type: string
backend_servers:
type: array
items:
type: object
properties:
server:
type: string
port:
type: integer
port_check:
type: integer
maxconn:
type: string
send_proxy:
type: integer
backup:
type: integer
type:
type: string
name:
type: string
mode:
type: string
ssl:
type: object
properties:
cert:
type: string
ssl_check:
type: integer
ssl_check_backend:
type: integer
maxconn:
type: string
balance:
type: string
health_check:
type: object
properties:
check:
type: string
path:
type: string
domain:
type: string
compression:
type: string
cache:
type: string
ssl_offloading:
type: integer
slow_attack:
type: integer
whitelist:
type: string
blacklist:
type: string
forward_for:
type: integer
antibot:
type: integer
ddos:
type: integer
cookie:
type: object
properties:
name:
type: string
domain:
type: string
dynamic:
type: string
dynamic_key:
type: string
nocache:
type: string
postonly:
type: string
prefix:
type: string
option:
type: string
servers_check:
type: object
properties:
inter:
type: integer
rise:
type: integer
fall:
type: integer
circuit_breaking:
type: object
properties:
observe:
type: string
error_limit:
type: integer
on_error:
type: string
responses:
200:
description: Haproxy section successfully created.
400:
description: Invalid parameters.
500:
description: Internal server error.
"""
return super().post(service, section_type, server_id, body, query)
@validate(body=HaproxyConfigRequest)
def put(self, service: Literal['haproxy'], section_type: Literal['listen', 'frontend', 'backend'],
section_name: str, server_id: Union[int, str], body: HaproxyConfigRequest):
"""
This is the HaproxySectionView API where you can update the HAProxy sections.
---
tags:
- HAProxy section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_type
in: path
type: string
required: true
enum:
- listen
- frontend
- backend
description: The type of section to update.
- name: section_name
in: path
type: string
required: true
description: The name of section to update.
- name: body
in: body
required: true
schema:
type: object
properties:
acls:
type: array
items:
type: object
properties:
acl_if:
type: string
acl_value:
type: string
acl_then:
type: string
acl_then_value:
type: string
binds:
type: array
items:
type: object
properties:
ip:
type: string
port:
type: string
headers:
type: array
items:
type: object
properties:
path:
type: string
method:
type: string
name:
type: string
value:
type: string
backend_servers:
type: array
items:
type: object
properties:
server:
type: string
port:
type: integer
port_check:
type: string
maxconn:
type: integer
send_proxy:
type: integer
backup:
type: integer
type:
type: string
name:
type: string
mode:
type: string
ssl:
type: object
properties:
cert:
type: string
ssl_check:
type: integer
ssl_check_backend:
type: integer
maxconn:
type: string
balance:
type: string
health_check:
type: object
properties:
check:
type: string
path:
type: string
domain:
type: string
compression:
type: string
cache:
type: string
ssl_offloading:
type: integer
slow_attack:
type: integer
whitelist:
type: string
blacklist:
type: string
forward_for:
type: integer
antibot:
type: integer
ddos:
type: integer
cookie:
type: object
properties:
name:
type: string
domain:
type: string
dynamic:
type: string
dynamic_key:
type: string
nocache:
type: string
postonly:
type: string
prefix:
type: string
option:
type: string
servers_check:
type: object
properties:
inter:
type: integer
rise:
type: integer
fall:
type: integer
circuit_breaking:
type: object
properties:
observe:
type: string
error_limit:
type: integer
on_error:
type: string
userlist_users:
type: object
properties:
user:
type: string
password:
type: string
group:
type: string
userlist_groups:
type: array
responses:
200:
description: Haproxy section successfully created.
400:
description: Invalid parameters.
500:
description: Internal server error.
"""
return super().put(service, section_type, section_name, server_id, body)
@validate()
def delete(self, service: Literal['haproxy'], section_type: str, section_name: str, server_id: Union[int, str]):
"""
HaproxySectionView sections API
This is the HaproxySectionView API where you can delete configurations of HAProxy sections.
---
tags:
- HAProxy section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_type
in: path
type: string
required: true
enum:
- listen
- frontend
- backend
- name: section_name
in: path
type: string
required: true
description: The name of the section to fetch.
responses:
204:
description: Haproxy section configuration.
"""
return super().delete(service, section_type, section_name, server_id)
class UserListSectionView(HaproxySectionView):
methods = ['GET', 'POST', 'PUT', 'DELETE']
decorators = [jwt_required(), get_user_params(), check_services, page_for_admin(level=3), check_group()]
@validate()
def get(self, service: Literal['haproxy'], section_name: str, server_id: Union[int, str]):
"""
HaproxySectionView userlist API
This is the HaproxySectionView API where you can get configurations of HAProxy userlist sections.
---
tags:
- HAProxy userlist section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_name
in: path
type: string
required: true
description: The name of the section to fetch.
responses:
200:
description: Haproxy section configuration.
schema:
type: object
properties:
config:
type: object
properties:
name:
type: string
id:
type: integer
name:
type: string
server_id:
type: integer
type:
type: string
400:
description: Invalid parameters.
404:
description: Section not found.
500:
description: Internal server error.
"""
return super().get(service, 'userlist', section_name, server_id)
@validate(body=HaproxyUserListRequest, query=GenerateConfigRequest)
def post(self,
service: Literal['haproxy'],
server_id: Union[int, str],
body: HaproxyUserListRequest,
query: GenerateConfigRequest
):
"""
HaproxySectionView userlist API
This is the HaproxySectionView API where you can create HAProxy userlist sections.
---
tags:
- HAProxy userlist section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: body
in: body
required: true
schema:
type: object
properties:
type:
type: string
example: "userlist"
userlist_users:
type: array
items:
type: object
properties:
user:
type: string
example: "admin"
password:
type: string
example: "secretpassword"
group:
type: string
example: ""
userlist_groups:
type: array
items:
type: string
example: "ops"
name:
type: string
example: "ops_users"
responses:
200:
description: Haproxy section successfully created.
400:
description: Invalid parameters.
500:
description: Internal server error.
"""
return super().post(service, 'userlist', server_id, body, query)
@validate(body=HaproxyUserListRequest)
def put(self, service: Literal['haproxy'], section_name: str, server_id: Union[int, str], body: HaproxyUserListRequest):
"""
This is the HaproxySectionView API where you can update the HAProxy user list section.
---
tags:
- HAProxy userlist section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_name
in: path
type: string
required: true
description: The name of section to update.
- name: body
in: body
required: true
schema:
type: object
properties:
type:
type: string
example: "userlist"
userlist_users:
type: array
items:
type: object
properties:
user:
type: string
example: "admin"
password:
type: string
example: "secretpassword"
group:
type: string
example: ""
userlist_groups:
type: array
items:
type: string
example: "ops"
name:
type: string
example: "ops_users"
responses:
200:
description: Haproxy section successfully created.
400:
description: Invalid parameters.
500:
description: Internal server error.
"""
return super().put(service, 'userlist', section_name, server_id, body)
@validate()
def delete(self, service: Literal['haproxy'], section_name: str, server_id: Union[int, str]):
"""
HaproxySectionView userlist API
This is the HaproxySectionView API where you can delete configurations of HAProxy userlist sections.
---
tags:
- HAProxy userlist section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_name
in: path
type: string
required: true
description: The name of the section to fetch.
responses:
204:
description: Haproxy section configuration.
"""
return super().delete(service, 'userlist', section_name, server_id)
class PeersSectionView(HaproxySectionView):
methods = ['GET', 'POST', 'PUT', 'DELETE']
decorators = [jwt_required(), get_user_params(), check_services, page_for_admin(level=3), check_group()]
@validate()
def get(self, service: Literal['haproxy'], section_name: str, server_id: Union[int, str]):
"""
HaproxySectionView peers API
This is the HaproxySectionView API where you can get configurations of HAProxy userlist sections.
---
tags:
- HAProxy peers section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_name
in: path
type: string
required: true
description: The name of the section to fetch.
responses:
200:
description: Haproxy section configuration.
schema:
type: object
properties:
config:
type: object
properties:
name:
type: string
id:
type: integer
name:
type: string
server_id:
type: integer
type:
type: string
400:
description: Invalid parameters.
404:
description: Section not found.
500:
description: Internal server error.
"""
return super().get(service, 'peers', section_name, server_id)
@validate(body=HaproxyPeersRequest, query=GenerateConfigRequest)
def post(self,
service: Literal['haproxy'],
server_id: Union[int, str],
body: HaproxyPeersRequest,
query: GenerateConfigRequest
):
"""
HaproxySectionView peers API
This is the HaproxySectionView API where you can create HAProxy userlist sections.
---
tags:
- HAProxy peers section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: body
in: body
required: true
schema:
type: object
properties:
type:
type: string
description: The type of the section.
peers:
type: array
items:
type: object
properties:
name:
type: string
description: The name of the peer.
ip:
type: string
description: The IP address of the peer.
port:
type: string
description: The port of the peer.
name:
type: string
description: The name of the section.
responses:
200:
description: Haproxy section successfully created.
400:
description: Invalid parameters.
500:
description: Internal server error.
"""
return super().post(service, 'peers', server_id, body, query)
@validate(body=HaproxyPeersRequest)
def put(self, service: Literal['haproxy'], section_name: str, server_id: Union[int, str], body: HaproxyPeersRequest):
"""
This is the HaproxySectionView API where you can update the HAProxy peers section.
---
tags:
- HAProxy peers section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_name
in: path
type: string
required: true
description: The name of section to update.
- name: body
in: body
required: true
schema:
type: object
properties:
type:
type: string
description: The type of the section.
peers:
type: array
items:
type: object
properties:
name:
type: string
description: The name of the peer.
ip:
type: string
description: The IP address of the peer.
port:
type: string
description: The port of the peer.
name:
type: string
description: The name of the section.
responses:
200:
description: Haproxy section successfully created.
400:
description: Invalid parameters.
500:
description: Internal server error.
"""
return super().put(service, 'peers', section_name, server_id, body)
@validate()
def delete(self, service: Literal['haproxy'], section_name: str, server_id: Union[int, str]):
"""
HaproxySectionView peers API
This is the HaproxySectionView API where you can delete configurations of HAProxy peers sections.
---
tags:
- HAProxy peers section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this section belongs.
- name: server_id
in: path
type: string
required: true
description: Server ID or IP address
- name: section_name
in: path
type: string
required: true
description: The name of the section to fetch.
responses:
204:
description: Haproxy section configuration.
"""
return super().delete(service, 'peers', section_name, server_id)
class GlobalSectionView(HaproxySectionView):
methods = ['GET', 'PUT']
decorators = [jwt_required(), get_user_params(), check_services, page_for_admin(level=3), check_group()]
@validate()
def get(self, service: Literal['haproxy'], server_id: Union[int, str]):
"""
GlobalSectionView API
This is the GlobalSectionView API where you can get the global configuration of HAProxy.
---
tags:
- HAProxy global section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this global configuration belongs.
- name: server_id
in: path
type: string
required: true
description: The server ID or server IP.
responses:
200:
description: Global HAProxy configuration.
schema:
type: object
properties:
config:
type: object
properties:
chroot:
type: string
default: /var/lib/haproxy
daemon:
type: bool
default: 1
group:
type: string
default: haproxy
log:
type: array
items:
type: string
default: ['127.0.0.1 local', '127.0.0.1 local1 notice']
maxconn:
type: integer
default: 5000
pidfile:
type: string
default: /var/run/haproxy.pid
socket:
type: array
items:
type: string
default: ['*:1999 level admin', '/var/run/haproxy.sock mode 600 level admin', '/var/lib/haproxy/stats']
type:
type: string
default: global
user:
type: string
default: haproxy
id:
type: integer
name:
type: string
server_id:
type: integer
type:
type: string
400:
description: Invalid parameters.
404:
description: Global section not found.
500:
description: Internal server error.
"""
return super().get(service, 'global', 'global', server_id)
@validate(body=HaproxyGlobalRequest, query=GenerateConfigRequest)
def put(self, service: Literal['haproxy'], server_id: Union[int, str], body: HaproxyGlobalRequest):
"""
GlobalSectionView API
This is the GlobalSectionView API where you can update the global configuration of HAProxy.
---
tags:
- HAProxy global section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this global configuration belongs.
- name: server_id
in: path
type: string
required: true
description: The server ID or server IP.
- name: body
in: body
required: true
schema:
type: object
properties:
chroot:
type: string
default: "/var/lib/haproxy"
daemon:
type: integer
default: 1
group:
type: string
default: "haproxy"
log:
type: array
items:
type: string
default: ["127.0.0.1 local", "127.0.0.1 local1 notice"]
maxconn:
type: integer
default: 5000
pidfile:
type: string
default: "/var/run/haproxy.pid"
socket:
type: array
items:
type: string
default: ["*:1999 level admin", "/var/run/haproxy.sock mode 600 level admin", "/var/lib/haproxy/stats"]
user:
type: string
default: "haproxy"
id:
type: integer
default: 20
name:
type: string
default: "global"
server_id:
type: integer
default: 1
type:
type: string
default: "global"
responses:
200:
description: Global HAProxy configuration successfully updated.
400:
description: Invalid parameters.
404:
description: Global section not found.
500:
description: Internal server error.
"""
return super().put(service, 'global', 'global', server_id, body)
class DefaultsSectionView(HaproxySectionView):
methods = ['GET', 'PUT']
decorators = [jwt_required(), get_user_params(), check_services, page_for_admin(level=3), check_group()]
@validate()
def get(self, service: Literal['haproxy'], server_id: Union[int, str]):
"""
DefaultsSectionView API
This is the DefaultsSectionView API where you can get the defaults configuration of HAProxy.
---
tags:
- HAProxy defaults section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this defaults configuration belongs.
- name: server_id
in: path
type: string
required: true
description: The server ID or server IP.
responses:
200:
description: Defaults HAProxy configuration.
schema:
type: object
properties:
config:
type: object
properties:
log:
type: string
default: "global"
maxconn:
type: integer
default: 5000
option:
type: string
default: ""
retries:
type: integer
default: 3
timeout:
type: object
properties:
check:
type: integer
default: 10
client:
type: integer
default: 60
connect:
type: integer
default: 10
http_keep_alive:
type: integer
default: 10
http_request:
type: integer
default: 10
queue:
type: integer
default: 60
server:
type: integer
default: 60
type:
type: string
default: "defaults"
id:
type: integer
default: 23
name:
type: string
default: "defaults"
server_id:
type: integer
default: 1
type:
type: string
default: "defaults"
400:
description: Invalid parameters.
404:
description: Defaults section not found.
500:
description: Internal server error.
"""
return super().get(service, 'defaults', 'defaults', server_id)
@validate(body=HaproxyDefaultsRequest, query=GenerateConfigRequest)
def put(self, service: Literal['haproxy'], server_id: Union[int, str], body: HaproxyDefaultsRequest):
"""
DefaultsSectionView API
This is the DefaultsSectionView API where you can update the defaults configuration of HAProxy.
---
tags:
- HAProxy defaults section
parameters:
- name: service
in: path
type: string
required: true
enum:
- haproxy
description: The service to which this defaults configuration belongs.
- name: server_id
in: path
type: string
required: true
description: The server ID or server IP.
- name: body
in: body
required: true
schema:
type: object
properties:
log:
type: string
default: "global"
maxconn:
type: integer
default: 5000
option:
type: string
default: ""
retries:
type: integer
default: 3
timeout:
type: object
properties:
check:
type: integer
default: 10s
client:
type: integer
default: 60s
connect:
type: integer
default: 10s
http_keep_alive:
type: integer
default: 10s
http_request:
type: integer
default: 10s
queue:
type: integer
default: 60s
server:
type: integer
default: 60s
type:
type: string
default: "defaults"
id:
type: integer
name:
type: string
default: "defaults"
server_id:
type: integer
type:
type: string
default: "defaults"
responses:
200:
description: Defaults HAProxy configuration successfully updated.
400:
description: Invalid parameters.
404:
description: Defaults section not found.
500:
description: Internal server error.
"""
return super().put(service, 'defaults', 'defaults', server_id, body)