d95cefff2a
Implements the CLI and python-API methods to support the clustering commands, including the new cluster scaling commands. Change-Id: Icc9b4eea8ed7db1455692823d29586088cfc9434 Implements: blueprint redis-cluster
120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
# Copyright (c) 2014 eBay Software Foundation
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from troveclient import base
|
|
from troveclient import common
|
|
|
|
|
|
class Cluster(base.Resource):
|
|
"""A Cluster is an opaque cluster used to store Database clusters."""
|
|
def __repr__(self):
|
|
return "<Cluster: %s>" % self.name
|
|
|
|
def delete(self):
|
|
"""Delete the cluster."""
|
|
self.manager.delete(self)
|
|
|
|
|
|
class Clusters(base.ManagerWithFind):
|
|
"""Manage :class:`Cluster` resources."""
|
|
resource_class = Cluster
|
|
|
|
def create(self, name, datastore, datastore_version, instances=None):
|
|
"""Create (boot) a new cluster."""
|
|
body = {"cluster": {
|
|
"name": name
|
|
}}
|
|
datastore_obj = {
|
|
"type": datastore,
|
|
"version": datastore_version
|
|
}
|
|
body["cluster"]["datastore"] = datastore_obj
|
|
if instances:
|
|
body["cluster"]["instances"] = instances
|
|
|
|
return self._create("/clusters", body, "cluster")
|
|
|
|
def list(self, limit=None, marker=None):
|
|
"""Get a list of all clusters.
|
|
|
|
:rtype: list of :class:`Cluster`.
|
|
"""
|
|
return self._paginated("/clusters", "clusters", limit, marker)
|
|
|
|
def get(self, cluster):
|
|
"""Get a specific cluster.
|
|
|
|
:rtype: :class:`Cluster`
|
|
"""
|
|
return self._get("/clusters/%s" % base.getid(cluster),
|
|
"cluster")
|
|
|
|
def delete(self, cluster):
|
|
"""Delete the specified cluster.
|
|
|
|
:param cluster: The cluster to delete
|
|
"""
|
|
url = "/clusters/%s" % base.getid(cluster)
|
|
resp, body = self.api.client.delete(url)
|
|
common.check_for_exceptions(resp, body, url)
|
|
|
|
def _action(self, cluster, body):
|
|
"""Perform a cluster "action" -- grow/shrink/etc."""
|
|
url = "/clusters/%s" % base.getid(cluster)
|
|
resp, body = self.api.client.post(url, body=body)
|
|
common.check_for_exceptions(resp, body, url)
|
|
if body:
|
|
return self.resource_class(self, body['cluster'], loaded=True)
|
|
return body
|
|
|
|
def add_shard(self, cluster):
|
|
"""Adds a shard to the specified cluster.
|
|
|
|
:param cluster: The cluster to add a shard to
|
|
"""
|
|
url = "/clusters/%s" % base.getid(cluster)
|
|
body = {"add_shard": {}}
|
|
resp, body = self.api.client.post(url, body=body)
|
|
common.check_for_exceptions(resp, body, url)
|
|
if body:
|
|
return self.resource_class(self, body, loaded=True)
|
|
return body
|
|
|
|
def grow(self, cluster, instances=None):
|
|
"""Grow a cluster.
|
|
|
|
:param cluster: The cluster to grow
|
|
:param instances: List of instances to add
|
|
"""
|
|
body = {"grow": instances}
|
|
return self._action(cluster, body)
|
|
|
|
def shrink(self, cluster, instances=None):
|
|
"""Shrink a cluster.
|
|
|
|
:param cluster: The cluster to shrink
|
|
:param instances: List of instances to drop
|
|
"""
|
|
body = {"shrink": instances}
|
|
return self._action(cluster, body)
|
|
|
|
|
|
class ClusterStatus(object):
|
|
|
|
ACTIVE = "ACTIVE"
|
|
BUILD = "BUILD"
|
|
FAILED = "FAILED"
|
|
SHUTDOWN = "SHUTDOWN"
|