| import json |
| import os |
| |
| from twitter.common.http import HttpServer, route, static_file |
| |
| from .launcher import MySQLClusterLauncher |
| from .scheduler import MysosScheduler |
| |
| import bottle |
| from mako.template import Template |
| |
| |
| class MysosServer(HttpServer): |
| def __init__(self, scheduler, asset_dir): |
| super(MysosServer, self).__init__() |
| self._scheduler = scheduler |
| self._asset_dir = asset_dir |
| |
| self._static_dir = os.path.join(self._asset_dir, 'static') |
| self._template_dir = os.path.join(self._asset_dir, 'templates') |
| |
| self._clusters_template = Template(filename=os.path.join(self._template_dir, 'clusters.html')) |
| |
| @route('/clusters/<clustername>', method=['POST']) |
| def create(self, clustername): |
| """Create a db cluster.""" |
| cluster_name = clustername # For naming consistency. |
| num_nodes = bottle.request.forms.get('num_nodes', default=3) |
| cluster_user = bottle.request.forms.get('cluster_user', default=None) |
| backup_id = bottle.request.forms.get('backup_id', default=None) |
| |
| try: |
| cluster_zk_url, cluster_password = self._scheduler.create_cluster( |
| cluster_name, |
| cluster_user, |
| num_nodes, |
| backup_id=backup_id) |
| return json.dumps(dict(cluster_url=cluster_zk_url, cluster_password=cluster_password)) |
| except MysosScheduler.ClusterExists as e: |
| raise bottle.HTTPResponse(e.message, status=409) |
| except MysosScheduler.InvalidUser as e: |
| raise bottle.HTTPResponse(e.message, status=400) |
| except MysosScheduler.ServiceUnavailable as e: |
| raise bottle.HTTPResponse(e.message, status=503) |
| except ValueError as e: |
| raise bottle.HTTPResponse(e.message, status=400) |
| |
| |
| @route('/clusters/<clustername>', method=['DELETE']) |
| def remove(self, clustername): |
| """Remove a db cluster.""" |
| cluster_name = clustername # For naming consistency. |
| |
| password = bottle.request.forms.get('password', default=None) |
| |
| try: |
| cluster_zk_url = self._scheduler.delete_cluster(cluster_name, password) |
| return json.dumps(dict(cluster_url=cluster_zk_url)) |
| except MysosScheduler.ClusterNotFound as e: |
| raise bottle.HTTPResponse(e.message, status=404) |
| except MySQLClusterLauncher.PermissionError as e: |
| raise bottle.HTTPResponse(e.message, status=403) |
| |
| @route('/', method=['GET']) |
| def clusters(self): |
| """Landing page, showing the list of managed clusters.""" |
| if not self._scheduler.connected.is_set(): |
| return "<h1>Mysos scheduler is still connecting...</h1>" |
| |
| return self._clusters_template.render(clusters=self._scheduler.clusters) |
| |
| @route('/static/<filepath:path>', method=['GET']) |
| def serve_static(self, filepath): |
| return static_file(filepath, root=self._static_dir) |