byteplus-python-sdk-v2 3.0.61__py2.py3-none-any.whl → 3.0.62__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. {byteplus_python_sdk_v2-3.0.61.dist-info → byteplus_python_sdk_v2-3.0.62.dist-info}/METADATA +1 -1
  2. {byteplus_python_sdk_v2-3.0.61.dist-info → byteplus_python_sdk_v2-3.0.62.dist-info}/RECORD +61 -42
  3. byteplussdkcore/api_client.py +36 -8
  4. byteplussdkcore/auth/provider_binding.py +42 -0
  5. byteplussdkcore/auth/providers/sts_oidc_provider.py +23 -3
  6. byteplussdkcore/auth/providers/sts_provider.py +32 -3
  7. byteplussdkcore/auth/providers/sts_saml_provider.py +23 -3
  8. byteplussdkcore/auth/sts_http_config.py +133 -0
  9. byteplussdkcore/configuration.py +1 -1
  10. byteplussdkcore/feature/rds/connect_utils.py +6 -8
  11. byteplussdkcore/interceptor/interceptors/request.py +5 -0
  12. byteplussdkcore/rest.py +27 -0
  13. byteplussdkcore/retryer/retry_condition.py +29 -1
  14. byteplussdkvpc/__init__.py +17 -0
  15. byteplussdkvpc/api/vpc_api.py +582 -0
  16. byteplussdkvpc/models/__init__.py +17 -0
  17. byteplussdkvpc/models/authorize_security_group_egress_batch_request.py +150 -0
  18. byteplussdkvpc/models/authorize_security_group_egress_batch_response.py +149 -0
  19. byteplussdkvpc/models/authorize_security_group_ingress_batch_request.py +150 -0
  20. byteplussdkvpc/models/authorize_security_group_ingress_batch_response.py +149 -0
  21. byteplussdkvpc/models/create_flow_log_request.py +27 -1
  22. byteplussdkvpc/models/create_flow_log_response.py +29 -3
  23. byteplussdkvpc/models/create_ipam_pool_request.py +2 -5
  24. byteplussdkvpc/models/create_ipam_request.py +0 -3
  25. byteplussdkvpc/models/create_ipam_resource_discovery_request.py +9 -0
  26. byteplussdkvpc/models/create_ipam_scope_request.py +2 -5
  27. byteplussdkvpc/models/create_network_interface_request.py +81 -3
  28. byteplussdkvpc/models/describe_ipam_pools_request.py +6 -0
  29. byteplussdkvpc/models/describe_ipam_resource_cidrs_request.py +27 -1
  30. byteplussdkvpc/models/describe_ipam_resource_discoveries_request.py +6 -0
  31. byteplussdkvpc/models/describe_ipam_scopes_request.py +6 -0
  32. byteplussdkvpc/models/describe_ipams_request.py +2 -2
  33. byteplussdkvpc/models/describe_network_interface_attributes_response.py +79 -1
  34. byteplussdkvpc/models/ipam_resource_cidr_for_describe_ipam_resource_cidrs_output.py +53 -1
  35. byteplussdkvpc/models/modify_flow_log_attribute_request.py +27 -1
  36. byteplussdkvpc/models/modify_flow_log_attribute_response.py +29 -3
  37. byteplussdkvpc/models/modify_ipam_pool_request.py +2 -5
  38. byteplussdkvpc/models/modify_ipam_request.py +2 -5
  39. byteplussdkvpc/models/modify_ipam_resource_discovery_request.py +61 -6
  40. byteplussdkvpc/models/modify_ipam_resource_discovery_response.py +27 -1
  41. byteplussdkvpc/models/modify_ipam_scope_request.py +2 -5
  42. byteplussdkvpc/models/modify_network_interface_attributes_request.py +81 -3
  43. byteplussdkvpc/models/modify_security_group_egress_batch_request.py +150 -0
  44. byteplussdkvpc/models/modify_security_group_egress_batch_response.py +149 -0
  45. byteplussdkvpc/models/modify_security_group_ingress_batch_request.py +150 -0
  46. byteplussdkvpc/models/modify_security_group_ingress_batch_response.py +149 -0
  47. byteplussdkvpc/models/network_interface_set_for_describe_network_interfaces_output.py +79 -1
  48. byteplussdkvpc/models/overlap_detail_for_describe_ipam_resource_cidrs_output.py +175 -0
  49. byteplussdkvpc/models/permission_for_authorize_security_group_egress_batch_input.py +412 -0
  50. byteplussdkvpc/models/permission_for_authorize_security_group_ingress_batch_input.py +412 -0
  51. byteplussdkvpc/models/permission_for_describe_security_group_attributes_output.py +27 -1
  52. byteplussdkvpc/models/permission_for_modify_security_group_egress_batch_input.py +439 -0
  53. byteplussdkvpc/models/permission_for_modify_security_group_ingress_batch_input.py +439 -0
  54. byteplussdkvpc/models/revoke_security_group_egress_batch_request.py +150 -0
  55. byteplussdkvpc/models/revoke_security_group_egress_batch_response.py +149 -0
  56. byteplussdkvpc/models/revoke_security_group_ingress_batch_request.py +150 -0
  57. byteplussdkvpc/models/revoke_security_group_ingress_batch_response.py +149 -0
  58. {byteplus_python_sdk_v2-3.0.61.dist-info → byteplus_python_sdk_v2-3.0.62.dist-info}/WHEEL +0 -0
  59. {byteplus_python_sdk_v2-3.0.61.dist-info → byteplus_python_sdk_v2-3.0.62.dist-info}/licenses/LICENSE.txt +0 -0
  60. {byteplus_python_sdk_v2-3.0.61.dist-info → byteplus_python_sdk_v2-3.0.62.dist-info}/licenses/NOTICE.md +0 -0
  61. {byteplus_python_sdk_v2-3.0.61.dist-info → byteplus_python_sdk_v2-3.0.62.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,133 @@
1
+ # coding: utf-8
2
+ """Proxy / TLS customization shared by the STS credential providers.
3
+
4
+ This mirrors the Go SDK's ``ProxyConfig`` (see ``byteplus/credentials/
5
+ http_client.go``). It bundles the three public knobs used when reaching the
6
+ STS endpoint and knows how to project them onto an SDK ``Configuration``:
7
+
8
+ proxy_url -> configuration.proxy
9
+ ca_file -> configuration.ssl_ca_cert
10
+ insecure_skip_verify -> configuration.verify_ssl (inverted)
11
+
12
+ Unlike the Go SDK -- which builds a dedicated ``*http.Transport`` -- the
13
+ Python SDK already routes every request (including STS federation calls)
14
+ through ``RESTClientObject``, which reads these ``Configuration`` fields
15
+ directly. So the only thing this helper needs to do is set the fields.
16
+
17
+ An explicit provider ``proxy_url`` wins over its client-local fallback.
18
+ When both are empty, the transport retains default configuration and
19
+ ``HTTP_PROXY`` / ``HTTPS_PROXY`` lookup; it does not implement ``NO_PROXY``.
20
+
21
+ TLS priority also matches Go's ``tls.Config``: ``insecure_skip_verify``
22
+ takes precedence over ``ca_file`` (when verification is skipped the custom
23
+ CA is irrelevant).
24
+ """
25
+
26
+ from __future__ import absolute_import
27
+
28
+ import base64
29
+
30
+ import six
31
+ from six.moves.urllib.parse import unquote, urlparse
32
+
33
+
34
+ class StsHttpConfig(object):
35
+ """Carries proxy / TLS options for a single STS request path.
36
+
37
+ :param proxy_url: Forward proxy address, ``scheme://[user:password@]host:port``.
38
+ Empty preserves default configuration and environment lookup.
39
+ :param ca_file: Path to a custom CA bundle (PEM) used to verify the STS
40
+ server certificate. Restores verification unless skipped.
41
+ Empty inherits ssl_ca_cert, otherwise REST uses certifi.
42
+ :param insecure_skip_verify: When True, skip TLS certificate/hostname
43
+ verification. For debugging only; never use in production.
44
+ """
45
+
46
+ def __init__(self, proxy_url=None, ca_file=None, insecure_skip_verify=False):
47
+ self.proxy_url = proxy_url or None
48
+ self.ca_file = ca_file or None
49
+ self.insecure_skip_verify = bool(insecure_skip_verify)
50
+
51
+ def is_empty(self):
52
+ """True when no proxy/TLS option is configured.
53
+
54
+ Callers use this to leave the underlying ``Configuration`` untouched,
55
+ so existing behavior (including BYTEPLUS env-var proxies) is
56
+ preserved when the user did not opt in. Mirrors Go's ``IsZero``.
57
+ """
58
+ return (not self.proxy_url) and (not self.ca_file) and (not self.insecure_skip_verify)
59
+
60
+ def apply_to_configuration(self, configuration):
61
+ """Project the configured options onto ``configuration`` in place.
62
+
63
+ No-op when :meth:`is_empty` is True.
64
+ """
65
+ if self.is_empty():
66
+ return configuration
67
+
68
+ if self.proxy_url:
69
+ # Highest-priority proxy source; RESTClientObject honors this over
70
+ # http_proxy / https_proxy / env vars.
71
+ configuration.proxy = self.proxy_url
72
+
73
+ # TLS: insecure_skip_verify wins over ca_file (same as Go's tls.Config,
74
+ # where RootCAs is ignored once InsecureSkipVerify is set).
75
+ if self.insecure_skip_verify:
76
+ configuration.verify_ssl = False
77
+ configuration.ssl_ca_cert = None
78
+ elif self.ca_file:
79
+ configuration.verify_ssl = True
80
+ configuration.ssl_ca_cert = self.ca_file
81
+
82
+ return configuration
83
+
84
+ def proxy_authorization_header(self):
85
+ """Return the ``Proxy-Authorization`` header value, or None.
86
+
87
+ Delegates to :func:`build_proxy_authorization_header` using this
88
+ config's ``proxy_url``.
89
+ """
90
+ return build_proxy_authorization_header(self.proxy_url)
91
+
92
+
93
+ def build_proxy_authorization_header(proxy_url):
94
+ """Build a ``Basic`` ``Proxy-Authorization`` value from an embedded userinfo.
95
+
96
+ urllib3 (v2) does NOT automatically forward the ``user:password@`` embedded
97
+ in a proxy URL as a ``Proxy-Authorization`` header, whereas Go's
98
+ ``http.ProxyURL`` / ``http.ProxyFromEnvironment`` do. To keep behavior
99
+ aligned with the Go SDK, callers extract this header explicitly and pass it
100
+ to ``ProxyManager(proxy_headers=...)``.
101
+
102
+ Returns None when ``proxy_url`` is empty or carries no userinfo. Raises
103
+ ``ValueError`` when ``proxy_url`` cannot be parsed.
104
+ """
105
+ if not proxy_url:
106
+ return None
107
+
108
+ try:
109
+ parsed = urlparse(proxy_url)
110
+ except (ValueError, AttributeError) as e:
111
+ raise ValueError("invalid proxy url {0!r}: {1}".format(proxy_url, e))
112
+
113
+ username = parsed.username
114
+ if username is None:
115
+ return None
116
+ password = parsed.password or ""
117
+
118
+ # Go's http.Transport derives proxy Basic auth from url.Userinfo, whose
119
+ # Username()/Password() return the PERCENT-DECODED values. urlparse keeps
120
+ # userinfo raw, so decode here to stay byte-for-byte identical with the Go
121
+ # SDK (e.g. a "p%40ss" password must be sent as "p@ss").
122
+ # Python 2 unquote accepts UTF-8 bytes; Python 3 accepts text.
123
+ if six.PY2:
124
+ username = username.encode("utf-8") if isinstance(username, six.text_type) else username
125
+ password = password.encode("utf-8") if isinstance(password, six.text_type) else password
126
+ username = unquote(username)
127
+ password = unquote(password)
128
+ if isinstance(username, six.text_type):
129
+ username = username.encode("utf-8")
130
+ if isinstance(password, six.text_type):
131
+ password = password.encode("utf-8")
132
+ # urllib3.make_headers uses Latin-1, which cannot encode UTF-8 userinfo.
133
+ return "Basic " + base64.b64encode(username + b":" + password).decode("ascii")
@@ -302,7 +302,7 @@ class Configuration(six.with_metaclass(TypeWithDefault, object)):
302
302
  "OS: {env}\n" \
303
303
  "Python Version: {pyversion}\n" \
304
304
  "Version of the API: 0.1.0\n" \
305
- "SDK Package Version: 3.0.61".\
305
+ "SDK Package Version: 3.0.62".\
306
306
  format(env=sys.platform, pyversion=sys.version)
307
307
 
308
308
  @property
@@ -6,9 +6,8 @@ This module provides utilities for generating authentication tokens for RDS MySQ
6
6
  """
7
7
 
8
8
  from byteplussdkcore.endpoint.providers.standard_provider import StandardEndpointResolver
9
- from byteplussdkcore.interceptor import InterceptorChain, InterceptorContext, SignRequestInterceptor, \
9
+ from byteplussdkcore.interceptor import InterceptorChain, InterceptorContext, \
10
10
  ResolveEndpointInterceptor
11
- from byteplussdkcore.interceptor import Request
12
11
 
13
12
  DEFAULT_SERVICE = 'rds_mysql'
14
13
  DEFAULT_API_VERSION = '2022-01-01'
@@ -58,11 +57,10 @@ def build_auth_token(api_client, db_user, instance_id, expires=None):
58
57
  }
59
58
 
60
59
  # Create Request with presign mode
61
- request = Request(configuration,
62
- resource_path='/{}/{}/{}/get/text_plain/'.format(DEFAULT_API, DEFAULT_API_VERSION,
63
- DEFAULT_SERVICE),
64
- method='GET',
65
- query_params=query)
60
+ request = api_client._create_request(
61
+ resource_path='/{}/{}/{}/get/text_plain/'.format(
62
+ DEFAULT_API, DEFAULT_API_VERSION, DEFAULT_SERVICE),
63
+ method='GET', query_params=query)
66
64
  request.endpoint_provider = StandardEndpointResolver()
67
65
  request.service = DEFAULT_SERVICE
68
66
  request.is_presign = True
@@ -82,7 +80,7 @@ def build_auth_token(api_client, db_user, instance_id, expires=None):
82
80
 
83
81
  # Step 3: Sign request (host is None, won't be included in signature)
84
82
  sign_chain = InterceptorChain()
85
- sign_chain.append_request_interceptor(SignRequestInterceptor())
83
+ sign_chain.append_request_interceptor(api_client.sign_request_interceptor)
86
84
  context = sign_chain.execute_request(context)
87
85
 
88
86
  return context.request.signed_query
@@ -57,6 +57,10 @@ class Request(object):
57
57
  self.session_token = configuration.session_token
58
58
  self.region = configuration.region
59
59
  self.scheme = configuration.scheme
60
+ # Business proxy snapshot; credential routing belongs to ApiClient's binding.
61
+ self.proxy = configuration.proxy
62
+ self.http_proxy = configuration.http_proxy
63
+ self.https_proxy = configuration.https_proxy
60
64
  self.endpoint_provider = configuration.endpoint_provider
61
65
  self.custom_bootstrap_region = configuration.custom_bootstrap_region
62
66
  self.use_dual_stack = configuration.use_dual_stack
@@ -64,6 +68,7 @@ class Request(object):
64
68
  # ApiClient injects its private base retryer before interception.
65
69
  self.auto_retry = configuration.auto_retry
66
70
  self.retryer = None
71
+ # ApiClient replaces this with its persistent binding before signing.
67
72
  self.credential_provider = configuration.credential_provider
68
73
  self.invocation_id = str(uuid.uuid4())
69
74
  self.retry_count = 0
byteplussdkcore/rest.py CHANGED
@@ -147,6 +147,11 @@ class RESTClientObject(object):
147
147
  )
148
148
 
149
149
  if proxy_url:
150
+ # urllib3 (v2) does not forward the ``user:password@`` embedded in
151
+ # the proxy URL as a Proxy-Authorization header, unlike Go's
152
+ # http.ProxyURL. Extract it explicitly so proxies requiring Basic
153
+ # auth work the same way across SDKs.
154
+ proxy_headers = self.__proxy_authorization_headers(proxy_url)
150
155
  self.pool_manager = urllib3.ProxyManager(
151
156
  num_pools=pools_size,
152
157
  maxsize=maxsize,
@@ -155,6 +160,7 @@ class RESTClientObject(object):
155
160
  cert_file=configuration.cert_file,
156
161
  key_file=configuration.key_file,
157
162
  proxy_url=proxy_url,
163
+ proxy_headers=proxy_headers,
158
164
  timeout=timeout,
159
165
  retries=Retry(total=False),
160
166
  **addition_pool_args
@@ -191,6 +197,27 @@ class RESTClientObject(object):
191
197
  proxy_url = os.getenv('https_proxy')
192
198
  return proxy_url
193
199
 
200
+ @staticmethod
201
+ def __proxy_authorization_headers(proxy_url):
202
+ """Build proxy_headers carrying Proxy-Authorization, or None.
203
+
204
+ Returns a dict ``{'Proxy-Authorization': 'Basic ...'}`` when the proxy
205
+ URL embeds a ``user:password@`` userinfo, otherwise None (so urllib3
206
+ keeps its default empty proxy headers). Never raises: a malformed proxy
207
+ URL simply yields no auth header and lets the connection attempt (and
208
+ its clearer downstream error) proceed.
209
+ """
210
+ try:
211
+ from byteplussdkcore.auth.sts_http_config import (
212
+ build_proxy_authorization_header,
213
+ )
214
+ value = build_proxy_authorization_header(proxy_url)
215
+ except Exception:
216
+ return None
217
+ if not value:
218
+ return None
219
+ return {"Proxy-Authorization": value}
220
+
194
221
  def request(self, method, url, query_params=None, headers=None,
195
222
  body=None, post_params=None, _preload_content=True,
196
223
  _request_timeout=None):
@@ -1,10 +1,13 @@
1
+ import errno
1
2
  import json
2
3
  import logging
3
4
  import socket
5
+ import ssl
4
6
  import traceback
5
7
  from abc import abstractmethod
6
8
 
7
9
  import urllib3
10
+ from six.moves.http_client import BadStatusLine
8
11
 
9
12
  from byteplussdkcore.observability.debugger import sdk_core_logger
10
13
  from byteplussdkcore.rest import ApiException, RESTResponse
@@ -73,7 +76,7 @@ class DefaultRetryCondition(RetryCondition):
73
76
  Returns:
74
77
  bool: True if the request should be retried, False otherwise.
75
78
  """
76
- if err is not None and isinstance(err, self.__retry_exceptions):
79
+ if err is not None and self._is_retryable_exception(err):
77
80
  sdk_core_logger.debug_retry("retry for retryable exception, err: %s", err)
78
81
  return True
79
82
 
@@ -105,6 +108,31 @@ class DefaultRetryCondition(RetryCondition):
105
108
  sdk_core_logger.debug_retry("no need to retry")
106
109
  return False
107
110
 
111
+ @classmethod
112
+ def _is_retryable_exception(cls, err):
113
+ # Retry the underlying connection failure, not every proxy failure.
114
+ # In particular, a CONNECT 407 or a TLS/configuration error must stop.
115
+ seen = set()
116
+ while isinstance(err, (urllib3.exceptions.ProxyError, urllib3.exceptions.MaxRetryError)):
117
+ if id(err) in seen:
118
+ return False
119
+ seen.add(id(err))
120
+ if isinstance(err, urllib3.exceptions.ProxyError):
121
+ err = err.original_error
122
+ else:
123
+ err = err.reason
124
+ if isinstance(err, (ssl.SSLError, urllib3.exceptions.SSLError)):
125
+ return False
126
+ if isinstance(err, cls.__retry_exceptions):
127
+ return True
128
+ # RemoteDisconnected on Python 3, empty BadStatusLine on Python 2.
129
+ if isinstance(err, BadStatusLine) and err.line in ("", "''"):
130
+ return True
131
+ return isinstance(err, socket.error) and err.errno in (
132
+ errno.ECONNRESET, errno.ECONNREFUSED, errno.ECONNABORTED,
133
+ errno.EPIPE, errno.ETIMEDOUT, errno.ENETUNREACH, errno.EHOSTUNREACH,
134
+ )
135
+
108
136
  @staticmethod
109
137
  def __json_loads(data):
110
138
  """
@@ -59,8 +59,12 @@ from byteplussdkvpc.models.attach_network_interface_request import AttachNetwork
59
59
  from byteplussdkvpc.models.attach_network_interface_response import AttachNetworkInterfaceResponse
60
60
  from byteplussdkvpc.models.attachment_for_describe_network_interface_attributes_output import AttachmentForDescribeNetworkInterfaceAttributesOutput
61
61
  from byteplussdkvpc.models.attachment_for_describe_network_interfaces_output import AttachmentForDescribeNetworkInterfacesOutput
62
+ from byteplussdkvpc.models.authorize_security_group_egress_batch_request import AuthorizeSecurityGroupEgressBatchRequest
63
+ from byteplussdkvpc.models.authorize_security_group_egress_batch_response import AuthorizeSecurityGroupEgressBatchResponse
62
64
  from byteplussdkvpc.models.authorize_security_group_egress_request import AuthorizeSecurityGroupEgressRequest
63
65
  from byteplussdkvpc.models.authorize_security_group_egress_response import AuthorizeSecurityGroupEgressResponse
66
+ from byteplussdkvpc.models.authorize_security_group_ingress_batch_request import AuthorizeSecurityGroupIngressBatchRequest
67
+ from byteplussdkvpc.models.authorize_security_group_ingress_batch_response import AuthorizeSecurityGroupIngressBatchResponse
64
68
  from byteplussdkvpc.models.authorize_security_group_ingress_request import AuthorizeSecurityGroupIngressRequest
65
69
  from byteplussdkvpc.models.authorize_security_group_ingress_response import AuthorizeSecurityGroupIngressResponse
66
70
  from byteplussdkvpc.models.bandwidth_package_for_describe_bandwidth_packages_output import BandwidthPackageForDescribeBandwidthPackagesOutput
@@ -384,6 +388,10 @@ from byteplussdkvpc.models.modify_route_table_attributes_request import ModifyRo
384
388
  from byteplussdkvpc.models.modify_route_table_attributes_response import ModifyRouteTableAttributesResponse
385
389
  from byteplussdkvpc.models.modify_security_group_attributes_request import ModifySecurityGroupAttributesRequest
386
390
  from byteplussdkvpc.models.modify_security_group_attributes_response import ModifySecurityGroupAttributesResponse
391
+ from byteplussdkvpc.models.modify_security_group_egress_batch_request import ModifySecurityGroupEgressBatchRequest
392
+ from byteplussdkvpc.models.modify_security_group_egress_batch_response import ModifySecurityGroupEgressBatchResponse
393
+ from byteplussdkvpc.models.modify_security_group_ingress_batch_request import ModifySecurityGroupIngressBatchRequest
394
+ from byteplussdkvpc.models.modify_security_group_ingress_batch_response import ModifySecurityGroupIngressBatchResponse
387
395
  from byteplussdkvpc.models.modify_security_group_rule_descriptions_egress_request import ModifySecurityGroupRuleDescriptionsEgressRequest
388
396
  from byteplussdkvpc.models.modify_security_group_rule_descriptions_egress_response import ModifySecurityGroupRuleDescriptionsEgressResponse
389
397
  from byteplussdkvpc.models.modify_security_group_rule_descriptions_ingress_request import ModifySecurityGroupRuleDescriptionsIngressRequest
@@ -403,7 +411,12 @@ from byteplussdkvpc.models.modify_vpc_attributes_response import ModifyVpcAttrib
403
411
  from byteplussdkvpc.models.network_acl_attribute_for_describe_network_acl_attributes_output import NetworkAclAttributeForDescribeNetworkAclAttributesOutput
404
412
  from byteplussdkvpc.models.network_acl_for_describe_network_acls_output import NetworkAclForDescribeNetworkAclsOutput
405
413
  from byteplussdkvpc.models.network_interface_set_for_describe_network_interfaces_output import NetworkInterfaceSetForDescribeNetworkInterfacesOutput
414
+ from byteplussdkvpc.models.overlap_detail_for_describe_ipam_resource_cidrs_output import OverlapDetailForDescribeIpamResourceCidrsOutput
415
+ from byteplussdkvpc.models.permission_for_authorize_security_group_egress_batch_input import PermissionForAuthorizeSecurityGroupEgressBatchInput
416
+ from byteplussdkvpc.models.permission_for_authorize_security_group_ingress_batch_input import PermissionForAuthorizeSecurityGroupIngressBatchInput
406
417
  from byteplussdkvpc.models.permission_for_describe_security_group_attributes_output import PermissionForDescribeSecurityGroupAttributesOutput
418
+ from byteplussdkvpc.models.permission_for_modify_security_group_egress_batch_input import PermissionForModifySecurityGroupEgressBatchInput
419
+ from byteplussdkvpc.models.permission_for_modify_security_group_ingress_batch_input import PermissionForModifySecurityGroupIngressBatchInput
407
420
  from byteplussdkvpc.models.prefix_list_association_for_describe_prefix_list_associations_output import PrefixListAssociationForDescribePrefixListAssociationsOutput
408
421
  from byteplussdkvpc.models.prefix_list_entry_for_create_prefix_list_input import PrefixListEntryForCreatePrefixListInput
409
422
  from byteplussdkvpc.models.prefix_list_entry_for_describe_prefix_list_entries_output import PrefixListEntryForDescribePrefixListEntriesOutput
@@ -430,8 +443,12 @@ from byteplussdkvpc.models.resource_for_describe_network_acls_output import Reso
430
443
  from byteplussdkvpc.models.resource_for_disassociate_network_acl_input import ResourceForDisassociateNetworkAclInput
431
444
  from byteplussdkvpc.models.resource_tag_for_list_tags_for_ipam_resources_output import ResourceTagForListTagsForIpamResourcesOutput
432
445
  from byteplussdkvpc.models.resource_tag_for_list_tags_for_resources_output import ResourceTagForListTagsForResourcesOutput
446
+ from byteplussdkvpc.models.revoke_security_group_egress_batch_request import RevokeSecurityGroupEgressBatchRequest
447
+ from byteplussdkvpc.models.revoke_security_group_egress_batch_response import RevokeSecurityGroupEgressBatchResponse
433
448
  from byteplussdkvpc.models.revoke_security_group_egress_request import RevokeSecurityGroupEgressRequest
434
449
  from byteplussdkvpc.models.revoke_security_group_egress_response import RevokeSecurityGroupEgressResponse
450
+ from byteplussdkvpc.models.revoke_security_group_ingress_batch_request import RevokeSecurityGroupIngressBatchRequest
451
+ from byteplussdkvpc.models.revoke_security_group_ingress_batch_response import RevokeSecurityGroupIngressBatchResponse
435
452
  from byteplussdkvpc.models.revoke_security_group_ingress_request import RevokeSecurityGroupIngressRequest
436
453
  from byteplussdkvpc.models.revoke_security_group_ingress_response import RevokeSecurityGroupIngressResponse
437
454
  from byteplussdkvpc.models.route_entry_for_describe_route_entry_list_output import RouteEntryForDescribeRouteEntryListOutput