"""
.. module:: clusters
.. moduleauthor:: Roy Russo <royrusso.gmail.com>
"""
from flask import request
from flask_restful import Resource
from elastichq.model import ClusterDTO
from . import api
from ..common.api_response import APIResponse
from ..common.exceptions import BadRequest, request_wrapper
from ..common.status_codes import HTTP_Status
from ..service import ClusterService, ConnectionService
[docs]class ClusterConnection(Resource):
"""
Manages cluster connection pool.
"""
@request_wrapper
[docs] def post(self):
"""
Creates a connection to a given host/port. Accepts a JSON POST BODY. This will add the connection, if it doesn't already
exist, to the pool of connections and save the details in the database.
Responds with the `elastichq.common.api_response.APIResponse` object.
.. :quickref: Creates a connection to the cluster.
**Example request**:
.. sourcecode:: http
GET /clusters/_connect/ HTTP/1.1
Accept: application/json
{
"ip": "127.0.0.1",
"port": "9200",
"use_ssl": false
}
**Request Structure**
- *(dict) --*
- **ip** *(string) --* IP address or host name
- **port** *(string) --* ES REST API port
- **use_ssl** *(boolean) --* Whether to use HTTPS or not.
**Example response**:
.. sourcecode:: http
HTTP/1.1 201
Content-Type: application/json
{
"data": [
{
"cluster_name": "",
"cluster_ip": "",
"cluster_port": "9200",
"cluster_scheme": "http",
"cluster_connected": true,
"cluster_host": "http://10.0.0.0:9200",
"cluster_version": "2.3.5",
}
],
"status_code": 201,
"message": null,
"response_time": 92
}
**Response Structure**
- *(dict) --*
- **ip** *(string) --* IP address or host name
- **port** *(string) --* ES REST API port
- **use_ssl** *(boolean) --* Whether to use HTTPS or not.
:reqheader Accept: application/json
:resheader Content-Type: application/json
:status 201: connection created
:status 400: bad request
:status 500: server error
"""
json_data = request.get_json(force=True)
params = request.values.to_dict()
params.update(json_data)
if params.get('ip', None) is None:
raise BadRequest(message='Missing required parameters.')
scheme = 'http'
if params.get('use_ssl', False) is True:
scheme = 'https'
response = ConnectionService().create_connection(ip=params['ip'], port=params.get('port', "9200"),
scheme=scheme)
schema = ClusterDTO(many=False)
result = schema.dump(response)
return APIResponse(result.data, HTTP_Status.CREATED, None)
@request_wrapper
[docs] def delete(self, cluster_name):
"""
Deletes a connection from the connection pool and the database, by cluster name.
:type cluster_name: string
:param cluster_name: the name of the cluster.
:return: APIResponse
:rtype: elastichq.common.api_response.APIResponse
:rtype: :class: `elastichq.common.api_response.APIResponse`
"""
response = ConnectionService().delete_connection(cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
[docs]class ClusterList(Resource):
"""
Retrieves a list of all active and inactive cluster connections.
"""
@request_wrapper
[docs] def get(self):
"""
Retrieves a list of all active and inactive cluster connections.
:return:
**POST BODY**
::
{
"ip": "127.0.0.1",
"port" : "9200",
"use_ssl: true
}
**Request Structure**
- *(dict) --*
- **ip** *(string) --* IP address or host name
- **port** *(string) --* ES REST API port
- **use_ssl** *(boolean) --* Whether to use HTTPS or not.
"""
response = ClusterService().get_clusters()
schema = ClusterDTO(many=True)
result = schema.dump(response)
return APIResponse(result.data, HTTP_Status.OK, None)
[docs]class ClusterHealth(Resource):
"""
qq
"""
@request_wrapper
[docs] def get(self, cluster_name):
"""
Returns cluster health
:param cluster_name:
:return:
"""
response = ClusterService().get_cluster_health(cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
[docs]class ClusterState(Resource):
"""
q
"""
@request_wrapper
[docs] def get(self, cluster_name):
"""
"""
response = ClusterService().get_cluster_state(cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
[docs]class ClusterSummary(Resource):
"""
Brief summary for a given cluster name
"""
@request_wrapper
def get(self, cluster_name):
response = ClusterService().get_cluster_summary(cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
class ClusterStats(Resource):
@request_wrapper
def get(self, cluster_name):
response = ClusterService().get_cluster_stats(cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
class ClusterPendingTasks(Resource):
@request_wrapper
def get(self, cluster_name):
response = ClusterService().get_cluster_pending_tasks(cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
class ClusterSettings(Resource):
@request_wrapper
def get(self, cluster_name):
response = ClusterService().get_cluster_settings(cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
@request_wrapper
def put(self, cluster_name):
json_data = request.get_json(force=True)
response = ClusterService().put_cluster_settings(json_data, cluster_name)
return APIResponse(response, HTTP_Status.OK, None)
api.add_resource(ClusterConnection, '/clusters/_connect', '/clusters/<string:cluster_name>/_connect',
endpoint='clusters', methods=['POST', 'DELETE'])
api.add_resource(ClusterList, '/clusters', endpoint='clusters_list', methods=['GET'])
api.add_resource(ClusterStats, '/clusters/<string:cluster_name>/_stats', endpoint='clusters_stats', methods=['GET'])
api.add_resource(ClusterHealth, '/clusters/<string:cluster_name>/_health', endpoint='clusters_health', methods=['GET'])
api.add_resource(ClusterSummary, '/clusters/<string:cluster_name>/_summary', endpoint='clusters_summary',
methods=['GET'])
api.add_resource(ClusterState, '/clusters/<string:cluster_name>/_state', endpoint='clusters_state', methods=['GET'])
api.add_resource(ClusterPendingTasks, '/clusters/<string:cluster_name>/_pending_tasks',
endpoint='clusters_pending_tasks', methods=['GET'])
api.add_resource(ClusterSettings, '/clusters/<string:cluster_name>/_settings', endpoint='clusters_settings',
methods=['GET', 'PUT'])