network_services.py
Go to the documentation of this file.
1 # Copyright 2020 gRPC authors.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 import abc
16 import dataclasses
17 import logging
18 from typing import Any, Dict, List, Optional, Tuple
19 
20 from google.rpc import code_pb2
21 import tenacity
22 
23 from framework.infrastructure import gcp
24 
25 logger = logging.getLogger(__name__)
26 
27 # Type aliases
29 
30 
31 @dataclasses.dataclass(frozen=True)
33  url: str
34  name: str
35  type: str
36  traffic_port_selector: dict
37  endpoint_matcher: dict
38  update_time: str
39  create_time: str
40  http_filters: Optional[dict] = None
41  server_tls_policy: Optional[str] = None
42 
43  @classmethod
44  def from_response(cls, name: str, response: Dict[str,
45  Any]) -> 'EndpointPolicy':
46  return cls(name=name,
47  url=response['name'],
48  type=response['type'],
49  server_tls_policy=response.get('serverTlsPolicy', None),
50  traffic_port_selector=response['trafficPortSelector'],
51  endpoint_matcher=response['endpointMatcher'],
52  http_filters=response.get('httpFilters', None),
53  update_time=response['updateTime'],
54  create_time=response['createTime'])
55 
56 
57 @dataclasses.dataclass(frozen=True)
58 class Mesh:
59 
60  name: str
61  url: str
62  routes: Optional[List[str]]
63 
64  @classmethod
65  def from_response(cls, name: str, d: Dict[str, Any]) -> 'Mesh':
66  return cls(
67  name=name,
68  url=d["name"],
69  routes=list(d["routes"]) if "routes" in d else None,
70  )
71 
72 
73 @dataclasses.dataclass(frozen=True)
74 class GrpcRoute:
75 
76  @dataclasses.dataclass(frozen=True)
77  class MethodMatch:
78  type: Optional[str]
79  grpc_service: Optional[str]
80  grpc_method: Optional[str]
81  case_sensitive: Optional[bool]
82 
83  @classmethod
84  def from_response(cls, d: Dict[str, Any]) -> 'GrpcRoute.MethodMatch':
85  return cls(
86  type=d.get("type"),
87  grpc_service=d.get("grpcService"),
88  grpc_method=d.get("grpcMethod"),
89  case_sensitive=d.get("caseSensitive"),
90  )
91 
92  @dataclasses.dataclass(frozen=True)
93  class HeaderMatch:
94  type: Optional[str]
95  key: str
96  value: str
97 
98  @classmethod
99  def from_response(cls, d: Dict[str, Any]) -> 'GrpcRoute.HeaderMatch':
100  return cls(
101  type=d.get("type"),
102  key=d["key"],
103  value=d["value"],
104  )
105 
106  @dataclasses.dataclass(frozen=True)
107  class RouteMatch:
108  method: Optional['GrpcRoute.MethodMatch']
109  headers: Tuple['GrpcRoute.HeaderMatch']
110 
111  @classmethod
112  def from_response(cls, d: Dict[str, Any]) -> 'GrpcRoute.RouteMatch':
113  return cls(
114  method=GrpcRoute.MethodMatch.from_response(d["method"])
115  if "method" in d else None,
116  headers=tuple(
117  GrpcRoute.HeaderMatch.from_response(h)
118  for h in d["headers"]) if "headers" in d else (),
119  )
120 
121  @dataclasses.dataclass(frozen=True)
122  class Destination:
123  service_name: str
124  weight: Optional[int]
125 
126  @classmethod
127  def from_response(cls, d: Dict[str, Any]) -> 'GrpcRoute.Destination':
128  return cls(
129  service_name=d["serviceName"],
130  weight=d.get("weight"),
131  )
132 
133  @dataclasses.dataclass(frozen=True)
134  class RouteAction:
135 
136  @classmethod
137  def from_response(cls, d: Dict[str, Any]) -> 'GrpcRoute.RouteAction':
138  destinations = [
139  GrpcRoute.Destination.from_response(dest)
140  for dest in d["destinations"]
141  ] if "destinations" in d else []
142  return cls(destinations=destinations)
143 
144  @dataclasses.dataclass(frozen=True)
145  class RouteRule:
146  matches: List['GrpcRoute.RouteMatch']
147  action: 'GrpcRoute.RouteAction'
148 
149  @classmethod
150  def from_response(cls, d: Dict[str, Any]) -> 'GrpcRoute.RouteRule':
151  matches = [
152  GrpcRoute.RouteMatch.from_response(m) for m in d["matches"]
153  ] if "matches" in d else []
154  return cls(
155  matches=matches,
156  action=GrpcRoute.RouteAction.from_response(d["action"]),
157  )
158 
159  name: str
160  url: str
161  hostnames: Tuple[str]
162  rules: Tuple['GrpcRoute.RouteRule']
163  meshes: Optional[Tuple[str]]
164 
165  @classmethod
166  def from_response(cls, name: str, d: Dict[str,
167  Any]) -> 'GrpcRoute.RouteRule':
168  return cls(
169  name=name,
170  url=d["name"],
171  hostnames=tuple(d["hostnames"]),
172  rules=tuple(d["rules"]),
173  meshes=None if d.get("meshes") is None else tuple(d["meshes"]),
174  )
175 
176 
178  metaclass=abc.ABCMeta):
179  """Base class for NetworkServices APIs."""
180 
181  # TODO(https://github.com/grpc/grpc/issues/29532) remove pylint disable
182  # pylint: disable=abstract-method
183 
184  def __init__(self, api_manager: gcp.api.GcpApiManager, project: str):
185  super().__init__(api_manager.networkservices(self.api_version), project)
186  # Shortcut to projects/*/locations/ endpoints
187  self._api_locations = self.api.projects().locations()
188 
189  @property
190  def api_name(self) -> str:
191  return 'networkservices'
192 
193  def _execute(self, *args, **kwargs): # pylint: disable=signature-differs,arguments-differ
194  # Workaround TD bug: throttled operations are reported as internal.
195  # Ref b/175345578
196  retryer = tenacity.Retrying(
197  retry=tenacity.retry_if_exception(self._operation_internal_error),
198  wait=tenacity.wait_fixed(10),
199  stop=tenacity.stop_after_delay(5 * 60),
200  before_sleep=tenacity.before_sleep_log(logger, logging.DEBUG),
201  reraise=True)
202  retryer(super()._execute, *args, **kwargs)
203 
204  @staticmethod
206  return (isinstance(exception, gcp.api.OperationError) and
207  exception.error.code == code_pb2.INTERNAL)
208 
209 
211  """NetworkServices API v1beta1."""
212  ENDPOINT_POLICIES = 'endpointPolicies'
213 
214  @property
215  def api_version(self) -> str:
216  return 'v1beta1'
217 
218  def create_endpoint_policy(self, name, body: dict) -> GcpResource:
219  return self._create_resource(
220  collection=self._api_locations.endpointPolicies(),
221  body=body,
222  endpointPolicyId=name)
223 
224  def get_endpoint_policy(self, name: str) -> EndpointPolicy:
225  response = self._get_resource(
226  collection=self._api_locations.endpointPolicies(),
227  full_name=self.resource_full_name(name, self.ENDPOINT_POLICIES))
228  return EndpointPolicy.from_response(name, response)
229 
230  def delete_endpoint_policy(self, name: str) -> bool:
231  return self._delete_resource(
232  collection=self._api_locations.endpointPolicies(),
233  full_name=self.resource_full_name(name, self.ENDPOINT_POLICIES))
234 
235 
237  """NetworkServices API v1alpha1.
238 
239  Note: extending v1beta1 class presumes that v1beta1 is just a v1alpha1 API
240  graduated into a more stable version. This is true in most cases. However,
241  v1alpha1 class can always override and reimplement incompatible methods.
242  """
243 
244  GRPC_ROUTES = 'grpcRoutes'
245  MESHES = 'meshes'
246 
247  @property
248  def api_version(self) -> str:
249  return 'v1alpha1'
250 
251  def create_mesh(self, name: str, body: dict) -> GcpResource:
252  return self._create_resource(collection=self._api_locations.meshes(),
253  body=body,
254  meshId=name)
255 
256  def get_mesh(self, name: str) -> Mesh:
257  full_name = self.resource_full_name(name, self.MESHES)
258  result = self._get_resource(collection=self._api_locations.meshes(),
259  full_name=full_name)
260  return Mesh.from_response(name, result)
261 
262  def delete_mesh(self, name: str) -> bool:
263  return self._delete_resource(collection=self._api_locations.meshes(),
264  full_name=self.resource_full_name(
265  name, self.MESHES))
266 
267  def create_grpc_route(self, name: str, body: dict) -> GcpResource:
268  return self._create_resource(
269  collection=self._api_locations.grpcRoutes(),
270  body=body,
271  grpcRouteId=name)
272 
273  def get_grpc_route(self, name: str) -> GrpcRoute:
274  full_name = self.resource_full_name(name, self.GRPC_ROUTES)
275  result = self._get_resource(collection=self._api_locations.grpcRoutes(),
276  full_name=full_name)
277  return GrpcRoute.from_response(name, result)
278 
279  def delete_grpc_route(self, name: str) -> bool:
280  return self._delete_resource(
281  collection=self._api_locations.grpcRoutes(),
282  full_name=self.resource_full_name(name, self.GRPC_ROUTES))
framework.infrastructure.gcp.api.GcpStandardCloudApiResource._create_resource
def _create_resource(self, discovery.Resource collection, dict body, **kwargs)
Definition: api.py:396
framework.infrastructure.gcp.api.GcpStandardCloudApiResource.api_version
str api_version(self)
Definition: api.py:412
framework.infrastructure.gcp.network_services.NetworkServicesV1Beta1.create_endpoint_policy
GcpResource create_endpoint_policy(self, name, dict body)
Definition: network_services.py:218
framework.infrastructure.gcp.api.GcpStandardCloudApiResource._delete_resource
bool _delete_resource(self, discovery.Resource collection, str full_name)
Definition: api.py:421
framework.infrastructure.gcp.network_services.GrpcRoute.HeaderMatch.from_response
'GrpcRoute.HeaderMatch' from_response(cls, Dict[str, Any] d)
Definition: network_services.py:99
framework.infrastructure.gcp.network_services._NetworkServicesBase.__init__
def __init__(self, gcp.api.GcpApiManager api_manager, str project)
Definition: network_services.py:184
framework.infrastructure.gcp.compute.ComputeV1.GcpResource
Definition: compute.py:35
framework.infrastructure.gcp.network_services.EndpointPolicy
Definition: network_services.py:32
framework.infrastructure.gcp.network_services.NetworkServicesV1Beta1
Definition: network_services.py:210
framework.infrastructure.gcp.network_services.GrpcRoute.RouteAction
Definition: network_services.py:134
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.delete_mesh
bool delete_mesh(self, str name)
Definition: network_services.py:262
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.create_mesh
GcpResource create_mesh(self, str name, dict body)
Definition: network_services.py:251
framework.infrastructure.gcp.api.GcpStandardCloudApiResource._get_resource
def _get_resource(self, discovery.Resource collection, full_name)
Definition: api.py:415
framework.infrastructure.gcp.api.GcpStandardCloudApiResource
Definition: api.py:385
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.MESHES
string MESHES
Definition: network_services.py:245
framework.infrastructure.gcp.network_services._NetworkServicesBase.api_name
str api_name(self)
Definition: network_services.py:190
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.api_version
str api_version(self)
Definition: network_services.py:248
framework.infrastructure.gcp.network_services.NetworkServicesV1Beta1.get_endpoint_policy
EndpointPolicy get_endpoint_policy(self, str name)
Definition: network_services.py:224
framework.infrastructure.gcp.network_services.GrpcRoute.Destination.from_response
'GrpcRoute.Destination' from_response(cls, Dict[str, Any] d)
Definition: network_services.py:127
framework.infrastructure.gcp.network_services.NetworkServicesV1Beta1.api_version
str api_version(self)
Definition: network_services.py:215
framework.infrastructure.gcp.network_services.GrpcRoute.RouteMatch
Definition: network_services.py:107
framework.infrastructure.gcp.network_services.GrpcRoute.RouteAction.from_response
'GrpcRoute.RouteAction' from_response(cls, Dict[str, Any] d)
Definition: network_services.py:137
framework.infrastructure.gcp.network_services.GrpcRoute.MethodMatch
Definition: network_services.py:77
framework.infrastructure.gcp.network_services.NetworkServicesV1Beta1.delete_endpoint_policy
bool delete_endpoint_policy(self, str name)
Definition: network_services.py:230
framework.infrastructure.gcp.network_services._NetworkServicesBase._execute
def _execute(self, *args, **kwargs)
Definition: network_services.py:193
framework.infrastructure.gcp.network_services._NetworkServicesBase
Definition: network_services.py:178
framework.infrastructure
Definition: tools/run_tests/xds_k8s_test_driver/framework/infrastructure/__init__.py:1
framework.infrastructure.gcp.network_services.GrpcRoute.RouteMatch.from_response
'GrpcRoute.RouteMatch' from_response(cls, Dict[str, Any] d)
Definition: network_services.py:112
framework.infrastructure.gcp.network_services.GrpcRoute.Destination
Definition: network_services.py:122
framework.infrastructure.gcp.network_services.NetworkServicesV1Beta1.ENDPOINT_POLICIES
string ENDPOINT_POLICIES
Definition: network_services.py:212
framework.infrastructure.gcp.network_services.GrpcRoute
Definition: network_services.py:74
framework.infrastructure.gcp.network_services.EndpointPolicy.from_response
'EndpointPolicy' from_response(cls, str name, Dict[str, Any] response)
Definition: network_services.py:44
framework.infrastructure.gcp.network_services.Mesh
Definition: network_services.py:58
framework.infrastructure.gcp.network_services.GrpcRoute.RouteRule.from_response
'GrpcRoute.RouteRule' from_response(cls, Dict[str, Any] d)
Definition: network_services.py:150
framework.infrastructure.gcp.network_services._NetworkServicesBase._operation_internal_error
def _operation_internal_error(exception)
Definition: network_services.py:205
framework.infrastructure.gcp.network_services.GrpcRoute.MethodMatch.from_response
'GrpcRoute.MethodMatch' from_response(cls, Dict[str, Any] d)
Definition: network_services.py:84
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.get_mesh
Mesh get_mesh(self, str name)
Definition: network_services.py:256
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.delete_grpc_route
bool delete_grpc_route(self, str name)
Definition: network_services.py:279
framework.infrastructure.gcp.api.GcpStandardCloudApiResource.resource_full_name
def resource_full_name(self, name, collection_name)
Definition: api.py:393
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.GRPC_ROUTES
string GRPC_ROUTES
Definition: network_services.py:244
framework.infrastructure.gcp.network_services._NetworkServicesBase._api_locations
_api_locations
Definition: network_services.py:187
framework.infrastructure.gcp.api.OperationError
Definition: api.py:257
framework.infrastructure.gcp.network_services.GrpcRoute.HeaderMatch
Definition: network_services.py:93
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1
Definition: network_services.py:236
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.create_grpc_route
GcpResource create_grpc_route(self, str name, dict body)
Definition: network_services.py:267
framework.infrastructure.gcp.network_services.GrpcRoute.RouteRule
Definition: network_services.py:145
framework.infrastructure.gcp.network_services.Mesh.from_response
'Mesh' from_response(cls, str name, Dict[str, Any] d)
Definition: network_services.py:65
framework.infrastructure.gcp.network_services.NetworkServicesV1Alpha1.get_grpc_route
GrpcRoute get_grpc_route(self, str name)
Definition: network_services.py:273
framework.infrastructure.gcp.api.GcpApiManager
Definition: api.py:64
framework.infrastructure.gcp.network_services.GrpcRoute.from_response
'GrpcRoute.RouteRule' from_response(cls, str name, Dict[str, Any] d)
Definition: network_services.py:166


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:42