Skip to content

Commit b4013b3

Browse files
committed
Merge pull request #1270 from dhermes/bigtable-cluster-update
Implementing Bigtable Cluster.update().
2 parents cda34f4 + f6248a4 commit b4013b3

2 files changed

Lines changed: 120 additions & 0 deletions

File tree

gcloud/bigtable/cluster.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@
3838
_TYPE_URL_BASE = 'type.googleapis.com/google.bigtable.'
3939
_ADMIN_TYPE_URL_BASE = _TYPE_URL_BASE + 'admin.cluster.v1.'
4040
_CLUSTER_CREATE_METADATA = _ADMIN_TYPE_URL_BASE + 'CreateClusterMetadata'
41+
_UPDATE_CREATE_METADATA = _ADMIN_TYPE_URL_BASE + 'UpdateClusterMetadata'
4142
_TYPE_URL_MAP = {
4243
_CLUSTER_CREATE_METADATA: messages_pb2.CreateClusterMetadata,
44+
_UPDATE_CREATE_METADATA: messages_pb2.UpdateClusterMetadata,
4345
}
4446

4547

@@ -384,6 +386,37 @@ def create(self):
384386
op_id, op_begin = _process_operation(cluster_pb.current_operation)
385387
return Operation('create', op_id, op_begin)
386388

389+
def update(self):
390+
"""Update this cluster.
391+
392+
.. note::
393+
394+
Updates the ``display_name`` and ``serve_nodes``. If you'd like to
395+
change them before updating, reset the values via
396+
397+
.. code:: python
398+
399+
cluster.display_name = 'New display name'
400+
cluster.serve_nodes = 3
401+
402+
before calling :meth:`update`.
403+
404+
:rtype: :class:`Operation`
405+
:returns: The long-running operation corresponding to the
406+
update operation.
407+
"""
408+
request_pb = data_pb2.Cluster(
409+
name=self.name,
410+
display_name=self.display_name,
411+
serve_nodes=self.serve_nodes,
412+
)
413+
# We expect a `._generated.bigtable_cluster_data_pb2.Cluster`.
414+
cluster_pb = self._client._cluster_stub.UpdateCluster(
415+
request_pb, self._client.timeout_seconds)
416+
417+
op_id, op_begin = _process_operation(cluster_pb.current_operation)
418+
return Operation('update', op_id, op_begin)
419+
387420
def delete(self):
388421
"""Delete this cluster.
389422

gcloud/bigtable/test_cluster.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,66 @@ def mock_process_operation(operation_pb):
413413
self.assertEqual(prep_create_called, [cluster])
414414
self.assertEqual(process_operation_called, [current_op])
415415

416+
def test_update(self):
417+
from gcloud._testing import _Monkey
418+
from gcloud.bigtable._generated import (
419+
bigtable_cluster_data_pb2 as data_pb2)
420+
from gcloud.bigtable._generated import operations_pb2
421+
from gcloud.bigtable._testing import _FakeStub
422+
from gcloud.bigtable import cluster as MUT
423+
424+
project = 'PROJECT'
425+
zone = 'zone'
426+
cluster_id = 'cluster-id'
427+
serve_nodes = 81
428+
display_name = 'display_name'
429+
timeout_seconds = 9
430+
431+
client = _Client(project, timeout_seconds=timeout_seconds)
432+
cluster = self._makeOne(zone, cluster_id, client,
433+
display_name=display_name,
434+
serve_nodes=serve_nodes)
435+
436+
# Create request_pb
437+
cluster_name = ('projects/' + project + '/zones/' + zone +
438+
'/clusters/' + cluster_id)
439+
request_pb = data_pb2.Cluster(
440+
name=cluster_name,
441+
display_name=display_name,
442+
serve_nodes=serve_nodes,
443+
)
444+
445+
# Create response_pb
446+
current_op = operations_pb2.Operation()
447+
response_pb = data_pb2.Cluster(current_operation=current_op)
448+
449+
# Patch the stub used by the API method.
450+
client._cluster_stub = stub = _FakeStub(response_pb)
451+
452+
# Create expected_result.
453+
op_id = 5678
454+
op_begin = object()
455+
expected_result = MUT.Operation('update', op_id, op_begin)
456+
457+
# Create mocks
458+
process_operation_called = []
459+
460+
def mock_process_operation(operation_pb):
461+
process_operation_called.append(operation_pb)
462+
return op_id, op_begin
463+
464+
# Perform the method and check the result.
465+
with _Monkey(MUT, _process_operation=mock_process_operation):
466+
result = cluster.update()
467+
468+
self.assertEqual(result, expected_result)
469+
self.assertEqual(stub.method_calls, [(
470+
'UpdateCluster',
471+
(request_pb, timeout_seconds),
472+
{},
473+
)])
474+
self.assertEqual(process_operation_called, [current_op])
475+
416476
def test_delete(self):
417477
from gcloud.bigtable._generated import (
418478
bigtable_cluster_service_messages_pb2 as messages_pb2)
@@ -651,6 +711,33 @@ def test_with_create_cluster_metadata(self):
651711
result = self._callFUT(any_val)
652712
self.assertEqual(result, metadata)
653713

714+
def test_with_update_cluster_metadata(self):
715+
from gcloud.bigtable._generated import any_pb2
716+
from gcloud.bigtable._generated import (
717+
bigtable_cluster_data_pb2 as data_pb2)
718+
from gcloud.bigtable._generated import (
719+
bigtable_cluster_service_messages_pb2 as messages_pb2)
720+
from gcloud.bigtable._generated.timestamp_pb2 import Timestamp
721+
722+
type_url = ('type.googleapis.com/' +
723+
messages_pb2._UPDATECLUSTERMETADATA.full_name)
724+
metadata = messages_pb2.UpdateClusterMetadata(
725+
request_time=Timestamp(seconds=1, nanos=1234),
726+
finish_time=Timestamp(seconds=10, nanos=891011),
727+
cancel_time=Timestamp(seconds=100, nanos=76543),
728+
original_request=data_pb2.Cluster(
729+
display_name='the-end',
730+
serve_nodes=42,
731+
),
732+
)
733+
734+
any_val = any_pb2.Any(
735+
type_url=type_url,
736+
value=metadata.SerializeToString(),
737+
)
738+
result = self._callFUT(any_val)
739+
self.assertEqual(result, metadata)
740+
654741
def test_unknown_type_url(self):
655742
from gcloud._testing import _Monkey
656743
from gcloud.bigtable._generated import any_pb2

0 commit comments

Comments
 (0)