Skip to content

Commit 4643e2b

Browse files
committed
refactor credentials providers
1 parent d14d8f3 commit 4643e2b

39 files changed

+7454
-217
lines changed

.github/workflows/testPython.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ permissions:
1111

1212
jobs:
1313
build:
14-
runs-on: ubuntu-latest
14+
runs-on: ubuntu-20.04
1515
strategy:
1616
matrix:
17-
python-version: [ "3.7", "3.8", "3.9", "3.10", "3.11", "3.12" ]
17+
python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12" ]
1818
fail-fast: false
1919
steps:
2020
- uses: actions/checkout@v4
2121
- name: Set up Python ${{ matrix.python-version }}
22-
uses: actions/setup-python@v3
22+
uses: actions/setup-python@v5
2323
with:
2424
python-version: ${{ matrix.python-version }}
2525
- name: Install dependencies
26-
run: pip install alibabacloud-tea coverage pytest
26+
run: pip install alibabacloud-tea coverage pytest alibabacloud_credentials_api APScheduler aiofiles
2727
- name: Setup OIDC
2828
run: npm install @actions/[email protected] @actions/http-client
2929
- name: Get Id Token

alibabacloud_credentials/client.py

Lines changed: 166 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
from functools import wraps
22

3-
from alibabacloud_credentials import credentials, providers, models
3+
from alibabacloud_credentials_api import ICredentialsProvider
4+
from alibabacloud_credentials import credentials
5+
from alibabacloud_credentials.exceptions import CredentialException
6+
from alibabacloud_credentials.models import Config, CredentialModel
7+
from alibabacloud_credentials.http import HttpOptions
8+
from alibabacloud_credentials.provider import (StaticAKCredentialsProvider,
9+
StaticSTSCredentialsProvider,
10+
RamRoleArnCredentialsProvider,
11+
OIDCRoleArnCredentialsProvider,
12+
RsaKeyPairCredentialsProvider,
13+
EcsRamRoleCredentialsProvider,
14+
URLCredentialsProvider,
15+
DefaultCredentialsProvider)
416
from alibabacloud_credentials.utils import auth_constant as ac
517
from Tea.decorators import deprecated
618

@@ -16,24 +28,85 @@ def i(*args, **kwargs):
1628
return i
1729

1830

31+
class _CredentialsProviderWrap:
32+
33+
def __init__(self,
34+
*,
35+
type_name: str = None,
36+
provider: ICredentialsProvider = None):
37+
self.type_name = type_name
38+
self.provider = provider
39+
40+
def get_access_key_id(self) -> str:
41+
credential = self.provider.get_credentials()
42+
return credential.get_access_key_id()
43+
44+
async def get_access_key_id_async(self) -> str:
45+
credential = await self.provider.get_credentials_async()
46+
return credential.get_access_key_id()
47+
48+
def get_access_key_secret(self) -> str:
49+
credential = self.provider.get_credentials()
50+
return credential.get_access_key_secret()
51+
52+
async def get_access_key_secret_async(self) -> str:
53+
credential = await self.provider.get_credentials_async()
54+
return credential.get_access_key_secret()
55+
56+
def get_security_token(self):
57+
credential = self.provider.get_credentials()
58+
return credential.get_security_token()
59+
60+
async def get_security_token_async(self):
61+
credential = await self.provider.get_credentials_async()
62+
return credential.get_security_token()
63+
64+
def get_credential(self) -> CredentialModel:
65+
credential = self.provider.get_credentials()
66+
return CredentialModel(
67+
access_key_id=credential.get_access_key_id(),
68+
access_key_secret=credential.get_access_key_secret(),
69+
security_token=credential.get_security_token(),
70+
type=self.type_name,
71+
provider_name=credential.get_provider_name(),
72+
)
73+
74+
async def get_credential_async(self) -> CredentialModel:
75+
credential = await self.provider.get_credentials_async()
76+
return CredentialModel(
77+
access_key_id=credential.get_access_key_id(),
78+
access_key_secret=credential.get_access_key_secret(),
79+
security_token=credential.get_security_token(),
80+
type=self.type_name,
81+
provider_name=credential.get_provider_name(),
82+
)
83+
84+
def get_type(self) -> str:
85+
return self.type_name
86+
87+
1988
class Client:
2089
cloud_credential = None
2190

22-
def __init__(self, config=None):
23-
if config is None:
24-
provider = providers.DefaultCredentialsProvider()
25-
self.cloud_credential = provider.get_credentials()
26-
return
27-
self.cloud_credential = Client.get_credentials(config)
28-
29-
def get_credential(self) -> models.CredentialModel:
91+
def __init__(self,
92+
config: Config = None,
93+
provider: ICredentialsProvider = None):
94+
if provider is not None:
95+
self.cloud_credential = _CredentialsProviderWrap(provider=provider)
96+
elif config is None:
97+
provider = DefaultCredentialsProvider()
98+
self.cloud_credential = _CredentialsProviderWrap(type_name='default', provider=provider)
99+
else:
100+
self.cloud_credential = Client.get_credentials(config)
101+
102+
def get_credential(self) -> CredentialModel:
30103
"""
31104
Get credential
32105
@return: the whole credential
33106
"""
34107
return self.cloud_credential.get_credential()
35108

36-
async def get_credential_async(self) -> models.CredentialModel:
109+
async def get_credential_async(self) -> CredentialModel:
37110
"""
38111
Get credential
39112
@return: the whole credential
@@ -43,44 +116,99 @@ async def get_credential_async(self) -> models.CredentialModel:
43116
@staticmethod
44117
def get_credentials(config):
45118
if config.type == ac.ACCESS_KEY:
46-
return credentials.AccessKeyCredential(config.access_key_id, config.access_key_secret)
119+
provider = StaticAKCredentialsProvider(
120+
access_key_id=config.access_key_id,
121+
access_key_secret=config.access_key_secret,
122+
)
123+
return _CredentialsProviderWrap(type_name='access_key', provider=provider)
47124
elif config.type == ac.STS:
48-
return credentials.StsCredential(config.access_key_id, config.access_key_secret, config.security_token)
125+
provider = StaticSTSCredentialsProvider(
126+
access_key_id=config.access_key_id,
127+
access_key_secret=config.access_key_secret,
128+
security_token=config.security_token,
129+
)
130+
return _CredentialsProviderWrap(type_name='sts', provider=provider)
49131
elif config.type == ac.BEARER:
50132
return credentials.BearerTokenCredential(config.bearer_token)
51133
elif config.type == ac.ECS_RAM_ROLE:
52-
return credentials.EcsRamRoleCredential(
53-
config.access_key_id,
54-
config.access_key_secret,
55-
config.security_token,
56-
0,
57-
providers.EcsRamRoleCredentialProvider(config=config)
134+
provider = EcsRamRoleCredentialsProvider(
135+
role_name=config.role_name,
136+
disable_imds_v1=config.disable_imds_v1,
137+
http_options=HttpOptions(
138+
read_timeout=config.timeout,
139+
connect_timeout=config.connect_timeout,
140+
proxy=config.proxy,
141+
),
58142
)
143+
return _CredentialsProviderWrap(type_name='ecs_ram_role', provider=provider)
59144
elif config.type == ac.CREDENTIALS_URI:
60-
return credentials.CredentialsURICredential(config.credentials_uri)
145+
provider = URLCredentialsProvider(
146+
uri=config.credentials_uri,
147+
http_options=HttpOptions(
148+
read_timeout=config.timeout,
149+
connect_timeout=config.connect_timeout,
150+
proxy=config.proxy,
151+
),
152+
)
153+
return _CredentialsProviderWrap(type_name='credentials_uri', provider=provider)
61154
elif config.type == ac.RAM_ROLE_ARN:
62-
return credentials.RamRoleArnCredential(
63-
config.access_key_id,
64-
config.access_key_secret,
65-
config.security_token,
66-
0,
67-
providers.RamRoleArnCredentialProvider(config=config)
155+
if config.security_token is not None and config.security_token != '':
156+
previous_provider = StaticSTSCredentialsProvider(
157+
access_key_id=config.access_key_id,
158+
access_key_secret=config.access_key_secret,
159+
security_token=config.security_token,
160+
)
161+
else:
162+
previous_provider = StaticAKCredentialsProvider(
163+
access_key_id=config.access_key_id,
164+
access_key_secret=config.access_key_secret,
165+
)
166+
provider = RamRoleArnCredentialsProvider(
167+
credentials_provider=previous_provider,
168+
role_arn=config.role_arn,
169+
role_session_name=config.role_session_name,
170+
duration_seconds=config.role_session_expiration,
171+
policy=config.policy,
172+
external_id=config.external_id,
173+
sts_endpoint=config.sts_endpoint,
174+
http_options=HttpOptions(
175+
read_timeout=config.timeout,
176+
connect_timeout=config.connect_timeout,
177+
proxy=config.proxy,
178+
),
68179
)
180+
return _CredentialsProviderWrap(type_name='ram_role_arn', provider=provider)
69181
elif config.type == ac.RSA_KEY_PAIR:
70-
return credentials.RsaKeyPairCredential(
71-
config.access_key_id,
72-
config.access_key_secret,
73-
0,
74-
providers.RsaKeyPairCredentialProvider(config=config)
182+
provider = RsaKeyPairCredentialsProvider(
183+
public_key_id=config.public_key_id,
184+
private_key_file=config.private_key_file,
185+
duration_seconds=config.role_session_expiration,
186+
sts_endpoint=config.sts_endpoint,
187+
http_options=HttpOptions(
188+
read_timeout=config.timeout,
189+
connect_timeout=config.connect_timeout,
190+
proxy=config.proxy,
191+
),
75192
)
193+
return _CredentialsProviderWrap(type_name='rsa_key_pair', provider=provider)
76194
elif config.type == ac.OIDC_ROLE_ARN:
77-
return credentials.OIDCRoleArnCredential(
78-
config.access_key_id,
79-
config.access_key_secret,
80-
config.security_token,
81-
0,
82-
providers.OIDCRoleArnCredentialProvider(config=config))
83-
return providers.DefaultCredentialsProvider().get_credentials()
195+
provider = OIDCRoleArnCredentialsProvider(
196+
role_arn=config.role_arn,
197+
oidc_provider_arn=config.oidc_provider_arn,
198+
oidc_token_file_path=config.oidc_token_file_path,
199+
role_session_name=config.role_session_name,
200+
duration_seconds=config.role_session_expiration,
201+
policy=config.policy,
202+
sts_endpoint=config.sts_endpoint,
203+
http_options=HttpOptions(
204+
read_timeout=config.timeout,
205+
connect_timeout=config.connect_timeout,
206+
proxy=config.proxy,
207+
),
208+
)
209+
return _CredentialsProviderWrap(type_name='oidc_role_arn', provider=provider)
210+
raise CredentialException(
211+
'invalid type option, support: access_key, sts, bearer, ecs_ram_role, ram_role_arn, rsa_key_pair, oidc_role_arn, credentials_uri')
84212

85213
@deprecated("Use 'get_credential().access_key_id' instead")
86214
def get_access_key_id(self):
@@ -109,7 +237,7 @@ async def get_security_token_async(self):
109237
@deprecated("Use 'get_credential().type' instead")
110238
@attribute_error_return_none
111239
def get_type(self):
112-
return self.cloud_credential.credential_type
240+
return self.cloud_credential.get_type()
113241

114242
@deprecated("Use 'get_credential().bearer_token' instead")
115243
@attribute_error_return_none

alibabacloud_credentials/credentials.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ async def get_credential_async(self):
116116
type=ac.BEARER
117117
)
118118

119+
def get_type(self) -> str:
120+
return self.credential_type
121+
119122

120123
class EcsRamRoleCredential(Credential, _AutomaticallyRefreshCredentials):
121124
"""EcsRamRoleCredential"""
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from ._options import HttpOptions
2+
3+
__all__ = [
4+
'HttpOptions'
5+
]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class HttpOptions:
2+
def __init__(self,
3+
*,
4+
proxy: str = None,
5+
connect_timeout: int = None,
6+
read_timeout: int = None):
7+
self.proxy = proxy
8+
self.connect_timeout = connect_timeout
9+
self.read_timeout = read_timeout

0 commit comments

Comments
 (0)