Skip to content

Commit 2b0dd5a

Browse files
authored
feat(iam): add SCIM related endpoints (scaleway#2811)
1 parent f02e436 commit 2b0dd5a

File tree

1 file changed

+261
-0
lines changed

1 file changed

+261
-0
lines changed

api/iam/v1alpha1/iam_sdk.go

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,43 @@ func (enum *ListSSHKeysRequestOrderBy) UnmarshalJSON(data []byte) error {
546546
return nil
547547
}
548548

549+
type ListScimTokensRequestOrderBy string
550+
551+
const (
552+
ListScimTokensRequestOrderByCreatedAtAsc = ListScimTokensRequestOrderBy("created_at_asc")
553+
ListScimTokensRequestOrderByCreatedAtDesc = ListScimTokensRequestOrderBy("created_at_desc")
554+
)
555+
556+
func (enum ListScimTokensRequestOrderBy) String() string {
557+
if enum == "" {
558+
// return default value if empty
559+
return string(ListScimTokensRequestOrderByCreatedAtAsc)
560+
}
561+
return string(enum)
562+
}
563+
564+
func (enum ListScimTokensRequestOrderBy) Values() []ListScimTokensRequestOrderBy {
565+
return []ListScimTokensRequestOrderBy{
566+
"created_at_asc",
567+
"created_at_desc",
568+
}
569+
}
570+
571+
func (enum ListScimTokensRequestOrderBy) MarshalJSON() ([]byte, error) {
572+
return []byte(fmt.Sprintf(`"%s"`, enum)), nil
573+
}
574+
575+
func (enum *ListScimTokensRequestOrderBy) UnmarshalJSON(data []byte) error {
576+
tmp := ""
577+
578+
if err := json.Unmarshal(data, &tmp); err != nil {
579+
return err
580+
}
581+
582+
*enum = ListScimTokensRequestOrderBy(ListScimTokensRequestOrderBy(tmp).String())
583+
return nil
584+
}
585+
549586
type ListUsersRequestOrderBy string
550587

551588
const (
@@ -1085,6 +1122,17 @@ type RuleSpecs struct {
10851122
OrganizationID *string `json:"organization_id,omitempty"`
10861123
}
10871124

1125+
// ScimToken: scim token.
1126+
type ScimToken struct {
1127+
ID string `json:"id"`
1128+
1129+
ScimID string `json:"scim_id"`
1130+
1131+
CreatedAt *time.Time `json:"created_at"`
1132+
1133+
ExpiresAt *time.Time `json:"expires_at"`
1134+
}
1135+
10881136
// CreateUserRequestMember: create user request member.
10891137
type CreateUserRequestMember struct {
10901138
// Email: email of the user to create.
@@ -1691,6 +1739,21 @@ type CreateSSHKeyRequest struct {
16911739
ProjectID string `json:"project_id"`
16921740
}
16931741

1742+
// CreateScimTokenRequest: create scim token request.
1743+
type CreateScimTokenRequest struct {
1744+
// ScimID: ID of the SCIM configuration.
1745+
ScimID string `json:"-"`
1746+
}
1747+
1748+
// CreateScimTokenResponse: create scim token response.
1749+
type CreateScimTokenResponse struct {
1750+
// Token: the SCIM token metadata.
1751+
Token *ScimToken `json:"token"`
1752+
1753+
// BearerToken: the Bearer Token to use to authenticate to SCIM endpoints.
1754+
BearerToken string `json:"bearer_token"`
1755+
}
1756+
16941757
// CreateUserMFAOTPRequest: create user mfaotp request.
16951758
type CreateUserMFAOTPRequest struct {
16961759
// UserID: user ID of the MFA OTP.
@@ -1761,6 +1824,18 @@ type DeleteSamlRequest struct {
17611824
SamlID string `json:"-"`
17621825
}
17631826

1827+
// DeleteScimRequest: delete scim request.
1828+
type DeleteScimRequest struct {
1829+
// ScimID: ID of the SCIM configuration.
1830+
ScimID string `json:"-"`
1831+
}
1832+
1833+
// DeleteScimTokenRequest: delete scim token request.
1834+
type DeleteScimTokenRequest struct {
1835+
// TokenID: the SCIM token ID.
1836+
TokenID string `json:"-"`
1837+
}
1838+
17641839
// DeleteUserMFAOTPRequest: delete user mfaotp request.
17651840
type DeleteUserMFAOTPRequest struct {
17661841
// UserID: user ID of the MFA OTP.
@@ -1779,6 +1854,12 @@ type EnableOrganizationSamlRequest struct {
17791854
OrganizationID string `json:"-"`
17801855
}
17811856

1857+
// EnableOrganizationScimRequest: enable organization scim request.
1858+
type EnableOrganizationScimRequest struct {
1859+
// OrganizationID: ID of the Organization.
1860+
OrganizationID string `json:"-"`
1861+
}
1862+
17821863
// EncodedJWT: encoded jwt.
17831864
type EncodedJWT struct {
17841865
// Jwt: the renewed JWT.
@@ -2470,6 +2551,50 @@ type ListSamlCertificatesResponse struct {
24702551
Certificates []*SamlCertificate `json:"certificates"`
24712552
}
24722553

2554+
// ListScimTokensRequest: list scim tokens request.
2555+
type ListScimTokensRequest struct {
2556+
// ScimID: ID of the SCIM configuration.
2557+
ScimID string `json:"-"`
2558+
2559+
// OrderBy: sort order of SCIM tokens.
2560+
// Default value: created_at_asc
2561+
OrderBy ListScimTokensRequestOrderBy `json:"-"`
2562+
2563+
// Page: requested page number. Value must be greater or equal to 1.
2564+
Page *int32 `json:"-"`
2565+
2566+
// PageSize: number of items per page. Value must be between 1 and 100.
2567+
PageSize *uint32 `json:"-"`
2568+
}
2569+
2570+
// ListScimTokensResponse: list scim tokens response.
2571+
type ListScimTokensResponse struct {
2572+
// ScimTokens: list of SCIM tokens.
2573+
ScimTokens []*ScimToken `json:"scim_tokens"`
2574+
2575+
// TotalCount: total count of SCIM tokens.
2576+
TotalCount uint64 `json:"total_count"`
2577+
}
2578+
2579+
// UnsafeGetTotalCount should not be used
2580+
// Internal usage only
2581+
func (r *ListScimTokensResponse) UnsafeGetTotalCount() uint64 {
2582+
return r.TotalCount
2583+
}
2584+
2585+
// UnsafeAppend should not be used
2586+
// Internal usage only
2587+
func (r *ListScimTokensResponse) UnsafeAppend(res any) (uint64, error) {
2588+
results, ok := res.(*ListScimTokensResponse)
2589+
if !ok {
2590+
return 0, errors.New("%T type cannot be appended to type %T", res, r)
2591+
}
2592+
2593+
r.ScimTokens = append(r.ScimTokens, results.ScimTokens...)
2594+
r.TotalCount += uint64(len(results.ScimTokens))
2595+
return uint64(len(results.ScimTokens)), nil
2596+
}
2597+
24732598
// ListUsersRequest: list users request.
24742599
type ListUsersRequest struct {
24752600
// OrderBy: criteria for sorting results.
@@ -2636,6 +2761,15 @@ type Saml struct {
26362761
SingleSignOnURL string `json:"single_sign_on_url"`
26372762
}
26382763

2764+
// Scim: scim.
2765+
type Scim struct {
2766+
// ID: ID of the SCIM configuration.
2767+
ID string `json:"id"`
2768+
2769+
// CreatedAt: date and time of SCIM configuration creation.
2770+
CreatedAt *time.Time `json:"created_at"`
2771+
}
2772+
26392773
// SetGroupMembersRequest: set group members request.
26402774
type SetGroupMembersRequest struct {
26412775
GroupID string `json:"-"`
@@ -4805,3 +4939,130 @@ func (s *API) DeleteSamlCertificate(req *DeleteSamlCertificateRequest, opts ...s
48054939
}
48064940
return nil
48074941
}
4942+
4943+
// EnableOrganizationScim:
4944+
func (s *API) EnableOrganizationScim(req *EnableOrganizationScimRequest, opts ...scw.RequestOption) (*Scim, error) {
4945+
var err error
4946+
4947+
if req.OrganizationID == "" {
4948+
defaultOrganizationID, _ := s.client.GetDefaultOrganizationID()
4949+
req.OrganizationID = defaultOrganizationID
4950+
}
4951+
4952+
if fmt.Sprint(req.OrganizationID) == "" {
4953+
return nil, errors.New("field OrganizationID cannot be empty in request")
4954+
}
4955+
4956+
scwReq := &scw.ScalewayRequest{
4957+
Method: "POST",
4958+
Path: "/iam/v1alpha1/organizations/" + fmt.Sprint(req.OrganizationID) + "/scim",
4959+
}
4960+
4961+
err = scwReq.SetBody(req)
4962+
if err != nil {
4963+
return nil, err
4964+
}
4965+
4966+
var resp Scim
4967+
4968+
err = s.client.Do(scwReq, &resp, opts...)
4969+
if err != nil {
4970+
return nil, err
4971+
}
4972+
return &resp, nil
4973+
}
4974+
4975+
// DeleteScim:
4976+
func (s *API) DeleteScim(req *DeleteScimRequest, opts ...scw.RequestOption) error {
4977+
var err error
4978+
4979+
if fmt.Sprint(req.ScimID) == "" {
4980+
return errors.New("field ScimID cannot be empty in request")
4981+
}
4982+
4983+
scwReq := &scw.ScalewayRequest{
4984+
Method: "DELETE",
4985+
Path: "/iam/v1alpha1/scim/" + fmt.Sprint(req.ScimID) + "",
4986+
}
4987+
4988+
err = s.client.Do(scwReq, nil, opts...)
4989+
if err != nil {
4990+
return err
4991+
}
4992+
return nil
4993+
}
4994+
4995+
// ListScimTokens:
4996+
func (s *API) ListScimTokens(req *ListScimTokensRequest, opts ...scw.RequestOption) (*ListScimTokensResponse, error) {
4997+
var err error
4998+
4999+
defaultPageSize, exist := s.client.GetDefaultPageSize()
5000+
if (req.PageSize == nil || *req.PageSize == 0) && exist {
5001+
req.PageSize = &defaultPageSize
5002+
}
5003+
5004+
query := url.Values{}
5005+
parameter.AddToQuery(query, "order_by", req.OrderBy)
5006+
parameter.AddToQuery(query, "page", req.Page)
5007+
parameter.AddToQuery(query, "page_size", req.PageSize)
5008+
5009+
if fmt.Sprint(req.ScimID) == "" {
5010+
return nil, errors.New("field ScimID cannot be empty in request")
5011+
}
5012+
5013+
scwReq := &scw.ScalewayRequest{
5014+
Method: "GET",
5015+
Path: "/iam/v1alpha1/scim/" + fmt.Sprint(req.ScimID) + "/tokens",
5016+
Query: query,
5017+
}
5018+
5019+
var resp ListScimTokensResponse
5020+
5021+
err = s.client.Do(scwReq, &resp, opts...)
5022+
if err != nil {
5023+
return nil, err
5024+
}
5025+
return &resp, nil
5026+
}
5027+
5028+
// CreateScimToken:
5029+
func (s *API) CreateScimToken(req *CreateScimTokenRequest, opts ...scw.RequestOption) (*CreateScimTokenResponse, error) {
5030+
var err error
5031+
5032+
if fmt.Sprint(req.ScimID) == "" {
5033+
return nil, errors.New("field ScimID cannot be empty in request")
5034+
}
5035+
5036+
scwReq := &scw.ScalewayRequest{
5037+
Method: "POST",
5038+
Path: "/iam/v1alpha1/scim/" + fmt.Sprint(req.ScimID) + "/tokens",
5039+
}
5040+
5041+
var resp CreateScimTokenResponse
5042+
5043+
err = s.client.Do(scwReq, &resp, opts...)
5044+
if err != nil {
5045+
return nil, err
5046+
}
5047+
return &resp, nil
5048+
}
5049+
5050+
// DeleteScimToken:
5051+
func (s *API) DeleteScimToken(req *DeleteScimTokenRequest, opts ...scw.RequestOption) error {
5052+
var err error
5053+
5054+
if fmt.Sprint(req.TokenID) == "" {
5055+
return errors.New("field TokenID cannot be empty in request")
5056+
}
5057+
5058+
scwReq := &scw.ScalewayRequest{
5059+
Method: "DELETE",
5060+
Path: "/iam/v1alpha1/scim-tokens/" + fmt.Sprint(req.TokenID) + "",
5061+
}
5062+
5063+
err = s.client.Do(scwReq, nil, opts...)
5064+
if err != nil {
5065+
return err
5066+
}
5067+
return nil
5068+
}

0 commit comments

Comments
 (0)