From e00e6b34ee71eecd2b2293873342b9b85a20e449 Mon Sep 17 00:00:00 2001
From: Yoshi Automation Bot <yoshi-automation@google.com>
Date: Wed, 27 May 2020 14:24:46 -0700
Subject: [PATCH 1/7] chore: change docstring line breaks (via synth) (#24)

---
 google/cloud/recommender_v1/proto/recommendation_pb2.py    | 7 ++++---
 google/cloud/recommender_v1beta1/proto/insight_pb2.py      | 4 ++--
 .../recommender_v1beta1/proto/recommender_service_pb2.py   | 4 ++--
 synth.metadata                                             | 2 +-
 4 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/google/cloud/recommender_v1/proto/recommendation_pb2.py b/google/cloud/recommender_v1/proto/recommendation_pb2.py
index 64f2547..c90c894 100644
--- a/google/cloud/recommender_v1/proto/recommendation_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommendation_pb2.py
@@ -1258,7 +1258,8 @@
     {
         "DESCRIPTOR": _VALUEMATCHER,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
-        "__doc__": """Contains various matching options for values for a GCP resource field.
+        "__doc__": """Contains various matching options for values for a GCP
+  resource field.
   
   
   Attributes:
@@ -1279,8 +1280,8 @@
     {
         "DESCRIPTOR": _COSTPROJECTION,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
-        "__doc__": """Contains metadata about how much money a recommendation
-  can save or incur.
+        "__doc__": """Contains metadata about how much money a recommendation can save or
+  incur.
   
   
   Attributes:
diff --git a/google/cloud/recommender_v1beta1/proto/insight_pb2.py b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
index 85588ae..dd91c49 100644
--- a/google/cloud/recommender_v1beta1/proto/insight_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
@@ -531,8 +531,8 @@
         ),
         "DESCRIPTOR": _INSIGHT,
         "__module__": "google.cloud.recommender_v1beta1.proto.insight_pb2",
-        "__doc__": """An insight along with the information used to derive the
-  insight. The insight may have associated recomendations as well.
+        "__doc__": """An insight along with the information used to derive the insight. The
+  insight may have associated recomendations as well.
   
   
   Attributes:
diff --git a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
index e2df9fa..8343f7a 100644
--- a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
@@ -1260,7 +1260,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
+          [3]_[a-z0-9_.-]{0,62}/``. Values must match the regex
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
@@ -1296,7 +1296,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
diff --git a/synth.metadata b/synth.metadata
index df0d409..8b29514 100644
--- a/synth.metadata
+++ b/synth.metadata
@@ -4,7 +4,7 @@
       "git": {
         "name": ".",
         "remote": "https://github.com/googleapis/python-recommender.git",
-        "sha": "754b32927208eb775c9d3774fc3c389e22039910"
+        "sha": "5e00996548efe5680e45a56e64e808a570d430c1"
       }
     },
     {

From 2d8723fe3395c20d9116aaf50d2d890a18b38baa Mon Sep 17 00:00:00 2001
From: Yoshi Automation Bot <yoshi-automation@google.com>
Date: Thu, 28 May 2020 09:46:25 -0700
Subject: [PATCH 2/7] chore: change docstring line breaks (via synth) (#25)

---
 .../proto/recommendation_pb2.py               | 48 +++++------------
 .../proto/recommender_service_pb2.py          | 12 -----
 .../recommender_v1beta1/proto/insight_pb2.py  |  7 +--
 .../proto/recommendation_pb2.py               | 53 +++++--------------
 .../proto/recommender_service_pb2.py          | 24 +--------
 synth.metadata                                |  4 +-
 6 files changed, 32 insertions(+), 116 deletions(-)

diff --git a/google/cloud/recommender_v1/proto/recommendation_pb2.py b/google/cloud/recommender_v1/proto/recommendation_pb2.py
index c90c894..df3c73b 100644
--- a/google/cloud/recommender_v1/proto/recommendation_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommendation_pb2.py
@@ -1063,11 +1063,8 @@
     {
         "DESCRIPTOR": _RECOMMENDATION,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
-        "__doc__": """A recommendation along with a suggested action. E.g., a
-  rightsizing recommendation for an underutilized VM, IAM role
-  recommendations, etc
-  
-  
+        "__doc__": """A recommendation along with a suggested action. E.g., a rightsizing
+  recommendation for an underutilized VM, IAM role recommendations, etc
   Attributes:
       name:
           Name of recommendation.
@@ -1114,10 +1111,7 @@
     {
         "DESCRIPTOR": _RECOMMENDATIONCONTENT,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
-        "__doc__": """Contains what resources are changing and how they are
-  changing.
-  
-  
+        "__doc__": """Contains what resources are changing and how they are changing.
   Attributes:
       operation_groups:
           Operations to one or more Google Cloud resources grouped in
@@ -1136,8 +1130,6 @@
         "DESCRIPTOR": _OPERATIONGROUP,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Group of operations that need to be performed atomically.
-  
-  
   Attributes:
       operations:
           List of operations across one or more resources that belong to
@@ -1173,18 +1165,13 @@
         ),
         "DESCRIPTOR": _OPERATION,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
-        "__doc__": """Contains an operation for a resource loosely based on the
-  JSON-PATCH format with support for:
-  
-  -  Custom filters for describing partial array patch.
-  -  Extended path values for describing nested arrays.
-  -  Custom fields for describing the resource for which the operation is
-     being described.
-  -  Allows extension to custom operations not natively supported by
-     RFC6902. See https://tools.ietf.org/html/rfc6902 for details on the
-     original RFC.
-  
-  
+        "__doc__": """Contains an operation for a resource loosely based on the JSON-PATCH
+  format with support for:  -  Custom filters for describing partial
+  array patch. -  Extended path values for describing nested arrays. -
+  Custom fields for describing the resource for which the operation is
+  being described. -  Allows extension to custom operations not natively
+  supported by    RFC6902. See https://tools.ietf.org/html/rfc6902 for
+  details on the    original RFC.
   Attributes:
       action:
           Type of this operation. Contains one of ‘and’, ‘remove’,
@@ -1258,10 +1245,7 @@
     {
         "DESCRIPTOR": _VALUEMATCHER,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
-        "__doc__": """Contains various matching options for values for a GCP
-  resource field.
-  
-  
+        "__doc__": """Contains various matching options for values for a GCP resource field.
   Attributes:
       matches_pattern:
           To be used for full regex matching. The regular expression is
@@ -1282,8 +1266,7 @@
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Contains metadata about how much money a recommendation can save or
   incur.
-  
-  
+
   Attributes:
       cost:
           An approximate projection on amount saved or amount incurred.
@@ -1304,10 +1287,7 @@
     {
         "DESCRIPTOR": _IMPACT,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
-        "__doc__": """Contains the impact a recommendation can have for a given
-  category.
-  
-  
+        "__doc__": """Contains the impact a recommendation can have for a given category.
   Attributes:
       category:
           Category that is being targeted.
@@ -1337,8 +1317,6 @@
         "DESCRIPTOR": _RECOMMENDATIONSTATEINFO,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Information for state. Contains state and metadata.
-  
-  
   Attributes:
       state:
           The state of the recommendation, Eg ACTIVE, SUCCEEDED, FAILED.
diff --git a/google/cloud/recommender_v1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
index cdb8149..703793a 100644
--- a/google/cloud/recommender_v1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
@@ -681,8 +681,6 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``ListRecommendations`` method.
-  
-  
   Attributes:
       parent:
           Required. The container resource on which to execute the
@@ -717,8 +715,6 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSRESPONSE,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Response to the ``ListRecommendations`` method.
-  
-  
   Attributes:
       recommendations:
           The set of recommendations for the ``parent`` resource.
@@ -738,8 +734,6 @@
         "DESCRIPTOR": _GETRECOMMENDATIONREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request to the ``GetRecommendation`` method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -765,8 +759,6 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONCLAIMEDREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationClaimed`` Method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -801,8 +793,6 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONSUCCEEDEDREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationSucceeded`` Method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -838,8 +828,6 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONFAILEDREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationFailed`` Method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
diff --git a/google/cloud/recommender_v1beta1/proto/insight_pb2.py b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
index dd91c49..cf86331 100644
--- a/google/cloud/recommender_v1beta1/proto/insight_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
@@ -518,8 +518,6 @@
                 "DESCRIPTOR": _INSIGHT_RECOMMENDATIONREFERENCE,
                 "__module__": "google.cloud.recommender_v1beta1.proto.insight_pb2",
                 "__doc__": """Reference to an associated recommendation.
-    
-    
     Attributes:
         recommendation:
             Recommendation resource name, e.g. projects/[PROJECT_NUMBER]/l
@@ -533,8 +531,7 @@
         "__module__": "google.cloud.recommender_v1beta1.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.
@@ -587,8 +584,6 @@
         "DESCRIPTOR": _INSIGHTSTATEINFO,
         "__module__": "google.cloud.recommender_v1beta1.proto.insight_pb2",
         "__doc__": """Information related to insight state.
-  
-  
   Attributes:
       state:
           Insight state.
diff --git a/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py b/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
index 33b36cf..185abd6 100644
--- a/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
@@ -1128,8 +1128,6 @@
                 "DESCRIPTOR": _RECOMMENDATION_INSIGHTREFERENCE,
                 "__module__": "google.cloud.recommender_v1beta1.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]``
@@ -1139,11 +1137,8 @@
         ),
         "DESCRIPTOR": _RECOMMENDATION,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
-        "__doc__": """A recommendation along with a suggested action. E.g., a
-  rightsizing recommendation for an underutilized VM, IAM role
-  recommendations, etc
-  
-  
+        "__doc__": """A recommendation along with a suggested action. E.g., a rightsizing
+  recommendation for an underutilized VM, IAM role recommendations, etc
   Attributes:
       name:
           Name of recommendation.
@@ -1193,10 +1188,7 @@
     {
         "DESCRIPTOR": _RECOMMENDATIONCONTENT,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
-        "__doc__": """Contains what resources are changing and how they are
-  changing.
-  
-  
+        "__doc__": """Contains what resources are changing and how they are changing.
   Attributes:
       operation_groups:
           Operations to one or more Google Cloud resources grouped in
@@ -1215,8 +1207,6 @@
         "DESCRIPTOR": _OPERATIONGROUP,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Group of operations that need to be performed atomically.
-  
-  
   Attributes:
       operations:
           List of operations across one or more resources that belong to
@@ -1252,18 +1242,13 @@
         ),
         "DESCRIPTOR": _OPERATION,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
-        "__doc__": """Contains an operation for a resource loosely based on the
-  JSON-PATCH format with support for:
-  
-  -  Custom filters for describing partial array patch.
-  -  Extended path values for describing nested arrays.
-  -  Custom fields for describing the resource for which the operation is
-     being described.
-  -  Allows extension to custom operations not natively supported by
-     RFC6902. See https://tools.ietf.org/html/rfc6902 for details on the
-     original RFC.
-  
-  
+        "__doc__": """Contains an operation for a resource loosely based on the JSON-PATCH
+  format with support for:  -  Custom filters for describing partial
+  array patch. -  Extended path values for describing nested arrays. -
+  Custom fields for describing the resource for which the operation is
+  being described. -  Allows extension to custom operations not natively
+  supported by    RFC6902. See https://tools.ietf.org/html/rfc6902 for
+  details on the    original RFC.
   Attributes:
       action:
           Type of this operation. Contains one of ‘and’, ‘remove’,
@@ -1337,10 +1322,7 @@
     {
         "DESCRIPTOR": _VALUEMATCHER,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
-        "__doc__": """Contains various matching options for values for a GCP
-  resource field.
-  
-  
+        "__doc__": """Contains various matching options for values for a GCP resource field.
   Attributes:
       matches_pattern:
           To be used for full regex matching. The regular expression is
@@ -1359,10 +1341,8 @@
     {
         "DESCRIPTOR": _COSTPROJECTION,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
-        "__doc__": """Contains metadata about how much money a recommendation
-  can save or incur.
-  
-  
+        "__doc__": """Contains metadata about how much money a recommendation can save or
+  incur.
   Attributes:
       cost:
           An approximate projection on amount saved or amount incurred.
@@ -1383,10 +1363,7 @@
     {
         "DESCRIPTOR": _IMPACT,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
-        "__doc__": """Contains the impact a recommendation can have for a given
-  category.
-  
-  
+        "__doc__": """Contains the impact a recommendation can have for a given category.
   Attributes:
       category:
           Category that is being targeted.
@@ -1416,8 +1393,6 @@
         "DESCRIPTOR": _RECOMMENDATIONSTATEINFO,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Information for state. Contains state and metadata.
-  
-  
   Attributes:
       state:
           The state of the recommendation, Eg ACTIVE, SUCCEEDED, FAILED.
diff --git a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
index 8343f7a..d8f1004 100644
--- a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
@@ -1022,8 +1022,6 @@
         "DESCRIPTOR": _LISTINSIGHTSREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``ListInsights`` method.
-  
-  
   Attributes:
       parent:
           Required. The container resource on which to execute the
@@ -1058,8 +1056,6 @@
         "DESCRIPTOR": _LISTINSIGHTSRESPONSE,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Response to the ``ListInsights`` method.
-  
-  
   Attributes:
       insights:
           The set of insights for the ``parent`` resource.
@@ -1079,8 +1075,6 @@
         "DESCRIPTOR": _GETINSIGHTREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request to the ``GetInsight`` method.
-  
-  
   Attributes:
       name:
           Required. Name of the insight.
@@ -1106,8 +1100,6 @@
         "DESCRIPTOR": _MARKINSIGHTACCEPTEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkInsightAccepted`` method.
-  
-  
   Attributes:
       name:
           Required. Name of the insight.
@@ -1131,8 +1123,6 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``ListRecommendations`` method.
-  
-  
   Attributes:
       parent:
           Required. The container resource on which to execute the
@@ -1154,7 +1144,6 @@
           Filter expression to restrict the recommendations returned.
           Supported filter fields: state_info.state Eg:
           \`state_info.state:“DISMISSED” or state_info.state:“FAILED”
-          .. [1]    a-z0-9  .. [2]    a-z0-9  .. [3]    a-z0-9
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1beta1.ListRecommendationsRequest)
     },
@@ -1168,8 +1157,6 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSRESPONSE,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Response to the ``ListRecommendations`` method.
-  
-  
   Attributes:
       recommendations:
           The set of recommendations for the ``parent`` resource.
@@ -1189,8 +1176,6 @@
         "DESCRIPTOR": _GETRECOMMENDATIONREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request to the ``GetRecommendation`` method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -1216,8 +1201,6 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONCLAIMEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationClaimed`` Method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -1252,8 +1235,6 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONSUCCEEDEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationSucceeded`` Method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -1288,8 +1269,6 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONFAILEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationFailed`` Method.
-  
-  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -1300,7 +1279,8 @@
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
-          optimistic locking.
+          optimistic locking.  .. [1]    a-z0-9  .. [2]    a-z0-9  ..
+          [3]    a-z0-9
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1beta1.MarkRecommendationFailedRequest)
     },
diff --git a/synth.metadata b/synth.metadata
index 8b29514..d5c8467 100644
--- a/synth.metadata
+++ b/synth.metadata
@@ -11,8 +11,8 @@
       "git": {
         "name": "googleapis",
         "remote": "https://github.com/googleapis/googleapis.git",
-        "sha": "89e89786896d256c70f43e68a975470c4f4f220e",
-        "internalRef": "311239362"
+        "sha": "576234f179d2e8dde1e629888afafb59abec7e6c",
+        "internalRef": "313408465"
       }
     },
     {

From 5c497e29d65d288a4b8b24a7b5aa487a5804e880 Mon Sep 17 00:00:00 2001
From: Yoshi Automation Bot <yoshi-automation@google.com>
Date: Wed, 1 Jul 2020 09:27:58 -0700
Subject: [PATCH 3/7] fix: update retry config (#31)

---
 google/cloud/recommender_v1/__init__.py       |   4 +-
 .../gapic/recommender_client_config.py        |  53 ++-
 .../proto/recommendation_pb2.py               | 127 ++++++-
 .../proto/recommendation_pb2_grpc.py          |  16 +-
 .../proto/recommender_service_pb2.py          |  56 ++-
 .../proto/recommender_service_pb2_grpc.py     | 238 +++++++++---
 google/cloud/recommender_v1beta1/__init__.py  |   4 +-
 .../gapic/recommender_client_config.py        |  65 ++--
 .../recommender_v1beta1/proto/insight_pb2.py  |  80 +++-
 .../proto/insight_pb2_grpc.py                 |  16 +-
 .../proto/recommendation_pb2.py               | 130 ++++++-
 .../proto/recommendation_pb2_grpc.py          |  16 +-
 .../proto/recommender_service_pb2.py          |  78 +++-
 .../proto/recommender_service_pb2_grpc.py     | 341 ++++++++++++++----
 synth.metadata                                |  13 +-
 15 files changed, 985 insertions(+), 252 deletions(-)

diff --git a/google/cloud/recommender_v1/__init__.py b/google/cloud/recommender_v1/__init__.py
index 1de5743..a848b91 100644
--- a/google/cloud/recommender_v1/__init__.py
+++ b/google/cloud/recommender_v1/__init__.py
@@ -26,8 +26,8 @@
 
 if sys.version_info[:2] == (2, 7):
     message = (
-        "A future version of this library will drop support for Python 2.7."
-        "More details about Python 2 support for Google Cloud Client Libraries"
+        "A future version of this library will drop support for Python 2.7. "
+        "More details about Python 2 support for Google Cloud Client Libraries "
         "can be found at https://cloud.google.com/python/docs/python2-sunset/"
     )
     warnings.warn(message, DeprecationWarning)
diff --git a/google/cloud/recommender_v1/gapic/recommender_client_config.py b/google/cloud/recommender_v1/gapic/recommender_client_config.py
index 7526288..ef6ad0e 100644
--- a/google/cloud/recommender_v1/gapic/recommender_client_config.py
+++ b/google/cloud/recommender_v1/gapic/recommender_client_config.py
@@ -2,45 +2,64 @@
     "interfaces": {
         "google.cloud.recommender.v1.Recommender": {
             "retry_codes": {
-                "idempotent": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
-                "non_idempotent": [],
+                "retry_policy_1_codes": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
+                "no_retry_codes": [],
+                "no_retry_1_codes": [],
             },
             "retry_params": {
-                "default": {
+                "retry_policy_1_params": {
                     "initial_retry_delay_millis": 100,
                     "retry_delay_multiplier": 1.3,
                     "max_retry_delay_millis": 60000,
-                    "initial_rpc_timeout_millis": 20000,
+                    "initial_rpc_timeout_millis": 60000,
                     "rpc_timeout_multiplier": 1.0,
-                    "max_rpc_timeout_millis": 20000,
-                    "total_timeout_millis": 600000,
-                }
+                    "max_rpc_timeout_millis": 60000,
+                    "total_timeout_millis": 60000,
+                },
+                "no_retry_params": {
+                    "initial_retry_delay_millis": 0,
+                    "retry_delay_multiplier": 0.0,
+                    "max_retry_delay_millis": 0,
+                    "initial_rpc_timeout_millis": 0,
+                    "rpc_timeout_multiplier": 1.0,
+                    "max_rpc_timeout_millis": 0,
+                    "total_timeout_millis": 0,
+                },
+                "no_retry_1_params": {
+                    "initial_retry_delay_millis": 0,
+                    "retry_delay_multiplier": 0.0,
+                    "max_retry_delay_millis": 0,
+                    "initial_rpc_timeout_millis": 60000,
+                    "rpc_timeout_multiplier": 1.0,
+                    "max_rpc_timeout_millis": 60000,
+                    "total_timeout_millis": 60000,
+                },
             },
             "methods": {
                 "ListRecommendations": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "retry_policy_1_codes",
+                    "retry_params_name": "retry_policy_1_params",
                 },
                 "GetRecommendation": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "retry_policy_1_codes",
+                    "retry_params_name": "retry_policy_1_params",
                 },
                 "MarkRecommendationClaimed": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "non_idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "no_retry_1_codes",
+                    "retry_params_name": "no_retry_1_params",
                 },
                 "MarkRecommendationSucceeded": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "non_idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "no_retry_1_codes",
+                    "retry_params_name": "no_retry_1_params",
                 },
                 "MarkRecommendationFailed": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "non_idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "no_retry_1_codes",
+                    "retry_params_name": "no_retry_1_params",
                 },
             },
         }
diff --git a/google/cloud/recommender_v1/proto/recommendation_pb2.py b/google/cloud/recommender_v1/proto/recommendation_pb2.py
index df3c73b..5f61a53 100644
--- a/google/cloud/recommender_v1/proto/recommendation_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommendation_pb2.py
@@ -16,7 +16,7 @@
 
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/cloud/recommender_v1/proto/recommendation.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
@@ -39,6 +39,7 @@
     package="google.cloud.recommender.v1",
     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',
     dependencies=[
         google_dot_api_dot_resource__pb2.DESCRIPTOR,
@@ -55,6 +56,7 @@
     full_name="google.cloud.recommender.v1.Impact.Category",
     filename=None,
     file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
     values=[
         _descriptor.EnumValueDescriptor(
             name="CATEGORY_UNSPECIFIED",
@@ -62,18 +64,39 @@
             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
+            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
+            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
+            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
+            name="MANAGEABILITY",
+            index=4,
+            number=4,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     containing_type=None,
@@ -88,6 +111,7 @@
     full_name="google.cloud.recommender.v1.RecommendationStateInfo.State",
     filename=None,
     file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
     values=[
         _descriptor.EnumValueDescriptor(
             name="STATE_UNSPECIFIED",
@@ -95,21 +119,47 @@
             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
+            name="ACTIVE",
+            index=1,
+            number=1,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="CLAIMED", index=2, number=6, serialized_options=None, type=None
+            name="CLAIMED",
+            index=2,
+            number=6,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="SUCCEEDED", index=3, number=3, serialized_options=None, type=None
+            name="SUCCEEDED",
+            index=3,
+            number=3,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="FAILED", index=4, number=4, serialized_options=None, type=None
+            name="FAILED",
+            index=4,
+            number=4,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="DISMISSED", index=5, number=5, serialized_options=None, type=None
+            name="DISMISSED",
+            index=5,
+            number=5,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     containing_type=None,
@@ -126,6 +176,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -144,6 +195,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="description",
@@ -162,6 +214,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="recommender_subtype",
@@ -180,6 +233,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="last_refresh_time",
@@ -198,6 +252,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="primary_impact",
@@ -216,6 +271,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="additional_impact",
@@ -234,6 +290,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="content",
@@ -252,6 +309,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_info",
@@ -270,6 +328,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -288,6 +347,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -309,6 +369,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="operation_groups",
@@ -327,6 +388,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -348,6 +410,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="operations",
@@ -366,6 +429,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -387,6 +451,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -405,6 +470,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -423,6 +489,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -443,6 +510,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -461,6 +529,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -479,6 +548,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -499,6 +569,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="action",
@@ -517,6 +588,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="resource_type",
@@ -535,6 +607,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="resource",
@@ -553,6 +626,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="path",
@@ -571,6 +645,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="source_resource",
@@ -589,6 +664,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="source_path",
@@ -607,6 +683,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -625,6 +702,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value_matcher",
@@ -643,6 +721,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="path_filters",
@@ -661,6 +740,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="path_value_matchers",
@@ -679,6 +759,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -694,6 +775,7 @@
             full_name="google.cloud.recommender.v1.Operation.path_value",
             index=0,
             containing_type=None,
+            create_key=_descriptor._internal_create_key,
             fields=[],
         )
     ],
@@ -708,6 +790,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="matches_pattern",
@@ -726,6 +809,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -741,6 +825,7 @@
             full_name="google.cloud.recommender.v1.ValueMatcher.match_variant",
             index=0,
             containing_type=None,
+            create_key=_descriptor._internal_create_key,
             fields=[],
         )
     ],
@@ -755,6 +840,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="cost",
@@ -773,6 +859,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="duration",
@@ -791,6 +878,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -812,6 +900,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="category",
@@ -830,6 +919,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="cost_projection",
@@ -848,6 +938,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -863,6 +954,7 @@
             full_name="google.cloud.recommender.v1.Impact.projection",
             index=0,
             containing_type=None,
+            create_key=_descriptor._internal_create_key,
             fields=[],
         )
     ],
@@ -877,6 +969,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -895,6 +988,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -913,6 +1007,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -933,6 +1028,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="state",
@@ -951,6 +1047,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -969,6 +1066,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -1065,6 +1163,7 @@
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """A recommendation along with a suggested action. E.g., a rightsizing
   recommendation for an underutilized VM, IAM role recommendations, etc
+  
   Attributes:
       name:
           Name of recommendation.
@@ -1112,6 +1211,7 @@
         "DESCRIPTOR": _RECOMMENDATIONCONTENT,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Contains what resources are changing and how they are changing.
+  
   Attributes:
       operation_groups:
           Operations to one or more Google Cloud resources grouped in
@@ -1130,6 +1230,7 @@
         "DESCRIPTOR": _OPERATIONGROUP,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Group of operations that need to be performed atomically.
+  
   Attributes:
       operations:
           List of operations across one or more resources that belong to
@@ -1172,6 +1273,7 @@
   being described. -  Allows extension to custom operations not natively
   supported by    RFC6902. See https://tools.ietf.org/html/rfc6902 for
   details on the    original RFC.
+  
   Attributes:
       action:
           Type of this operation. Contains one of ‘and’, ‘remove’,
@@ -1246,6 +1348,7 @@
         "DESCRIPTOR": _VALUEMATCHER,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Contains various matching options for values for a GCP resource field.
+  
   Attributes:
       matches_pattern:
           To be used for full regex matching. The regular expression is
@@ -1266,7 +1369,7 @@
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Contains metadata about how much money a recommendation can save or
   incur.
-
+  
   Attributes:
       cost:
           An approximate projection on amount saved or amount incurred.
@@ -1288,6 +1391,7 @@
         "DESCRIPTOR": _IMPACT,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Contains the impact a recommendation can have for a given category.
+  
   Attributes:
       category:
           Category that is being targeted.
@@ -1317,6 +1421,7 @@
         "DESCRIPTOR": _RECOMMENDATIONSTATEINFO,
         "__module__": "google.cloud.recommender_v1.proto.recommendation_pb2",
         "__doc__": """Information for state. Contains state and metadata.
+  
   Attributes:
       state:
           The state of the recommendation, Eg ACTIVE, SUCCEEDED, FAILED.
diff --git a/google/cloud/recommender_v1/proto/recommendation_pb2_grpc.py b/google/cloud/recommender_v1/proto/recommendation_pb2_grpc.py
index b662812..8a93939 100644
--- a/google/cloud/recommender_v1/proto/recommendation_pb2_grpc.py
+++ b/google/cloud/recommender_v1/proto/recommendation_pb2_grpc.py
@@ -1,17 +1,3 @@
-# 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 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/recommender_service_pb2.py b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
index 703793a..547f8da 100644
--- a/google/cloud/recommender_v1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
@@ -16,7 +16,7 @@
 
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/cloud/recommender_v1/proto/recommender_service.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
@@ -41,6 +41,7 @@
     package="google.cloud.recommender.v1",
     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',
     dependencies=[
         google_dot_api_dot_annotations__pb2.DESCRIPTOR,
@@ -58,6 +59,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="parent",
@@ -76,6 +78,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A(\n&recommender.googleapis.com/Recommender",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="page_size",
@@ -94,6 +97,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="page_token",
@@ -112,6 +116,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="filter",
@@ -130,6 +135,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -151,6 +157,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="recommendations",
@@ -169,6 +176,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="next_page_token",
@@ -187,6 +195,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -208,6 +217,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -226,6 +236,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -247,6 +258,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -265,6 +277,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -283,6 +296,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -303,6 +317,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -321,6 +336,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -339,6 +355,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -357,6 +374,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -378,6 +396,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -396,6 +415,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -414,6 +434,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -434,6 +455,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -452,6 +474,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -470,6 +493,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -488,6 +512,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -509,6 +534,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -527,6 +553,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -545,6 +572,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -565,6 +593,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -583,6 +612,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -601,6 +631,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -619,6 +650,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -681,6 +713,7 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``ListRecommendations`` method.
+  
   Attributes:
       parent:
           Required. The container resource on which to execute the
@@ -715,6 +748,7 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSRESPONSE,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Response to the ``ListRecommendations`` method.
+  
   Attributes:
       recommendations:
           The set of recommendations for the ``parent`` resource.
@@ -734,9 +768,11 @@
         "DESCRIPTOR": _GETRECOMMENDATIONREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request to the ``GetRecommendation`` method.
+  
   Attributes:
       name:
-          Required. Name of the recommendation.
+          Required. Name of the recommendation.  .. [1]    a-z0-9  ..
+          [2]    a-z0-9  .. [3]    a-z0-9
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.GetRecommendationRequest)
     },
@@ -759,13 +795,14 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONCLAIMEDREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationClaimed`` Method.
+  
   Attributes:
       name:
           Required. Name of the recommendation.
       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
+          [2]_[a-z0-9_.-]{0,62}/``. Values must match the regex
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
@@ -793,6 +830,7 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONSUCCEEDEDREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationSucceeded`` Method.
+  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -803,8 +841,7 @@
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
-          optimistic locking.  .. [1]    a-z0-9  .. [2]    a-z0-9  ..
-          [3]    a-z0-9
+          optimistic locking.
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.MarkRecommendationSucceededRequest)
     },
@@ -828,13 +865,14 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONFAILEDREQUEST,
         "__module__": "google.cloud.recommender_v1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationFailed`` Method.
+  
   Attributes:
       name:
           Required. Name of the recommendation.
       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
@@ -868,6 +906,7 @@
     file=DESCRIPTOR,
     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,
     methods=[
@@ -879,6 +918,7 @@
             input_type=_LISTRECOMMENDATIONSREQUEST,
             output_type=_LISTRECOMMENDATIONSRESPONSE,
             serialized_options=b"\202\323\344\223\002D\022B/v1/{parent=projects/*/locations/*/recommenders/*}/recommendations\332A\006parent\332A\rparent,filter",
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="GetRecommendation",
@@ -888,6 +928,7 @@
             input_type=_GETRECOMMENDATIONREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b"\202\323\344\223\002D\022B/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}\332A\004name",
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="MarkRecommendationClaimed",
@@ -897,6 +938,7 @@
             input_type=_MARKRECOMMENDATIONCLAIMEDREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b'\202\323\344\223\002S"N/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markClaimed:\001*\332A\030name,state_metadata,etag',
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="MarkRecommendationSucceeded",
@@ -906,6 +948,7 @@
             input_type=_MARKRECOMMENDATIONSUCCEEDEDREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b'\202\323\344\223\002U"P/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markSucceeded:\001*\332A\030name,state_metadata,etag',
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="MarkRecommendationFailed",
@@ -915,6 +958,7 @@
             input_type=_MARKRECOMMENDATIONFAILEDREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b'\202\323\344\223\002R"M/v1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markFailed:\001*\332A\030name,state_metadata,etag',
+            create_key=_descriptor._internal_create_key,
         ),
     ],
 )
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 486a25a..76f8def 100644
--- a/google/cloud/recommender_v1/proto/recommender_service_pb2_grpc.py
+++ b/google/cloud/recommender_v1/proto/recommender_service_pb2_grpc.py
@@ -1,19 +1,5 @@
-# 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 gRPC Python protocol compiler plugin. DO NOT EDIT!
-
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from google.cloud.recommender_v1.proto import (
@@ -26,17 +12,17 @@
 
 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.
-  """
+    performance optimization, cost savings, reliability, feature discovery, etc.
+    These recommendations are generated automatically based on analysis of user
+    resources, configuration and monitoring metrics.
+    """
 
     def __init__(self, channel):
         """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
+        Args:
+            channel: A grpc.Channel.
+        """
         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,
@@ -66,71 +52,71 @@ 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.
-  """
+    performance optimization, cost savings, reliability, feature discovery, etc.
+    These recommendations are generated automatically based on analysis of user
+    resources, configuration and monitoring metrics.
+    """
 
     def ListRecommendations(self, request, context):
         """Lists recommendations for a Cloud project. Requires the recommender.*.list
-    IAM permission for the specified recommender.
-    """
+        IAM permission for the specified recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def GetRecommendation(self, request, context):
         """Gets the requested recommendation. Requires the recommender.*.get
-    IAM permission for the specified recommender.
-    """
+        IAM permission for the specified recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def MarkRecommendationClaimed(self, request, context):
         """Mark 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.
+        indicate to the Recommender API that they are starting to apply the
+        recommendation themselves. This stops the recommendation content from being
+        updated.
 
-    MarkRecommendationClaimed can be applied to recommendations in CLAIMED,
-    SUCCEEDED, FAILED, or ACTIVE state.
+        MarkRecommendationClaimed can be applied to recommendations in CLAIMED,
+        SUCCEEDED, FAILED, or ACTIVE state.
 
-    Requires the recommender.*.update IAM permission for the specified
-    recommender.
-    """
+        Requires the recommender.*.update IAM permission for the specified
+        recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def MarkRecommendationSucceeded(self, request, context):
         """Mark 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.
+        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.
 
-    MarkRecommendationSucceeded can be applied to recommendations in ACTIVE,
-    CLAIMED, SUCCEEDED, or FAILED state.
+        MarkRecommendationSucceeded can be applied to recommendations in ACTIVE,
+        CLAIMED, SUCCEEDED, or FAILED state.
 
-    Requires the recommender.*.update IAM permission for the specified
-    recommender.
-    """
+        Requires the recommender.*.update IAM permission for the specified
+        recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def MarkRecommendationFailed(self, request, context):
         """Mark 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.
+        indicate to the Recommender API that they have applied the recommendation
+        themselves, and the operation failed. This stops the recommendation content
+        from being updated.
 
-    MarkRecommendationFailed can be applied to recommendations in ACTIVE,
-    CLAIMED, SUCCEEDED, or FAILED state.
+        MarkRecommendationFailed can be applied to recommendations in ACTIVE,
+        CLAIMED, SUCCEEDED, or FAILED state.
 
-    Requires the recommender.*.update IAM permission for the specified
-    recommender.
-    """
+        Requires the recommender.*.update IAM permission for the specified
+        recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
@@ -168,3 +154,147 @@ def add_RecommenderServicer_to_server(servicer, server):
         "google.cloud.recommender.v1.Recommender", rpc_method_handlers
     )
     server.add_generic_rpc_handlers((generic_handler,))
+
+
+# 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.
+    """
+
+    @staticmethod
+    def ListRecommendations(
+        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/ListRecommendations",
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListRecommendationsRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.ListRecommendationsResponse.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def GetRecommendation(
+        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/GetRecommendation",
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.GetRecommendationRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def MarkRecommendationClaimed(
+        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/MarkRecommendationClaimed",
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.MarkRecommendationClaimedRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def MarkRecommendationSucceeded(
+        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/MarkRecommendationSucceeded",
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.MarkRecommendationSucceededRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def MarkRecommendationFailed(
+        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/MarkRecommendationFailed",
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommender__service__pb2.MarkRecommendationFailedRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
diff --git a/google/cloud/recommender_v1beta1/__init__.py b/google/cloud/recommender_v1beta1/__init__.py
index 51dbe34..9de6826 100644
--- a/google/cloud/recommender_v1beta1/__init__.py
+++ b/google/cloud/recommender_v1beta1/__init__.py
@@ -26,8 +26,8 @@
 
 if sys.version_info[:2] == (2, 7):
     message = (
-        "A future version of this library will drop support for Python 2.7."
-        "More details about Python 2 support for Google Cloud Client Libraries"
+        "A future version of this library will drop support for Python 2.7. "
+        "More details about Python 2 support for Google Cloud Client Libraries "
         "can be found at https://cloud.google.com/python/docs/python2-sunset/"
     )
     warnings.warn(message, DeprecationWarning)
diff --git a/google/cloud/recommender_v1beta1/gapic/recommender_client_config.py b/google/cloud/recommender_v1beta1/gapic/recommender_client_config.py
index 011d9eb..fa55959 100644
--- a/google/cloud/recommender_v1beta1/gapic/recommender_client_config.py
+++ b/google/cloud/recommender_v1beta1/gapic/recommender_client_config.py
@@ -2,60 +2,79 @@
     "interfaces": {
         "google.cloud.recommender.v1beta1.Recommender": {
             "retry_codes": {
-                "idempotent": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
-                "non_idempotent": [],
+                "retry_policy_1_codes": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
+                "no_retry_codes": [],
+                "no_retry_1_codes": [],
             },
             "retry_params": {
-                "default": {
+                "retry_policy_1_params": {
                     "initial_retry_delay_millis": 100,
                     "retry_delay_multiplier": 1.3,
                     "max_retry_delay_millis": 60000,
-                    "initial_rpc_timeout_millis": 20000,
+                    "initial_rpc_timeout_millis": 60000,
                     "rpc_timeout_multiplier": 1.0,
-                    "max_rpc_timeout_millis": 20000,
-                    "total_timeout_millis": 600000,
-                }
+                    "max_rpc_timeout_millis": 60000,
+                    "total_timeout_millis": 60000,
+                },
+                "no_retry_params": {
+                    "initial_retry_delay_millis": 0,
+                    "retry_delay_multiplier": 0.0,
+                    "max_retry_delay_millis": 0,
+                    "initial_rpc_timeout_millis": 0,
+                    "rpc_timeout_multiplier": 1.0,
+                    "max_rpc_timeout_millis": 0,
+                    "total_timeout_millis": 0,
+                },
+                "no_retry_1_params": {
+                    "initial_retry_delay_millis": 0,
+                    "retry_delay_multiplier": 0.0,
+                    "max_retry_delay_millis": 0,
+                    "initial_rpc_timeout_millis": 60000,
+                    "rpc_timeout_multiplier": 1.0,
+                    "max_rpc_timeout_millis": 60000,
+                    "total_timeout_millis": 60000,
+                },
             },
             "methods": {
                 "ListInsights": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "retry_policy_1_codes",
+                    "retry_params_name": "retry_policy_1_params",
                 },
                 "GetInsight": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "retry_policy_1_codes",
+                    "retry_params_name": "retry_policy_1_params",
                 },
                 "MarkInsightAccepted": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "non_idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "no_retry_1_codes",
+                    "retry_params_name": "no_retry_1_params",
                 },
                 "ListRecommendations": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "retry_policy_1_codes",
+                    "retry_params_name": "retry_policy_1_params",
                 },
                 "GetRecommendation": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "retry_policy_1_codes",
+                    "retry_params_name": "retry_policy_1_params",
                 },
                 "MarkRecommendationClaimed": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "non_idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "no_retry_1_codes",
+                    "retry_params_name": "no_retry_1_params",
                 },
                 "MarkRecommendationSucceeded": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "non_idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "no_retry_1_codes",
+                    "retry_params_name": "no_retry_1_params",
                 },
                 "MarkRecommendationFailed": {
                     "timeout_millis": 60000,
-                    "retry_codes_name": "non_idempotent",
-                    "retry_params_name": "default",
+                    "retry_codes_name": "no_retry_1_codes",
+                    "retry_params_name": "no_retry_1_params",
                 },
             },
         }
diff --git a/google/cloud/recommender_v1beta1/proto/insight_pb2.py b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
index cf86331..f4a08e9 100644
--- a/google/cloud/recommender_v1beta1/proto/insight_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
@@ -16,7 +16,7 @@
 
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/cloud/recommender_v1beta1/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
@@ -38,6 +38,7 @@
     package="google.cloud.recommender.v1beta1",
     syntax="proto3",
     serialized_options=b"\n$com.google.cloud.recommender.v1beta1P\001ZKgoogle.golang.org/genproto/googleapis/cloud/recommender/v1beta1;recommender\242\002\004CREC\252\002 Google.Cloud.Recommender.V1Beta1\352Am\n&recommender.googleapis.com/InsightType\022Cprojects/{project}/locations/{location}/insightTypes/{insight_type}",
+    create_key=_descriptor._internal_create_key,
     serialized_pb=b'\n4google/cloud/recommender_v1beta1/proto/insight.proto\x12 google.cloud.recommender.v1beta1\x1a\x19google/api/resource.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x90\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\x46\n\nstate_info\x18\x06 \x01(\x0b\x32\x32.google.cloud.recommender.v1beta1.InsightStateInfo\x12\x44\n\x08\x63\x61tegory\x18\x07 \x01(\x0e\x32\x32.google.cloud.recommender.v1beta1.Insight.Category\x12\x0c\n\x04\x65tag\x18\x0b \x01(\t\x12\x65\n\x1a\x61ssociated_recommendations\x18\x08 \x03(\x0b\x32\x41.google.cloud.recommender.v1beta1.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}"\xb9\x02\n\x10InsightStateInfo\x12G\n\x05state\x18\x01 \x01(\x0e\x32\x38.google.cloud.recommender.v1beta1.InsightStateInfo.State\x12]\n\x0estate_metadata\x18\x02 \x03(\x0b\x32\x45.google.cloud.recommender.v1beta1.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\x8f\x02\n$com.google.cloud.recommender.v1beta1P\x01ZKgoogle.golang.org/genproto/googleapis/cloud/recommender/v1beta1;recommender\xa2\x02\x04\x43REC\xaa\x02 Google.Cloud.Recommender.V1Beta1\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,
@@ -53,6 +54,7 @@
     full_name="google.cloud.recommender.v1beta1.Insight.Category",
     filename=None,
     file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
     values=[
         _descriptor.EnumValueDescriptor(
             name="CATEGORY_UNSPECIFIED",
@@ -60,18 +62,39 @@
             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
+            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
+            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
+            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
+            name="MANAGEABILITY",
+            index=4,
+            number=4,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     containing_type=None,
@@ -86,6 +109,7 @@
     full_name="google.cloud.recommender.v1beta1.InsightStateInfo.State",
     filename=None,
     file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
     values=[
         _descriptor.EnumValueDescriptor(
             name="STATE_UNSPECIFIED",
@@ -93,15 +117,31 @@
             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
+            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
+            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
+            name="DISMISSED",
+            index=3,
+            number=3,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     containing_type=None,
@@ -118,6 +158,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="recommendation",
@@ -136,6 +177,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -156,6 +198,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -174,6 +217,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="description",
@@ -192,6 +236,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="target_resources",
@@ -210,6 +255,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="insight_subtype",
@@ -228,6 +274,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="content",
@@ -246,6 +293,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="last_refresh_time",
@@ -264,6 +312,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="observation_period",
@@ -282,6 +331,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_info",
@@ -300,6 +350,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="category",
@@ -318,6 +369,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -336,6 +388,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="associated_recommendations",
@@ -354,6 +407,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -375,6 +429,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -393,6 +448,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -411,6 +467,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -431,6 +488,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="state",
@@ -449,6 +507,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -467,6 +526,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -518,6 +578,7 @@
                 "DESCRIPTOR": _INSIGHT_RECOMMENDATIONREFERENCE,
                 "__module__": "google.cloud.recommender_v1beta1.proto.insight_pb2",
                 "__doc__": """Reference to an associated recommendation.
+    
     Attributes:
         recommendation:
             Recommendation resource name, e.g. projects/[PROJECT_NUMBER]/l
@@ -531,7 +592,7 @@
         "__module__": "google.cloud.recommender_v1beta1.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.
@@ -584,6 +645,7 @@
         "DESCRIPTOR": _INSIGHTSTATEINFO,
         "__module__": "google.cloud.recommender_v1beta1.proto.insight_pb2",
         "__doc__": """Information related to insight state.
+  
   Attributes:
       state:
           Insight state.
diff --git a/google/cloud/recommender_v1beta1/proto/insight_pb2_grpc.py b/google/cloud/recommender_v1beta1/proto/insight_pb2_grpc.py
index b662812..8a93939 100644
--- a/google/cloud/recommender_v1beta1/proto/insight_pb2_grpc.py
+++ b/google/cloud/recommender_v1beta1/proto/insight_pb2_grpc.py
@@ -1,17 +1,3 @@
-# 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 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_v1beta1/proto/recommendation_pb2.py b/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
index 185abd6..c77563c 100644
--- a/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
@@ -16,7 +16,7 @@
 
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/cloud/recommender_v1beta1/proto/recommendation.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
@@ -39,6 +39,7 @@
     package="google.cloud.recommender.v1beta1",
     syntax="proto3",
     serialized_options=b"\n$com.google.cloud.recommender.v1beta1P\001ZKgoogle.golang.org/genproto/googleapis/cloud/recommender/v1beta1;recommender\242\002\004CREC\252\002 Google.Cloud.Recommender.V1Beta1\352Al\n&recommender.googleapis.com/Recommender\022Bprojects/{project}/locations/{location}/recommenders/{recommender}",
+    create_key=_descriptor._internal_create_key,
     serialized_pb=b'\n;google/cloud/recommender_v1beta1/proto/recommendation.proto\x12 google.cloud.recommender.v1beta1\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"\xd1\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.v1beta1.Impact\x12\x43\n\x11\x61\x64\x64itional_impact\x18\x06 \x03(\x0b\x32(.google.cloud.recommender.v1beta1.Impact\x12H\n\x07\x63ontent\x18\x07 \x01(\x0b\x32\x37.google.cloud.recommender.v1beta1.RecommendationContent\x12M\n\nstate_info\x18\n \x01(\x0b\x32\x39.google.cloud.recommender.v1beta1.RecommendationStateInfo\x12\x0c\n\x04\x65tag\x18\x0b \x01(\t\x12^\n\x13\x61ssociated_insights\x18\x0e \x03(\x0b\x32\x41.google.cloud.recommender.v1beta1.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}"c\n\x15RecommendationContent\x12J\n\x10operation_groups\x18\x02 \x03(\x0b\x32\x30.google.cloud.recommender.v1beta1.OperationGroup"Q\n\x0eOperationGroup\x12?\n\noperations\x18\x01 \x03(\x0b\x32+.google.cloud.recommender.v1beta1.Operation"\xeb\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\x12G\n\rvalue_matcher\x18\n \x01(\x0b\x32..google.cloud.recommender.v1beta1.ValueMatcherH\x00\x12R\n\x0cpath_filters\x18\x08 \x03(\x0b\x32<.google.cloud.recommender.v1beta1.Operation.PathFiltersEntry\x12_\n\x13path_value_matchers\x18\x0b \x03(\x0b\x32\x42.google.cloud.recommender.v1beta1.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\x1ah\n\x16PathValueMatchersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12=\n\x05value\x18\x02 \x01(\x0b\x32..google.cloud.recommender.v1beta1.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"\x8a\x02\n\x06Impact\x12\x43\n\x08\x63\x61tegory\x18\x01 \x01(\x0e\x32\x31.google.cloud.recommender.v1beta1.Impact.Category\x12K\n\x0f\x63ost_projection\x18\x64 \x01(\x0b\x32\x30.google.cloud.recommender.v1beta1.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"\xe8\x02\n\x17RecommendationStateInfo\x12N\n\x05state\x18\x01 \x01(\x0e\x32?.google.cloud.recommender.v1beta1.RecommendationStateInfo.State\x12\x64\n\x0estate_metadata\x18\x02 \x03(\x0b\x32L.google.cloud.recommender.v1beta1.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\x8e\x02\n$com.google.cloud.recommender.v1beta1P\x01ZKgoogle.golang.org/genproto/googleapis/cloud/recommender/v1beta1;recommender\xa2\x02\x04\x43REC\xaa\x02 Google.Cloud.Recommender.V1Beta1\xea\x41l\n&recommender.googleapis.com/Recommender\x12\x42projects/{project}/locations/{location}/recommenders/{recommender}b\x06proto3',
     dependencies=[
         google_dot_api_dot_resource__pb2.DESCRIPTOR,
@@ -55,6 +56,7 @@
     full_name="google.cloud.recommender.v1beta1.Impact.Category",
     filename=None,
     file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
     values=[
         _descriptor.EnumValueDescriptor(
             name="CATEGORY_UNSPECIFIED",
@@ -62,18 +64,39 @@
             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
+            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
+            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
+            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
+            name="MANAGEABILITY",
+            index=4,
+            number=4,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     containing_type=None,
@@ -88,6 +111,7 @@
     full_name="google.cloud.recommender.v1beta1.RecommendationStateInfo.State",
     filename=None,
     file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
     values=[
         _descriptor.EnumValueDescriptor(
             name="STATE_UNSPECIFIED",
@@ -95,21 +119,47 @@
             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
+            name="ACTIVE",
+            index=1,
+            number=1,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="CLAIMED", index=2, number=6, serialized_options=None, type=None
+            name="CLAIMED",
+            index=2,
+            number=6,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="SUCCEEDED", index=3, number=3, serialized_options=None, type=None
+            name="SUCCEEDED",
+            index=3,
+            number=3,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="FAILED", index=4, number=4, serialized_options=None, type=None
+            name="FAILED",
+            index=4,
+            number=4,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="DISMISSED", index=5, number=5, serialized_options=None, type=None
+            name="DISMISSED",
+            index=5,
+            number=5,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     containing_type=None,
@@ -126,6 +176,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="insight",
@@ -144,6 +195,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -164,6 +216,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -182,6 +235,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="description",
@@ -200,6 +254,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="recommender_subtype",
@@ -218,6 +273,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="last_refresh_time",
@@ -236,6 +292,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="primary_impact",
@@ -254,6 +311,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="additional_impact",
@@ -272,6 +330,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="content",
@@ -290,6 +349,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_info",
@@ -308,6 +368,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -326,6 +387,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="associated_insights",
@@ -344,6 +406,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -365,6 +428,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="operation_groups",
@@ -383,6 +447,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -404,6 +469,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="operations",
@@ -422,6 +488,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -443,6 +510,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -461,6 +529,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -479,6 +548,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -499,6 +569,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -517,6 +588,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -535,6 +607,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -555,6 +628,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="action",
@@ -573,6 +647,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="resource_type",
@@ -591,6 +666,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="resource",
@@ -609,6 +685,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="path",
@@ -627,6 +704,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="source_resource",
@@ -645,6 +723,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="source_path",
@@ -663,6 +742,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -681,6 +761,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value_matcher",
@@ -699,6 +780,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="path_filters",
@@ -717,6 +799,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="path_value_matchers",
@@ -735,6 +818,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -750,6 +834,7 @@
             full_name="google.cloud.recommender.v1beta1.Operation.path_value",
             index=0,
             containing_type=None,
+            create_key=_descriptor._internal_create_key,
             fields=[],
         )
     ],
@@ -764,6 +849,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="matches_pattern",
@@ -782,6 +868,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -797,6 +884,7 @@
             full_name="google.cloud.recommender.v1beta1.ValueMatcher.match_variant",
             index=0,
             containing_type=None,
+            create_key=_descriptor._internal_create_key,
             fields=[],
         )
     ],
@@ -811,6 +899,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="cost",
@@ -829,6 +918,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="duration",
@@ -847,6 +937,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -868,6 +959,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="category",
@@ -886,6 +978,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="cost_projection",
@@ -904,6 +997,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -919,6 +1013,7 @@
             full_name="google.cloud.recommender.v1beta1.Impact.projection",
             index=0,
             containing_type=None,
+            create_key=_descriptor._internal_create_key,
             fields=[],
         )
     ],
@@ -933,6 +1028,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -951,6 +1047,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -969,6 +1066,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -989,6 +1087,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="state",
@@ -1007,6 +1106,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -1025,6 +1125,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -1128,6 +1229,7 @@
                 "DESCRIPTOR": _RECOMMENDATION_INSIGHTREFERENCE,
                 "__module__": "google.cloud.recommender_v1beta1.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]``
@@ -1139,6 +1241,7 @@
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """A recommendation along with a suggested action. E.g., a rightsizing
   recommendation for an underutilized VM, IAM role recommendations, etc
+  
   Attributes:
       name:
           Name of recommendation.
@@ -1189,6 +1292,7 @@
         "DESCRIPTOR": _RECOMMENDATIONCONTENT,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Contains what resources are changing and how they are changing.
+  
   Attributes:
       operation_groups:
           Operations to one or more Google Cloud resources grouped in
@@ -1207,6 +1311,7 @@
         "DESCRIPTOR": _OPERATIONGROUP,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Group of operations that need to be performed atomically.
+  
   Attributes:
       operations:
           List of operations across one or more resources that belong to
@@ -1249,6 +1354,7 @@
   being described. -  Allows extension to custom operations not natively
   supported by    RFC6902. See https://tools.ietf.org/html/rfc6902 for
   details on the    original RFC.
+  
   Attributes:
       action:
           Type of this operation. Contains one of ‘and’, ‘remove’,
@@ -1323,6 +1429,7 @@
         "DESCRIPTOR": _VALUEMATCHER,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Contains various matching options for values for a GCP resource field.
+  
   Attributes:
       matches_pattern:
           To be used for full regex matching. The regular expression is
@@ -1343,6 +1450,7 @@
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Contains metadata about how much money a recommendation can save or
   incur.
+  
   Attributes:
       cost:
           An approximate projection on amount saved or amount incurred.
@@ -1364,6 +1472,7 @@
         "DESCRIPTOR": _IMPACT,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Contains the impact a recommendation can have for a given category.
+  
   Attributes:
       category:
           Category that is being targeted.
@@ -1393,6 +1502,7 @@
         "DESCRIPTOR": _RECOMMENDATIONSTATEINFO,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommendation_pb2",
         "__doc__": """Information for state. Contains state and metadata.
+  
   Attributes:
       state:
           The state of the recommendation, Eg ACTIVE, SUCCEEDED, FAILED.
diff --git a/google/cloud/recommender_v1beta1/proto/recommendation_pb2_grpc.py b/google/cloud/recommender_v1beta1/proto/recommendation_pb2_grpc.py
index b662812..8a93939 100644
--- a/google/cloud/recommender_v1beta1/proto/recommendation_pb2_grpc.py
+++ b/google/cloud/recommender_v1beta1/proto/recommendation_pb2_grpc.py
@@ -1,17 +1,3 @@
-# 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 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_v1beta1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
index d8f1004..123260b 100644
--- a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
@@ -16,7 +16,7 @@
 
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: google/cloud/recommender_v1beta1/proto/recommender_service.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
@@ -44,6 +44,7 @@
     package="google.cloud.recommender.v1beta1",
     syntax="proto3",
     serialized_options=b"\n$com.google.cloud.recommender.v1beta1B\020RecommenderProtoP\001ZKgoogle.golang.org/genproto/googleapis/cloud/recommender/v1beta1;recommender\242\002\004CREC\252\002 Google.Cloud.Recommender.V1Beta1",
+    create_key=_descriptor._internal_create_key,
     serialized_pb=b'\n@google/cloud/recommender_v1beta1/proto/recommender_service.proto\x12 google.cloud.recommender.v1beta1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x34google/cloud/recommender_v1beta1/proto/insight.proto\x1a;google/cloud/recommender_v1beta1/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"l\n\x14ListInsightsResponse\x12;\n\x08insights\x18\x01 \x03(\x0b\x32).google.cloud.recommender.v1beta1.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"\x8d\x02\n\x1aMarkInsightAcceptedRequest\x12\x38\n\x04name\x18\x01 \x01(\tB*\xe0\x41\x02\xfa\x41$\n"recommender.googleapis.com/Insight\x12l\n\x0estate_metadata\x18\x02 \x03(\x0b\x32O.google.cloud.recommender.v1beta1.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"\x81\x01\n\x1bListRecommendationsResponse\x12I\n\x0frecommendations\x18\x01 \x03(\x0b\x32\x30.google.cloud.recommender.v1beta1.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"\x9b\x02\n MarkRecommendationClaimedRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12m\n\x0estate_metadata\x18\x02 \x03(\x0b\x32U.google.cloud.recommender.v1beta1.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"\x9f\x02\n"MarkRecommendationSucceededRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12o\n\x0estate_metadata\x18\x02 \x03(\x0b\x32W.google.cloud.recommender.v1beta1.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"\x99\x02\n\x1fMarkRecommendationFailedRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)recommender.googleapis.com/Recommendation\x12l\n\x0estate_metadata\x18\x02 \x03(\x0b\x32T.google.cloud.recommender.v1beta1.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\xe8\x0f\n\x0bRecommender\x12\xd0\x01\n\x0cListInsights\x12\x35.google.cloud.recommender.v1beta1.ListInsightsRequest\x1a\x36.google.cloud.recommender.v1beta1.ListInsightsResponse"Q\x82\xd3\xe4\x93\x02\x42\x12@/v1beta1/{parent=projects/*/locations/*/insightTypes/*}/insights\xda\x41\x06parent\x12\xbd\x01\n\nGetInsight\x12\x33.google.cloud.recommender.v1beta1.GetInsightRequest\x1a).google.cloud.recommender.v1beta1.Insight"O\x82\xd3\xe4\x93\x02\x42\x12@/v1beta1/{name=projects/*/locations/*/insightTypes/*/insights/*}\xda\x41\x04name\x12\xf3\x01\n\x13MarkInsightAccepted\x12<.google.cloud.recommender.v1beta1.MarkInsightAcceptedRequest\x1a).google.cloud.recommender.v1beta1.Insight"s\x82\xd3\xe4\x93\x02R"M/v1beta1/{name=projects/*/locations/*/insightTypes/*/insights/*}:markAccepted:\x01*\xda\x41\x18name,state_metadata,etag\x12\xf3\x01\n\x13ListRecommendations\x12<.google.cloud.recommender.v1beta1.ListRecommendationsRequest\x1a=.google.cloud.recommender.v1beta1.ListRecommendationsResponse"_\x82\xd3\xe4\x93\x02I\x12G/v1beta1/{parent=projects/*/locations/*/recommenders/*}/recommendations\xda\x41\rparent,filter\x12\xd9\x01\n\x11GetRecommendation\x12:.google.cloud.recommender.v1beta1.GetRecommendationRequest\x1a\x30.google.cloud.recommender.v1beta1.Recommendation"V\x82\xd3\xe4\x93\x02I\x12G/v1beta1/{name=projects/*/locations/*/recommenders/*/recommendations/*}\xda\x41\x04name\x12\x8c\x02\n\x19MarkRecommendationClaimed\x12\x42.google.cloud.recommender.v1beta1.MarkRecommendationClaimedRequest\x1a\x30.google.cloud.recommender.v1beta1.Recommendation"y\x82\xd3\xe4\x93\x02X"S/v1beta1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markClaimed:\x01*\xda\x41\x18name,state_metadata,etag\x12\x92\x02\n\x1bMarkRecommendationSucceeded\x12\x44.google.cloud.recommender.v1beta1.MarkRecommendationSucceededRequest\x1a\x30.google.cloud.recommender.v1beta1.Recommendation"{\x82\xd3\xe4\x93\x02Z"U/v1beta1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markSucceeded:\x01*\xda\x41\x18name,state_metadata,etag\x12\x89\x02\n\x18MarkRecommendationFailed\x12\x41.google.cloud.recommender.v1beta1.MarkRecommendationFailedRequest\x1a\x30.google.cloud.recommender.v1beta1.Recommendation"x\x82\xd3\xe4\x93\x02W"R/v1beta1/{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\xb1\x01\n$com.google.cloud.recommender.v1beta1B\x10RecommenderProtoP\x01ZKgoogle.golang.org/genproto/googleapis/cloud/recommender/v1beta1;recommender\xa2\x02\x04\x43REC\xaa\x02 Google.Cloud.Recommender.V1Beta1b\x06proto3',
     dependencies=[
         google_dot_api_dot_annotations__pb2.DESCRIPTOR,
@@ -62,6 +63,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="parent",
@@ -80,6 +82,7 @@
             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",
@@ -98,6 +101,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="page_token",
@@ -116,6 +120,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="filter",
@@ -134,6 +139,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -155,6 +161,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="insights",
@@ -173,6 +180,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="next_page_token",
@@ -191,6 +199,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -212,6 +221,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -230,6 +240,7 @@
             extension_scope=None,
             serialized_options=b'\340A\002\372A$\n"recommender.googleapis.com/Insight',
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -251,6 +262,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -269,6 +281,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -287,6 +300,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -307,6 +321,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -325,6 +340,7 @@
             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",
@@ -343,6 +359,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -361,6 +378,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -382,6 +400,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="parent",
@@ -400,6 +419,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A(\n&recommender.googleapis.com/Recommender",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="page_size",
@@ -418,6 +438,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="page_token",
@@ -436,6 +457,7 @@
             extension_scope=None,
             serialized_options=b"\340A\001",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="filter",
@@ -454,6 +476,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -475,6 +498,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="recommendations",
@@ -493,6 +517,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="next_page_token",
@@ -511,6 +536,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -532,6 +558,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -550,6 +577,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         )
     ],
     extensions=[],
@@ -571,6 +599,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -589,6 +618,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -607,6 +637,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -627,6 +658,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -645,6 +677,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -663,6 +696,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -681,6 +715,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -702,6 +737,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -720,6 +756,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -738,6 +775,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -758,6 +796,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -776,6 +815,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -794,6 +834,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -812,6 +853,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -833,6 +875,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="key",
@@ -851,6 +894,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="value",
@@ -869,6 +913,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -889,6 +934,7 @@
     filename=None,
     file=DESCRIPTOR,
     containing_type=None,
+    create_key=_descriptor._internal_create_key,
     fields=[
         _descriptor.FieldDescriptor(
             name="name",
@@ -907,6 +953,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="state_metadata",
@@ -925,6 +972,7 @@
             extension_scope=None,
             serialized_options=None,
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="etag",
@@ -943,6 +991,7 @@
             extension_scope=None,
             serialized_options=b"\340A\002",
             file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
         ),
     ],
     extensions=[],
@@ -1022,6 +1071,7 @@
         "DESCRIPTOR": _LISTINSIGHTSREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``ListInsights`` method.
+  
   Attributes:
       parent:
           Required. The container resource on which to execute the
@@ -1056,6 +1106,7 @@
         "DESCRIPTOR": _LISTINSIGHTSRESPONSE,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Response to the ``ListInsights`` method.
+  
   Attributes:
       insights:
           The set of insights for the ``parent`` resource.
@@ -1075,6 +1126,7 @@
         "DESCRIPTOR": _GETINSIGHTREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request to the ``GetInsight`` method.
+  
   Attributes:
       name:
           Required. Name of the insight.
@@ -1100,6 +1152,7 @@
         "DESCRIPTOR": _MARKINSIGHTACCEPTEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkInsightAccepted`` method.
+  
   Attributes:
       name:
           Required. Name of the insight.
@@ -1123,6 +1176,7 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``ListRecommendations`` method.
+  
   Attributes:
       parent:
           Required. The container resource on which to execute the
@@ -1144,6 +1198,7 @@
           Filter expression to restrict the recommendations returned.
           Supported filter fields: state_info.state Eg:
           \`state_info.state:“DISMISSED” or state_info.state:“FAILED”
+          .. [1]    a-z0-9  .. [2]    a-z0-9  .. [3]    a-z0-9
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1beta1.ListRecommendationsRequest)
     },
@@ -1157,6 +1212,7 @@
         "DESCRIPTOR": _LISTRECOMMENDATIONSRESPONSE,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Response to the ``ListRecommendations`` method.
+  
   Attributes:
       recommendations:
           The set of recommendations for the ``parent`` resource.
@@ -1176,6 +1232,7 @@
         "DESCRIPTOR": _GETRECOMMENDATIONREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request to the ``GetRecommendation`` method.
+  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -1201,6 +1258,7 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONCLAIMEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationClaimed`` Method.
+  
   Attributes:
       name:
           Required. Name of the recommendation.
@@ -1235,13 +1293,14 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONSUCCEEDEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationSucceeded`` Method.
+  
   Attributes:
       name:
           Required. Name of the recommendation.
       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
@@ -1269,18 +1328,18 @@
         "DESCRIPTOR": _MARKRECOMMENDATIONFAILEDREQUEST,
         "__module__": "google.cloud.recommender_v1beta1.proto.recommender_service_pb2",
         "__doc__": """Request for the ``MarkRecommendationFailed`` Method.
+  
   Attributes:
       name:
           Required. Name of the recommendation.
       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
+          [3]_[a-z0-9_.-]{0,62}/``. Values must match the regex
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
-          optimistic locking.  .. [1]    a-z0-9  .. [2]    a-z0-9  ..
-          [3]    a-z0-9
+          optimistic locking.
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1beta1.MarkRecommendationFailedRequest)
     },
@@ -1319,6 +1378,7 @@
     file=DESCRIPTOR,
     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=2197,
     serialized_end=4221,
     methods=[
@@ -1330,6 +1390,7 @@
             input_type=_LISTINSIGHTSREQUEST,
             output_type=_LISTINSIGHTSRESPONSE,
             serialized_options=b"\202\323\344\223\002B\022@/v1beta1/{parent=projects/*/locations/*/insightTypes/*}/insights\332A\006parent",
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="GetInsight",
@@ -1339,6 +1400,7 @@
             input_type=_GETINSIGHTREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_insight__pb2._INSIGHT,
             serialized_options=b"\202\323\344\223\002B\022@/v1beta1/{name=projects/*/locations/*/insightTypes/*/insights/*}\332A\004name",
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="MarkInsightAccepted",
@@ -1348,6 +1410,7 @@
             input_type=_MARKINSIGHTACCEPTEDREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_insight__pb2._INSIGHT,
             serialized_options=b'\202\323\344\223\002R"M/v1beta1/{name=projects/*/locations/*/insightTypes/*/insights/*}:markAccepted:\001*\332A\030name,state_metadata,etag',
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="ListRecommendations",
@@ -1357,6 +1420,7 @@
             input_type=_LISTRECOMMENDATIONSREQUEST,
             output_type=_LISTRECOMMENDATIONSRESPONSE,
             serialized_options=b"\202\323\344\223\002I\022G/v1beta1/{parent=projects/*/locations/*/recommenders/*}/recommendations\332A\rparent,filter",
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="GetRecommendation",
@@ -1366,6 +1430,7 @@
             input_type=_GETRECOMMENDATIONREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b"\202\323\344\223\002I\022G/v1beta1/{name=projects/*/locations/*/recommenders/*/recommendations/*}\332A\004name",
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="MarkRecommendationClaimed",
@@ -1375,6 +1440,7 @@
             input_type=_MARKRECOMMENDATIONCLAIMEDREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b'\202\323\344\223\002X"S/v1beta1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markClaimed:\001*\332A\030name,state_metadata,etag',
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="MarkRecommendationSucceeded",
@@ -1384,6 +1450,7 @@
             input_type=_MARKRECOMMENDATIONSUCCEEDEDREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b'\202\323\344\223\002Z"U/v1beta1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markSucceeded:\001*\332A\030name,state_metadata,etag',
+            create_key=_descriptor._internal_create_key,
         ),
         _descriptor.MethodDescriptor(
             name="MarkRecommendationFailed",
@@ -1393,6 +1460,7 @@
             input_type=_MARKRECOMMENDATIONFAILEDREQUEST,
             output_type=google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2._RECOMMENDATION,
             serialized_options=b'\202\323\344\223\002W"R/v1beta1/{name=projects/*/locations/*/recommenders/*/recommendations/*}:markFailed:\001*\332A\030name,state_metadata,etag',
+            create_key=_descriptor._internal_create_key,
         ),
     ],
 )
diff --git a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2_grpc.py b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2_grpc.py
index 3c0221b..34a0621 100644
--- a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2_grpc.py
+++ b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2_grpc.py
@@ -1,19 +1,5 @@
-# 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 gRPC Python protocol compiler plugin. DO NOT EDIT!
-
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from google.cloud.recommender_v1beta1.proto import (
@@ -29,17 +15,17 @@
 
 class RecommenderStub(object):
     """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.
-  """
+    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):
         """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
+        Args:
+            channel: A grpc.Channel.
+        """
         self.ListInsights = channel.unary_unary(
             "/google.cloud.recommender.v1beta1.Recommender/ListInsights",
             request_serializer=google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.ListInsightsRequest.SerializeToString,
@@ -84,101 +70,101 @@ def __init__(self, channel):
 
 class RecommenderServicer(object):
     """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.
-  """
+    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.
-    """
+        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.
-    """
+        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.
+        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.
-    """
+        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.
-    """
+        IAM permission for the specified recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def GetRecommendation(self, request, context):
         """Gets the requested recommendation. Requires the recommender.*.get
-    IAM permission for the specified recommender.
-    """
+        IAM permission for the specified recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def MarkRecommendationClaimed(self, request, context):
         """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. Associated insights are frozen and placed in the ACCEPTED state.
+        indicate to the Recommender API that they are starting to apply the
+        recommendation themselves. This stops the recommendation content from being
+        updated. Associated insights are frozen and placed in the ACCEPTED state.
 
-    MarkRecommendationClaimed can be applied to recommendations in CLAIMED or
-    ACTIVE state.
+        MarkRecommendationClaimed can be applied to recommendations in CLAIMED or
+        ACTIVE state.
 
-    Requires the recommender.*.update IAM permission for the specified
-    recommender.
-    """
+        Requires the recommender.*.update IAM permission for the specified
+        recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def MarkRecommendationSucceeded(self, request, context):
         """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. Associated insights are frozen and placed in
-    the ACCEPTED state.
+        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. Associated insights are frozen and placed in
+        the ACCEPTED state.
 
-    MarkRecommendationSucceeded can be applied to recommendations in ACTIVE,
-    CLAIMED, SUCCEEDED, or FAILED state.
+        MarkRecommendationSucceeded can be applied to recommendations in ACTIVE,
+        CLAIMED, SUCCEEDED, or FAILED state.
 
-    Requires the recommender.*.update IAM permission for the specified
-    recommender.
-    """
+        Requires the recommender.*.update IAM permission for the specified
+        recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
 
     def MarkRecommendationFailed(self, request, context):
         """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. Associated insights are frozen and placed in the
-    ACCEPTED state.
+        indicate to the Recommender API that they have applied the recommendation
+        themselves, and the operation failed. This stops the 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.
+        MarkRecommendationFailed can be applied to recommendations in ACTIVE,
+        CLAIMED, SUCCEEDED, or FAILED state.
 
-    Requires the recommender.*.update IAM permission for the specified
-    recommender.
-    """
+        Requires the recommender.*.update IAM permission for the specified
+        recommender.
+        """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details("Method not implemented!")
         raise NotImplementedError("Method not implemented!")
@@ -231,3 +217,228 @@ def add_RecommenderServicer_to_server(servicer, server):
         "google.cloud.recommender.v1beta1.Recommender", rpc_method_handlers
     )
     server.add_generic_rpc_handlers((generic_handler,))
+
+
+# This class is part of an EXPERIMENTAL API.
+class Recommender(object):
+    """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.v1beta1.Recommender/ListInsights",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.ListInsightsRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_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.v1beta1.Recommender/GetInsight",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.GetInsightRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_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.v1beta1.Recommender/MarkInsightAccepted",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.MarkInsightAcceptedRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_insight__pb2.Insight.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def ListRecommendations(
+        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.v1beta1.Recommender/ListRecommendations",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.ListRecommendationsRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.ListRecommendationsResponse.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def GetRecommendation(
+        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.v1beta1.Recommender/GetRecommendation",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.GetRecommendationRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def MarkRecommendationClaimed(
+        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.v1beta1.Recommender/MarkRecommendationClaimed",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.MarkRecommendationClaimedRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def MarkRecommendationSucceeded(
+        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.v1beta1.Recommender/MarkRecommendationSucceeded",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.MarkRecommendationSucceededRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
+
+    @staticmethod
+    def MarkRecommendationFailed(
+        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.v1beta1.Recommender/MarkRecommendationFailed",
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommender__service__pb2.MarkRecommendationFailedRequest.SerializeToString,
+            google_dot_cloud_dot_recommender__v1beta1_dot_proto_dot_recommendation__pb2.Recommendation.FromString,
+            options,
+            channel_credentials,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+        )
diff --git a/synth.metadata b/synth.metadata
index d5c8467..9fd5fd6 100644
--- a/synth.metadata
+++ b/synth.metadata
@@ -4,15 +4,22 @@
       "git": {
         "name": ".",
         "remote": "https://github.com/googleapis/python-recommender.git",
-        "sha": "5e00996548efe5680e45a56e64e808a570d430c1"
+        "sha": "2d8723fe3395c20d9116aaf50d2d890a18b38baa"
       }
     },
     {
       "git": {
         "name": "googleapis",
         "remote": "https://github.com/googleapis/googleapis.git",
-        "sha": "576234f179d2e8dde1e629888afafb59abec7e6c",
-        "internalRef": "313408465"
+        "sha": "e6ab0a55f2195169feded73dd684574dd4bd9dfa",
+        "internalRef": "319180144"
+      }
+    },
+    {
+      "git": {
+        "name": "synthtool",
+        "remote": "https://github.com/googleapis/synthtool.git",
+        "sha": "84c4156c49be9dcabacc8fd7b0585b6fd789ae47"
       }
     },
     {

From 109bb174fc60e2d2c03e397fad6877c31f300464 Mon Sep 17 00:00:00 2001
From: Yoshi Automation Bot <yoshi-automation@google.com>
Date: Mon, 13 Jul 2020 13:22:46 -0700
Subject: [PATCH 4/7] chore: update docstring formatting (#34)

autosynth cannot find the source of changes triggered by earlier changes in this
        repository, or by version upgrades to tools such as linters.
---
 .../recommender_v1/proto/recommender_service_pb2.py    |  6 +++---
 .../proto/recommender_service_pb2.py                   | 10 +++++-----
 synth.metadata                                         |  2 +-
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/google/cloud/recommender_v1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
index 547f8da..5842ac9 100644
--- a/google/cloud/recommender_v1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
@@ -771,8 +771,7 @@
   
   Attributes:
       name:
-          Required. Name of the recommendation.  .. [1]    a-z0-9  ..
-          [2]    a-z0-9  .. [3]    a-z0-9
+          Required. Name of the recommendation.
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.GetRecommendationRequest)
     },
@@ -841,7 +840,8 @@
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
-          optimistic locking.
+          optimistic locking.  .. [1]    a-z0-9  .. [2]    a-z0-9  ..
+          [3]    a-z0-9
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.MarkRecommendationSucceededRequest)
     },
diff --git a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
index 123260b..604d6d9 100644
--- a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
@@ -1112,7 +1112,8 @@
           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.
+          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.v1beta1.ListInsightsResponse)
     },
@@ -1198,7 +1199,6 @@
           Filter expression to restrict the recommendations returned.
           Supported filter fields: state_info.state Eg:
           \`state_info.state:“DISMISSED” or state_info.state:“FAILED”
-          .. [1]    a-z0-9  .. [2]    a-z0-9  .. [3]    a-z0-9
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1beta1.ListRecommendationsRequest)
     },
@@ -1265,7 +1265,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
+          [2]_[a-z0-9_.-]{0,62}/``. Values must match the regex
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
@@ -1300,7 +1300,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
+          [3]_[a-z0-9_.-]{0,62}/``. Values must match the regex
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
@@ -1335,7 +1335,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
+          [1]_[a-z0-9_.-]{0,62}/``. Values must match the regex
           ``/^[a-zA-Z0-9_./-]{0,255}/``.
       etag:
           Required. Fingerprint of the Recommendation. Provides
diff --git a/synth.metadata b/synth.metadata
index 9fd5fd6..2218f99 100644
--- a/synth.metadata
+++ b/synth.metadata
@@ -4,7 +4,7 @@
       "git": {
         "name": ".",
         "remote": "https://github.com/googleapis/python-recommender.git",
-        "sha": "2d8723fe3395c20d9116aaf50d2d890a18b38baa"
+        "sha": "5c497e29d65d288a4b8b24a7b5aa487a5804e880"
       }
     },
     {

From 940a3fb01013865c836bfb55397c25284004a7ad Mon Sep 17 00:00:00 2001
From: Yoshi Automation Bot <yoshi-automation@google.com>
Date: Mon, 13 Jul 2020 13:28:14 -0700
Subject: [PATCH 5/7] feat: add methods for interacting with insights (#35)

This PR was generated using Autosynth. :rainbow:

Synth log will be available here:
https://source.cloud.google.com/results/invocations/cd303691-1da7-4e59-a799-9ca83d49bbf2/targets

- [ ] To automatically regenerate this PR, check this box.

PiperOrigin-RevId: 319332818
Source-Link: https://github.com/googleapis/googleapis/commit/76905ffe7e3b0605f64ef889fb88913634f9f836
PiperOrigin-RevId: 319247865
Source-Link: https://github.com/googleapis/googleapis/commit/5202cfe3e5c2907a1a21a4c6d4bd0812029b6aa3
Source-Link: https://github.com/googleapis/synthtool/commit/84c4156c49be9dcabacc8fd7b0585b6fd789ae47
---
 google/cloud/recommender_v1/gapic/enums.py    |  46 +-
 .../gapic/recommender_client.py               | 314 ++++++++-
 .../gapic/recommender_client_config.py        |  15 +
 .../transports/recommender_grpc_transport.py  |  61 +-
 .../cloud/recommender_v1/proto/insight_pb2.py | 666 ++++++++++++++++++
 .../recommender_v1/proto/insight_pb2_grpc.py  |   3 +
 .../proto/recommendation_pb2.py               | 135 +++-
 .../proto/recommender_service_pb2.py          | 563 ++++++++++++++-
 .../proto/recommender_service_pb2_grpc.py     | 180 ++++-
 google/cloud/recommender_v1/types.py          |   3 +-
 synth.metadata                                |   4 +-
 .../gapic/v1/test_recommender_client_v1.py    | 150 ++++
 12 files changed, 2045 insertions(+), 95 deletions(-)
 create mode 100644 google/cloud/recommender_v1/proto/insight_pb2.py
 create mode 100644 google/cloud/recommender_v1/proto/insight_pb2_grpc.py

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 = ""

From 1fec4ead29b51e4958b897ec63bd1f41d922babd Mon Sep 17 00:00:00 2001
From: Yoshi Automation Bot <yoshi-automation@google.com>
Date: Mon, 13 Jul 2020 13:44:58 -0700
Subject: [PATCH 6/7] chore: update templates from synthtool (#36)

---
 .flake8                                       |   2 +
 .gitignore                                    |   2 +
 .kokoro/release.sh                            |   2 -
 .kokoro/samples/lint/common.cfg               |  34 ++++++
 .kokoro/samples/lint/continuous.cfg           |   6 +
 .kokoro/samples/lint/periodic.cfg             |   6 +
 .kokoro/samples/lint/presubmit.cfg            |   6 +
 .kokoro/samples/python3.6/common.cfg          |  34 ++++++
 .kokoro/samples/python3.6/continuous.cfg      |   7 ++
 .kokoro/samples/python3.6/periodic.cfg        |   6 +
 .kokoro/samples/python3.6/presubmit.cfg       |   6 +
 .kokoro/samples/python3.7/common.cfg          |  34 ++++++
 .kokoro/samples/python3.7/continuous.cfg      |   6 +
 .kokoro/samples/python3.7/periodic.cfg        |   6 +
 .kokoro/samples/python3.7/presubmit.cfg       |   6 +
 .kokoro/samples/python3.8/common.cfg          |  34 ++++++
 .kokoro/samples/python3.8/continuous.cfg      |   6 +
 .kokoro/samples/python3.8/periodic.cfg        |   6 +
 .kokoro/samples/python3.8/presubmit.cfg       |   6 +
 .kokoro/test-samples.sh                       | 104 ++++++++++++++++++
 MANIFEST.in                                   |   3 +
 docs/_templates/layout.html                   |   4 +-
 docs/conf.py                                  |   9 +-
 google/cloud/recommender.py                   |   6 +-
 google/cloud/recommender_v1/__init__.py       |   6 +-
 .../gapic/recommender_client.py               |  18 +--
 .../transports/recommender_grpc_transport.py  |   4 +-
 .../proto/recommendation_pb2.py               |  20 ++--
 .../proto/recommender_service_pb2.py          |   9 +-
 google/cloud/recommender_v1/types.py          |  14 ++-
 google/cloud/recommender_v1beta1/__init__.py  |   6 +-
 .../gapic/recommender_client.py               |  24 ++--
 .../transports/recommender_grpc_transport.py  |   4 +-
 .../recommender_v1beta1/proto/insight_pb2.py  |  10 +-
 .../proto/recommendation_pb2.py               |  24 ++--
 .../proto/recommender_service_pb2.py          |  12 +-
 google/cloud/recommender_v1beta1/types.py     |  15 ++-
 noxfile.py                                    |  33 ++++--
 scripts/decrypt-secrets.sh                    |  33 ++++++
 scripts/readme-gen/readme_gen.py              |  66 +++++++++++
 scripts/readme-gen/templates/README.tmpl.rst  |  87 +++++++++++++++
 scripts/readme-gen/templates/auth.tmpl.rst    |   9 ++
 .../templates/auth_api_key.tmpl.rst           |  14 +++
 .../templates/install_deps.tmpl.rst           |  29 +++++
 .../templates/install_portaudio.tmpl.rst      |  35 ++++++
 synth.metadata                                |   4 +-
 synth.py                                      |   6 +-
 testing/.gitignore                            |   3 +
 48 files changed, 729 insertions(+), 97 deletions(-)
 create mode 100644 .kokoro/samples/lint/common.cfg
 create mode 100644 .kokoro/samples/lint/continuous.cfg
 create mode 100644 .kokoro/samples/lint/periodic.cfg
 create mode 100644 .kokoro/samples/lint/presubmit.cfg
 create mode 100644 .kokoro/samples/python3.6/common.cfg
 create mode 100644 .kokoro/samples/python3.6/continuous.cfg
 create mode 100644 .kokoro/samples/python3.6/periodic.cfg
 create mode 100644 .kokoro/samples/python3.6/presubmit.cfg
 create mode 100644 .kokoro/samples/python3.7/common.cfg
 create mode 100644 .kokoro/samples/python3.7/continuous.cfg
 create mode 100644 .kokoro/samples/python3.7/periodic.cfg
 create mode 100644 .kokoro/samples/python3.7/presubmit.cfg
 create mode 100644 .kokoro/samples/python3.8/common.cfg
 create mode 100644 .kokoro/samples/python3.8/continuous.cfg
 create mode 100644 .kokoro/samples/python3.8/periodic.cfg
 create mode 100644 .kokoro/samples/python3.8/presubmit.cfg
 create mode 100755 .kokoro/test-samples.sh
 create mode 100755 scripts/decrypt-secrets.sh
 create mode 100644 scripts/readme-gen/readme_gen.py
 create mode 100644 scripts/readme-gen/templates/README.tmpl.rst
 create mode 100644 scripts/readme-gen/templates/auth.tmpl.rst
 create mode 100644 scripts/readme-gen/templates/auth_api_key.tmpl.rst
 create mode 100644 scripts/readme-gen/templates/install_deps.tmpl.rst
 create mode 100644 scripts/readme-gen/templates/install_portaudio.tmpl.rst
 create mode 100644 testing/.gitignore

diff --git a/.flake8 b/.flake8
index 20fe9bd..ed93163 100644
--- a/.flake8
+++ b/.flake8
@@ -21,6 +21,8 @@ exclude =
   # Exclude generated code.
   **/proto/**
   **/gapic/**
+  **/services/**
+  **/types/**
   *_pb2.py
 
   # Standard linting exemptions.
diff --git a/.gitignore b/.gitignore
index 3fb06e0..b87e1ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@
 dist
 build
 eggs
+.eggs
 parts
 bin
 var
@@ -49,6 +50,7 @@ bigquery/docs/generated
 # Virtual environment
 env/
 coverage.xml
+sponge_log.xml
 
 # System test environment variables.
 system_tests/local_test_setup
diff --git a/.kokoro/release.sh b/.kokoro/release.sh
index 9a48a17..7bde51f 100755
--- a/.kokoro/release.sh
+++ b/.kokoro/release.sh
@@ -13,8 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#!/bin/bash
-
 set -eo pipefail
 
 # Start the releasetool reporter
diff --git a/.kokoro/samples/lint/common.cfg b/.kokoro/samples/lint/common.cfg
new file mode 100644
index 0000000..1891a8e
--- /dev/null
+++ b/.kokoro/samples/lint/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+  define_artifacts {
+    regex: "**/*sponge_log.xml"
+  }
+}
+
+# Specify which tests to run
+env_vars: {
+    key: "RUN_TESTS_SESSION"
+    value: "lint"
+}
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/python-recommender/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+    key: "TRAMPOLINE_IMAGE"
+    value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-recommender/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/lint/continuous.cfg b/.kokoro/samples/lint/continuous.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/lint/continuous.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/lint/periodic.cfg b/.kokoro/samples/lint/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/lint/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/lint/presubmit.cfg b/.kokoro/samples/lint/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/lint/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.6/common.cfg b/.kokoro/samples/python3.6/common.cfg
new file mode 100644
index 0000000..b8d2727
--- /dev/null
+++ b/.kokoro/samples/python3.6/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+  define_artifacts {
+    regex: "**/*sponge_log.xml"
+  }
+}
+
+# Specify which tests to run
+env_vars: {
+    key: "RUN_TESTS_SESSION"
+    value: "py-3.6"
+}
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/python-recommender/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+    key: "TRAMPOLINE_IMAGE"
+    value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-recommender/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/python3.6/continuous.cfg b/.kokoro/samples/python3.6/continuous.cfg
new file mode 100644
index 0000000..7218af1
--- /dev/null
+++ b/.kokoro/samples/python3.6/continuous.cfg
@@ -0,0 +1,7 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
+
diff --git a/.kokoro/samples/python3.6/periodic.cfg b/.kokoro/samples/python3.6/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/python3.6/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.6/presubmit.cfg b/.kokoro/samples/python3.6/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.6/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/common.cfg b/.kokoro/samples/python3.7/common.cfg
new file mode 100644
index 0000000..acceed3
--- /dev/null
+++ b/.kokoro/samples/python3.7/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+  define_artifacts {
+    regex: "**/*sponge_log.xml"
+  }
+}
+
+# Specify which tests to run
+env_vars: {
+    key: "RUN_TESTS_SESSION"
+    value: "py-3.7"
+}
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/python-recommender/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+    key: "TRAMPOLINE_IMAGE"
+    value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-recommender/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/continuous.cfg b/.kokoro/samples/python3.7/continuous.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.7/continuous.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/periodic.cfg b/.kokoro/samples/python3.7/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/python3.7/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/presubmit.cfg b/.kokoro/samples/python3.7/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.7/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/common.cfg b/.kokoro/samples/python3.8/common.cfg
new file mode 100644
index 0000000..ad63042
--- /dev/null
+++ b/.kokoro/samples/python3.8/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+  define_artifacts {
+    regex: "**/*sponge_log.xml"
+  }
+}
+
+# Specify which tests to run
+env_vars: {
+    key: "RUN_TESTS_SESSION"
+    value: "py-3.8"
+}
+
+env_vars: {
+    key: "TRAMPOLINE_BUILD_FILE"
+    value: "github/python-recommender/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+    key: "TRAMPOLINE_IMAGE"
+    value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-recommender/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/continuous.cfg b/.kokoro/samples/python3.8/continuous.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.8/continuous.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/periodic.cfg b/.kokoro/samples/python3.8/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/python3.8/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/presubmit.cfg b/.kokoro/samples/python3.8/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.8/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+    key: "INSTALL_LIBRARY_FROM_SOURCE"
+    value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/test-samples.sh b/.kokoro/test-samples.sh
new file mode 100755
index 0000000..a860a0d
--- /dev/null
+++ b/.kokoro/test-samples.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+# 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
+#
+#     https://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.
+
+
+# `-e` enables the script to automatically fail when a command fails
+# `-o pipefail` sets the exit code to the rightmost comment to exit with a non-zero
+set -eo pipefail
+# Enables `**` to include files nested inside sub-folders
+shopt -s globstar
+
+cd github/python-recommender
+
+# Run periodic samples tests at latest release
+if [[ $KOKORO_BUILD_ARTIFACTS_SUBDIR = *"periodic"* ]]; then
+    LATEST_RELEASE=$(git describe --abbrev=0 --tags)
+    git checkout $LATEST_RELEASE
+fi
+
+# Disable buffering, so that the logs stream through.
+export PYTHONUNBUFFERED=1
+
+# Debug: show build environment
+env | grep KOKORO
+
+# Install nox
+python3.6 -m pip install --upgrade --quiet nox
+
+# Use secrets acessor service account to get secrets
+if [[ -f "${KOKORO_GFILE_DIR}/secrets_viewer_service_account.json" ]]; then
+    gcloud auth activate-service-account \
+	   --key-file="${KOKORO_GFILE_DIR}/secrets_viewer_service_account.json" \
+	   --project="cloud-devrel-kokoro-resources"
+fi
+
+# This script will create 3 files:
+# - testing/test-env.sh
+# - testing/service-account.json
+# - testing/client-secrets.json
+./scripts/decrypt-secrets.sh
+
+source ./testing/test-env.sh
+export GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/testing/service-account.json
+
+# For cloud-run session, we activate the service account for gcloud sdk.
+gcloud auth activate-service-account \
+       --key-file "${GOOGLE_APPLICATION_CREDENTIALS}"
+
+export GOOGLE_CLIENT_SECRETS=$(pwd)/testing/client-secrets.json
+
+echo -e "\n******************** TESTING PROJECTS ********************"
+
+# Switch to 'fail at end' to allow all tests to complete before exiting.
+set +e
+# Use RTN to return a non-zero value if the test fails.
+RTN=0
+ROOT=$(pwd)
+# Find all requirements.txt in the samples directory (may break on whitespace).
+for file in samples/**/requirements.txt; do
+    cd "$ROOT"
+    # Navigate to the project folder.
+    file=$(dirname "$file")
+    cd "$file"
+
+    echo "------------------------------------------------------------"
+    echo "- testing $file"
+    echo "------------------------------------------------------------"
+
+    # Use nox to execute the tests for the project.
+    python3.6 -m nox -s "$RUN_TESTS_SESSION"
+    EXIT=$?
+
+    # If this is a periodic build, send the test log to the Build Cop Bot.
+    # See https://github.com/googleapis/repo-automation-bots/tree/master/packages/buildcop.
+    if [[ $KOKORO_BUILD_ARTIFACTS_SUBDIR = *"periodic"* ]]; then
+      chmod +x $KOKORO_GFILE_DIR/linux_amd64/buildcop
+      $KOKORO_GFILE_DIR/linux_amd64/buildcop
+    fi
+
+    if [[ $EXIT -ne 0 ]]; then
+      RTN=1
+      echo -e "\n Testing failed: Nox returned a non-zero exit code. \n"
+    else
+      echo -e "\n Testing completed.\n"
+    fi
+
+done
+cd "$ROOT"
+
+# Workaround for Kokoro permissions issue: delete secrets
+rm testing/{test-env.sh,client-secrets.json,service-account.json}
+
+exit "$RTN"
\ No newline at end of file
diff --git a/MANIFEST.in b/MANIFEST.in
index 68855ab..e9e29d1 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -20,3 +20,6 @@ recursive-include google *.json *.proto
 recursive-include tests *
 global-exclude *.py[co]
 global-exclude __pycache__
+
+# Exclude scripts for samples readmegen
+prune scripts/readme-gen
\ No newline at end of file
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
index 228529e..6316a53 100644
--- a/docs/_templates/layout.html
+++ b/docs/_templates/layout.html
@@ -21,8 +21,8 @@
 
           <div class="body" role="main">
           	<div class="admonition" id="python2-eol"> 
-          	 On January 1, 2020 this library will no longer support Python 2 on the latest released version. 
-          	 Previously released library versions will continue to be available. For more information please
+          	 As of January 1, 2020 this library no longer supports Python 2 on the latest released version. 
+          	 Library versions released prior to that date will continue to be available. For more information please
           	 visit <a href="https://cloud.google.com/python/docs/python2-sunset/">Python 2 support on Google Cloud</a>.
           	</div>
             {% block body %} {% endblock %}
diff --git a/docs/conf.py b/docs/conf.py
index 9f88326..7616836 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -38,21 +38,18 @@
     "sphinx.ext.napoleon",
     "sphinx.ext.todo",
     "sphinx.ext.viewcode",
+    "recommonmark",
 ]
 
 # autodoc/autosummary flags
 autoclass_content = "both"
-autodoc_default_flags = ["members"]
+autodoc_default_options = {"members": True}
 autosummary_generate = True
 
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ["_templates"]
 
-# Allow markdown includes (so releases.md can include CHANGLEOG.md)
-# http://www.sphinx-doc.org/en/master/markdown.html
-source_parsers = {".md": "recommonmark.parser.CommonMarkParser"}
-
 # The suffix(es) of source filenames.
 # You can specify multiple suffix as a list of string:
 # source_suffix = ['.rst', '.md']
@@ -340,7 +337,7 @@
 intersphinx_mapping = {
     "python": ("http://python.readthedocs.org/en/latest/", None),
     "google-auth": ("https://google-auth.readthedocs.io/en/stable", None),
-    "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None),
+    "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None,),
     "grpc": ("https://grpc.io/grpc/python/", None),
 }
 
diff --git a/google/cloud/recommender.py b/google/cloud/recommender.py
index 7bf5c92..3dd5ddd 100644
--- a/google/cloud/recommender.py
+++ b/google/cloud/recommender.py
@@ -22,4 +22,8 @@
 from google.cloud.recommender_v1 import types
 
 
-__all__ = ("enums", "types", "RecommenderClient")
+__all__ = (
+    "enums",
+    "types",
+    "RecommenderClient",
+)
diff --git a/google/cloud/recommender_v1/__init__.py b/google/cloud/recommender_v1/__init__.py
index a848b91..05e20d3 100644
--- a/google/cloud/recommender_v1/__init__.py
+++ b/google/cloud/recommender_v1/__init__.py
@@ -38,4 +38,8 @@ class RecommenderClient(recommender_client.RecommenderClient):
     enums = enums
 
 
-__all__ = ("enums", "types", "RecommenderClient")
+__all__ = (
+    "enums",
+    "types",
+    "RecommenderClient",
+)
diff --git a/google/cloud/recommender_v1/gapic/recommender_client.py b/google/cloud/recommender_v1/gapic/recommender_client.py
index cd86757..cb46818 100644
--- a/google/cloud/recommender_v1/gapic/recommender_client.py
+++ b/google/cloud/recommender_v1/gapic/recommender_client.py
@@ -41,7 +41,7 @@
 
 
 _GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution(
-    "google-cloud-recommender"
+    "google-cloud-recommender",
 ).version
 
 
@@ -209,12 +209,12 @@ def __init__(
                 self.transport = transport
         else:
             self.transport = recommender_grpc_transport.RecommenderGrpcTransport(
-                address=api_endpoint, channel=channel, credentials=credentials
+                address=api_endpoint, channel=channel, credentials=credentials,
             )
 
         if client_info is None:
             client_info = google.api_core.gapic_v1.client_info.ClientInfo(
-                gapic_version=_GAPIC_LIBRARY_VERSION
+                gapic_version=_GAPIC_LIBRARY_VERSION,
             )
         else:
             client_info.gapic_version = _GAPIC_LIBRARY_VERSION
@@ -225,7 +225,7 @@ def __init__(
         # (Ordinarily, these are the defaults specified in the `*_config.py`
         # file next to this one.)
         self._method_configs = google.api_core.gapic_v1.config.parse_method_configs(
-            client_config["interfaces"][self._INTERFACE_NAME]
+            client_config["interfaces"][self._INTERFACE_NAME],
         )
 
         # Save a dictionary of cached API call functions.
@@ -590,7 +590,7 @@ def list_recommendations(
             )
 
         request = recommender_service_pb2.ListRecommendationsRequest(
-            parent=parent, page_size=page_size, filter=filter_
+            parent=parent, page_size=page_size, filter=filter_,
         )
         if metadata is None:
             metadata = []
@@ -672,7 +672,7 @@ def get_recommendation(
                 client_info=self._client_info,
             )
 
-        request = recommender_service_pb2.GetRecommendationRequest(name=name)
+        request = recommender_service_pb2.GetRecommendationRequest(name=name,)
         if metadata is None:
             metadata = []
         metadata = list(metadata)
@@ -764,7 +764,7 @@ def mark_recommendation_claimed(
             )
 
         request = recommender_service_pb2.MarkRecommendationClaimedRequest(
-            name=name, etag=etag, state_metadata=state_metadata
+            name=name, etag=etag, state_metadata=state_metadata,
         )
         if metadata is None:
             metadata = []
@@ -857,7 +857,7 @@ def mark_recommendation_succeeded(
             )
 
         request = recommender_service_pb2.MarkRecommendationSucceededRequest(
-            name=name, etag=etag, state_metadata=state_metadata
+            name=name, etag=etag, state_metadata=state_metadata,
         )
         if metadata is None:
             metadata = []
@@ -950,7 +950,7 @@ def mark_recommendation_failed(
             )
 
         request = recommender_service_pb2.MarkRecommendationFailedRequest(
-            name=name, etag=etag, state_metadata=state_metadata
+            name=name, etag=etag, state_metadata=state_metadata,
         )
         if metadata is None:
             metadata = []
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 5b2c038..3502d74 100644
--- a/google/cloud/recommender_v1/gapic/transports/recommender_grpc_transport.py
+++ b/google/cloud/recommender_v1/gapic/transports/recommender_grpc_transport.py
@@ -53,7 +53,7 @@ def __init__(
         # exception (channels come with credentials baked in already).
         if channel is not None and credentials is not None:
             raise ValueError(
-                "The `channel` and `credentials` arguments are mutually " "exclusive."
+                "The `channel` and `credentials` arguments are mutually " "exclusive.",
             )
 
         # Create the channel.
@@ -72,7 +72,7 @@ def __init__(
         # gRPC uses objects called "stubs" that are bound to the
         # channel and provide a basic method for each RPC.
         self._stubs = {
-            "recommender_stub": recommender_service_pb2_grpc.RecommenderStub(channel)
+            "recommender_stub": recommender_service_pb2_grpc.RecommenderStub(channel),
         }
 
     @classmethod
diff --git a/google/cloud/recommender_v1/proto/recommendation_pb2.py b/google/cloud/recommender_v1/proto/recommendation_pb2.py
index 89d4751..f323133 100644
--- a/google/cloud/recommender_v1/proto/recommendation_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommendation_pb2.py
@@ -448,7 +448,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -489,7 +489,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -822,7 +822,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_OPERATION_PATHFILTERSENTRY, _OPERATION_PATHVALUEMATCHERSENTRY],
+    nested_types=[_OPERATION_PATHFILTERSENTRY, _OPERATION_PATHVALUEMATCHERSENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -836,7 +836,7 @@
             containing_type=None,
             create_key=_descriptor._internal_create_key,
             fields=[],
-        )
+        ),
     ],
     serialized_start=1108,
     serialized_end=1707,
@@ -869,7 +869,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -886,7 +886,7 @@
             containing_type=None,
             create_key=_descriptor._internal_create_key,
             fields=[],
-        )
+        ),
     ],
     serialized_start=1709,
     serialized_end=1767,
@@ -1002,7 +1002,7 @@
     ],
     extensions=[],
     nested_types=[],
-    enum_types=[_IMPACT_CATEGORY],
+    enum_types=[_IMPACT_CATEGORY,],
     serialized_options=None,
     is_extendable=False,
     syntax="proto3",
@@ -1015,7 +1015,7 @@
             containing_type=None,
             create_key=_descriptor._internal_create_key,
             fields=[],
-        )
+        ),
     ],
     serialized_start=1867,
     serialized_end=2123,
@@ -1129,8 +1129,8 @@
         ),
     ],
     extensions=[],
-    nested_types=[_RECOMMENDATIONSTATEINFO_STATEMETADATAENTRY],
-    enum_types=[_RECOMMENDATIONSTATEINFO_STATE],
+    nested_types=[_RECOMMENDATIONSTATEINFO_STATEMETADATAENTRY,],
+    enum_types=[_RECOMMENDATIONSTATEINFO_STATE,],
     serialized_options=None,
     is_extendable=False,
     syntax="proto3",
diff --git a/google/cloud/recommender_v1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
index 66cae26..b82e1eb 100644
--- a/google/cloud/recommender_v1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1/proto/recommender_service_pb2.py
@@ -578,7 +578,7 @@
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -719,7 +719,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_MARKRECOMMENDATIONCLAIMEDREQUEST_STATEMETADATAENTRY],
+    nested_types=[_MARKRECOMMENDATIONCLAIMEDREQUEST_STATEMETADATAENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -857,7 +857,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_MARKRECOMMENDATIONSUCCEEDEDREQUEST_STATEMETADATAENTRY],
+    nested_types=[_MARKRECOMMENDATIONSUCCEEDEDREQUEST_STATEMETADATAENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -995,7 +995,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_MARKRECOMMENDATIONFAILEDREQUEST_STATEMETADATAENTRY],
+    nested_types=[_MARKRECOMMENDATIONFAILEDREQUEST_STATEMETADATAENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -1198,6 +1198,7 @@
           Filter expression to restrict the recommendations returned.
           Supported filter fields: state_info.state Eg:
           \`state_info.state:“DISMISSED” or state_info.state:“FAILED”
+          .. [1]    a-z0-9  .. [2]    a-z0-9  .. [3]    a-z0-9
   """,
         # @@protoc_insertion_point(class_scope:google.cloud.recommender.v1.ListRecommendationsRequest)
     },
diff --git a/google/cloud/recommender_v1/types.py b/google/cloud/recommender_v1/types.py
index 17ec504..c3536ae 100644
--- a/google/cloud/recommender_v1/types.py
+++ b/google/cloud/recommender_v1/types.py
@@ -29,9 +29,19 @@
 from google.type import money_pb2
 
 
-_shared_modules = [duration_pb2, struct_pb2, timestamp_pb2, money_pb2]
+_shared_modules = [
+    duration_pb2,
+    struct_pb2,
+    timestamp_pb2,
+    money_pb2,
+]
+
+_local_modules = [
+    insight_pb2,
+    recommendation_pb2,
+    recommender_service_pb2,
+]
 
-_local_modules = [insight_pb2, recommendation_pb2, recommender_service_pb2]
 
 names = []
 
diff --git a/google/cloud/recommender_v1beta1/__init__.py b/google/cloud/recommender_v1beta1/__init__.py
index 9de6826..82250ea 100644
--- a/google/cloud/recommender_v1beta1/__init__.py
+++ b/google/cloud/recommender_v1beta1/__init__.py
@@ -38,4 +38,8 @@ class RecommenderClient(recommender_client.RecommenderClient):
     enums = enums
 
 
-__all__ = ("enums", "types", "RecommenderClient")
+__all__ = (
+    "enums",
+    "types",
+    "RecommenderClient",
+)
diff --git a/google/cloud/recommender_v1beta1/gapic/recommender_client.py b/google/cloud/recommender_v1beta1/gapic/recommender_client.py
index e437b03..4087ac4 100644
--- a/google/cloud/recommender_v1beta1/gapic/recommender_client.py
+++ b/google/cloud/recommender_v1beta1/gapic/recommender_client.py
@@ -41,7 +41,7 @@
 
 
 _GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution(
-    "google-cloud-recommender"
+    "google-cloud-recommender",
 ).version
 
 
@@ -209,12 +209,12 @@ def __init__(
                 self.transport = transport
         else:
             self.transport = recommender_grpc_transport.RecommenderGrpcTransport(
-                address=api_endpoint, channel=channel, credentials=credentials
+                address=api_endpoint, channel=channel, credentials=credentials,
             )
 
         if client_info is None:
             client_info = google.api_core.gapic_v1.client_info.ClientInfo(
-                gapic_version=_GAPIC_LIBRARY_VERSION
+                gapic_version=_GAPIC_LIBRARY_VERSION,
             )
         else:
             client_info.gapic_version = _GAPIC_LIBRARY_VERSION
@@ -225,7 +225,7 @@ def __init__(
         # (Ordinarily, these are the defaults specified in the `*_config.py`
         # file next to this one.)
         self._method_configs = google.api_core.gapic_v1.config.parse_method_configs(
-            client_config["interfaces"][self._INTERFACE_NAME]
+            client_config["interfaces"][self._INTERFACE_NAME],
         )
 
         # Save a dictionary of cached API call functions.
@@ -320,7 +320,7 @@ def list_insights(
             )
 
         request = recommender_service_pb2.ListInsightsRequest(
-            parent=parent, page_size=page_size, filter=filter_
+            parent=parent, page_size=page_size, filter=filter_,
         )
         if metadata is None:
             metadata = []
@@ -402,7 +402,7 @@ def get_insight(
                 client_info=self._client_info,
             )
 
-        request = recommender_service_pb2.GetInsightRequest(name=name)
+        request = recommender_service_pb2.GetInsightRequest(name=name,)
         if metadata is None:
             metadata = []
         metadata = list(metadata)
@@ -485,7 +485,7 @@ def mark_insight_accepted(
             )
 
         request = recommender_service_pb2.MarkInsightAcceptedRequest(
-            name=name, etag=etag, state_metadata=state_metadata
+            name=name, etag=etag, state_metadata=state_metadata,
         )
         if metadata is None:
             metadata = []
@@ -590,7 +590,7 @@ def list_recommendations(
             )
 
         request = recommender_service_pb2.ListRecommendationsRequest(
-            parent=parent, page_size=page_size, filter=filter_
+            parent=parent, page_size=page_size, filter=filter_,
         )
         if metadata is None:
             metadata = []
@@ -672,7 +672,7 @@ def get_recommendation(
                 client_info=self._client_info,
             )
 
-        request = recommender_service_pb2.GetRecommendationRequest(name=name)
+        request = recommender_service_pb2.GetRecommendationRequest(name=name,)
         if metadata is None:
             metadata = []
         metadata = list(metadata)
@@ -764,7 +764,7 @@ def mark_recommendation_claimed(
             )
 
         request = recommender_service_pb2.MarkRecommendationClaimedRequest(
-            name=name, etag=etag, state_metadata=state_metadata
+            name=name, etag=etag, state_metadata=state_metadata,
         )
         if metadata is None:
             metadata = []
@@ -857,7 +857,7 @@ def mark_recommendation_succeeded(
             )
 
         request = recommender_service_pb2.MarkRecommendationSucceededRequest(
-            name=name, etag=etag, state_metadata=state_metadata
+            name=name, etag=etag, state_metadata=state_metadata,
         )
         if metadata is None:
             metadata = []
@@ -950,7 +950,7 @@ def mark_recommendation_failed(
             )
 
         request = recommender_service_pb2.MarkRecommendationFailedRequest(
-            name=name, etag=etag, state_metadata=state_metadata
+            name=name, etag=etag, state_metadata=state_metadata,
         )
         if metadata is None:
             metadata = []
diff --git a/google/cloud/recommender_v1beta1/gapic/transports/recommender_grpc_transport.py b/google/cloud/recommender_v1beta1/gapic/transports/recommender_grpc_transport.py
index fd2d573..0e7176a 100644
--- a/google/cloud/recommender_v1beta1/gapic/transports/recommender_grpc_transport.py
+++ b/google/cloud/recommender_v1beta1/gapic/transports/recommender_grpc_transport.py
@@ -53,7 +53,7 @@ def __init__(
         # exception (channels come with credentials baked in already).
         if channel is not None and credentials is not None:
             raise ValueError(
-                "The `channel` and `credentials` arguments are mutually " "exclusive."
+                "The `channel` and `credentials` arguments are mutually " "exclusive.",
             )
 
         # Create the channel.
@@ -72,7 +72,7 @@ def __init__(
         # gRPC uses objects called "stubs" that are bound to the
         # channel and provide a basic method for each RPC.
         self._stubs = {
-            "recommender_stub": recommender_service_pb2_grpc.RecommenderStub(channel)
+            "recommender_stub": recommender_service_pb2_grpc.RecommenderStub(channel),
         }
 
     @classmethod
diff --git a/google/cloud/recommender_v1beta1/proto/insight_pb2.py b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
index f4a08e9..72ab4e5 100644
--- a/google/cloud/recommender_v1beta1/proto/insight_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/insight_pb2.py
@@ -178,7 +178,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -411,8 +411,8 @@
         ),
     ],
     extensions=[],
-    nested_types=[_INSIGHT_RECOMMENDATIONREFERENCE],
-    enum_types=[_INSIGHT_CATEGORY],
+    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",
@@ -530,8 +530,8 @@
         ),
     ],
     extensions=[],
-    nested_types=[_INSIGHTSTATEINFO_STATEMETADATAENTRY],
-    enum_types=[_INSIGHTSTATEINFO_STATE],
+    nested_types=[_INSIGHTSTATEINFO_STATEMETADATAENTRY,],
+    enum_types=[_INSIGHTSTATEINFO_STATE,],
     serialized_options=None,
     is_extendable=False,
     syntax="proto3",
diff --git a/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py b/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
index c77563c..1aa6e14 100644
--- a/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommendation_pb2.py
@@ -196,7 +196,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -410,7 +410,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_RECOMMENDATION_INSIGHTREFERENCE],
+    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,
@@ -448,7 +448,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -489,7 +489,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -822,7 +822,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_OPERATION_PATHFILTERSENTRY, _OPERATION_PATHVALUEMATCHERSENTRY],
+    nested_types=[_OPERATION_PATHFILTERSENTRY, _OPERATION_PATHVALUEMATCHERSENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -836,7 +836,7 @@
             containing_type=None,
             create_key=_descriptor._internal_create_key,
             fields=[],
-        )
+        ),
     ],
     serialized_start=1153,
     serialized_end=1772,
@@ -869,7 +869,7 @@
             serialized_options=None,
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -886,7 +886,7 @@
             containing_type=None,
             create_key=_descriptor._internal_create_key,
             fields=[],
-        )
+        ),
     ],
     serialized_start=1774,
     serialized_end=1832,
@@ -1002,7 +1002,7 @@
     ],
     extensions=[],
     nested_types=[],
-    enum_types=[_IMPACT_CATEGORY],
+    enum_types=[_IMPACT_CATEGORY,],
     serialized_options=None,
     is_extendable=False,
     syntax="proto3",
@@ -1015,7 +1015,7 @@
             containing_type=None,
             create_key=_descriptor._internal_create_key,
             fields=[],
-        )
+        ),
     ],
     serialized_start=1932,
     serialized_end=2198,
@@ -1129,8 +1129,8 @@
         ),
     ],
     extensions=[],
-    nested_types=[_RECOMMENDATIONSTATEINFO_STATEMETADATAENTRY],
-    enum_types=[_RECOMMENDATIONSTATEINFO_STATE],
+    nested_types=[_RECOMMENDATIONSTATEINFO_STATEMETADATAENTRY,],
+    enum_types=[_RECOMMENDATIONSTATEINFO_STATE,],
     serialized_options=None,
     is_extendable=False,
     syntax="proto3",
diff --git a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
index 604d6d9..c6b55f6 100644
--- a/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
+++ b/google/cloud/recommender_v1beta1/proto/recommender_service_pb2.py
@@ -241,7 +241,7 @@
             serialized_options=b'\340A\002\372A$\n"recommender.googleapis.com/Insight',
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -382,7 +382,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY],
+    nested_types=[_MARKINSIGHTACCEPTEDREQUEST_STATEMETADATAENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -578,7 +578,7 @@
             serialized_options=b"\340A\002\372A+\n)recommender.googleapis.com/Recommendation",
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
-        )
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -719,7 +719,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_MARKRECOMMENDATIONCLAIMEDREQUEST_STATEMETADATAENTRY],
+    nested_types=[_MARKRECOMMENDATIONCLAIMEDREQUEST_STATEMETADATAENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -857,7 +857,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_MARKRECOMMENDATIONSUCCEEDEDREQUEST_STATEMETADATAENTRY],
+    nested_types=[_MARKRECOMMENDATIONSUCCEEDEDREQUEST_STATEMETADATAENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
@@ -995,7 +995,7 @@
         ),
     ],
     extensions=[],
-    nested_types=[_MARKRECOMMENDATIONFAILEDREQUEST_STATEMETADATAENTRY],
+    nested_types=[_MARKRECOMMENDATIONFAILEDREQUEST_STATEMETADATAENTRY,],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
diff --git a/google/cloud/recommender_v1beta1/types.py b/google/cloud/recommender_v1beta1/types.py
index 3a85b6f..608f387 100644
--- a/google/cloud/recommender_v1beta1/types.py
+++ b/google/cloud/recommender_v1beta1/types.py
@@ -29,9 +29,18 @@
 from google.type import money_pb2
 
 
-_shared_modules = [duration_pb2, struct_pb2, timestamp_pb2, money_pb2]
-
-_local_modules = [insight_pb2, recommendation_pb2, recommender_service_pb2]
+_shared_modules = [
+    duration_pb2,
+    struct_pb2,
+    timestamp_pb2,
+    money_pb2,
+]
+
+_local_modules = [
+    insight_pb2,
+    recommendation_pb2,
+    recommender_service_pb2,
+]
 
 names = []
 
diff --git a/noxfile.py b/noxfile.py
index bea019e..52002da 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -23,14 +23,15 @@
 import nox
 
 
-BLACK_VERSION = "black==19.3b0"
+BLACK_VERSION = "black==19.10b0"
 BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"]
 
-if os.path.exists("samples"):
-    BLACK_PATHS.append("samples")
+DEFAULT_PYTHON_VERSION = "3.8"
+SYSTEM_TEST_PYTHON_VERSIONS = ["3.8"]
+UNIT_TEST_PYTHON_VERSIONS = ["3.6", "3.7", "3.8"]
 
 
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
 def lint(session):
     """Run linters.
 
@@ -38,7 +39,9 @@ def lint(session):
     serious code quality issues.
     """
     session.install("flake8", BLACK_VERSION)
-    session.run("black", "--check", *BLACK_PATHS)
+    session.run(
+        "black", "--check", *BLACK_PATHS,
+    )
     session.run("flake8", "google", "tests")
 
 
@@ -53,10 +56,12 @@ def blacken(session):
     check the state of the `gcp_ubuntu_config` we use for that Kokoro run.
     """
     session.install(BLACK_VERSION)
-    session.run("black", *BLACK_PATHS)
+    session.run(
+        "black", *BLACK_PATHS,
+    )
 
 
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
 def lint_setup_py(session):
     """Verify that setup.py is valid (including RST check)."""
     session.install("docutils", "pygments")
@@ -65,6 +70,8 @@ def lint_setup_py(session):
 
 def default(session):
     # Install all test dependencies, then install this package in-place.
+    session.install("asyncmock", "pytest-asyncio")
+
     session.install("mock", "pytest", "pytest-cov")
     session.install("-e", ".")
 
@@ -84,13 +91,13 @@ def default(session):
     )
 
 
-@nox.session(python=["3.5", "3.6", "3.7", "3.8"])
+@nox.session(python=UNIT_TEST_PYTHON_VERSIONS)
 def unit(session):
     """Run the unit test suite."""
     default(session)
 
 
-@nox.session(python=["3.7"])
+@nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS)
 def system(session):
     """Run the system test suite."""
     system_test_path = os.path.join("tests", "system.py")
@@ -110,7 +117,9 @@ def system(session):
 
     # Install all test dependencies, then install this package into the
     # virtualenv's dist-packages.
-    session.install("mock", "pytest", "google-cloud-testutils")
+    session.install(
+        "mock", "pytest", "google-cloud-testutils",
+    )
     session.install("-e", ".")
 
     # Run py.test against the system tests.
@@ -120,7 +129,7 @@ def system(session):
         session.run("py.test", "--quiet", system_test_folder_path, *session.posargs)
 
 
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
 def cover(session):
     """Run the final coverage report.
 
@@ -133,7 +142,7 @@ def cover(session):
     session.run("coverage", "erase")
 
 
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
 def docs(session):
     """Build the docs for this library."""
 
diff --git a/scripts/decrypt-secrets.sh b/scripts/decrypt-secrets.sh
new file mode 100755
index 0000000..ff599eb
--- /dev/null
+++ b/scripts/decrypt-secrets.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# Copyright 2015 Google Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+ROOT=$( dirname "$DIR" )
+
+# Work from the project root.
+cd $ROOT
+
+# Use SECRET_MANAGER_PROJECT if set, fallback to cloud-devrel-kokoro-resources.
+PROJECT_ID="${SECRET_MANAGER_PROJECT:-cloud-devrel-kokoro-resources}"
+
+gcloud secrets versions access latest --secret="python-docs-samples-test-env" \
+       > testing/test-env.sh
+gcloud secrets versions access latest \
+       --secret="python-docs-samples-service-account" \
+       > testing/service-account.json
+gcloud secrets versions access latest \
+       --secret="python-docs-samples-client-secrets" \
+       > testing/client-secrets.json
\ No newline at end of file
diff --git a/scripts/readme-gen/readme_gen.py b/scripts/readme-gen/readme_gen.py
new file mode 100644
index 0000000..d309d6e
--- /dev/null
+++ b/scripts/readme-gen/readme_gen.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# Copyright 2016 Google Inc
+#
+# 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.
+
+"""Generates READMEs using configuration defined in yaml."""
+
+import argparse
+import io
+import os
+import subprocess
+
+import jinja2
+import yaml
+
+
+jinja_env = jinja2.Environment(
+    trim_blocks=True,
+    loader=jinja2.FileSystemLoader(
+        os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates'))))
+
+README_TMPL = jinja_env.get_template('README.tmpl.rst')
+
+
+def get_help(file):
+    return subprocess.check_output(['python', file, '--help']).decode()
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('source')
+    parser.add_argument('--destination', default='README.rst')
+
+    args = parser.parse_args()
+
+    source = os.path.abspath(args.source)
+    root = os.path.dirname(source)
+    destination = os.path.join(root, args.destination)
+
+    jinja_env.globals['get_help'] = get_help
+
+    with io.open(source, 'r') as f:
+        config = yaml.load(f)
+
+    # This allows get_help to execute in the right directory.
+    os.chdir(root)
+
+    output = README_TMPL.render(config)
+
+    with io.open(destination, 'w') as f:
+        f.write(output)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/scripts/readme-gen/templates/README.tmpl.rst b/scripts/readme-gen/templates/README.tmpl.rst
new file mode 100644
index 0000000..4fd2397
--- /dev/null
+++ b/scripts/readme-gen/templates/README.tmpl.rst
@@ -0,0 +1,87 @@
+{# The following line is a lie. BUT! Once jinja2 is done with it, it will
+    become truth! #}
+.. This file is automatically generated. Do not edit this file directly.
+
+{{product.name}} Python Samples
+===============================================================================
+
+.. image:: https://gstatic.com/cloudssh/images/open-btn.png
+   :target: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor={{folder}}/README.rst
+
+
+This directory contains samples for {{product.name}}. {{product.description}}
+
+{{description}}
+
+.. _{{product.name}}: {{product.url}}
+
+{% if required_api_url %}
+To run the sample, you need to enable the API at: {{required_api_url}}
+{% endif %}
+
+{% if required_role %}
+To run the sample, you need to have `{{required_role}}` role.
+{% endif %}
+
+{{other_required_steps}}
+
+{% if setup %}
+Setup
+-------------------------------------------------------------------------------
+
+{% for section in setup %}
+
+{% include section + '.tmpl.rst' %}
+
+{% endfor %}
+{% endif %}
+
+{% if samples %}
+Samples
+-------------------------------------------------------------------------------
+
+{% for sample in samples %}
+{{sample.name}}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+{% if not sample.hide_cloudshell_button %}
+.. image:: https://gstatic.com/cloudssh/images/open-btn.png
+   :target: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor={{folder}}/{{sample.file}},{{folder}}/README.rst
+{% endif %}
+
+
+{{sample.description}}
+
+To run this sample:
+
+.. code-block:: bash
+
+    $ python {{sample.file}}
+{% if sample.show_help %}
+
+    {{get_help(sample.file)|indent}}
+{% endif %}
+
+
+{% endfor %}
+{% endif %}
+
+{% if cloud_client_library %}
+
+The client library
+-------------------------------------------------------------------------------
+
+This sample uses the `Google Cloud Client Library for Python`_.
+You can read the documentation for more details on API usage and use GitHub
+to `browse the source`_ and  `report issues`_.
+
+.. _Google Cloud Client Library for Python:
+    https://googlecloudplatform.github.io/google-cloud-python/
+.. _browse the source:
+    https://github.com/GoogleCloudPlatform/google-cloud-python
+.. _report issues:
+    https://github.com/GoogleCloudPlatform/google-cloud-python/issues
+
+{% endif %}
+
+.. _Google Cloud SDK: https://cloud.google.com/sdk/
\ No newline at end of file
diff --git a/scripts/readme-gen/templates/auth.tmpl.rst b/scripts/readme-gen/templates/auth.tmpl.rst
new file mode 100644
index 0000000..1446b94
--- /dev/null
+++ b/scripts/readme-gen/templates/auth.tmpl.rst
@@ -0,0 +1,9 @@
+Authentication
+++++++++++++++
+
+This sample requires you to have authentication setup. Refer to the
+`Authentication Getting Started Guide`_ for instructions on setting up
+credentials for applications.
+
+.. _Authentication Getting Started Guide:
+    https://cloud.google.com/docs/authentication/getting-started
diff --git a/scripts/readme-gen/templates/auth_api_key.tmpl.rst b/scripts/readme-gen/templates/auth_api_key.tmpl.rst
new file mode 100644
index 0000000..11957ce
--- /dev/null
+++ b/scripts/readme-gen/templates/auth_api_key.tmpl.rst
@@ -0,0 +1,14 @@
+Authentication
+++++++++++++++
+
+Authentication for this service is done via an `API Key`_. To obtain an API
+Key:
+
+1. Open the `Cloud Platform Console`_
+2. Make sure that billing is enabled for your project.
+3. From the **Credentials** page, create a new **API Key** or use an existing
+   one for your project.
+
+.. _API Key:
+    https://developers.google.com/api-client-library/python/guide/aaa_apikeys
+.. _Cloud Console: https://console.cloud.google.com/project?_
diff --git a/scripts/readme-gen/templates/install_deps.tmpl.rst b/scripts/readme-gen/templates/install_deps.tmpl.rst
new file mode 100644
index 0000000..a0406db
--- /dev/null
+++ b/scripts/readme-gen/templates/install_deps.tmpl.rst
@@ -0,0 +1,29 @@
+Install Dependencies
+++++++++++++++++++++
+
+#. Clone python-docs-samples and change directory to the sample directory you want to use.
+
+    .. code-block:: bash
+
+        $ git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
+
+#. Install `pip`_ and `virtualenv`_ if you do not already have them. You may want to refer to the `Python Development Environment Setup Guide`_ for Google Cloud Platform for instructions.
+
+   .. _Python Development Environment Setup Guide:
+       https://cloud.google.com/python/setup
+
+#. Create a virtualenv. Samples are compatible with Python 2.7 and 3.4+.
+
+    .. code-block:: bash
+
+        $ virtualenv env
+        $ source env/bin/activate
+
+#. Install the dependencies needed to run the samples.
+
+    .. code-block:: bash
+
+        $ pip install -r requirements.txt
+
+.. _pip: https://pip.pypa.io/
+.. _virtualenv: https://virtualenv.pypa.io/
diff --git a/scripts/readme-gen/templates/install_portaudio.tmpl.rst b/scripts/readme-gen/templates/install_portaudio.tmpl.rst
new file mode 100644
index 0000000..5ea33d1
--- /dev/null
+++ b/scripts/readme-gen/templates/install_portaudio.tmpl.rst
@@ -0,0 +1,35 @@
+Install PortAudio
++++++++++++++++++
+
+Install `PortAudio`_. This is required by the `PyAudio`_ library to stream
+audio from your computer's microphone. PyAudio depends on PortAudio for cross-platform compatibility, and is installed differently depending on the
+platform.
+
+* For Mac OS X, you can use `Homebrew`_::
+
+      brew install portaudio
+
+  **Note**: if you encounter an error when running `pip install` that indicates
+  it can't find `portaudio.h`, try running `pip install` with the following
+  flags::
+
+      pip install --global-option='build_ext' \
+          --global-option='-I/usr/local/include' \
+          --global-option='-L/usr/local/lib' \
+          pyaudio
+
+* For Debian / Ubuntu Linux::
+
+      apt-get install portaudio19-dev python-all-dev
+
+* Windows may work without having to install PortAudio explicitly (it will get
+  installed with PyAudio).
+
+For more details, see the `PyAudio installation`_ page.
+
+
+.. _PyAudio: https://people.csail.mit.edu/hubert/pyaudio/
+.. _PortAudio: http://www.portaudio.com/
+.. _PyAudio installation:
+  https://people.csail.mit.edu/hubert/pyaudio/#downloads
+.. _Homebrew: http://brew.sh
diff --git a/synth.metadata b/synth.metadata
index bb1782e..1a198e7 100644
--- a/synth.metadata
+++ b/synth.metadata
@@ -19,14 +19,14 @@
       "git": {
         "name": "synthtool",
         "remote": "https://github.com/googleapis/synthtool.git",
-        "sha": "84c4156c49be9dcabacc8fd7b0585b6fd789ae47"
+        "sha": "303271797a360f8a439203413f13a160f2f5b3b4"
       }
     },
     {
       "git": {
         "name": "synthtool",
         "remote": "https://github.com/googleapis/synthtool.git",
-        "sha": "84c4156c49be9dcabacc8fd7b0585b6fd789ae47"
+        "sha": "303271797a360f8a439203413f13a160f2f5b3b4"
       }
     }
   ],
diff --git a/synth.py b/synth.py
index f6043d3..96d1027 100644
--- a/synth.py
+++ b/synth.py
@@ -67,10 +67,10 @@
 # ----------------------------------------------------------------------------
 # Add templated files
 # ----------------------------------------------------------------------------
-templated_files = common.py_library(cov_level=80)
+templated_files = common.py_library(microgenerator=True, cov_level=80)
 s.move(templated_files)
 
-# don't run 2.7 tests
-s.replace("noxfile.py", """\["2\.7", """, "[")
+# TODO(busunkim): Use latest sphinx after microgenerator transition
+s.replace("noxfile.py", """['"]sphinx['"]""", '"sphinx<3.0.0"')
 
 s.shell.run(["nox", "-s", "blacken"], hide_output=False)
diff --git a/testing/.gitignore b/testing/.gitignore
new file mode 100644
index 0000000..b05fbd6
--- /dev/null
+++ b/testing/.gitignore
@@ -0,0 +1,3 @@
+test-env.sh
+service-account.json
+client-secrets.json
\ No newline at end of file

From fe4970d7bd7cfe529ad16aa6faac658447915921 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
 <55107282+release-please[bot]@users.noreply.github.com>
Date: Mon, 13 Jul 2020 14:04:58 -0700
Subject: [PATCH 7/7] chore: release 1.1.0 (#37)

* updated CHANGELOG.md [ci skip]

* updated setup.cfg [ci skip]

* updated setup.py

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com>
---
 CHANGELOG.md | 12 ++++++++++++
 setup.py     |  2 +-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 15fbe62..89390d9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,18 @@
 
 [1]: https://pypi.org/project/google-cloud-recommender/#history
 
+## [1.1.0](https://www.github.com/googleapis/python-recommender/compare/v1.0.0...v1.1.0) (2020-07-13)
+
+
+### Features
+
+* add methods for interacting with insights ([#35](https://www.github.com/googleapis/python-recommender/issues/35)) ([940a3fb](https://www.github.com/googleapis/python-recommender/commit/940a3fb01013865c836bfb55397c25284004a7ad))
+
+
+### Bug Fixes
+
+* update retry config ([#31](https://www.github.com/googleapis/python-recommender/issues/31)) ([5c497e2](https://www.github.com/googleapis/python-recommender/commit/5c497e29d65d288a4b8b24a7b5aa487a5804e880))
+
 ## [1.0.0](https://www.github.com/googleapis/python-recommender/compare/v0.3.0...v1.0.0) (2020-05-21)
 
 
diff --git a/setup.py b/setup.py
index 61ca142..109d8ef 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,7 @@
 
 name = "google-cloud-recommender"
 description = "Cloud Recommender API client library"
-version = "1.0.0"
+version = "1.1.0"
 release_status = "Development Status :: 5 - Production/Stable"
 dependencies = ["google-api-core[grpc] >= 1.14.0, < 2.0.0dev"]