From 9d3098ebaf4718838edc714f2c1d3b02a992c398 Mon Sep 17 00:00:00 2001 From: Morgan Jones Date: Wed, 24 Aug 2016 14:30:19 -0400 Subject: [PATCH] Cluster Upgrade Implements the Clusters.upgrade python API and corresponding shell command. Implements blueprint: bp/cluster-upgrade Change-Id: Iedb08c99bf8eb2a0b0d09e3c1ebd11965fdfff90 --- .../notes/cluster-upgrade-d58d1fc4b8da0a03.yaml | 3 +++ troveclient/tests/test_clusters.py | 10 ++++++++++ troveclient/tests/test_v1_shell.py | 5 +++++ troveclient/v1/clusters.py | 9 +++++++++ troveclient/v1/shell.py | 12 ++++++++++++ 5 files changed, 39 insertions(+) create mode 100644 releasenotes/notes/cluster-upgrade-d58d1fc4b8da0a03.yaml diff --git a/releasenotes/notes/cluster-upgrade-d58d1fc4b8da0a03.yaml b/releasenotes/notes/cluster-upgrade-d58d1fc4b8da0a03.yaml new file mode 100644 index 00000000..9d672cd5 --- /dev/null +++ b/releasenotes/notes/cluster-upgrade-d58d1fc4b8da0a03.yaml @@ -0,0 +1,3 @@ +features: + - Added cluster-upgrade command to upgrade all instances + in a cluster to a new datastore version. diff --git a/troveclient/tests/test_clusters.py b/troveclient/tests/test_clusters.py index 0ccda058..710b3c14 100644 --- a/troveclient/tests/test_clusters.py +++ b/troveclient/tests/test_clusters.py @@ -102,6 +102,16 @@ class ClustersTest(testtools.TestCase): self.assertEqual(('/clusters/cluster1', 'cluster'), clusters_test.get(1)) + def test_upgrade(self): + resp = mock.Mock() + resp.status_code = 200 + body = None + clusters_test = self.get_clusters() + clusters_test.api.client.post = mock.Mock(return_value=(resp, body)) + clusters_test.upgrade('cluster1', '5.6') + resp.status_code = 500 + self.assertRaises(Exception, clusters_test.upgrade, 'cluster1', '5.6') + def test_delete(self): resp = mock.Mock() resp.status_code = 200 diff --git a/troveclient/tests/test_v1_shell.py b/troveclient/tests/test_v1_shell.py index 58c9d4cb..0e55947b 100644 --- a/troveclient/tests/test_v1_shell.py +++ b/troveclient/tests/test_v1_shell.py @@ -474,6 +474,11 @@ class ShellTest(utils.TestCase): self.run_command(cmd) self.assert_called('POST', '/clusters/cls-1234') + def test_cluster_upgrade(self): + cmd = ('cluster-upgrade cls-1234 1234') + self.run_command(cmd) + self.assert_called('POST', '/clusters/cls-1234') + def test_cluster_create_with_locality(self): cmd = ('cluster-create test-clstr2 redis 3.0 --locality=affinity ' '--instance flavor=2,volume=1 ' diff --git a/troveclient/v1/clusters.py b/troveclient/v1/clusters.py index 451bfe8e..b7e5dddb 100644 --- a/troveclient/v1/clusters.py +++ b/troveclient/v1/clusters.py @@ -126,6 +126,15 @@ class Clusters(base.ManagerWithFind): body = {"shrink": instances} return self._action(cluster, body) + def upgrade(self, cluster, datastore_version): + """Upgrades a cluster to a new datastore version. + + :param cluster: The cluster to upgrade + :param datastore_version: Datastore version to which to upgrade + """ + body = {"upgrade": {'datastore_version': datastore_version}} + return self._action(cluster, body) + class ClusterStatus(object): diff --git a/troveclient/v1/shell.py b/troveclient/v1/shell.py index 32a33bb1..bff44589 100644 --- a/troveclient/v1/shell.py +++ b/troveclient/v1/shell.py @@ -414,6 +414,18 @@ def do_cluster_reset_status(cs, args): cs.clusters.reset_status(cluster) +@utils.arg('cluster', metavar='', + help=_('ID or name of the cluster.')) +@utils.arg('datastore_version', + metavar='', + help=_('A datastore version name or ID.')) +@utils.service_type('database') +def do_cluster_upgrade(cs, args): + """Upgrades a cluster to a new datastore version.""" + cluster = _find_cluster(cs, args.cluster) + cs.clusters.upgrade(cluster, args.datastore_version) + + @utils.arg('instance', metavar='', type=str,