Skip to content

Commit 2bd8d23

Browse files
feat(iam): add support for creating members within CreateUser (scaleway#650)
Co-authored-by: Rémy Léone <[email protected]>
1 parent 127f11a commit 2bd8d23

File tree

8 files changed

+200
-70
lines changed

8 files changed

+200
-70
lines changed

scaleway-async/scaleway_async/iam/v1alpha1/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from .types import UserStatus
1818
from .types import UserType
1919
from .types import RuleSpecs
20+
from .types import CreateUserRequestMember
2021
from .types import JWT
2122
from .types import APIKey
2223
from .types import Application
@@ -107,6 +108,7 @@
107108
"UserStatus",
108109
"UserType",
109110
"RuleSpecs",
111+
"CreateUserRequestMember",
110112
"JWT",
111113
"APIKey",
112114
"Application",

scaleway-async/scaleway_async/iam/v1alpha1/api.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
CreatePolicyRequest,
3838
CreateSSHKeyRequest,
3939
CreateUserRequest,
40+
CreateUserRequestMember,
4041
EncodedJWT,
4142
Group,
4243
JWT,
@@ -534,34 +535,37 @@ async def delete_user(
534535
async def create_user(
535536
self,
536537
*,
537-
email: str,
538538
organization_id: Optional[str] = None,
539+
email: Optional[str] = None,
539540
tags: Optional[List[str]] = None,
541+
member: Optional[CreateUserRequestMember] = None,
540542
) -> User:
541543
"""
542544
Create a new user.
543545
Create a new user. You must define the `organization_id` and the `email` in your request.
544-
:param email: Email of the user.
545546
:param organization_id: ID of the Organization.
547+
:param email: Email of the user.
548+
One-Of ('type'): at most one of 'email', 'member' could be set.
546549
:param tags: Tags associated with the user.
550+
:param member: A new IAM Member to create.
551+
One-Of ('type'): at most one of 'email', 'member' could be set.
547552
:return: :class:`User <User>`
548553
549554
Usage:
550555
::
551556
552-
result = await api.create_user(
553-
email="example",
554-
)
557+
result = await api.create_user()
555558
"""
556559

557560
res = self._request(
558561
"POST",
559562
"/iam/v1alpha1/users",
560563
body=marshal_CreateUserRequest(
561564
CreateUserRequest(
562-
email=email,
563565
organization_id=organization_id,
564566
tags=tags,
567+
email=email,
568+
member=member,
565569
),
566570
self.client,
567571
),

scaleway-async/scaleway_async/iam/v1alpha1/marshalling.py

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
RuleSpecs,
4444
CreatePolicyRequest,
4545
CreateSSHKeyRequest,
46+
CreateUserRequestMember,
4647
CreateUserRequest,
4748
RemoveGroupMemberRequest,
4849
SetGroupMembersRequest,
@@ -512,10 +513,26 @@ def unmarshal_User(data: Any) -> User:
512513
if field is not None:
513514
args["email"] = field
514515

516+
field = data.get("username", None)
517+
if field is not None:
518+
args["username"] = field
519+
515520
field = data.get("organization_id", None)
516521
if field is not None:
517522
args["organization_id"] = field
518523

524+
field = data.get("created_at", None)
525+
if field is not None:
526+
args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field
527+
else:
528+
args["created_at"] = None
529+
530+
field = data.get("updated_at", None)
531+
if field is not None:
532+
args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field
533+
else:
534+
args["updated_at"] = None
535+
519536
field = data.get("deletable", None)
520537
if field is not None:
521538
args["deletable"] = field
@@ -528,12 +545,6 @@ def unmarshal_User(data: Any) -> User:
528545
if field is not None:
529546
args["status"] = field
530547

531-
field = data.get("created_at", None)
532-
if field is not None:
533-
args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field
534-
else:
535-
args["created_at"] = None
536-
537548
field = data.get("mfa", None)
538549
if field is not None:
539550
args["mfa"] = field
@@ -546,12 +557,6 @@ def unmarshal_User(data: Any) -> User:
546557
if field is not None:
547558
args["tags"] = field
548559

549-
field = data.get("updated_at", None)
550-
if field is not None:
551-
args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field
552-
else:
553-
args["updated_at"] = None
554-
555560
field = data.get("last_login_at", None)
556561
if field is not None:
557562
args["last_login_at"] = (
@@ -1118,15 +1123,41 @@ def marshal_CreateSSHKeyRequest(
11181123
return output
11191124

11201125

1121-
def marshal_CreateUserRequest(
1122-
request: CreateUserRequest,
1126+
def marshal_CreateUserRequestMember(
1127+
request: CreateUserRequestMember,
11231128
defaults: ProfileDefaults,
11241129
) -> Dict[str, Any]:
11251130
output: Dict[str, Any] = {}
11261131

11271132
if request.email is not None:
11281133
output["email"] = request.email
11291134

1135+
if request.send_password_email is not None:
1136+
output["send_password_email"] = request.send_password_email
1137+
1138+
if request.username is not None:
1139+
output["username"] = request.username
1140+
1141+
if request.password is not None:
1142+
output["password"] = request.password
1143+
1144+
return output
1145+
1146+
1147+
def marshal_CreateUserRequest(
1148+
request: CreateUserRequest,
1149+
defaults: ProfileDefaults,
1150+
) -> Dict[str, Any]:
1151+
output: Dict[str, Any] = {}
1152+
output.update(
1153+
resolve_one_of(
1154+
[
1155+
OneOfPossibility("email", request.email),
1156+
OneOfPossibility("member", request.member),
1157+
]
1158+
),
1159+
)
1160+
11301161
if request.organization_id is not None:
11311162
output["organization_id"] = (
11321163
request.organization_id or defaults.default_organization_id

scaleway-async/scaleway_async/iam/v1alpha1/types.py

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class UserType(str, Enum, metaclass=StrEnumMeta):
176176
UNKNOWN_TYPE = "unknown_type"
177177
GUEST = "guest"
178178
OWNER = "owner"
179+
MEMBER = "member"
179180

180181
def __str__(self) -> str:
181182
return str(self.value)
@@ -198,6 +199,29 @@ class RuleSpecs:
198199
organization_id: Optional[str]
199200

200201

202+
@dataclass
203+
class CreateUserRequestMember:
204+
email: str
205+
"""
206+
Email of the user to create.
207+
"""
208+
209+
send_password_email: bool
210+
"""
211+
Whether or not to send an email containing the member's password.
212+
"""
213+
214+
username: str
215+
"""
216+
The member's username.
217+
"""
218+
219+
password: str
220+
"""
221+
The member's password.
222+
"""
223+
224+
201225
@dataclass
202226
class JWT:
203227
jti: str
@@ -647,11 +671,26 @@ class User:
647671
Email of user.
648672
"""
649673

674+
username: str
675+
"""
676+
User identifier unique to the Organization.
677+
"""
678+
650679
organization_id: str
651680
"""
652681
ID of the Organization.
653682
"""
654683

684+
created_at: Optional[datetime]
685+
"""
686+
Date user was created.
687+
"""
688+
689+
updated_at: Optional[datetime]
690+
"""
691+
Date of last user update.
692+
"""
693+
655694
deletable: bool
656695
"""
657696
Deletion status of user. Owners cannot be deleted.
@@ -667,11 +706,6 @@ class User:
667706
Status of user invitation.
668707
"""
669708

670-
created_at: Optional[datetime]
671-
"""
672-
Date user was created.
673-
"""
674-
675709
mfa: bool
676710
"""
677711
Defines whether MFA is enabled.
@@ -687,11 +721,6 @@ class User:
687721
Tags associated with the user.
688722
"""
689723

690-
updated_at: Optional[datetime]
691-
"""
692-
Date of last user update.
693-
"""
694-
695724
last_login_at: Optional[datetime]
696725
"""
697726
Date of the last login.
@@ -875,11 +904,6 @@ class CreateSSHKeyRequest:
875904

876905
@dataclass
877906
class CreateUserRequest:
878-
email: str
879-
"""
880-
Email of the user.
881-
"""
882-
883907
organization_id: Optional[str]
884908
"""
885909
ID of the Organization.
@@ -890,6 +914,10 @@ class CreateUserRequest:
890914
Tags associated with the user.
891915
"""
892916

917+
email: Optional[str]
918+
919+
member: Optional[CreateUserRequestMember]
920+
893921

894922
@dataclass
895923
class DeleteAPIKeyRequest:

scaleway/scaleway/iam/v1alpha1/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from .types import UserStatus
1818
from .types import UserType
1919
from .types import RuleSpecs
20+
from .types import CreateUserRequestMember
2021
from .types import JWT
2122
from .types import APIKey
2223
from .types import Application
@@ -107,6 +108,7 @@
107108
"UserStatus",
108109
"UserType",
109110
"RuleSpecs",
111+
"CreateUserRequestMember",
110112
"JWT",
111113
"APIKey",
112114
"Application",

scaleway/scaleway/iam/v1alpha1/api.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
CreatePolicyRequest,
3838
CreateSSHKeyRequest,
3939
CreateUserRequest,
40+
CreateUserRequestMember,
4041
EncodedJWT,
4142
Group,
4243
JWT,
@@ -534,34 +535,37 @@ def delete_user(
534535
def create_user(
535536
self,
536537
*,
537-
email: str,
538538
organization_id: Optional[str] = None,
539+
email: Optional[str] = None,
539540
tags: Optional[List[str]] = None,
541+
member: Optional[CreateUserRequestMember] = None,
540542
) -> User:
541543
"""
542544
Create a new user.
543545
Create a new user. You must define the `organization_id` and the `email` in your request.
544-
:param email: Email of the user.
545546
:param organization_id: ID of the Organization.
547+
:param email: Email of the user.
548+
One-Of ('type'): at most one of 'email', 'member' could be set.
546549
:param tags: Tags associated with the user.
550+
:param member: A new IAM Member to create.
551+
One-Of ('type'): at most one of 'email', 'member' could be set.
547552
:return: :class:`User <User>`
548553
549554
Usage:
550555
::
551556
552-
result = api.create_user(
553-
email="example",
554-
)
557+
result = api.create_user()
555558
"""
556559

557560
res = self._request(
558561
"POST",
559562
"/iam/v1alpha1/users",
560563
body=marshal_CreateUserRequest(
561564
CreateUserRequest(
562-
email=email,
563565
organization_id=organization_id,
564566
tags=tags,
567+
email=email,
568+
member=member,
565569
),
566570
self.client,
567571
),

0 commit comments

Comments
 (0)