diff --git a/google/cloud/recommender_v1/gapic/enums.py b/google/cloud/recommender_v1/gapic/enums.py index a4c452d..a794132 100644 --- a/google/cloud/recommender_v1/gapic/enums.py +++ b/google/cloud/recommender_v1/gapic/enums.py @@ -53,10 +53,54 @@ class Category(enum.IntEnum): MANAGEABILITY = 4 +class Insight(object): + class Category(enum.IntEnum): + """ + Insight category. + + Attributes: + CATEGORY_UNSPECIFIED (int): Unspecified category. + COST (int): The insight is related to cost. + SECURITY (int): The insight is related to security. + PERFORMANCE (int): The insight is related to performance. + MANAGEABILITY (int): This insight is related to manageability. + """ + + CATEGORY_UNSPECIFIED = 0 + COST = 1 + SECURITY = 2 + PERFORMANCE = 3 + MANAGEABILITY = 4 + + +class InsightStateInfo(object): + class State(enum.IntEnum): + """ + Represents insight state. + + Attributes: + STATE_UNSPECIFIED (int): Unspecified state. + ACTIVE (int): Insight is active. Content for ACTIVE insights can be updated by Google. + ACTIVE insights can be marked DISMISSED OR ACCEPTED. + ACCEPTED (int): Some action has been taken based on this insight. Insights become + accepted when a recommendation derived from the insight has been marked + CLAIMED, SUCCEEDED, or FAILED. ACTIVE insights can also be marked + ACCEPTED explicitly. Content for ACCEPTED insights is immutable. ACCEPTED + insights can only be marked ACCEPTED (which may update state metadata). + DISMISSED (int): Insight is dismissed. Content for DISMISSED insights can be updated by + Google. DISMISSED insights can be marked as ACTIVE. + """ + + STATE_UNSPECIFIED = 0 + ACTIVE = 1 + ACCEPTED = 2 + DISMISSED = 3 + + class RecommendationStateInfo(object): class State(enum.IntEnum): """ - Represents Recommendation State + Represents Recommendation State. Attributes: STATE_UNSPECIFIED (int): Default state. Don't use directly. diff --git a/google/cloud/recommender_v1/gapic/recommender_client.py b/google/cloud/recommender_v1/gapic/recommender_client.py index 308aaaa..cd86757 100644 --- a/google/cloud/recommender_v1/gapic/recommender_client.py +++ b/google/cloud/recommender_v1/gapic/recommender_client.py @@ -34,6 +34,7 @@ from google.cloud.recommender_v1.gapic import enums from google.cloud.recommender_v1.gapic import recommender_client_config from google.cloud.recommender_v1.gapic.transports import recommender_grpc_transport +from google.cloud.recommender_v1.proto import insight_pb2 from google.cloud.recommender_v1.proto import recommendation_pb2 from google.cloud.recommender_v1.proto import recommender_service_pb2 from google.cloud.recommender_v1.proto import recommender_service_pb2_grpc @@ -46,10 +47,10 @@ class RecommenderClient(object): """ - Provides recommendations for cloud customers for various categories like - performance optimization, cost savings, reliability, feature discovery, etc. - These recommendations are generated automatically based on analysis of user - resources, configuration and monitoring metrics. + Provides insights and recommendations for cloud customers for various + categories like performance optimization, cost savings, reliability, feature + discovery, etc. Insights and recommendations are generated automatically + based on analysis of user resources, configuration and monitoring metrics. """ SERVICE_ADDRESS = "recommender.googleapis.com:443" @@ -79,6 +80,27 @@ def from_service_account_file(cls, filename, *args, **kwargs): from_service_account_json = from_service_account_file + @classmethod + def insight_path(cls, project, location, insight_type, insight): + """Return a fully-qualified insight string.""" + return google.api_core.path_template.expand( + "projects/{project}/locations/{location}/insightTypes/{insight_type}/insights/{insight}", + project=project, + location=location, + insight_type=insight_type, + insight=insight, + ) + + @classmethod + def insight_type_path(cls, project, location, insight_type): + """Return a fully-qualified insight_type string.""" + return google.api_core.path_template.expand( + "projects/{project}/locations/{location}/insightTypes/{insight_type}", + project=project, + location=location, + insight_type=insight_type, + ) + @classmethod def recommendation_path(cls, project, location, recommender, recommendation): """Return a fully-qualified recommendation string.""" @@ -213,6 +235,275 @@ def __init__( self._inner_api_calls = {} # Service calls + def list_insights( + self, + parent, + page_size=None, + filter_=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT, + metadata=None, + ): + """ + Lists insights for a Cloud project. Requires the recommender.*.list + IAM permission for the specified insight type. + + Example: + >>> from google.cloud import recommender_v1 + >>> + >>> client = recommender_v1.RecommenderClient() + >>> + >>> parent = client.insight_type_path('[PROJECT]', '[LOCATION]', '[INSIGHT_TYPE]') + >>> + >>> # Iterate over all results + >>> for element in client.list_insights(parent): + ... # process element + ... pass + >>> + >>> + >>> # Alternatively: + >>> + >>> # Iterate over results one page at a time + >>> for page in client.list_insights(parent).pages: + ... for element in page: + ... # process element + ... pass + + Args: + parent (str): Required. The container resource on which to execute the request. + Acceptable formats: + + 1. + + "projects/[PROJECT_NUMBER]/locations/[LOCATION]/insightTypes/[INSIGHT_TYPE_ID]", + + LOCATION here refers to GCP Locations: + https://cloud.google.com/about/locations/ + page_size (int): The maximum number of resources contained in the + underlying API response. If page streaming is performed per- + resource, this parameter does not affect the return value. If page + streaming is performed per-page, this determines the maximum number + of resources in a page. + filter_ (str): Optional. Filter expression to restrict the insights returned. + Supported filter fields: state Eg: \`state:"DISMISSED" or state:"ACTIVE" + 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.api_core.page_iterator.PageIterator` instance. + An iterable of :class:`~google.cloud.recommender_v1.types.Insight` instances. + You can also iterate over the pages of the response + using its `pages` property. + + 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 "list_insights" not in self._inner_api_calls: + self._inner_api_calls[ + "list_insights" + ] = google.api_core.gapic_v1.method.wrap_method( + self.transport.list_insights, + default_retry=self._method_configs["ListInsights"].retry, + default_timeout=self._method_configs["ListInsights"].timeout, + client_info=self._client_info, + ) + + request = recommender_service_pb2.ListInsightsRequest( + parent=parent, page_size=page_size, filter=filter_ + ) + if metadata is None: + metadata = [] + metadata = list(metadata) + try: + routing_header = [("parent", parent)] + except AttributeError: + pass + else: + routing_metadata = google.api_core.gapic_v1.routing_header.to_grpc_metadata( + routing_header + ) + metadata.append(routing_metadata) + + iterator = google.api_core.page_iterator.GRPCIterator( + client=None, + method=functools.partial( + self._inner_api_calls["list_insights"], + retry=retry, + timeout=timeout, + metadata=metadata, + ), + request=request, + items_field="insights", + request_token_field="page_token", + response_token_field="next_page_token", + ) + return iterator + + def get_insight( + self, + name, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT, + metadata=None, + ): + """ + Gets the requested insight. Requires the recommender.*.get IAM + permission for the specified insight type. + + Example: + >>> from google.cloud import recommender_v1 + >>> + >>> client = recommender_v1.RecommenderClient() + >>> + >>> name = client.insight_path('[PROJECT]', '[LOCATION]', '[INSIGHT_TYPE]', '[INSIGHT]') + >>> + >>> response = client.get_insight(name) + + Args: + name (str): Required. Name of the insight. + 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.recommender_v1.types.Insight` 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 "get_insight" not in self._inner_api_calls: + self._inner_api_calls[ + "get_insight" + ] = google.api_core.gapic_v1.method.wrap_method( + self.transport.get_insight, + default_retry=self._method_configs["GetInsight"].retry, + default_timeout=self._method_configs["GetInsight"].timeout, + client_info=self._client_info, + ) + + request = recommender_service_pb2.GetInsightRequest(name=name) + if metadata is None: + metadata = [] + metadata = list(metadata) + try: + routing_header = [("name", name)] + except AttributeError: + pass + else: + routing_metadata = google.api_core.gapic_v1.routing_header.to_grpc_metadata( + routing_header + ) + metadata.append(routing_metadata) + + return self._inner_api_calls["get_insight"]( + request, retry=retry, timeout=timeout, metadata=metadata + ) + + def mark_insight_accepted( + self, + name, + etag, + state_metadata=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT, + metadata=None, + ): + """ + Marks the Insight State as Accepted. Users can use this method to + indicate to the Recommender API that they have applied some action based + on the insight. This stops the insight content from being updated. + + MarkInsightAccepted can be applied to insights in ACTIVE state. Requires + the recommender.*.update IAM permission for the specified insight. + + Example: + >>> from google.cloud import recommender_v1 + >>> + >>> client = recommender_v1.RecommenderClient() + >>> + >>> name = client.insight_path('[PROJECT]', '[LOCATION]', '[INSIGHT_TYPE]', '[INSIGHT]') + >>> + >>> # TODO: Initialize `etag`: + >>> etag = '' + >>> + >>> response = client.mark_insight_accepted(name, etag) + + Args: + name (str): Required. Name of the insight. + etag (str): Required. Fingerprint of the Insight. Provides optimistic locking. + state_metadata (dict[str -> str]): Optional. State properties user wish to include with this state. + Full replace of the current state_metadata. + 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.recommender_v1.types.Insight` 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 "mark_insight_accepted" not in self._inner_api_calls: + self._inner_api_calls[ + "mark_insight_accepted" + ] = google.api_core.gapic_v1.method.wrap_method( + self.transport.mark_insight_accepted, + default_retry=self._method_configs["MarkInsightAccepted"].retry, + default_timeout=self._method_configs["MarkInsightAccepted"].timeout, + client_info=self._client_info, + ) + + request = recommender_service_pb2.MarkInsightAcceptedRequest( + name=name, etag=etag, state_metadata=state_metadata + ) + if metadata is None: + metadata = [] + metadata = list(metadata) + try: + routing_header = [("name", name)] + except AttributeError: + pass + else: + routing_metadata = google.api_core.gapic_v1.routing_header.to_grpc_metadata( + routing_header + ) + metadata.append(routing_metadata) + + return self._inner_api_calls["mark_insight_accepted"]( + request, retry=retry, timeout=timeout, metadata=metadata + ) + def list_recommendations( self, parent, @@ -409,10 +700,11 @@ def mark_recommendation_claimed( metadata=None, ): """ - Mark the Recommendation State as Claimed. Users can use this method + Marks the Recommendation State as Claimed. Users can use this method to indicate to the Recommender API that they are starting to apply the recommendation themselves. This stops the recommendation content from - being updated. + being updated. Associated insights are frozen and placed in the ACCEPTED + state. MarkRecommendationClaimed can be applied to recommendations in CLAIMED, SUCCEEDED, FAILED, or ACTIVE state. @@ -501,10 +793,11 @@ def mark_recommendation_succeeded( metadata=None, ): """ - Mark the Recommendation State as Succeeded. Users can use this + Marks the Recommendation State as Succeeded. Users can use this method to indicate to the Recommender API that they have applied the recommendation themselves, and the operation was successful. This stops - the recommendation content from being updated. + the recommendation content from being updated. Associated insights are + frozen and placed in the ACCEPTED state. MarkRecommendationSucceeded can be applied to recommendations in ACTIVE, CLAIMED, SUCCEEDED, or FAILED state. @@ -593,10 +886,11 @@ def mark_recommendation_failed( metadata=None, ): """ - Mark the Recommendation State as Failed. Users can use this method + Marks the Recommendation State as Failed. Users can use this method to indicate to the Recommender API that they have applied the recommendation themselves, and the operation failed. This stops the - recommendation content from being updated. + recommendation content from being updated. Associated insights are + frozen and placed in the ACCEPTED state. MarkRecommendationFailed can be applied to recommendations in ACTIVE, CLAIMED, SUCCEEDED, or FAILED state. diff --git a/google/cloud/recommender_v1/gapic/recommender_client_config.py b/google/cloud/recommender_v1/gapic/recommender_client_config.py index ef6ad0e..ef9192c 100644 --- a/google/cloud/recommender_v1/gapic/recommender_client_config.py +++ b/google/cloud/recommender_v1/gapic/recommender_client_config.py @@ -36,6 +36,21 @@ }, }, "methods": { + "ListInsights": { + "timeout_millis": 60000, + "retry_codes_name": "retry_policy_1_codes", + "retry_params_name": "no_retry_params", + }, + "GetInsight": { + "timeout_millis": 60000, + "retry_codes_name": "retry_policy_1_codes", + "retry_params_name": "no_retry_params", + }, + "MarkInsightAccepted": { + "timeout_millis": 60000, + "retry_codes_name": "no_retry_1_codes", + "retry_params_name": "no_retry_params", + }, "ListRecommendations": { "timeout_millis": 60000, "retry_codes_name": "retry_policy_1_codes", diff --git a/google/cloud/recommender_v1/gapic/transports/recommender_grpc_transport.py b/google/cloud/recommender_v1/gapic/transports/recommender_grpc_transport.py index b08c238..5b2c038 100644 --- a/google/cloud/recommender_v1/gapic/transports/recommender_grpc_transport.py +++ b/google/cloud/recommender_v1/gapic/transports/recommender_grpc_transport.py @@ -107,6 +107,52 @@ def channel(self): """ return self._channel + @property + def list_insights(self): + """Return the gRPC stub for :meth:`RecommenderClient.list_insights`. + + Lists insights for a Cloud project. Requires the recommender.*.list + IAM permission for the specified insight type. + + Returns: + Callable: A callable which accepts the appropriate + deserialized request object and returns a + deserialized response object. + """ + return self._stubs["recommender_stub"].ListInsights + + @property + def get_insight(self): + """Return the gRPC stub for :meth:`RecommenderClient.get_insight`. + + Gets the requested insight. Requires the recommender.*.get IAM + permission for the specified insight type. + + Returns: + Callable: A callable which accepts the appropriate + deserialized request object and returns a + deserialized response object. + """ + return self._stubs["recommender_stub"].GetInsight + + @property + def mark_insight_accepted(self): + """Return the gRPC stub for :meth:`RecommenderClient.mark_insight_accepted`. + + Marks the Insight State as Accepted. Users can use this method to + indicate to the Recommender API that they have applied some action based + on the insight. This stops the insight content from being updated. + + MarkInsightAccepted can be applied to insights in ACTIVE state. Requires + the recommender.*.update IAM permission for the specified insight. + + Returns: + Callable: A callable which accepts the appropriate + deserialized request object and returns a + deserialized response object. + """ + return self._stubs["recommender_stub"].MarkInsightAccepted + @property def list_recommendations(self): """Return the gRPC stub for :meth:`RecommenderClient.list_recommendations`. @@ -139,10 +185,11 @@ def get_recommendation(self): def mark_recommendation_claimed(self): """Return the gRPC stub for :meth:`RecommenderClient.mark_recommendation_claimed`. - Mark the Recommendation State as Claimed. Users can use this method + Marks the Recommendation State as Claimed. Users can use this method to indicate to the Recommender API that they are starting to apply the recommendation themselves. This stops the recommendation content from - being updated. + being updated. Associated insights are frozen and placed in the ACCEPTED + state. MarkRecommendationClaimed can be applied to recommendations in CLAIMED, SUCCEEDED, FAILED, or ACTIVE state. @@ -161,10 +208,11 @@ def mark_recommendation_claimed(self): def mark_recommendation_succeeded(self): """Return the gRPC stub for :meth:`RecommenderClient.mark_recommendation_succeeded`. - Mark the Recommendation State as Succeeded. Users can use this + Marks the Recommendation State as Succeeded. Users can use this method to indicate to the Recommender API that they have applied the recommendation themselves, and the operation was successful. This stops - the recommendation content from being updated. + the recommendation content from being updated. Associated insights are + frozen and placed in the ACCEPTED state. MarkRecommendationSucceeded can be applied to recommendations in ACTIVE, CLAIMED, SUCCEEDED, or FAILED state. @@ -183,10 +231,11 @@ def mark_recommendation_succeeded(self): def mark_recommendation_failed(self): """Return the gRPC stub for :meth:`RecommenderClient.mark_recommendation_failed`. - Mark the Recommendation State as Failed. Users can use this method + Marks the Recommendation State as Failed. Users can use this method to indicate to the Recommender API that they have applied the recommendation themselves, and the operation failed. This stops the - recommendation content from being updated. + recommendation content from being updated. Associated insights are + frozen and placed in the ACCEPTED state. MarkRecommendationFailed can be applied to recommendations in ACTIVE, CLAIMED, SUCCEEDED, or FAILED state. diff --git a/google/cloud/recommender_v1/proto/insight_pb2.py b/google/cloud/recommender_v1/proto/insight_pb2.py new file mode 100644 index 0000000..500671c --- /dev/null +++ b/google/cloud/recommender_v1/proto/insight_pb2.py @@ -0,0 +1,666 @@ +# -*- coding: utf-8 -*- + +# Copyright 2020 Google LLC +# +# 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. + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/cloud/recommender_v1/proto/insight.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import resource_pb2 as google_dot_api_dot_resource__pb2 +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name="google/cloud/recommender_v1/proto/insight.proto", + package="google.cloud.recommender.v1", + syntax="proto3", + serialized_options=b"\n\037com.google.cloud.recommender.v1B\014InsightProtoP\001ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\242\002\004CREC\252\002\033Google.Cloud.Recommender.V1\352Am\n&recommender.googleapis.com/InsightType\022Cprojects/{project}/locations/{location}/insightTypes/{insight_type}", + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n/google/cloud/recommender_v1/proto/insight.proto\x12\x1bgoogle.cloud.recommender.v1\x1a\x19google/api/resource.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x81\x06\n\x07Insight\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x18\n\x10target_resources\x18\t \x03(\t\x12\x17\n\x0finsight_subtype\x18\n \x01(\t\x12(\n\x07\x63ontent\x18\x03 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x35\n\x11last_refresh_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x12observation_period\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\nstate_info\x18\x06 \x01(\x0b\x32-.google.cloud.recommender.v1.InsightStateInfo\x12?\n\x08\x63\x61tegory\x18\x07 \x01(\x0e\x32-.google.cloud.recommender.v1.Insight.Category\x12\x0c\n\x04\x65tag\x18\x0b \x01(\t\x12`\n\x1a\x61ssociated_recommendations\x18\x08 \x03(\x0b\x32<.google.cloud.recommender.v1.Insight.RecommendationReference\x1a\x31\n\x17RecommendationReference\x12\x16\n\x0erecommendation\x18\x01 \x01(\t"`\n\x08\x43\x61tegory\x12\x18\n\x14\x43\x41TEGORY_UNSPECIFIED\x10\x00\x12\x08\n\x04\x43OST\x10\x01\x12\x0c\n\x08SECURITY\x10\x02\x12\x0f\n\x0bPERFORMANCE\x10\x03\x12\x11\n\rMANAGEABILITY\x10\x04:\x7f\xea\x41|\n"recommender.googleapis.com/Insight\x12Vprojects/{project}/locations/{location}/insightTypes/{insight_type}/insights/{insight}"\xaf\x02\n\x10InsightStateInfo\x12\x42\n\x05state\x18\x01 \x01(\x0e\x32\x33.google.cloud.recommender.v1.InsightStateInfo.State\x12X\n\x0estate_metadata\x18\x02 \x03(\x0b\x32@.google.cloud.recommender.v1.InsightStateInfo.StateMetadataEntry\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\n\n\x06\x41\x43TIVE\x10\x01\x12\x0c\n\x08\x41\x43\x43\x45PTED\x10\x02\x12\r\n\tDISMISSED\x10\x03\x42\x8e\x02\n\x1f\x63om.google.cloud.recommender.v1B\x0cInsightProtoP\x01ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\xa2\x02\x04\x43REC\xaa\x02\x1bGoogle.Cloud.Recommender.V1\xea\x41m\n&recommender.googleapis.com/InsightType\x12\x43projects/{project}/locations/{location}/insightTypes/{insight_type}b\x06proto3', + dependencies=[ + google_dot_api_dot_resource__pb2.DESCRIPTOR, + google_dot_protobuf_dot_duration__pb2.DESCRIPTOR, + google_dot_protobuf_dot_struct__pb2.DESCRIPTOR, + google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR, + ], +) + + +_INSIGHT_CATEGORY = _descriptor.EnumDescriptor( + name="Category", + full_name="google.cloud.recommender.v1.Insight.Category", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="CATEGORY_UNSPECIFIED", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="COST", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="SECURITY", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="PERFORMANCE", + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="MANAGEABILITY", + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=747, + serialized_end=843, +) +_sym_db.RegisterEnumDescriptor(_INSIGHT_CATEGORY) + +_INSIGHTSTATEINFO_STATE = _descriptor.EnumDescriptor( + name="State", + full_name="google.cloud.recommender.v1.InsightStateInfo.State", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="STATE_UNSPECIFIED", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ACTIVE", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ACCEPTED", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="DISMISSED", + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=1207, + serialized_end=1278, +) +_sym_db.RegisterEnumDescriptor(_INSIGHTSTATEINFO_STATE) + + +_INSIGHT_RECOMMENDATIONREFERENCE = _descriptor.Descriptor( + name="RecommendationReference", + full_name="google.cloud.recommender.v1.Insight.RecommendationReference", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="recommendation", + full_name="google.cloud.recommender.v1.Insight.RecommendationReference.recommendation", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ) + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=696, + serialized_end=745, +) + +_INSIGHT = _descriptor.Descriptor( + name="Insight", + full_name="google.cloud.recommender.v1.Insight", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="google.cloud.recommender.v1.Insight.name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="description", + full_name="google.cloud.recommender.v1.Insight.description", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="target_resources", + full_name="google.cloud.recommender.v1.Insight.target_resources", + index=2, + number=9, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="insight_subtype", + full_name="google.cloud.recommender.v1.Insight.insight_subtype", + index=3, + number=10, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="content", + full_name="google.cloud.recommender.v1.Insight.content", + index=4, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="last_refresh_time", + full_name="google.cloud.recommender.v1.Insight.last_refresh_time", + index=5, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="observation_period", + full_name="google.cloud.recommender.v1.Insight.observation_period", + index=6, + number=5, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="state_info", + full_name="google.cloud.recommender.v1.Insight.state_info", + index=7, + number=6, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="category", + full_name="google.cloud.recommender.v1.Insight.category", + index=8, + number=7, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="etag", + full_name="google.cloud.recommender.v1.Insight.etag", + index=9, + number=11, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="associated_recommendations", + full_name="google.cloud.recommender.v1.Insight.associated_recommendations", + index=10, + number=8, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[_INSIGHT_RECOMMENDATIONREFERENCE], + enum_types=[_INSIGHT_CATEGORY], + serialized_options=b'\352A|\n"recommender.googleapis.com/Insight\022Vprojects/{project}/locations/{location}/insightTypes/{insight_type}/insights/{insight}', + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=203, + serialized_end=972, +) + + +_INSIGHTSTATEINFO_STATEMETADATAENTRY = _descriptor.Descriptor( + name="StateMetadataEntry", + full_name="google.cloud.recommender.v1.InsightStateInfo.StateMetadataEntry", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="key", + full_name="google.cloud.recommender.v1.InsightStateInfo.StateMetadataEntry.key", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="value", + full_name="google.cloud.recommender.v1.InsightStateInfo.StateMetadataEntry.value", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b"8\001", + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=1153, + serialized_end=1205, +) + +_INSIGHTSTATEINFO = _descriptor.Descriptor( + name="InsightStateInfo", + full_name="google.cloud.recommender.v1.InsightStateInfo", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="state", + full_name="google.cloud.recommender.v1.InsightStateInfo.state", + index=0, + number=1, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="state_metadata", + full_name="google.cloud.recommender.v1.InsightStateInfo.state_metadata", + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[_INSIGHTSTATEINFO_STATEMETADATAENTRY], + enum_types=[_INSIGHTSTATEINFO_STATE], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=975, + serialized_end=1278, +) + +_INSIGHT_RECOMMENDATIONREFERENCE.containing_type = _INSIGHT +_INSIGHT.fields_by_name[ + "content" +].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT +_INSIGHT.fields_by_name[ + "last_refresh_time" +].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP +_INSIGHT.fields_by_name[ + "observation_period" +].message_type = google_dot_protobuf_dot_duration__pb2._DURATION +_INSIGHT.fields_by_name["state_info"].message_type = _INSIGHTSTATEINFO +_INSIGHT.fields_by_name["category"].enum_type = _INSIGHT_CATEGORY +_INSIGHT.fields_by_name[ + "associated_recommendations" +].message_type = _INSIGHT_RECOMMENDATIONREFERENCE +_INSIGHT_CATEGORY.containing_type = _INSIGHT +_INSIGHTSTATEINFO_STATEMETADATAENTRY.containing_type = _INSIGHTSTATEINFO +_INSIGHTSTATEINFO.fields_by_name["state"].enum_type = _INSIGHTSTATEINFO_STATE +_INSIGHTSTATEINFO.fields_by_name[ + "state_metadata" +].message_type = _INSIGHTSTATEINFO_STATEMETADATAENTRY +_INSIGHTSTATEINFO_STATE.containing_type = _INSIGHTSTATEINFO +DESCRIPTOR.message_types_by_name["Insight"] = _INSIGHT +DESCRIPTOR.message_types_by_name["InsightStateInfo"] = _INSIGHTSTATEINFO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Insight = _reflection.GeneratedProtocolMessageType( + "Insight", + (_message.Message,), + { + "RecommendationReference": _reflection.GeneratedProtocolMessageType( + "RecommendationReference", + (_message.Message,), + { + "DESCRIPTOR": _INSIGHT_RECOMMENDATIONREFERENCE, + "__module__": "google.cloud.recommender_v1.proto.insight_pb2", + "__doc__": """Reference to an associated recommendation. + + Attributes: + recommendation: + Recommendation resource name, e.g. projects/[PROJECT_NUMBER]/l + ocations/[LOCATION]/recommenders/[RECOMMENDER_ID]/recommendati + ons/[RECOMMENDATION_ID] + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.Insight.RecommendationReference) + }, + ), + "DESCRIPTOR": _INSIGHT, + "__module__": "google.cloud.recommender_v1.proto.insight_pb2", + "__doc__": """An insight along with the information used to derive the insight. The + insight may have associated recomendations as well. + + Attributes: + name: + Name of the insight. + description: + Free-form human readable summary in English. The maximum + length is 500 characters. + target_resources: + Fully qualified resource names that this insight is targeting. + insight_subtype: + Insight subtype. Insight content schema will be stable for a + given subtype. + content: + A struct of custom fields to explain the insight. Example: + “grantedPermissionsCount”: “1000” + last_refresh_time: + Timestamp of the latest data used to generate the insight. + observation_period: + Observation period that led to the insight. The source data + used to generate the insight ends at last_refresh_time and + begins at (last_refresh_time - observation_period). + state_info: + Information state and metadata. + category: + Category being targeted by the insight. + etag: + Fingerprint of the Insight. Provides optimistic locking when + updating states. + associated_recommendations: + Recommendations derived from this insight. + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.Insight) + }, +) +_sym_db.RegisterMessage(Insight) +_sym_db.RegisterMessage(Insight.RecommendationReference) + +InsightStateInfo = _reflection.GeneratedProtocolMessageType( + "InsightStateInfo", + (_message.Message,), + { + "StateMetadataEntry": _reflection.GeneratedProtocolMessageType( + "StateMetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _INSIGHTSTATEINFO_STATEMETADATAENTRY, + "__module__": "google.cloud.recommender_v1.proto.insight_pb2" + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.InsightStateInfo.StateMetadataEntry) + }, + ), + "DESCRIPTOR": _INSIGHTSTATEINFO, + "__module__": "google.cloud.recommender_v1.proto.insight_pb2", + "__doc__": """Information related to insight state. + + Attributes: + state: + Insight state. + state_metadata: + A map of metadata for the state, provided by user or + automations systems. + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.InsightStateInfo) + }, +) +_sym_db.RegisterMessage(InsightStateInfo) +_sym_db.RegisterMessage(InsightStateInfo.StateMetadataEntry) + + +DESCRIPTOR._options = None +_INSIGHT._options = None +_INSIGHTSTATEINFO_STATEMETADATAENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/google/cloud/recommender_v1/proto/insight_pb2_grpc.py b/google/cloud/recommender_v1/proto/insight_pb2_grpc.py new file mode 100644 index 0000000..8a93939 --- /dev/null +++ b/google/cloud/recommender_v1/proto/insight_pb2_grpc.py @@ -0,0 +1,3 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc diff --git a/google/cloud/recommender_v1/proto/recommendation_pb2.py b/google/cloud/recommender_v1/proto/recommendation_pb2.py index 5f61a53..89d4751 100644 --- a/google/cloud/recommender_v1/proto/recommendation_pb2.py +++ b/google/cloud/recommender_v1/proto/recommendation_pb2.py @@ -40,7 +40,7 @@ syntax="proto3", serialized_options=b"\n\037com.google.cloud.recommender.v1P\001ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\242\002\004CREC\252\002\033Google.Cloud.Recommender.V1\352Al\n&recommender.googleapis.com/Recommender\022Bprojects/{project}/locations/{location}/recommenders/{recommender}", create_key=_descriptor._internal_create_key, - serialized_pb=b'\n6google/cloud/recommender_v1/proto/recommendation.proto\x12\x1bgoogle.cloud.recommender.v1\x1a\x19google/api/resource.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/type/money.proto"\xb8\x04\n\x0eRecommendation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x1b\n\x13recommender_subtype\x18\x0c \x01(\t\x12\x35\n\x11last_refresh_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x0eprimary_impact\x18\x05 \x01(\x0b\x32#.google.cloud.recommender.v1.Impact\x12>\n\x11\x61\x64\x64itional_impact\x18\x06 \x03(\x0b\x32#.google.cloud.recommender.v1.Impact\x12\x43\n\x07\x63ontent\x18\x07 \x01(\x0b\x32\x32.google.cloud.recommender.v1.RecommendationContent\x12H\n\nstate_info\x18\n \x01(\x0b\x32\x34.google.cloud.recommender.v1.RecommendationStateInfo\x12\x0c\n\x04\x65tag\x18\x0b \x01(\t:\x94\x01\xea\x41\x90\x01\n)recommender.googleapis.com/Recommendation\x12\x63projects/{project}/locations/{location}/recommenders/{recommender}/recommendations/{recommendation}"^\n\x15RecommendationContent\x12\x45\n\x10operation_groups\x18\x02 \x03(\x0b\x32+.google.cloud.recommender.v1.OperationGroup"L\n\x0eOperationGroup\x12:\n\noperations\x18\x01 \x03(\x0b\x32&.google.cloud.recommender.v1.Operation"\xd7\x04\n\tOperation\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x10\n\x08resource\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x17\n\x0fsource_resource\x18\x05 \x01(\t\x12\x13\n\x0bsource_path\x18\x06 \x01(\t\x12\'\n\x05value\x18\x07 \x01(\x0b\x32\x16.google.protobuf.ValueH\x00\x12\x42\n\rvalue_matcher\x18\n \x01(\x0b\x32).google.cloud.recommender.v1.ValueMatcherH\x00\x12M\n\x0cpath_filters\x18\x08 \x03(\x0b\x32\x37.google.cloud.recommender.v1.Operation.PathFiltersEntry\x12Z\n\x13path_value_matchers\x18\x0b \x03(\x0b\x32=.google.cloud.recommender.v1.Operation.PathValueMatchersEntry\x1aJ\n\x10PathFiltersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.google.protobuf.Value:\x02\x38\x01\x1a\x63\n\x16PathValueMatchersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).google.cloud.recommender.v1.ValueMatcher:\x02\x38\x01\x42\x0c\n\npath_value":\n\x0cValueMatcher\x12\x19\n\x0fmatches_pattern\x18\x01 \x01(\tH\x00\x42\x0f\n\rmatch_variant"_\n\x0e\x43ostProjection\x12 \n\x04\x63ost\x18\x01 \x01(\x0b\x32\x12.google.type.Money\x12+\n\x08\x64uration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x80\x02\n\x06Impact\x12>\n\x08\x63\x61tegory\x18\x01 \x01(\x0e\x32,.google.cloud.recommender.v1.Impact.Category\x12\x46\n\x0f\x63ost_projection\x18\x64 \x01(\x0b\x32+.google.cloud.recommender.v1.CostProjectionH\x00"`\n\x08\x43\x61tegory\x12\x18\n\x14\x43\x41TEGORY_UNSPECIFIED\x10\x00\x12\x08\n\x04\x43OST\x10\x01\x12\x0c\n\x08SECURITY\x10\x02\x12\x0f\n\x0bPERFORMANCE\x10\x03\x12\x11\n\rMANAGEABILITY\x10\x04\x42\x0c\n\nprojection"\xde\x02\n\x17RecommendationStateInfo\x12I\n\x05state\x18\x01 \x01(\x0e\x32:.google.cloud.recommender.v1.RecommendationStateInfo.State\x12_\n\x0estate_metadata\x18\x02 \x03(\x0b\x32G.google.cloud.recommender.v1.RecommendationStateInfo.StateMetadataEntry\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"a\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\n\n\x06\x41\x43TIVE\x10\x01\x12\x0b\n\x07\x43LAIMED\x10\x06\x12\r\n\tSUCCEEDED\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\r\n\tDISMISSED\x10\x05\x42\xff\x01\n\x1f\x63om.google.cloud.recommender.v1P\x01ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\xa2\x02\x04\x43REC\xaa\x02\x1bGoogle.Cloud.Recommender.V1\xea\x41l\n&recommender.googleapis.com/Recommender\x12\x42projects/{project}/locations/{location}/recommenders/{recommender}b\x06proto3', + serialized_pb=b'\n6google/cloud/recommender_v1/proto/recommendation.proto\x12\x1bgoogle.cloud.recommender.v1\x1a\x19google/api/resource.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/type/money.proto"\xb8\x05\n\x0eRecommendation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x1b\n\x13recommender_subtype\x18\x0c \x01(\t\x12\x35\n\x11last_refresh_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x0eprimary_impact\x18\x05 \x01(\x0b\x32#.google.cloud.recommender.v1.Impact\x12>\n\x11\x61\x64\x64itional_impact\x18\x06 \x03(\x0b\x32#.google.cloud.recommender.v1.Impact\x12\x43\n\x07\x63ontent\x18\x07 \x01(\x0b\x32\x32.google.cloud.recommender.v1.RecommendationContent\x12H\n\nstate_info\x18\n \x01(\x0b\x32\x34.google.cloud.recommender.v1.RecommendationStateInfo\x12\x0c\n\x04\x65tag\x18\x0b \x01(\t\x12Y\n\x13\x61ssociated_insights\x18\x0e \x03(\x0b\x32<.google.cloud.recommender.v1.Recommendation.InsightReference\x1a#\n\x10InsightReference\x12\x0f\n\x07insight\x18\x01 \x01(\t:\x94\x01\xea\x41\x90\x01\n)recommender.googleapis.com/Recommendation\x12\x63projects/{project}/locations/{location}/recommenders/{recommender}/recommendations/{recommendation}"^\n\x15RecommendationContent\x12\x45\n\x10operation_groups\x18\x02 \x03(\x0b\x32+.google.cloud.recommender.v1.OperationGroup"L\n\x0eOperationGroup\x12:\n\noperations\x18\x01 \x03(\x0b\x32&.google.cloud.recommender.v1.Operation"\xd7\x04\n\tOperation\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x15\n\rresource_type\x18\x02 \x01(\t\x12\x10\n\x08resource\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x17\n\x0fsource_resource\x18\x05 \x01(\t\x12\x13\n\x0bsource_path\x18\x06 \x01(\t\x12\'\n\x05value\x18\x07 \x01(\x0b\x32\x16.google.protobuf.ValueH\x00\x12\x42\n\rvalue_matcher\x18\n \x01(\x0b\x32).google.cloud.recommender.v1.ValueMatcherH\x00\x12M\n\x0cpath_filters\x18\x08 \x03(\x0b\x32\x37.google.cloud.recommender.v1.Operation.PathFiltersEntry\x12Z\n\x13path_value_matchers\x18\x0b \x03(\x0b\x32=.google.cloud.recommender.v1.Operation.PathValueMatchersEntry\x1aJ\n\x10PathFiltersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.google.protobuf.Value:\x02\x38\x01\x1a\x63\n\x16PathValueMatchersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).google.cloud.recommender.v1.ValueMatcher:\x02\x38\x01\x42\x0c\n\npath_value":\n\x0cValueMatcher\x12\x19\n\x0fmatches_pattern\x18\x01 \x01(\tH\x00\x42\x0f\n\rmatch_variant"_\n\x0e\x43ostProjection\x12 \n\x04\x63ost\x18\x01 \x01(\x0b\x32\x12.google.type.Money\x12+\n\x08\x64uration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x80\x02\n\x06Impact\x12>\n\x08\x63\x61tegory\x18\x01 \x01(\x0e\x32,.google.cloud.recommender.v1.Impact.Category\x12\x46\n\x0f\x63ost_projection\x18\x64 \x01(\x0b\x32+.google.cloud.recommender.v1.CostProjectionH\x00"`\n\x08\x43\x61tegory\x12\x18\n\x14\x43\x41TEGORY_UNSPECIFIED\x10\x00\x12\x08\n\x04\x43OST\x10\x01\x12\x0c\n\x08SECURITY\x10\x02\x12\x0f\n\x0bPERFORMANCE\x10\x03\x12\x11\n\rMANAGEABILITY\x10\x04\x42\x0c\n\nprojection"\xde\x02\n\x17RecommendationStateInfo\x12I\n\x05state\x18\x01 \x01(\x0e\x32:.google.cloud.recommender.v1.RecommendationStateInfo.State\x12_\n\x0estate_metadata\x18\x02 \x03(\x0b\x32G.google.cloud.recommender.v1.RecommendationStateInfo.StateMetadataEntry\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"a\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\n\n\x06\x41\x43TIVE\x10\x01\x12\x0b\n\x07\x43LAIMED\x10\x06\x12\r\n\tSUCCEEDED\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\r\n\tDISMISSED\x10\x05\x42\xff\x01\n\x1f\x63om.google.cloud.recommender.v1P\x01ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\xa2\x02\x04\x43REC\xaa\x02\x1bGoogle.Cloud.Recommender.V1\xea\x41l\n&recommender.googleapis.com/Recommender\x12\x42projects/{project}/locations/{location}/recommenders/{recommender}b\x06proto3', dependencies=[ google_dot_api_dot_resource__pb2.DESCRIPTOR, google_dot_protobuf_dot_duration__pb2.DESCRIPTOR, @@ -101,8 +101,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=1885, - serialized_end=1981, + serialized_start=2013, + serialized_end=2109, ) _sym_db.RegisterEnumDescriptor(_IMPACT_CATEGORY) @@ -164,12 +164,52 @@ ], containing_type=None, serialized_options=None, - serialized_start=2251, - serialized_end=2348, + serialized_start=2379, + serialized_end=2476, ) _sym_db.RegisterEnumDescriptor(_RECOMMENDATIONSTATEINFO_STATE) +_RECOMMENDATION_INSIGHTREFERENCE = _descriptor.Descriptor( + name="InsightReference", + full_name="google.cloud.recommender.v1.Recommendation.InsightReference", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="insight", + full_name="google.cloud.recommender.v1.Recommendation.InsightReference.insight", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ) + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=745, + serialized_end=780, +) + _RECOMMENDATION = _descriptor.Descriptor( name="Recommendation", full_name="google.cloud.recommender.v1.Recommendation", @@ -349,9 +389,28 @@ file=DESCRIPTOR, create_key=_descriptor._internal_create_key, ), + _descriptor.FieldDescriptor( + name="associated_insights", + full_name="google.cloud.recommender.v1.Recommendation.associated_insights", + index=9, + number=14, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), ], extensions=[], - nested_types=[], + nested_types=[_RECOMMENDATION_INSIGHTREFERENCE], enum_types=[], serialized_options=b"\352A\220\001\n)recommender.googleapis.com/Recommendation\022cprojects/{project}/locations/{location}/recommenders/{recommender}/recommendations/{recommendation}", is_extendable=False, @@ -359,7 +418,7 @@ extension_ranges=[], oneofs=[], serialized_start=235, - serialized_end=803, + serialized_end=931, ) @@ -399,8 +458,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=805, - serialized_end=899, + serialized_start=933, + serialized_end=1027, ) @@ -440,8 +499,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=901, - serialized_end=977, + serialized_start=1029, + serialized_end=1105, ) @@ -500,8 +559,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1390, - serialized_end=1464, + serialized_start=1518, + serialized_end=1592, ) _OPERATION_PATHVALUEMATCHERSENTRY = _descriptor.Descriptor( @@ -559,8 +618,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1466, - serialized_end=1565, + serialized_start=1594, + serialized_end=1693, ) _OPERATION = _descriptor.Descriptor( @@ -779,8 +838,8 @@ fields=[], ) ], - serialized_start=980, - serialized_end=1579, + serialized_start=1108, + serialized_end=1707, ) @@ -829,8 +888,8 @@ fields=[], ) ], - serialized_start=1581, - serialized_end=1639, + serialized_start=1709, + serialized_end=1767, ) @@ -889,8 +948,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1641, - serialized_end=1736, + serialized_start=1769, + serialized_end=1864, ) @@ -958,8 +1017,8 @@ fields=[], ) ], - serialized_start=1739, - serialized_end=1995, + serialized_start=1867, + serialized_end=2123, ) @@ -1018,8 +1077,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=2197, - serialized_end=2249, + serialized_start=2325, + serialized_end=2377, ) _RECOMMENDATIONSTATEINFO = _descriptor.Descriptor( @@ -1077,10 +1136,11 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1998, - serialized_end=2348, + serialized_start=2126, + serialized_end=2476, ) +_RECOMMENDATION_INSIGHTREFERENCE.containing_type = _RECOMMENDATION _RECOMMENDATION.fields_by_name[ "last_refresh_time" ].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP @@ -1088,6 +1148,9 @@ _RECOMMENDATION.fields_by_name["additional_impact"].message_type = _IMPACT _RECOMMENDATION.fields_by_name["content"].message_type = _RECOMMENDATIONCONTENT _RECOMMENDATION.fields_by_name["state_info"].message_type = _RECOMMENDATIONSTATEINFO +_RECOMMENDATION.fields_by_name[ + "associated_insights" +].message_type = _RECOMMENDATION_INSIGHTREFERENCE _RECOMMENDATIONCONTENT.fields_by_name["operation_groups"].message_type = _OPERATIONGROUP _OPERATIONGROUP.fields_by_name["operations"].message_type = _OPERATION _OPERATION_PATHFILTERSENTRY.fields_by_name[ @@ -1159,6 +1222,21 @@ "Recommendation", (_message.Message,), { + "InsightReference": _reflection.GeneratedProtocolMessageType( + "InsightReference", + (_message.Message,), + { + "DESCRIPTOR": _RECOMMENDATION_INSIGHTREFERENCE, + "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2", + "__doc__": """Reference to an associated insight. + + Attributes: + insight: + Insight resource name, e.g. ``projects/[PROJECT_NUMBER]/locations/[LOCATION]/insightTypes/[INSIGHT_TYPE_ID]/insights/[INSIGHT_ID]`` + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.Recommendation.InsightReference) + }, + ), "DESCRIPTOR": _RECOMMENDATION, "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2", "__doc__": """A recommendation along with a suggested action. E.g., a rightsizing @@ -1198,11 +1276,14 @@ etag: Fingerprint of the Recommendation. Provides optimistic locking when updating states. + associated_insights: + Insights that led to this recommendation. """, # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.Recommendation) }, ) _sym_db.RegisterMessage(Recommendation) +_sym_db.RegisterMessage(Recommendation.InsightReference) RecommendationContent = _reflection.GeneratedProtocolMessageType( "RecommendationContent", diff --git a/google/cloud/recommender_v1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1/proto/recommender_service_pb2.py index 5842ac9..66cae26 100644 --- a/google/cloud/recommender_v1/proto/recommender_service_pb2.py +++ b/google/cloud/recommender_v1/proto/recommender_service_pb2.py @@ -31,6 +31,9 @@ from google.api import client_pb2 as google_dot_api_dot_client__pb2 from google.api import field_behavior_pb2 as google_dot_api_dot_field__behavior__pb2 from google.api import resource_pb2 as google_dot_api_dot_resource__pb2 +from google.cloud.recommender_v1.proto import ( + insight_pb2 as google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2, +) from google.cloud.recommender_v1.proto import ( recommendation_pb2 as google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2, ) @@ -42,17 +45,355 @@ syntax="proto3", serialized_options=b"\n\037com.google.cloud.recommender.v1B\020RecommenderProtoP\001ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\242\002\004CREC\252\002\033Google.Cloud.Recommender.V1", create_key=_descriptor._internal_create_key, - serialized_pb=b'\n;google/cloud/recommender_v1/proto/recommender_service.proto\x12\x1bgoogle.cloud.recommender.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x36google/cloud/recommender_v1/proto/recommendation.proto"\x9d\x01\n\x1aListRecommendationsRequest\x12>\n\x06parent\x18\x01 \x01(\tB.\xe0\x41\x02\xfa\x41(\n&recommender.googleapis.com/Recommender\x12\x16\n\tpage_size\x18\x02 \x01(\x05\x42\x03\xe0\x41\x01\x12\x17\n\npage_token\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x0e\n\x06\x66ilter\x18\x05 \x01(\t"|\n\x1bListRecommendationsResponse\x12\x44\n\x0frecommendations\x18\x01 \x03(\x0b\x32+.google.cloud.recommender.v1.Recommendation\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t"[\n\x18GetRecommendationRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation"\x96\x02\n MarkRecommendationClaimedRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12h\n\x0estate_metadata\x18\x02 \x03(\x0b\x32P.google.cloud.recommender.v1.MarkRecommendationClaimedRequest.StateMetadataEntry\x12\x11\n\x04\x65tag\x18\x03 \x01(\tB\x03\xe0\x41\x02\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x9a\x02\n"MarkRecommendationSucceededRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12j\n\x0estate_metadata\x18\x02 \x03(\x0b\x32R.google.cloud.recommender.v1.MarkRecommendationSucceededRequest.StateMetadataEntry\x12\x11\n\x04\x65tag\x18\x03 \x01(\tB\x03\xe0\x41\x02\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x94\x02\n\x1fMarkRecommendationFailedRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12g\n\x0estate_metadata\x18\x02 \x03(\x0b\x32O.google.cloud.recommender.v1.MarkRecommendationFailedRequest.StateMetadataEntry\x12\x11\n\x04\x65tag\x18\x03 \x01(\tB\x03\xe0\x41\x02\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x32\x9d\n\n\x0bRecommender\x12\xed\x01\n\x13ListRecommendations\x12\x37.google.cloud.recommender.v1.ListRecommendationsRequest\x1a\x38.google.cloud.recommender.v1.ListRecommendationsResponse"c\x82\xd3\xe4\x93\x02\x44\x12\x42/v1/{parent=projects/*/locations/*/recommenders/*}/recommendations\xda\x41\x06parent\xda\x41\rparent,filter\x12\xca\x01\n\x11GetRecommendation\x12\x35.google.cloud.recommender.v1.GetRecommendationRequest\x1a+.google.cloud.recommender.v1.Recommendation"Q\x82\xd3\xe4\x93\x02\x44\x12\x42/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}\xda\x41\x04name\x12\xfd\x01\n\x19MarkRecommendationClaimed\x12=.google.cloud.recommender.v1.MarkRecommendationClaimedRequest\x1a+.google.cloud.recommender.v1.Recommendation"t\x82\xd3\xe4\x93\x02S"N/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markClaimed:\x01*\xda\x41\x18name,state_metadata,etag\x12\x83\x02\n\x1bMarkRecommendationSucceeded\x12?.google.cloud.recommender.v1.MarkRecommendationSucceededRequest\x1a+.google.cloud.recommender.v1.Recommendation"v\x82\xd3\xe4\x93\x02U"P/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markSucceeded:\x01*\xda\x41\x18name,state_metadata,etag\x12\xfa\x01\n\x18MarkRecommendationFailed\x12<.google.cloud.recommender.v1.MarkRecommendationFailedRequest\x1a+.google.cloud.recommender.v1.Recommendation"s\x82\xd3\xe4\x93\x02R"M/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markFailed:\x01*\xda\x41\x18name,state_metadata,etag\x1aN\xca\x41\x1arecommender.googleapis.com\xd2\x41.https://www.googleapis.com/auth/cloud-platformB\xa2\x01\n\x1f\x63om.google.cloud.recommender.v1B\x10RecommenderProtoP\x01ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\xa2\x02\x04\x43REC\xaa\x02\x1bGoogle.Cloud.Recommender.V1b\x06proto3', + serialized_pb=b'\n;google/cloud/recommender_v1/proto/recommender_service.proto\x12\x1bgoogle.cloud.recommender.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a/google/cloud/recommender_v1/proto/insight.proto\x1a\x36google/cloud/recommender_v1/proto/recommendation.proto"\x9b\x01\n\x13ListInsightsRequest\x12>\n\x06parent\x18\x01 \x01(\tB.\xe0\x41\x02\xfa\x41(\n&recommender.googleapis.com/InsightType\x12\x16\n\tpage_size\x18\x02 \x01(\x05\x42\x03\xe0\x41\x01\x12\x17\n\npage_token\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x13\n\x06\x66ilter\x18\x04 \x01(\tB\x03\xe0\x41\x01"g\n\x14ListInsightsResponse\x12\x36\n\x08insights\x18\x01 \x03(\x0b\x32$.google.cloud.recommender.v1.Insight\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t"M\n\x11GetInsightRequest\x12\x38\n\x04name\x18\x01 \x01(\tB*\xe0\x41\x02\xfa\x41$\n"recommender.googleapis.com/Insight"\x88\x02\n\x1aMarkInsightAcceptedRequest\x12\x38\n\x04name\x18\x01 \x01(\tB*\xe0\x41\x02\xfa\x41$\n"recommender.googleapis.com/Insight\x12g\n\x0estate_metadata\x18\x02 \x03(\x0b\x32J.google.cloud.recommender.v1.MarkInsightAcceptedRequest.StateMetadataEntryB\x03\xe0\x41\x01\x12\x11\n\x04\x65tag\x18\x03 \x01(\tB\x03\xe0\x41\x02\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x9d\x01\n\x1aListRecommendationsRequest\x12>\n\x06parent\x18\x01 \x01(\tB.\xe0\x41\x02\xfa\x41(\n&recommender.googleapis.com/Recommender\x12\x16\n\tpage_size\x18\x02 \x01(\x05\x42\x03\xe0\x41\x01\x12\x17\n\npage_token\x18\x03 \x01(\tB\x03\xe0\x41\x01\x12\x0e\n\x06\x66ilter\x18\x05 \x01(\t"|\n\x1bListRecommendationsResponse\x12\x44\n\x0frecommendations\x18\x01 \x03(\x0b\x32+.google.cloud.recommender.v1.Recommendation\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t"[\n\x18GetRecommendationRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation"\x96\x02\n MarkRecommendationClaimedRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12h\n\x0estate_metadata\x18\x02 \x03(\x0b\x32P.google.cloud.recommender.v1.MarkRecommendationClaimedRequest.StateMetadataEntry\x12\x11\n\x04\x65tag\x18\x03 \x01(\tB\x03\xe0\x41\x02\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x9a\x02\n"MarkRecommendationSucceededRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12j\n\x0estate_metadata\x18\x02 \x03(\x0b\x32R.google.cloud.recommender.v1.MarkRecommendationSucceededRequest.StateMetadataEntry\x12\x11\n\x04\x65tag\x18\x03 \x01(\tB\x03\xe0\x41\x02\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x94\x02\n\x1fMarkRecommendationFailedRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12g\n\x0estate_metadata\x18\x02 \x03(\x0b\x32O.google.cloud.recommender.v1.MarkRecommendationFailedRequest.StateMetadataEntry\x12\x11\n\x04\x65tag\x18\x03 \x01(\tB\x03\xe0\x41\x02\x1a\x34\n\x12StateMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x32\xf9\x0e\n\x0bRecommender\x12\xc1\x01\n\x0cListInsights\x12\x30.google.cloud.recommender.v1.ListInsightsRequest\x1a\x31.google.cloud.recommender.v1.ListInsightsResponse"L\x82\xd3\xe4\x93\x02=\x12;/v1/{parent=projects/*/locations/*/insightTypes/*}/insights\xda\x41\x06parent\x12\xae\x01\n\nGetInsight\x12..google.cloud.recommender.v1.GetInsightRequest\x1a$.google.cloud.recommender.v1.Insight"J\x82\xd3\xe4\x93\x02=\x12;/v1/{name=projects/*/locations/*/insightTypes/*/insights/*}\xda\x41\x04name\x12\xe4\x01\n\x13MarkInsightAccepted\x12\x37.google.cloud.recommender.v1.MarkInsightAcceptedRequest\x1a$.google.cloud.recommender.v1.Insight"n\x82\xd3\xe4\x93\x02M"H/v1/{name=projects/*/locations/*/insightTypes/*/insights/*}:markAccepted:\x01*\xda\x41\x18name,state_metadata,etag\x12\xed\x01\n\x13ListRecommendations\x12\x37.google.cloud.recommender.v1.ListRecommendationsRequest\x1a\x38.google.cloud.recommender.v1.ListRecommendationsResponse"c\x82\xd3\xe4\x93\x02\x44\x12\x42/v1/{parent=projects/*/locations/*/recommenders/*}/recommendations\xda\x41\x06parent\xda\x41\rparent,filter\x12\xca\x01\n\x11GetRecommendation\x12\x35.google.cloud.recommender.v1.GetRecommendationRequest\x1a+.google.cloud.recommender.v1.Recommendation"Q\x82\xd3\xe4\x93\x02\x44\x12\x42/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}\xda\x41\x04name\x12\xfd\x01\n\x19MarkRecommendationClaimed\x12=.google.cloud.recommender.v1.MarkRecommendationClaimedRequest\x1a+.google.cloud.recommender.v1.Recommendation"t\x82\xd3\xe4\x93\x02S"N/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markClaimed:\x01*\xda\x41\x18name,state_metadata,etag\x12\x83\x02\n\x1bMarkRecommendationSucceeded\x12?.google.cloud.recommender.v1.MarkRecommendationSucceededRequest\x1a+.google.cloud.recommender.v1.Recommendation"v\x82\xd3\xe4\x93\x02U"P/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markSucceeded:\x01*\xda\x41\x18name,state_metadata,etag\x12\xfa\x01\n\x18MarkRecommendationFailed\x12<.google.cloud.recommender.v1.MarkRecommendationFailedRequest\x1a+.google.cloud.recommender.v1.Recommendation"s\x82\xd3\xe4\x93\x02R"M/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markFailed:\x01*\xda\x41\x18name,state_metadata,etag\x1aN\xca\x41\x1arecommender.googleapis.com\xd2\x41.https://www.googleapis.com/auth/cloud-platformB\xa2\x01\n\x1f\x63om.google.cloud.recommender.v1B\x10RecommenderProtoP\x01ZFgoogle.golang.org/genproto/googleapis/cloud/recommender/v1;recommender\xa2\x02\x04\x43REC\xaa\x02\x1bGoogle.Cloud.Recommender.V1b\x06proto3', dependencies=[ google_dot_api_dot_annotations__pb2.DESCRIPTOR, google_dot_api_dot_client__pb2.DESCRIPTOR, google_dot_api_dot_field__behavior__pb2.DESCRIPTOR, google_dot_api_dot_resource__pb2.DESCRIPTOR, + google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2.DESCRIPTOR, google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2.DESCRIPTOR, ], ) +_LISTINSIGHTSREQUEST = _descriptor.Descriptor( + name="ListInsightsRequest", + full_name="google.cloud.recommender.v1.ListInsightsRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="parent", + full_name="google.cloud.recommender.v1.ListInsightsRequest.parent", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b"\340A\002\372A(\n&recommender.googleapis.com/InsightType", + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="page_size", + full_name="google.cloud.recommender.v1.ListInsightsRequest.page_size", + index=1, + number=2, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b"\340A\001", + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="page_token", + full_name="google.cloud.recommender.v1.ListInsightsRequest.page_token", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b"\340A\001", + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="filter", + full_name="google.cloud.recommender.v1.ListInsightsRequest.filter", + index=3, + number=4, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b"\340A\001", + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=313, + serialized_end=468, +) + + +_LISTINSIGHTSRESPONSE = _descriptor.Descriptor( + name="ListInsightsResponse", + full_name="google.cloud.recommender.v1.ListInsightsResponse", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="insights", + full_name="google.cloud.recommender.v1.ListInsightsResponse.insights", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="next_page_token", + full_name="google.cloud.recommender.v1.ListInsightsResponse.next_page_token", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=470, + serialized_end=573, +) + + +_GETINSIGHTREQUEST = _descriptor.Descriptor( + name="GetInsightRequest", + full_name="google.cloud.recommender.v1.GetInsightRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="google.cloud.recommender.v1.GetInsightRequest.name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b'\340A\002\372A$\n"recommender.googleapis.com/Insight', + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ) + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=575, + serialized_end=652, +) + + +_MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY = _descriptor.Descriptor( + name="StateMetadataEntry", + full_name="google.cloud.recommender.v1.MarkInsightAcceptedRequest.StateMetadataEntry", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="key", + full_name="google.cloud.recommender.v1.MarkInsightAcceptedRequest.StateMetadataEntry.key", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="value", + full_name="google.cloud.recommender.v1.MarkInsightAcceptedRequest.StateMetadataEntry.value", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b"8\001", + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=867, + serialized_end=919, +) + +_MARKINSIGHTACCEPTEDREQUEST = _descriptor.Descriptor( + name="MarkInsightAcceptedRequest", + full_name="google.cloud.recommender.v1.MarkInsightAcceptedRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="google.cloud.recommender.v1.MarkInsightAcceptedRequest.name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b'\340A\002\372A$\n"recommender.googleapis.com/Insight', + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="state_metadata", + full_name="google.cloud.recommender.v1.MarkInsightAcceptedRequest.state_metadata", + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b"\340A\001", + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="etag", + full_name="google.cloud.recommender.v1.MarkInsightAcceptedRequest.etag", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b"\340A\002", + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[_MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=655, + serialized_end=919, +) + + _LISTRECOMMENDATIONSREQUEST = _descriptor.Descriptor( name="ListRecommendationsRequest", full_name="google.cloud.recommender.v1.ListRecommendationsRequest", @@ -146,8 +487,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=264, - serialized_end=421, + serialized_start=922, + serialized_end=1079, ) @@ -206,8 +547,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=423, - serialized_end=547, + serialized_start=1081, + serialized_end=1205, ) @@ -247,8 +588,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=549, - serialized_end=640, + serialized_start=1207, + serialized_end=1298, ) @@ -307,8 +648,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=869, - serialized_end=921, + serialized_start=867, + serialized_end=919, ) _MARKRECOMMENDATIONCLAIMEDREQUEST = _descriptor.Descriptor( @@ -385,8 +726,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=643, - serialized_end=921, + serialized_start=1301, + serialized_end=1579, ) @@ -445,8 +786,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=869, - serialized_end=921, + serialized_start=867, + serialized_end=919, ) _MARKRECOMMENDATIONSUCCEEDEDREQUEST = _descriptor.Descriptor( @@ -523,8 +864,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=924, - serialized_end=1206, + serialized_start=1582, + serialized_end=1864, ) @@ -583,8 +924,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=869, - serialized_end=921, + serialized_start=867, + serialized_end=919, ) _MARKRECOMMENDATIONFAILEDREQUEST = _descriptor.Descriptor( @@ -661,10 +1002,21 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1209, - serialized_end=1485, + serialized_start=1867, + serialized_end=2143, ) +_LISTINSIGHTSRESPONSE.fields_by_name[ + "insights" +].message_type = ( + google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2._INSIGHT +) +_MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY.containing_type = ( + _MARKINSIGHTACCEPTEDREQUEST +) +_MARKINSIGHTACCEPTEDREQUEST.fields_by_name[ + "state_metadata" +].message_type = _MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY _LISTRECOMMENDATIONSRESPONSE.fields_by_name[ "recommendations" ].message_type = ( @@ -688,6 +1040,12 @@ _MARKRECOMMENDATIONFAILEDREQUEST.fields_by_name[ "state_metadata" ].message_type = _MARKRECOMMENDATIONFAILEDREQUEST_STATEMETADATAENTRY +DESCRIPTOR.message_types_by_name["ListInsightsRequest"] = _LISTINSIGHTSREQUEST +DESCRIPTOR.message_types_by_name["ListInsightsResponse"] = _LISTINSIGHTSRESPONSE +DESCRIPTOR.message_types_by_name["GetInsightRequest"] = _GETINSIGHTREQUEST +DESCRIPTOR.message_types_by_name[ + "MarkInsightAcceptedRequest" +] = _MARKINSIGHTACCEPTEDREQUEST DESCRIPTOR.message_types_by_name[ "ListRecommendationsRequest" ] = _LISTRECOMMENDATIONSREQUEST @@ -706,6 +1064,111 @@ ] = _MARKRECOMMENDATIONFAILEDREQUEST _sym_db.RegisterFileDescriptor(DESCRIPTOR) +ListInsightsRequest = _reflection.GeneratedProtocolMessageType( + "ListInsightsRequest", + (_message.Message,), + { + "DESCRIPTOR": _LISTINSIGHTSREQUEST, + "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2", + "__doc__": """Request for the ``ListInsights`` method. + + Attributes: + parent: + Required. The container resource on which to execute the + request. Acceptable formats: 1. “projects/[PROJECT_NUMBER]/lo + cations/[LOCATION]/insightTypes/[INSIGHT_TYPE_ID]”, LOCATION + here refers to GCP Locations: + https://cloud.google.com/about/locations/ + page_size: + Optional. The maximum number of results to return from this + request. Non-positive values are ignored. If not specified, + the server will determine the number of results to return. + page_token: + Optional. If present, retrieves the next batch of results from + the preceding call to this method. ``page_token`` must be the + value of ``next_page_token`` from the previous response. The + values of other method parameters must be identical to those + in the previous call. + filter: + Optional. Filter expression to restrict the insights returned. + Supported filter fields: state Eg: \`state:“DISMISSED” or + state:“ACTIVE” + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.ListInsightsRequest) + }, +) +_sym_db.RegisterMessage(ListInsightsRequest) + +ListInsightsResponse = _reflection.GeneratedProtocolMessageType( + "ListInsightsResponse", + (_message.Message,), + { + "DESCRIPTOR": _LISTINSIGHTSRESPONSE, + "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2", + "__doc__": """Response to the ``ListInsights`` method. + + Attributes: + insights: + The set of insights for the ``parent`` resource. + next_page_token: + A token that can be used to request the next page of results. + This field is empty if there are no additional results. + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.ListInsightsResponse) + }, +) +_sym_db.RegisterMessage(ListInsightsResponse) + +GetInsightRequest = _reflection.GeneratedProtocolMessageType( + "GetInsightRequest", + (_message.Message,), + { + "DESCRIPTOR": _GETINSIGHTREQUEST, + "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2", + "__doc__": """Request to the ``GetInsight`` method. + + Attributes: + name: + Required. Name of the insight. + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.GetInsightRequest) + }, +) +_sym_db.RegisterMessage(GetInsightRequest) + +MarkInsightAcceptedRequest = _reflection.GeneratedProtocolMessageType( + "MarkInsightAcceptedRequest", + (_message.Message,), + { + "StateMetadataEntry": _reflection.GeneratedProtocolMessageType( + "StateMetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY, + "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2" + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.MarkInsightAcceptedRequest.StateMetadataEntry) + }, + ), + "DESCRIPTOR": _MARKINSIGHTACCEPTEDREQUEST, + "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2", + "__doc__": """Request for the ``MarkInsightAccepted`` method. + + Attributes: + name: + Required. Name of the insight. + state_metadata: + Optional. State properties user wish to include with this + state. Full replace of the current state_metadata. + etag: + Required. Fingerprint of the Insight. Provides optimistic + locking. + """, + # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.MarkInsightAcceptedRequest) + }, +) +_sym_db.RegisterMessage(MarkInsightAcceptedRequest) +_sym_db.RegisterMessage(MarkInsightAcceptedRequest.StateMetadataEntry) + ListRecommendationsRequest = _reflection.GeneratedProtocolMessageType( "ListRecommendationsRequest", (_message.Message,), @@ -754,7 +1217,8 @@ The set of recommendations for the ``parent`` resource. next_page_token: A token that can be used to request the next page of results. - This field is empty if there are no additional results. + This field is empty if there are no additional results. .. + [1] a-z0-9 .. [2] a-z0-9 .. [3] a-z0-9 """, # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.ListRecommendationsResponse) }, @@ -801,7 +1265,7 @@ state_metadata: State properties to include with this state. Overwrites any existing ``state_metadata``. Keys must match the regex ``/ - [2]_[a-z0-9_.-]{0,62}/``. Values must match the regex + [1]_[a-z0-9_.-]{0,62}/``. Values must match the regex ``/^[a-zA-Z0-9_./-]{0,255}/``. etag: Required. Fingerprint of the Recommendation. Provides @@ -836,7 +1300,7 @@ state_metadata: State properties to include with this state. Overwrites any existing ``state_metadata``. Keys must match the regex ``/ - [3]_[a-z0-9_.-]{0,62}/``. Values must match the regex + [2]_[a-z0-9_.-]{0,62}/``. Values must match the regex ``/^[a-zA-Z0-9_./-]{0,255}/``. etag: Required. Fingerprint of the Recommendation. Provides @@ -872,7 +1336,7 @@ state_metadata: State properties to include with this state. Overwrites any existing ``state_metadata``. Keys must match the regex ``/ - [1]_[a-z0-9_.-]{0,62}/``. Values must match the regex + [3]_[a-z0-9_.-]{0,62}/``. Values must match the regex ``/^[a-zA-Z0-9_./-]{0,255}/``. etag: Required. Fingerprint of the Recommendation. Provides @@ -886,6 +1350,15 @@ DESCRIPTOR._options = None +_LISTINSIGHTSREQUEST.fields_by_name["parent"]._options = None +_LISTINSIGHTSREQUEST.fields_by_name["page_size"]._options = None +_LISTINSIGHTSREQUEST.fields_by_name["page_token"]._options = None +_LISTINSIGHTSREQUEST.fields_by_name["filter"]._options = None +_GETINSIGHTREQUEST.fields_by_name["name"]._options = None +_MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY._options = None +_MARKINSIGHTACCEPTEDREQUEST.fields_by_name["name"]._options = None +_MARKINSIGHTACCEPTEDREQUEST.fields_by_name["state_metadata"]._options = None +_MARKINSIGHTACCEPTEDREQUEST.fields_by_name["etag"]._options = None _LISTRECOMMENDATIONSREQUEST.fields_by_name["parent"]._options = None _LISTRECOMMENDATIONSREQUEST.fields_by_name["page_size"]._options = None _LISTRECOMMENDATIONSREQUEST.fields_by_name["page_token"]._options = None @@ -907,13 +1380,43 @@ index=0, serialized_options=b"\312A\032recommender.googleapis.com\322A.https://www.googleapis.com/auth/cloud-platform", create_key=_descriptor._internal_create_key, - serialized_start=1488, - serialized_end=2797, + serialized_start=2146, + serialized_end=4059, methods=[ + _descriptor.MethodDescriptor( + name="ListInsights", + full_name="google.cloud.recommender.v1.Recommender.ListInsights", + index=0, + containing_service=None, + input_type=_LISTINSIGHTSREQUEST, + output_type=_LISTINSIGHTSRESPONSE, + serialized_options=b"\202\323\344\223\002=\022;/v1/{parent=projects/*/locations/*/insightTypes/*}/insights\332A\006parent", + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name="GetInsight", + full_name="google.cloud.recommender.v1.Recommender.GetInsight", + index=1, + containing_service=None, + input_type=_GETINSIGHTREQUEST, + output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2._INSIGHT, + serialized_options=b"\202\323\344\223\002=\022;/v1/{name=projects/*/locations/*/insightTypes/*/insights/*}\332A\004name", + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name="MarkInsightAccepted", + full_name="google.cloud.recommender.v1.Recommender.MarkInsightAccepted", + index=2, + containing_service=None, + input_type=_MARKINSIGHTACCEPTEDREQUEST, + output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2._INSIGHT, + serialized_options=b'\202\323\344\223\002M"H/v1/{name=projects/*/locations/*/insightTypes/*/insights/*}:markAccepted:\001*\332A\030name,state_metadata,etag', + create_key=_descriptor._internal_create_key, + ), _descriptor.MethodDescriptor( name="ListRecommendations", full_name="google.cloud.recommender.v1.Recommender.ListRecommendations", - index=0, + index=3, containing_service=None, input_type=_LISTRECOMMENDATIONSREQUEST, output_type=_LISTRECOMMENDATIONSRESPONSE, @@ -923,7 +1426,7 @@ _descriptor.MethodDescriptor( name="GetRecommendation", full_name="google.cloud.recommender.v1.Recommender.GetRecommendation", - index=1, + index=4, containing_service=None, input_type=_GETRECOMMENDATIONREQUEST, output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION, @@ -933,7 +1436,7 @@ _descriptor.MethodDescriptor( name="MarkRecommendationClaimed", full_name="google.cloud.recommender.v1.Recommender.MarkRecommendationClaimed", - index=2, + index=5, containing_service=None, input_type=_MARKRECOMMENDATIONCLAIMEDREQUEST, output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION, @@ -943,7 +1446,7 @@ _descriptor.MethodDescriptor( name="MarkRecommendationSucceeded", full_name="google.cloud.recommender.v1.Recommender.MarkRecommendationSucceeded", - index=3, + index=6, containing_service=None, input_type=_MARKRECOMMENDATIONSUCCEEDEDREQUEST, output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION, @@ -953,7 +1456,7 @@ _descriptor.MethodDescriptor( name="MarkRecommendationFailed", full_name="google.cloud.recommender.v1.Recommender.MarkRecommendationFailed", - index=4, + index=7, containing_service=None, input_type=_MARKRECOMMENDATIONFAILEDREQUEST, output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION, diff --git a/google/cloud/recommender_v1/proto/recommender_service_pb2_grpc.py b/google/cloud/recommender_v1/proto/recommender_service_pb2_grpc.py index 76f8def..419f2ae 100644 --- a/google/cloud/recommender_v1/proto/recommender_service_pb2_grpc.py +++ b/google/cloud/recommender_v1/proto/recommender_service_pb2_grpc.py @@ -2,6 +2,9 @@ """Client and server classes corresponding to protobuf-defined services.""" import grpc +from google.cloud.recommender_v1.proto import ( + insight_pb2 as google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2, +) from google.cloud.recommender_v1.proto import ( recommendation_pb2 as google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2, ) @@ -11,10 +14,10 @@ class RecommenderStub(object): - """Provides recommendations for cloud customers for various categories like - performance optimization, cost savings, reliability, feature discovery, etc. - These recommendations are generated automatically based on analysis of user - resources, configuration and monitoring metrics. + """Provides insights and recommendations for cloud customers for various + categories like performance optimization, cost savings, reliability, feature + discovery, etc. Insights and recommendations are generated automatically + based on analysis of user resources, configuration and monitoring metrics. """ def __init__(self, channel): @@ -23,6 +26,21 @@ def __init__(self, channel): Args: channel: A grpc.Channel. """ + self.ListInsights = channel.unary_unary( + "/google.cloud.recommender.v1.Recommender/ListInsights", + request_serializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListInsightsRequest.SerializeToString, + response_deserializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListInsightsResponse.FromString, + ) + self.GetInsight = channel.unary_unary( + "/google.cloud.recommender.v1.Recommender/GetInsight", + request_serializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.GetInsightRequest.SerializeToString, + response_deserializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2.Insight.FromString, + ) + self.MarkInsightAccepted = channel.unary_unary( + "/google.cloud.recommender.v1.Recommender/MarkInsightAccepted", + request_serializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.MarkInsightAcceptedRequest.SerializeToString, + response_deserializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2.Insight.FromString, + ) self.ListRecommendations = channel.unary_unary( "/google.cloud.recommender.v1.Recommender/ListRecommendations", request_serializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListRecommendationsRequest.SerializeToString, @@ -51,12 +69,40 @@ def __init__(self, channel): class RecommenderServicer(object): - """Provides recommendations for cloud customers for various categories like - performance optimization, cost savings, reliability, feature discovery, etc. - These recommendations are generated automatically based on analysis of user - resources, configuration and monitoring metrics. + """Provides insights and recommendations for cloud customers for various + categories like performance optimization, cost savings, reliability, feature + discovery, etc. Insights and recommendations are generated automatically + based on analysis of user resources, configuration and monitoring metrics. """ + def ListInsights(self, request, context): + """Lists insights for a Cloud project. Requires the recommender.*.list IAM + permission for the specified insight type. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def GetInsight(self, request, context): + """Gets the requested insight. Requires the recommender.*.get IAM permission + for the specified insight type. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def MarkInsightAccepted(self, request, context): + """Marks the Insight State as Accepted. Users can use this method to + indicate to the Recommender API that they have applied some action based + on the insight. This stops the insight content from being updated. + + MarkInsightAccepted can be applied to insights in ACTIVE state. Requires + the recommender.*.update IAM permission for the specified insight. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + def ListRecommendations(self, request, context): """Lists recommendations for a Cloud project. Requires the recommender.*.list IAM permission for the specified recommender. @@ -74,10 +120,10 @@ def GetRecommendation(self, request, context): raise NotImplementedError("Method not implemented!") def MarkRecommendationClaimed(self, request, context): - """Mark the Recommendation State as Claimed. Users can use this method to + """Marks the Recommendation State as Claimed. Users can use this method to indicate to the Recommender API that they are starting to apply the recommendation themselves. This stops the recommendation content from being - updated. + updated. Associated insights are frozen and placed in the ACCEPTED state. MarkRecommendationClaimed can be applied to recommendations in CLAIMED, SUCCEEDED, FAILED, or ACTIVE state. @@ -90,10 +136,11 @@ def MarkRecommendationClaimed(self, request, context): raise NotImplementedError("Method not implemented!") def MarkRecommendationSucceeded(self, request, context): - """Mark the Recommendation State as Succeeded. Users can use this method to + """Marks the Recommendation State as Succeeded. Users can use this method to indicate to the Recommender API that they have applied the recommendation themselves, and the operation was successful. This stops the recommendation - content from being updated. + content from being updated. Associated insights are frozen and placed in + the ACCEPTED state. MarkRecommendationSucceeded can be applied to recommendations in ACTIVE, CLAIMED, SUCCEEDED, or FAILED state. @@ -106,10 +153,11 @@ def MarkRecommendationSucceeded(self, request, context): raise NotImplementedError("Method not implemented!") def MarkRecommendationFailed(self, request, context): - """Mark the Recommendation State as Failed. Users can use this method to + """Marks the Recommendation State as Failed. Users can use this method to indicate to the Recommender API that they have applied the recommendation themselves, and the operation failed. This stops the recommendation content - from being updated. + from being updated. Associated insights are frozen and placed in the + ACCEPTED state. MarkRecommendationFailed can be applied to recommendations in ACTIVE, CLAIMED, SUCCEEDED, or FAILED state. @@ -124,6 +172,21 @@ def MarkRecommendationFailed(self, request, context): def add_RecommenderServicer_to_server(servicer, server): rpc_method_handlers = { + "ListInsights": grpc.unary_unary_rpc_method_handler( + servicer.ListInsights, + request_deserializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListInsightsRequest.FromString, + response_serializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListInsightsResponse.SerializeToString, + ), + "GetInsight": grpc.unary_unary_rpc_method_handler( + servicer.GetInsight, + request_deserializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.GetInsightRequest.FromString, + response_serializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2.Insight.SerializeToString, + ), + "MarkInsightAccepted": grpc.unary_unary_rpc_method_handler( + servicer.MarkInsightAccepted, + request_deserializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.MarkInsightAcceptedRequest.FromString, + response_serializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2.Insight.SerializeToString, + ), "ListRecommendations": grpc.unary_unary_rpc_method_handler( servicer.ListRecommendations, request_deserializer=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListRecommendationsRequest.FromString, @@ -158,12 +221,93 @@ def add_RecommenderServicer_to_server(servicer, server): # This class is part of an EXPERIMENTAL API. class Recommender(object): - """Provides recommendations for cloud customers for various categories like - performance optimization, cost savings, reliability, feature discovery, etc. - These recommendations are generated automatically based on analysis of user - resources, configuration and monitoring metrics. + """Provides insights and recommendations for cloud customers for various + categories like performance optimization, cost savings, reliability, feature + discovery, etc. Insights and recommendations are generated automatically + based on analysis of user resources, configuration and monitoring metrics. """ + @staticmethod + def ListInsights( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/google.cloud.recommender.v1.Recommender/ListInsights", + google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListInsightsRequest.SerializeToString, + google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListInsightsResponse.FromString, + options, + channel_credentials, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def GetInsight( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/google.cloud.recommender.v1.Recommender/GetInsight", + google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.GetInsightRequest.SerializeToString, + google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2.Insight.FromString, + options, + channel_credentials, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def MarkInsightAccepted( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/google.cloud.recommender.v1.Recommender/MarkInsightAccepted", + google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.MarkInsightAcceptedRequest.SerializeToString, + google_dot_cloud_dot_recommender__v1_dot_proto_dot_insight__pb2.Insight.FromString, + options, + channel_credentials, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + @staticmethod def ListRecommendations( request, diff --git a/google/cloud/recommender_v1/types.py b/google/cloud/recommender_v1/types.py index f5d243e..17ec504 100644 --- a/google/cloud/recommender_v1/types.py +++ b/google/cloud/recommender_v1/types.py @@ -20,6 +20,7 @@ from google.api_core.protobuf_helpers import get_messages +from google.cloud.recommender_v1.proto import insight_pb2 from google.cloud.recommender_v1.proto import recommendation_pb2 from google.cloud.recommender_v1.proto import recommender_service_pb2 from google.protobuf import duration_pb2 @@ -30,7 +31,7 @@ _shared_modules = [duration_pb2, struct_pb2, timestamp_pb2, money_pb2] -_local_modules = [recommendation_pb2, recommender_service_pb2] +_local_modules = [insight_pb2, recommendation_pb2, recommender_service_pb2] names = [] diff --git a/synth.metadata b/synth.metadata index 2218f99..bb1782e 100644 --- a/synth.metadata +++ b/synth.metadata @@ -11,8 +11,8 @@ "git": { "name": "googleapis", "remote": "https://github.com/googleapis/googleapis.git", - "sha": "e6ab0a55f2195169feded73dd684574dd4bd9dfa", - "internalRef": "319180144" + "sha": "76905ffe7e3b0605f64ef889fb88913634f9f836", + "internalRef": "319332818" } }, { diff --git a/tests/unit/gapic/v1/test_recommender_client_v1.py b/tests/unit/gapic/v1/test_recommender_client_v1.py index 617fb6d..e4957dd 100644 --- a/tests/unit/gapic/v1/test_recommender_client_v1.py +++ b/tests/unit/gapic/v1/test_recommender_client_v1.py @@ -20,6 +20,7 @@ import pytest from google.cloud import recommender_v1 +from google.cloud.recommender_v1.proto import insight_pb2 from google.cloud.recommender_v1.proto import recommendation_pb2 from google.cloud.recommender_v1.proto import recommender_service_pb2 @@ -61,6 +62,155 @@ class CustomException(Exception): class TestRecommenderClient(object): + def test_list_insights(self): + # Setup Expected Response + next_page_token = "" + insights_element = {} + insights = [insights_element] + expected_response = {"next_page_token": next_page_token, "insights": insights} + expected_response = recommender_service_pb2.ListInsightsResponse( + **expected_response + ) + + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = recommender_v1.RecommenderClient() + + # Setup Request + parent = client.insight_type_path("[PROJECT]", "[LOCATION]", "[INSIGHT_TYPE]") + + paged_list_response = client.list_insights(parent) + resources = list(paged_list_response) + assert len(resources) == 1 + + assert expected_response.insights[0] == resources[0] + + assert len(channel.requests) == 1 + expected_request = recommender_service_pb2.ListInsightsRequest(parent=parent) + actual_request = channel.requests[0][1] + assert expected_request == actual_request + + def test_list_insights_exception(self): + channel = ChannelStub(responses=[CustomException()]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = recommender_v1.RecommenderClient() + + # Setup request + parent = client.insight_type_path("[PROJECT]", "[LOCATION]", "[INSIGHT_TYPE]") + + paged_list_response = client.list_insights(parent) + with pytest.raises(CustomException): + list(paged_list_response) + + def test_get_insight(self): + # Setup Expected Response + name_2 = "name2-1052831874" + description = "description-1724546052" + insight_subtype = "insightSubtype-1491142701" + etag = "etag3123477" + expected_response = { + "name": name_2, + "description": description, + "insight_subtype": insight_subtype, + "etag": etag, + } + expected_response = insight_pb2.Insight(**expected_response) + + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = recommender_v1.RecommenderClient() + + # Setup Request + name = client.insight_path( + "[PROJECT]", "[LOCATION]", "[INSIGHT_TYPE]", "[INSIGHT]" + ) + + response = client.get_insight(name) + assert expected_response == response + + assert len(channel.requests) == 1 + expected_request = recommender_service_pb2.GetInsightRequest(name=name) + actual_request = channel.requests[0][1] + assert expected_request == actual_request + + def test_get_insight_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = recommender_v1.RecommenderClient() + + # Setup request + name = client.insight_path( + "[PROJECT]", "[LOCATION]", "[INSIGHT_TYPE]", "[INSIGHT]" + ) + + with pytest.raises(CustomException): + client.get_insight(name) + + def test_mark_insight_accepted(self): + # Setup Expected Response + name_2 = "name2-1052831874" + description = "description-1724546052" + insight_subtype = "insightSubtype-1491142701" + etag_2 = "etag2-1293302904" + expected_response = { + "name": name_2, + "description": description, + "insight_subtype": insight_subtype, + "etag": etag_2, + } + expected_response = insight_pb2.Insight(**expected_response) + + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = recommender_v1.RecommenderClient() + + # Setup Request + name = client.insight_path( + "[PROJECT]", "[LOCATION]", "[INSIGHT_TYPE]", "[INSIGHT]" + ) + etag = "etag3123477" + + response = client.mark_insight_accepted(name, etag) + assert expected_response == response + + assert len(channel.requests) == 1 + expected_request = recommender_service_pb2.MarkInsightAcceptedRequest( + name=name, etag=etag + ) + actual_request = channel.requests[0][1] + assert expected_request == actual_request + + def test_mark_insight_accepted_exception(self): + # Mock the API response + channel = ChannelStub(responses=[CustomException()]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = recommender_v1.RecommenderClient() + + # Setup request + name = client.insight_path( + "[PROJECT]", "[LOCATION]", "[INSIGHT_TYPE]", "[INSIGHT]" + ) + etag = "etag3123477" + + with pytest.raises(CustomException): + client.mark_insight_accepted(name, etag) + def test_list_recommendations(self): # Setup Expected Response next_page_token = ""