Example #1
0
    def test_update_cluster(self):
        # Setup Expected Response
        project_id_2 = "projectId2939242356"
        cluster_name_2 = "clusterName2875867491"
        cluster_uuid = "clusterUuid-1017854240"
        expected_response = {
            "project_id": project_id_2,
            "cluster_name": cluster_name_2,
            "cluster_uuid": cluster_uuid,
        }
        expected_response = clusters_pb2.Cluster(**expected_response)
        operation = operations_pb2.Operation(
            name="operations/test_update_cluster", done=True
        )
        operation.response.Pack(expected_response)

        # Mock the API response
        channel = ChannelStub(responses=[operation])
        patch = mock.patch("google.api_core.grpc_helpers.create_channel")
        with patch as create_channel:
            create_channel.return_value = channel
            client = dataproc_v1beta2.ClusterControllerClient()

        # Setup Request
        project_id = "projectId-1969970175"
        region = "region-934795532"
        cluster_name = "clusterName-1018081872"
        cluster = {}
        update_mask = {}

        response = client.update_cluster(
            project_id, region, cluster_name, cluster, update_mask
        )
        result = response.result()
        assert expected_response == result

        assert len(channel.requests) == 1
        expected_request = clusters_pb2.UpdateClusterRequest(
            project_id=project_id,
            region=region,
            cluster_name=cluster_name,
            cluster=cluster,
            update_mask=update_mask,
        )
        actual_request = channel.requests[0][1]
        assert expected_request == actual_request
    def test_update_cluster(self):
        # Setup Expected Response
        project_id_2 = 'projectId2939242356'
        cluster_name_2 = 'clusterName2875867491'
        cluster_uuid = 'clusterUuid-1017854240'
        expected_response = {
            'project_id': project_id_2,
            'cluster_name': cluster_name_2,
            'cluster_uuid': cluster_uuid
        }
        expected_response = clusters_pb2.Cluster(**expected_response)
        operation = operations_pb2.Operation(
            name='operations/test_update_cluster', done=True)
        operation.response.Pack(expected_response)

        # Mock the API response
        channel = ChannelStub(responses=[operation])
        client = dataproc_v1beta2.ClusterControllerClient(channel=channel)

        # Setup Request
        project_id = 'projectId-1969970175'
        region = 'region-934795532'
        cluster_name = 'clusterName-1018081872'
        cluster = {}
        update_mask = {}

        response = client.update_cluster(project_id, region, cluster_name,
                                         cluster, update_mask)
        result = response.result()
        assert expected_response == result

        assert len(channel.requests) == 1
        expected_request = clusters_pb2.UpdateClusterRequest(
            project_id=project_id,
            region=region,
            cluster_name=cluster_name,
            cluster=cluster,
            update_mask=update_mask)
        actual_request = channel.requests[0][1]
        assert expected_request == actual_request
    def update_cluster(
        self,
        project_id,
        region,
        cluster_name,
        cluster,
        update_mask,
        graceful_decommission_timeout=None,
        request_id=None,
        retry=google.api_core.gapic_v1.method.DEFAULT,
        timeout=google.api_core.gapic_v1.method.DEFAULT,
        metadata=None,
    ):
        """
        Updates a cluster in a project. The returned ``Operation.metadata`` will
        be
        `ClusterOperationMetadata <https://cloud.google.com/dataproc/docs/reference/rpc/google.cloud.dataproc.v1beta2#clusteroperationmetadata>`__.

        Example:
            >>> from google.cloud import dataproc_v1beta2
            >>>
            >>> client = dataproc_v1beta2.ClusterControllerClient()
            >>>
            >>> # TODO: Initialize `project_id`:
            >>> project_id = ''
            >>>
            >>> # TODO: Initialize `region`:
            >>> region = ''
            >>>
            >>> # TODO: Initialize `cluster_name`:
            >>> cluster_name = ''
            >>>
            >>> # TODO: Initialize `cluster`:
            >>> cluster = {}
            >>>
            >>> # TODO: Initialize `update_mask`:
            >>> update_mask = {}
            >>>
            >>> response = client.update_cluster(project_id, region, cluster_name, cluster, update_mask)
            >>>
            >>> def callback(operation_future):
            ...     # Handle result.
            ...     result = operation_future.result()
            >>>
            >>> response.add_done_callback(callback)
            >>>
            >>> # Handle metadata.
            >>> metadata = response.metadata()

        Args:
            project_id (str): Required. The ID of the Google Cloud Platform project the
                cluster belongs to.
            region (str): Required. The Cloud Dataproc region in which to handle the request.
            cluster_name (str): Required. The cluster name.
            cluster (Union[dict, ~google.cloud.dataproc_v1beta2.types.Cluster]): Required. The changes to the cluster.

                If a dict is provided, it must be of the same form as the protobuf
                message :class:`~google.cloud.dataproc_v1beta2.types.Cluster`
            update_mask (Union[dict, ~google.cloud.dataproc_v1beta2.types.FieldMask]): Required. Specifies the path, relative to ``Cluster``, of the field to
                update. For example, to change the number of workers in a cluster to 5,
                the ``update_mask`` parameter would be specified as
                ``config.worker_config.num_instances``, and the ``PATCH`` request body
                would specify the new value, as follows:

                ::

                     {
                       "config":{
                         "workerConfig":{
                           "numInstances":"5"
                         }
                       }
                     }

                Similarly, to change the number of preemptible workers in a cluster to
                5, the ``update_mask`` parameter would be
                ``config.secondary_worker_config.num_instances``, and the ``PATCH``
                request body would be set as follows:

                ::

                     {
                       "config":{
                         "secondaryWorkerConfig":{
                           "numInstances":"5"
                         }
                       }
                     }

                Note: currently only the following fields can be updated:

                .. raw:: html

                    <table>
                    <tr>
                    <td><strong>Mask</strong></td><td><strong>Purpose</strong></td>
                    </tr>
                    <tr>
                    <td>labels</td><td>Updates labels</td>
                    </tr>
                    <tr>
                    <td>config.worker_config.num_instances</td><td>Resize primary worker
                    group</td>
                    </tr>
                    <tr>
                    <td>config.secondary_worker_config.num_instances</td><td>Resize secondary
                    worker group</td>
                    </tr>
                    <tr>
                    <td>config.lifecycle_config.auto_delete_ttl</td><td>Reset MAX TTL
                    duration</td>
                    </tr>
                    <tr>
                    <td>config.lifecycle_config.auto_delete_time</td><td>Update MAX TTL
                    deletion timestamp</td>
                    </tr>
                    <tr>
                    <td>config.lifecycle_config.idle_delete_ttl</td><td>Update Idle TTL
                    duration</td>
                    </tr>
                    <tr>
                    <td>config.autoscaling_config.policy_uri</td><td>Use, stop using, or change
                    autoscaling policies</td>
                    </tr>
                    </table>

                If a dict is provided, it must be of the same form as the protobuf
                message :class:`~google.cloud.dataproc_v1beta2.types.FieldMask`
            graceful_decommission_timeout (Union[dict, ~google.cloud.dataproc_v1beta2.types.Duration]): Optional. Timeout for graceful YARN decomissioning. Graceful
                decommissioning allows removing nodes from the cluster without
                interrupting jobs in progress. Timeout specifies how long to wait for jobs
                in progress to finish before forcefully removing nodes (and potentially
                interrupting jobs). Default timeout is 0 (for forceful decommission), and
                the maximum allowed timeout is 1 day.

                Only supported on Dataproc image versions 1.2 and higher.

                If a dict is provided, it must be of the same form as the protobuf
                message :class:`~google.cloud.dataproc_v1beta2.types.Duration`
            request_id (str): Optional. A unique id used to identify the request. If the server
                receives two ``UpdateClusterRequest`` requests with the same id, then
                the second request will be ignored and the first
                ``google.longrunning.Operation`` created and stored in the backend is
                returned.

                It is recommended to always set this value to a
                `UUID <https://en.wikipedia.org/wiki/Universally_unique_identifier>`__.

                The id must contain only letters (a-z, A-Z), numbers (0-9), underscores
                (\_), and hyphens (-). The maximum length is 40 characters.
            retry (Optional[google.api_core.retry.Retry]):  A retry object used
                to retry requests. If ``None`` is specified, requests will
                be retried using a default configuration.
            timeout (Optional[float]): The amount of time, in seconds, to wait
                for the request to complete. Note that if ``retry`` is
                specified, the timeout applies to each individual attempt.
            metadata (Optional[Sequence[Tuple[str, str]]]): Additional metadata
                that is provided to the method.

        Returns:
            A :class:`~google.cloud.dataproc_v1beta2.types._OperationFuture` instance.

        Raises:
            google.api_core.exceptions.GoogleAPICallError: If the request
                    failed for any reason.
            google.api_core.exceptions.RetryError: If the request failed due
                    to a retryable error and retry attempts failed.
            ValueError: If the parameters are invalid.
        """
        # Wrap the transport method to add retry and timeout logic.
        if "update_cluster" not in self._inner_api_calls:
            self._inner_api_calls[
                "update_cluster"
            ] = google.api_core.gapic_v1.method.wrap_method(
                self.transport.update_cluster,
                default_retry=self._method_configs["UpdateCluster"].retry,
                default_timeout=self._method_configs["UpdateCluster"].timeout,
                client_info=self._client_info,
            )

        request = clusters_pb2.UpdateClusterRequest(
            project_id=project_id,
            region=region,
            cluster_name=cluster_name,
            cluster=cluster,
            update_mask=update_mask,
            graceful_decommission_timeout=graceful_decommission_timeout,
            request_id=request_id,
        )
        operation = self._inner_api_calls["update_cluster"](
            request, retry=retry, timeout=timeout, metadata=metadata
        )
        return google.api_core.operation.from_gapic(
            operation,
            self.transport._operations_client,
            clusters_pb2.Cluster,
            metadata_type=proto_operations_pb2.ClusterOperationMetadata,
        )