From 264538f492c0488d7be5904173719ced55773024 Mon Sep 17 00:00:00 2001 From: Tim Tkachev Date: Fri, 23 Jun 2023 15:13:22 +0300 Subject: [PATCH] v1.4.6 --- CHANGELOG.md | 12 +- pkg/cloudapi/compute/create_template.go | 24 +- pkg/cloudapi/vins/nat_rule_add.go | 10 +- pkg/cloudapi/vins/nat_rule_del.go | 2 +- pkg/cloudbroker/apiaccess.go | 8 + pkg/cloudbroker/apiaccess/api_find.go | 43 +++ pkg/cloudbroker/apiaccess/apiaccess.go | 15 + pkg/cloudbroker/apiaccess/apis_exclude.go | 69 +++++ pkg/cloudbroker/apiaccess/apis_include.go | 62 ++++ pkg/cloudbroker/apiaccess/copy.go | 44 +++ pkg/cloudbroker/apiaccess/create.go | 44 +++ pkg/cloudbroker/apiaccess/delete.go | 44 +++ pkg/cloudbroker/apiaccess/desc_update.go | 44 +++ pkg/cloudbroker/apiaccess/get.go | 42 +++ pkg/cloudbroker/apiaccess/get_full.go | 26 ++ pkg/cloudbroker/apiaccess/get_pre_groups.go | 26 ++ pkg/cloudbroker/apiaccess/list.go | 70 +++++ pkg/cloudbroker/apiaccess/list_deleted.go | 46 +++ pkg/cloudbroker/apiaccess/models.go | 182 ++++++++++++ pkg/cloudbroker/apiaccess/set_default.go | 40 +++ pkg/cloudbroker/apiaccess/subtract.go | 45 +++ pkg/cloudbroker/apiaccess/union.go | 47 +++ pkg/cloudbroker/apiaccess/update.go | 62 ++++ pkg/cloudbroker/apiaccess/user_list.go | 42 +++ pkg/cloudbroker/backup/create_disk_backup.go | 27 +- pkg/cloudbroker/backup/create_disks_backup.go | 27 +- pkg/cloudbroker/backup/delete_disk_backup.go | 27 +- .../backup/restore_disk_from_backup.go | 27 +- .../backup/restore_disks_from_backup.go | 27 +- pkg/cloudbroker/compute/create_template.go | 24 +- pkg/cloudbroker/group.go | 8 + pkg/cloudbroker/group/get.go | 42 +++ pkg/cloudbroker/group/group.go | 15 + pkg/cloudbroker/group/list.go | 57 ++++ pkg/cloudbroker/group/models.go | 42 +++ pkg/cloudbroker/user.go | 7 + pkg/cloudbroker/user/api_list.go | 43 +++ pkg/cloudbroker/user/apiaccess_join.go | 44 +++ pkg/cloudbroker/user/apiaccess_leave.go | 44 +++ pkg/cloudbroker/user/apiaccess_list.go | 44 +++ pkg/cloudbroker/user/create.go | 56 ++++ pkg/cloudbroker/user/delete.go | 40 +++ pkg/cloudbroker/user/delete_by_guid.go | 42 +++ pkg/cloudbroker/user/delete_users.go | 39 +++ pkg/cloudbroker/user/get.go | 42 +++ pkg/cloudbroker/user/get_audit.go | 50 ++++ .../user/get_matching_usernames.go | 47 +++ pkg/cloudbroker/user/list.go | 58 ++++ pkg/cloudbroker/user/models.go | 276 ++++++++++++++++++ pkg/cloudbroker/user/user.go | 15 + 50 files changed, 2143 insertions(+), 76 deletions(-) create mode 100644 pkg/cloudbroker/apiaccess.go create mode 100644 pkg/cloudbroker/apiaccess/api_find.go create mode 100644 pkg/cloudbroker/apiaccess/apiaccess.go create mode 100644 pkg/cloudbroker/apiaccess/apis_exclude.go create mode 100644 pkg/cloudbroker/apiaccess/apis_include.go create mode 100644 pkg/cloudbroker/apiaccess/copy.go create mode 100644 pkg/cloudbroker/apiaccess/create.go create mode 100644 pkg/cloudbroker/apiaccess/delete.go create mode 100644 pkg/cloudbroker/apiaccess/desc_update.go create mode 100644 pkg/cloudbroker/apiaccess/get.go create mode 100644 pkg/cloudbroker/apiaccess/get_full.go create mode 100644 pkg/cloudbroker/apiaccess/get_pre_groups.go create mode 100644 pkg/cloudbroker/apiaccess/list.go create mode 100644 pkg/cloudbroker/apiaccess/list_deleted.go create mode 100644 pkg/cloudbroker/apiaccess/models.go create mode 100644 pkg/cloudbroker/apiaccess/set_default.go create mode 100644 pkg/cloudbroker/apiaccess/subtract.go create mode 100644 pkg/cloudbroker/apiaccess/union.go create mode 100644 pkg/cloudbroker/apiaccess/update.go create mode 100644 pkg/cloudbroker/apiaccess/user_list.go create mode 100644 pkg/cloudbroker/group.go create mode 100644 pkg/cloudbroker/group/get.go create mode 100644 pkg/cloudbroker/group/group.go create mode 100644 pkg/cloudbroker/group/list.go create mode 100644 pkg/cloudbroker/group/models.go create mode 100644 pkg/cloudbroker/user.go create mode 100644 pkg/cloudbroker/user/api_list.go create mode 100644 pkg/cloudbroker/user/apiaccess_join.go create mode 100644 pkg/cloudbroker/user/apiaccess_leave.go create mode 100644 pkg/cloudbroker/user/apiaccess_list.go create mode 100644 pkg/cloudbroker/user/create.go create mode 100644 pkg/cloudbroker/user/delete.go create mode 100644 pkg/cloudbroker/user/delete_by_guid.go create mode 100644 pkg/cloudbroker/user/delete_users.go create mode 100644 pkg/cloudbroker/user/get.go create mode 100644 pkg/cloudbroker/user/get_audit.go create mode 100644 pkg/cloudbroker/user/get_matching_usernames.go create mode 100644 pkg/cloudbroker/user/list.go create mode 100644 pkg/cloudbroker/user/models.go create mode 100644 pkg/cloudbroker/user/user.go diff --git a/CHANGELOG.md b/CHANGELOG.md index e88cfe1..82ef107 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,12 @@ -## Version 1.4.5 +## Version 1.4.6 ### Bugfix -- Removed omitempty tag from field WithLB in cloudapi/k8s/create request +- Fixed returning value type of VINS.NATRuleAdd() +- Fixed RuleID field type of VINS.NATRuleDel() request struct +- Added wrapper for requests to async methods +- - CloudAPI()/CloudBroker().Compute().CreateTemplate() + +### Feature +- Added cloubroker/apiaccess group of endpoints support +- Added cloubroker/group group of endpoints support +- Added cloubroker/user group of endpoints support \ No newline at end of file diff --git a/pkg/cloudapi/compute/create_template.go b/pkg/cloudapi/compute/create_template.go index 428f630..1e5cc0d 100644 --- a/pkg/cloudapi/compute/create_template.go +++ b/pkg/cloudapi/compute/create_template.go @@ -18,12 +18,12 @@ type CreateTemplateRequest struct { // Name to assign to the template being created // Required: true Name string `url:"name" json:"name" validate:"required"` +} - // Async API call - // For async call use CreateTemplateAsync - // For sync call use CreateTemplate - // Required: true - async bool `url:"async"` +type wrapperCreateTemplateRequest struct { + CreateTemplateRequest + + Async bool `url:"async"` } // CreateTemplate create template from compute instance @@ -35,11 +35,14 @@ func (c Compute) CreateTemplate(ctx context.Context, req CreateTemplateRequest) } } - req.async = false + reqWrapped := wrapperCreateTemplateRequest{ + CreateTemplateRequest: req, + Async: false, + } url := "/cloudapi/compute/createTemplate" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return 0, err } @@ -61,11 +64,14 @@ func (c Compute) CreateTemplateAsync(ctx context.Context, req CreateTemplateRequ } } - req.async = true + reqWrapped := wrapperCreateTemplateRequest{ + CreateTemplateRequest: req, + Async: true, + } url := "/cloudapi/compute/createTemplate" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return "", err } diff --git a/pkg/cloudapi/vins/nat_rule_add.go b/pkg/cloudapi/vins/nat_rule_add.go index f0ce080..c04076b 100644 --- a/pkg/cloudapi/vins/nat_rule_add.go +++ b/pkg/cloudapi/vins/nat_rule_add.go @@ -39,11 +39,11 @@ type NATRuleAddRequest struct { } // NATRuleAdd create NAT (port forwarding) rule on VINS -func (v VINS) NATRuleAdd(ctx context.Context, req NATRuleAddRequest) (bool, error) { +func (v VINS) NATRuleAdd(ctx context.Context, req NATRuleAddRequest) (uint64, error) { err := validators.ValidateRequest(req) if err != nil { for _, validationError := range validators.GetErrors(err) { - return false, validators.ValidationError(validationError) + return 0, validators.ValidationError(validationError) } } @@ -51,12 +51,12 @@ func (v VINS) NATRuleAdd(ctx context.Context, req NATRuleAddRequest) (bool, erro res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return 0, err } - result, err := strconv.ParseBool(string(res)) + result, err := strconv.ParseUint(string(res), 10, 64) if err != nil { - return false, err + return 0, err } return result, nil diff --git a/pkg/cloudapi/vins/nat_rule_del.go b/pkg/cloudapi/vins/nat_rule_del.go index a85535d..787add8 100644 --- a/pkg/cloudapi/vins/nat_rule_del.go +++ b/pkg/cloudapi/vins/nat_rule_del.go @@ -17,7 +17,7 @@ type NATRuleDelRequest struct { // ID of the rule to delete. // Pass -1 to clear all rules at once // Required: true - RuleID uint64 `url:"ruleId" json:"ruleId" validate:"required"` + RuleID int64 `url:"ruleId" json:"ruleId" validate:"required"` } // NATRuleDel delete NAT (port forwarding) rule on VINS diff --git a/pkg/cloudbroker/apiaccess.go b/pkg/cloudbroker/apiaccess.go new file mode 100644 index 0000000..1273c0f --- /dev/null +++ b/pkg/cloudbroker/apiaccess.go @@ -0,0 +1,8 @@ +package cloudbroker + +import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/apiaccess" + +// Accessing the APIAccess method group +func (cb *CloudBroker) APIAccess() *apiaccess.APIAccess { + return apiaccess.New(cb.client) +} diff --git a/pkg/cloudbroker/apiaccess/api_find.go b/pkg/cloudbroker/apiaccess/api_find.go new file mode 100644 index 0000000..c794a5c --- /dev/null +++ b/pkg/cloudbroker/apiaccess/api_find.go @@ -0,0 +1,43 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for finding apiaccess groups. +type APIFindRequest struct { + // API function to find + // Example: cloudbroker/k8s/create + // Required: true + APIName string `url:"apiName" json:"apiName" validate:"required"` +} + +// APIFind outputs a list of apiaccess groups that mention the specified API function. +func (a APIAccess) APIFind(ctx context.Context, req APIFindRequest) ([]uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/apiFind" + + list := make([]uint64, 0) + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return list, nil +} diff --git a/pkg/cloudbroker/apiaccess/apiaccess.go b/pkg/cloudbroker/apiaccess/apiaccess.go new file mode 100644 index 0000000..c87fc3d --- /dev/null +++ b/pkg/cloudbroker/apiaccess/apiaccess.go @@ -0,0 +1,15 @@ +package apiaccess + +import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" + +// Structure for creating request to APIAccess +type APIAccess struct { + client interfaces.Caller +} + +// Builder for APIAccess endpoints +func New(client interfaces.Caller) *APIAccess { + return &APIAccess{ + client: client, + } +} diff --git a/pkg/cloudbroker/apiaccess/apis_exclude.go b/pkg/cloudbroker/apiaccess/apis_exclude.go new file mode 100644 index 0000000..f973d8b --- /dev/null +++ b/pkg/cloudbroker/apiaccess/apis_exclude.go @@ -0,0 +1,69 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for removing api from access group. +type APIsExcludeRequest struct { + // APIAccess group ID + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` + + // APIs to remove from APIAccess group + // Required: true + APIs APIsEndpoints `url:"-" json:"-" validate:"required"` +} + +type wrapperAPIsExcludeRequest struct { + APIsExcludeRequest + + APIString string `url:"apis"` +} + +// APIsExclude removes the listed API functions from the specified apiaccess group. +func (a APIAccess) APIsExclude(ctx context.Context, req APIsExcludeRequest) (*APIsEndpoints, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/apisExclude" + + info := APIsEndpoints{} + + apiJSON, err := json.Marshal(&req.APIs) + if err != nil { + return nil, err + } + + apiJSONPretty, err := json.MarshalIndent(&req.APIs, "", " ") + if err != nil { + return nil, err + } + fmt.Println(string(apiJSONPretty)) + + reqWrapped := wrapperAPIsExcludeRequest{ + APIsExcludeRequest: req, + APIString: string(apiJSON), + } + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/apis_include.go b/pkg/cloudbroker/apiaccess/apis_include.go new file mode 100644 index 0000000..94cad32 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/apis_include.go @@ -0,0 +1,62 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for adding api to access group. +type APIsIncludeRequest struct { + // APIAccess group ID. + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` + + // APIs to add to APIAccess group. + // Required: true + APIs APIsEndpoints `url:"-" json:"-" validate:"required"` +} + +type wrapperAPIsIncludeRequest struct { + APIsIncludeRequest + + APIString string `url:"apis"` +} + +// APIsInclude adds the listed API functions to the specified apiaccess group. +func (a APIAccess) APIsInclude(ctx context.Context, req APIsIncludeRequest) (*APIsEndpoints, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/apisInclude" + + info := APIsEndpoints{} + + apiJSON, err := json.Marshal(&req.APIs) + if err != nil { + return nil, err + } + + reqWrapped := wrapperAPIsIncludeRequest{ + APIsIncludeRequest: req, + APIString: string(apiJSON), + } + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/copy.go b/pkg/cloudbroker/apiaccess/copy.go new file mode 100644 index 0000000..dfd44d2 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/copy.go @@ -0,0 +1,44 @@ +package apiaccess + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for copying apiaccess group. +type CopyRequest struct { + // ID of the API access group to make copy from + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` + + // Name of the target API access group, which will be created on successful copy + // Required: true + Name string `url:"name" json:"name" validate:"required"` +} + +// Copy creates a copy of the specified apiaccess group with a new name (and a new unique ID). +func (a APIAccess) Copy(ctx context.Context, req CopyRequest) (uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return 0, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/copy" + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return 0, err + } + + result, err := strconv.ParseUint(string(res), 10, 64) + if err != nil { + return 0, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/apiaccess/create.go b/pkg/cloudbroker/apiaccess/create.go new file mode 100644 index 0000000..e8f9c2a --- /dev/null +++ b/pkg/cloudbroker/apiaccess/create.go @@ -0,0 +1,44 @@ +package apiaccess + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for creating apiaccess group. +type CreateRequest struct { + // Name of this apiaccess group. + // Required: true + Name string `url:"name" json:"name" validate:"required"` + + // Description of this apiaccess group. + // Required: false + Description string `url:"desc,omitempty" json:"desc,omitempty"` +} + +// Create creates apiaccess group. +func (a APIAccess) Create(ctx context.Context, req CreateRequest) (uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return 0, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/create" + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return 0, err + } + + result, err := strconv.ParseUint(string(res), 10, 64) + if err != nil { + return 0, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/apiaccess/delete.go b/pkg/cloudbroker/apiaccess/delete.go new file mode 100644 index 0000000..cbdcc8b --- /dev/null +++ b/pkg/cloudbroker/apiaccess/delete.go @@ -0,0 +1,44 @@ +package apiaccess + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for deleting apiaccess group. +type DeleteRequest struct { + // APIAccess group ID. + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` + + // Set True to delete apiaccess group with attached users. + // Required: false + Force bool `url:"force,omitempty" json:"force,omitempty"` +} + +// Delete deletes apiaccess group +func (a APIAccess) Delete(ctx context.Context, req DeleteRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/delete" + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/apiaccess/desc_update.go b/pkg/cloudbroker/apiaccess/desc_update.go new file mode 100644 index 0000000..c2ce70f --- /dev/null +++ b/pkg/cloudbroker/apiaccess/desc_update.go @@ -0,0 +1,44 @@ +package apiaccess + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for updating apiaccess group description. +type DescUpdateRequest struct { + // APIAccess group ID. + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` + + // New description to set for the apiaccess group. + // Required: true + Description string `url:"desc" json:"desc" validate:"required"` +} + +// DescUpdate sets a new text description of the apiaccess group. +func (a APIAccess) DescUpdate(ctx context.Context, req DescUpdateRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/descUpdate" + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/apiaccess/get.go b/pkg/cloudbroker/apiaccess/get.go new file mode 100644 index 0000000..eed0a1a --- /dev/null +++ b/pkg/cloudbroker/apiaccess/get.go @@ -0,0 +1,42 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting apiaccess group. +type GetRequest struct { + // APIAccess group ID. + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` +} + +// Get gets apiaccess group. +func (a APIAccess) Get(ctx context.Context, req GetRequest) (*ItemAPIAccess, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/get" + + info := ItemAPIAccess{} + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/get_full.go b/pkg/cloudbroker/apiaccess/get_full.go new file mode 100644 index 0000000..db79d69 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/get_full.go @@ -0,0 +1,26 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" +) + +// GetFull gets full current endpoints dictionary +func (a APIAccess) GetFull(ctx context.Context) (*APIsEndpoints, error) { + url := "/cloudbroker/apiaccess/getFull" + + info := APIsEndpoints{} + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, nil) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/get_pre_groups.go b/pkg/cloudbroker/apiaccess/get_pre_groups.go new file mode 100644 index 0000000..0315f4d --- /dev/null +++ b/pkg/cloudbroker/apiaccess/get_pre_groups.go @@ -0,0 +1,26 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" +) + +// GetPreGroups gets list of pre default groups from spec +func (a APIAccess) GetPreGroups(ctx context.Context) (map[string]APIsEndpoints, error) { + url := "/cloudbroker/apiaccess/getPreGroups" + + info := make(map[string]APIsEndpoints) + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, nil) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return info, nil +} diff --git a/pkg/cloudbroker/apiaccess/list.go b/pkg/cloudbroker/apiaccess/list.go new file mode 100644 index 0000000..1795fbb --- /dev/null +++ b/pkg/cloudbroker/apiaccess/list.go @@ -0,0 +1,70 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting list of all non deleted apiaccess instances. +type ListRequest struct { + // Find by ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by name apiaccess + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Find by status apiaccess + // Required: false + Status string `url:"status,omitempty" json:"status,omitempty"` + + // Find by created actor + // Required: false + CreatedBy string `url:"createdBy,omitempty" json:"createdBy,omitempty"` + + // Find by created after time (unix timestamp) + // Required: false + CreatedAfter uint64 `url:"createdAfter,omitempty" json:"createdAfter,omitempty"` + + // Find by created before time (unix timestamp) + // Required: false + CreatedBefore uint64 `url:"createdBefore,omitempty" json:"createdBefore,omitempty"` + + // Page number + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size, maximum - 100 + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` +} + +// List gets list of all non deleted apiaccess instances. +func (a APIAccess) List(ctx context.Context, req ListRequest) (*ListAPIAccess, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/list" + + info := ListAPIAccess{} + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/list_deleted.go b/pkg/cloudbroker/apiaccess/list_deleted.go new file mode 100644 index 0000000..607e6f2 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/list_deleted.go @@ -0,0 +1,46 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting list of all deleted apiaccess instances. +type ListDeletedRequest struct { + // Page number. + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size. + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` +} + +// ListDeleted gets list of all deleted apiaccess instances. +func (a APIAccess) ListDeleted(ctx context.Context, req ListDeletedRequest) (*ListAPIAccess, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/listDeleted" + + info := ListAPIAccess{} + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/models.go b/pkg/cloudbroker/apiaccess/models.go new file mode 100644 index 0000000..c5f5905 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/models.go @@ -0,0 +1,182 @@ +package apiaccess + +type ItemAPIAccess struct { + // APIs + APIs APIsEndpoints `json:"apis"` + + // Created by + CreatedBy string `json:"createdBy"` + + // Created time + CreatedTime uint64 `json:"createdTime"` + + // Is default + Default bool `json:"default"` + + // Deleted by + DeletedBy string `json:"deletedBy"` + + // Deleted time + DeletedTime uint64 `json:"deletedTime"` + + // Description + Description string `json:"decs"` + + // GID + GID uint64 `json:"gid"` + + // GUID + GUID uint64 `json:"guid"` + + // ID + ID uint64 `json:"id"` + + // Milestones + Milestones uint64 `json:"milestones"` + + // Name + Name string `json:"name"` + + // Is protected + Protected bool `json:"protected"` + + // Status + Status string `json:"status"` + + //Updated by + UpdatedBy string `json:"updatedBy"` + + // Updated time + UpdatedTime uint64 `json:"updatedTime"` +} + +type ListAPIAccess struct { + Data []ItemAPIAccess `json:"data"` + + EntryCount uint64 `json:"entryCount"` +} + +type APIsEndpoints struct { + // CloudAPI endpoints + CloudAPI CloudAPIEndpoints `json:"cloudapi,omitempty"` + + // CloudBroker endpoints + CloudBroker CloudBrokerEndpoints `json:"cloudbroker,omitempty"` + + // LibCloud endpoints + LibCloud LibCloudEndpoints `json:"libcloud,omitempty"` + + // System endpoints + System SystemEndpoints `json:"system,omitempty"` +} + +type CloudAPIEndpoints struct { + Account []string `json:"account,omitempty"` + BService []string `json:"bservice,omitempty"` + CloudSpace []string `json:"cloudspace,omitempty"` + Compute []string `json:"compute,omitempty"` + ComputeCI []string `json:"computeci,omitempty"` + Disks []string `json:"disks,omitempty"` + ExtNet []string `json:"extnet,omitempty"` + FLIPGroup []string `json:"flipgroup,omitempty"` + GPU []string `json:"gpu,omitempty"` + Image []string `json:"image,omitempty"` + K8CI []string `json:"k8ci,omitempty"` + K8S []string `json:"k8s,omitempty"` + KVMPPC []string `json:"kvmppc,omitempty"` + KVMX86 []string `json:"kvmx86,omitempty"` + LB []string `json:"lb,omitempty"` + Loactions []string `json:"locations,omitempty"` + Machine []string `json:"machine,omitempty"` + Openshift []string `json:"openshift,omitempty"` + OpenshiftCI []string `json:"openshiftci,omitempty"` + PCIDevice []string `json:"pcidevice,omitempty"` + PortForwarding []string `json:"portforwarding,omitempty"` + Prometheus []string `json:"prometheus,omitempty"` + RG []string `json:"rg,omitempty"` + Sizes []string `json:"sizes,omitempty"` + Tasks []string `json:"tasks,omitempty"` + User []string `json:"user,omitempty"` + VGPU []string `json:"vgpu,omitempty"` + VINS []string `json:"vins,omitempty"` + All bool `json:"ALL,omitempty"` +} + +type CloudBrokerEndpoints struct { + Account []string `json:"account,omitempty"` + APIAccess []string `json:"apiaccess,omitempty"` + Audit []string `json:"audit,omitempty"` + AuditBeat []string `json:"auditbeat,omitempty"` + AuditCollector []string `json:"auditcollector,omitempty"` + BackupCreator []string `json:"backupcreator,omitempty"` + BService []string `json:"bservice,omitempty"` + CloudSpace []string `json:"cloudspace,omitempty"` + Compute []string `json:"compute,omitempty"` + ComputeCI []string `json:"computeci,omitempty"` + Desnode []string `json:"desnode,omitempty"` + Diagnostics []string `json:"diagnostics,omitempty"` + Disks []string `json:"disks,omitempty"` + Eco []string `json:"eco,omitempty"` + ExtNet []string `json:"extnet,omitempty"` + FlIPgroup []string `json:"flipgroup,omitempty"` + Grid []string `json:"grid,omitempty"` + Group []string `json:"group,omitempty"` + Health []string `json:"health,omitempty"` + IaaS []string `json:"iaas,omitempty"` + Image []string `json:"image,omitempty"` + Job []string `json:"job,omitempty"` + K8CI []string `json:"k8ci,omitempty"` + K8S []string `json:"k8s,omitempty"` + KVMPPC []string `json:"kvmppc,omitempty"` + KVMX86 []string `json:"kvmx86,omitempty"` + LB []string `json:"lb,omitempty"` + Machine []string `json:"machine,omitempty"` + Metering []string `json:"metering,omitempty"` + Milestones []string `json:"milestones,omitempty"` + Node []string `json:"node,omitempty"` + Openshift []string `json:"openshift,omitempty"` + OpenshiftCI []string `json:"openshiftci,omitempty"` + Ovsnode []string `json:"ovsnode,omitempty"` + PCIDevice []string `json:"pcidevice,omitempty"` + PGPU []string `json:"pgpu,omitempty"` + Prometheus []string `json:"prometheus,omitempty"` + QOS []string `json:"qos,omitempty"` + Resmon []string `json:"resmon,omitempty"` + RG []string `json:"rg,omitempty"` + Sep []string `json:"sep,omitempty"` + Stack []string `json:"stack,omitempty"` + Tasks []string `json:"tasks,omitempty"` + TLock []string `json:"tlock,omitempty"` + User []string `json:"user,omitempty"` + VGPU []string `json:"vgpu,omitempty"` + VINS []string `json:"vins,omitempty"` + VNFDev []string `json:"vnfdev,omitempty"` + ZeroAccess []string `json:"zeroaccess,omitempty"` + All bool `json:"ALL,omitempty"` +} + +type LibCloudEndpoints struct { + Libvirt []string `json:"libvirt,omitempty"` + All bool `json:"ALL,omitempty"` +} + +type SystemEndpoints struct { + AgentController []string `json:"agentcontroller,omitempty"` + Alerts []string `json:"alerts,omitempty"` + Audits []string `json:"audits,omitempty"` + ContentManager []string `json:"contentmanager,omitempty"` + DocGenerator []string `json:"docgenerator,omitempty"` + EmailSender []string `json:"emailsender,omitempty"` + ErrorConditionHandler []string `json:"errorconditionhandler,omitempty"` + GridManager []string `json:"gridmanager,omitempty"` + Health []string `json:"health,omitempty"` + Info []string `json:"info,omitempty"` + InfoMGR []string `json:"infomgr,omitempty"` + Job []string `json:"job,omitempty"` + Log []string `json:"log,omitempty"` + Logo []string `json:"logo,omitempty"` + Oauth []string `json:"oauth,omitempty"` + Task []string `json:"task,omitempty"` + UserManager []string `json:"usermanager,omitempty"` + All bool `json:"ALL,omitempty"` +} diff --git a/pkg/cloudbroker/apiaccess/set_default.go b/pkg/cloudbroker/apiaccess/set_default.go new file mode 100644 index 0000000..ca3ee22 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/set_default.go @@ -0,0 +1,40 @@ +package apiaccess + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Reqeust struct for setting default apiaccess group. +type SetDefaultRequest struct { + // APIAccess group ID + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` +} + +// SetDefault sets current apiaccess group default. +func (a APIAccess) SetDefault(ctx context.Context, req SetDefaultRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/setDefault" + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/apiaccess/subtract.go b/pkg/cloudbroker/apiaccess/subtract.go new file mode 100644 index 0000000..4820b1e --- /dev/null +++ b/pkg/cloudbroker/apiaccess/subtract.go @@ -0,0 +1,45 @@ +package apiaccess + +import ( + "encoding/json" + "net/http" + + "context" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for subtracting. +type SubtractRequest struct { + // ID of the API access group to subtract from. This group will contain the difference. + MinuendID uint64 `url:"minuendId" json:"minuendId" validate:"required"` + + // ID of the API access group which is subtracted. This group is unchanged. + SubtrahendID uint64 `url:"subtrahendId" json:"subtrahendId" validate:"required"` +} + +// Subtract removes such APIs from MinuendID that match APIs from SubtrahendID. +func (a APIAccess) Subtruct(ctx context.Context, req SubtractRequest) (*APIsEndpoints, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/subtract" + + info := APIsEndpoints{} + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/union.go b/pkg/cloudbroker/apiaccess/union.go new file mode 100644 index 0000000..fb55c88 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/union.go @@ -0,0 +1,47 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for union. +type UnionRequest struct { + // Recipient apiaccess group ID + // Required: true + RecipientID uint64 `url:"recipientId" json:"recipientId" validate:"required"` + + // Donor apiaccess group ID + // Required: true + DonorID uint64 `url:"donorId" json:"donorId" validate:"required"` +} + +// Combines the API list of group #1 ("recipient") and group #2 ("donor"), +// writing the result to group #1 and avoiding duplicates in the list +func (a APIAccess) Union(ctx context.Context, req UnionRequest) (*APIsEndpoints, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/union" + + info := APIsEndpoints{} + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/apiaccess/update.go b/pkg/cloudbroker/apiaccess/update.go new file mode 100644 index 0000000..d4397f0 --- /dev/null +++ b/pkg/cloudbroker/apiaccess/update.go @@ -0,0 +1,62 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for updating apis of apiaccess group. +type UpdateRequest struct { + // APIAccess group ID + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` + + // APIs to remove from APIAccess group + // Required: false + APIs APIsEndpoints `url:"-" json:"-"` +} + +type wrapperUpdateRequest struct { + UpdateRequest + + APIString string `url:"apis"` +} + +// Update updates apis of apiaccess group. +func (a APIAccess) Update(ctx context.Context, req UpdateRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/update" + + reqWrapped := wrapperUpdateRequest{ + UpdateRequest: req, + } + + apiJSON, err := json.Marshal(&req.APIs) + if err != nil { + return false, err + } + + reqWrapped.APIString = string(apiJSON) + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/apiaccess/user_list.go b/pkg/cloudbroker/apiaccess/user_list.go new file mode 100644 index 0000000..8cac94b --- /dev/null +++ b/pkg/cloudbroker/apiaccess/user_list.go @@ -0,0 +1,42 @@ +package apiaccess + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting a list of users currently included in the specified group. +type UserListRequest struct { + // APIAccess group ID + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` +} + +// UserList gets a list of users currently included in the specified group. +func (a APIAccess) UserList(ctx context.Context, req UserListRequest) ([]string, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/apiaccess/userList" + + list := make([]string, 0) + + res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return list, nil +} diff --git a/pkg/cloudbroker/backup/create_disk_backup.go b/pkg/cloudbroker/backup/create_disk_backup.go index 9e50514..e483848 100644 --- a/pkg/cloudbroker/backup/create_disk_backup.go +++ b/pkg/cloudbroker/backup/create_disk_backup.go @@ -4,8 +4,9 @@ import ( "context" "encoding/json" "net/http" - "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "strings" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) // Request struct for creating disk backup @@ -21,12 +22,12 @@ type CreateDiskBackupRequest struct { // Backup path // Required: true BackupPath string `url:"backupPath" json:"backupPath" validate:"required"` +} - // Async API Call - // For async call use CreateDiskBackupAsync - // For sync call use CreateDiskBackup - // Required: true - async bool `url:"async"` +type wrapperCreateDiskBackupRequest struct { + CreateDiskBackupRequest + + Async bool `url:"async"` } // CreateDiskBackup creates disk backup @@ -38,11 +39,14 @@ func (b Backup) CreateDiskBackup(ctx context.Context, req CreateDiskBackupReques } } - req.async = false + reqWrapped := wrapperCreateDiskBackupRequest{ + CreateDiskBackupRequest: req, + Async: false, + } url := "/cloudbroker/backup/createDiskBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return nil, err } @@ -66,11 +70,14 @@ func (b Backup) CreateDiskBackupAsync(ctx context.Context, req CreateDiskBackupR } } - req.async = true + reqWrapped := wrapperCreateDiskBackupRequest{ + CreateDiskBackupRequest: req, + Async: true, + } url := "/cloudbroker/backup/createDiskBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return "", err } diff --git a/pkg/cloudbroker/backup/create_disks_backup.go b/pkg/cloudbroker/backup/create_disks_backup.go index c0ddd67..801ae90 100644 --- a/pkg/cloudbroker/backup/create_disks_backup.go +++ b/pkg/cloudbroker/backup/create_disks_backup.go @@ -4,8 +4,9 @@ import ( "context" "encoding/json" "net/http" - "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "strings" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) type Disk struct { @@ -23,12 +24,12 @@ type CreateDisksBackupRequest struct { // Disks Disks []Disk `url:"disks" json:"disks" validate:"required,dive"` +} - // Async API Call - // For async call use CreateDisksBackupAsync - // For sync call use CreateDisksBackup - // Required: true - async bool `url:"async"` +type wrapperCreateDisksBackupRequest struct { + CreateDisksBackupRequest + + Async bool `url:"async"` } // CreateDisksBackup creates disks backup @@ -40,11 +41,14 @@ func (b Backup) CreateDisksBackup(ctx context.Context, req CreateDisksBackupRequ } } - req.async = false + reqWrapped := wrapperCreateDisksBackupRequest{ + CreateDisksBackupRequest: req, + Async: false, + } url := "/cloudbroker/backup/createDisksBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return nil, err } @@ -68,11 +72,14 @@ func (b Backup) CreateDisksBackupAsync(ctx context.Context, req CreateDisksBacku } } - req.async = true + reqWrapped := wrapperCreateDisksBackupRequest{ + CreateDisksBackupRequest: req, + Async: true, + } url := "/cloudbroker/backup/createDisksBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return "", err } diff --git a/pkg/cloudbroker/backup/delete_disk_backup.go b/pkg/cloudbroker/backup/delete_disk_backup.go index 8d1873b..366004d 100644 --- a/pkg/cloudbroker/backup/delete_disk_backup.go +++ b/pkg/cloudbroker/backup/delete_disk_backup.go @@ -3,9 +3,10 @@ package backup import ( "context" "net/http" - "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "strconv" "strings" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) // Request struct for deleting disk backup @@ -15,12 +16,12 @@ type DeleteDiskBackupRequest struct { // Backup file BackupFile string `url:"backupFile" json:"backupFile" validate:"required"` +} - // Async API Call - // For async call use DeleteDiskBackupAsync - // For sync call use DeleteDiskBackup - // Required: true - async bool `url:"async"` +type wrapperDeleteDiskBackupRequest struct { + DeleteDiskBackupRequest + + Async bool `url:"async"` } // DeleteDiskBackup deletes disk backup @@ -32,11 +33,14 @@ func (b Backup) DeleteDiskBackup(ctx context.Context, req DeleteDiskBackupReques } } - req.async = false + reqWrapped := wrapperDeleteDiskBackupRequest{ + DeleteDiskBackupRequest: req, + Async: false, + } url := "/cloudbroker/backup/deleteDiskBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return false, err } @@ -58,11 +62,14 @@ func (b Backup) DeleteDiskBackupAsync(ctx context.Context, req DeleteDiskBackupR } } - req.async = true + reqWrapped := wrapperDeleteDiskBackupRequest{ + DeleteDiskBackupRequest: req, + Async: true, + } url := "/cloudbroker/backup/deleteDiskBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return "", err } diff --git a/pkg/cloudbroker/backup/restore_disk_from_backup.go b/pkg/cloudbroker/backup/restore_disk_from_backup.go index c7a4aaa..25e6854 100644 --- a/pkg/cloudbroker/backup/restore_disk_from_backup.go +++ b/pkg/cloudbroker/backup/restore_disk_from_backup.go @@ -4,8 +4,9 @@ import ( "context" "encoding/json" "net/http" - "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "strings" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) // Request struct for restoring disk from backup @@ -21,12 +22,12 @@ type RestoreDiskFromBackupRequest struct { // Backup file BackupFile string `url:"backupFile" json:"backupFile" validate:"required"` +} - // Async API Call - // For async call use RestoreDiskFromBackupAsync - // For sync call use RestoreDiskFromBackup - // Required: true - async bool `url:"async"` +type wrapperRestoreDiskFromBackupRequest struct { + RestoreDiskFromBackupRequest + + Async bool `url:"async"` } // RestoreDiskFromBackup restores disk from backup @@ -38,11 +39,14 @@ func (b Backup) RestoreDiskFromBackup(ctx context.Context, req RestoreDiskFromBa } } - req.async = false + reqWrapped := wrapperRestoreDiskFromBackupRequest{ + RestoreDiskFromBackupRequest: req, + Async: false, + } url := "/cloudbroker/backup/restoreDiskFromBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return nil, err } @@ -66,11 +70,14 @@ func (b Backup) RestoreDiskFromBackupAsync(ctx context.Context, req RestoreDiskF } } - req.async = true + reqWrapped := wrapperRestoreDiskFromBackupRequest{ + RestoreDiskFromBackupRequest: req, + Async: true, + } url := "/cloudbroker/backup/restoreDiskFromBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return "", err } diff --git a/pkg/cloudbroker/backup/restore_disks_from_backup.go b/pkg/cloudbroker/backup/restore_disks_from_backup.go index 665a801..3b32528 100644 --- a/pkg/cloudbroker/backup/restore_disks_from_backup.go +++ b/pkg/cloudbroker/backup/restore_disks_from_backup.go @@ -4,8 +4,9 @@ import ( "context" "encoding/json" "net/http" - "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" "strings" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) type BackupFile struct { @@ -26,12 +27,12 @@ type RestoreDisksFromBackupRequest struct { //Backup files BackupFiles []BackupFile `url:"backupFiles" json:"backupFiles" validate:"required,dive"` +} - // Async API Call - // For async call use RestoreDisksFromBackupAsync - // For sync call use RestoreDisksFromBackup - // Required: true - async bool `url:"async"` +type wrapperRestoreDisksFromBackupRequest struct { + RestoreDisksFromBackupRequest + + Async bool `url:"async"` } // RestoreDisksFromBackup restores disks from backup @@ -43,11 +44,14 @@ func (b Backup) RestoreDisksFromBackup(ctx context.Context, req RestoreDisksFrom } } - req.async = false + reqWrapped := wrapperRestoreDisksFromBackupRequest{ + RestoreDisksFromBackupRequest: req, + Async: false, + } url := "/cloudbroker/backup/restoreDisksFromBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return nil, err } @@ -71,11 +75,14 @@ func (b Backup) RestoreDisksFromBackupAsync(ctx context.Context, req RestoreDisk } } - req.async = true + reqWrapped := wrapperRestoreDisksFromBackupRequest{ + RestoreDisksFromBackupRequest: req, + Async: true, + } url := "/cloudbroker/backup/restoreDisksFromBackup" - res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := b.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return "", err } diff --git a/pkg/cloudbroker/compute/create_template.go b/pkg/cloudbroker/compute/create_template.go index b6e708e..f292e68 100644 --- a/pkg/cloudbroker/compute/create_template.go +++ b/pkg/cloudbroker/compute/create_template.go @@ -22,12 +22,12 @@ type CreateTemplateRequest struct { // Reason for action // Required: false Reason string `url:"reason,omitempty" json:"reason,omitempty"` +} - // Async API call - // For async call use CreateTemplateAsync - // For sync call use CreateTemplate - // Required: true - async bool `url:"async"` +type wrapperCreateTemplateRequest struct { + CreateTemplateRequest + + Async bool `url:"async"` } // CreateTemplateAsync create template from compute instance @@ -39,11 +39,14 @@ func (c Compute) CreateTemplateAsync(ctx context.Context, req CreateTemplateRequ } } - req.async = true + reqWrapped := wrapperCreateTemplateRequest{ + CreateTemplateRequest: req, + Async: true, + } url := "/cloudbroker/compute/createTemplate" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return "", err } @@ -62,11 +65,14 @@ func (c Compute) CreateTemplate(ctx context.Context, req CreateTemplateRequest) } } - req.async = false + reqWrapped := wrapperCreateTemplateRequest{ + CreateTemplateRequest: req, + Async: false, + } url := "/cloudbroker/compute/createTemplate" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { return 0, err } diff --git a/pkg/cloudbroker/group.go b/pkg/cloudbroker/group.go new file mode 100644 index 0000000..312f55b --- /dev/null +++ b/pkg/cloudbroker/group.go @@ -0,0 +1,8 @@ +package cloudbroker + +import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/group" + +// Accessing the Group method group +func (cb *CloudBroker) Group() *group.Group { + return group.New(cb.client) +} diff --git a/pkg/cloudbroker/group/get.go b/pkg/cloudbroker/group/get.go new file mode 100644 index 0000000..ff44bcc --- /dev/null +++ b/pkg/cloudbroker/group/get.go @@ -0,0 +1,42 @@ +package group + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Reuqest struct for getting details of the specified group. +type GetRequest struct { + // Group ID + // Required: true + GroupID string `url:"groupId" json:"groupId" validate:"required"` +} + +// Get gets details of the specified group. +func (g Group) Get(ctx context.Context, req GetRequest) (*ItemGroup, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/group/get" + + res, err := g.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + info := ItemGroup{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/group/group.go b/pkg/cloudbroker/group/group.go new file mode 100644 index 0000000..7e3818e --- /dev/null +++ b/pkg/cloudbroker/group/group.go @@ -0,0 +1,15 @@ +package group + +import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" + +// Structure for creating request to group +type Group struct { + client interfaces.Caller +} + +// Builder for group endpoints +func New(client interfaces.Caller) *Group { + return &Group{ + client: client, + } +} diff --git a/pkg/cloudbroker/group/list.go b/pkg/cloudbroker/group/list.go new file mode 100644 index 0000000..03df64f --- /dev/null +++ b/pkg/cloudbroker/group/list.go @@ -0,0 +1,57 @@ +package group + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting list of group instances. +type ListRequest struct { + // Find by id. + // Requires: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by list users. + // Required: false + User string `url:"user,omitempty" json:"user,omitempty"` + + // Page number. + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size, maximum - 100. + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` + + // Find by active True or False. + // Required: true + Active bool `url:"active" json:"active" validate:"required"` +} + +func (g Group) List(ctx context.Context, req ListRequest) (*ListGroups, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/group/list" + + res, err := g.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + info := ListGroups{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/group/models.go b/pkg/cloudbroker/group/models.go new file mode 100644 index 0000000..5096eed --- /dev/null +++ b/pkg/cloudbroker/group/models.go @@ -0,0 +1,42 @@ +package group + +type ItemGroup struct { + // CKey + CKey string `json:"_ckey"` + + // Meta + Meta []interface{} `json:"meta"` + + // Is active + Actice bool `json:"active"` + + // Description + Description string `json:"description"` + + // Domain + Domain string `json:"domain"` + + // GID + GID uint64 `json:"gid"` + + // GUID + GUID string `json:"guid"` + + // ID + ID string + + // Last check + LastCheck uint64 `json:"lastcheck"` + + // Roles + Roles []interface{} `json:"roles"` + + // Users + Users []string `json:"users"` +} + +type ListGroups struct { + Data []ItemGroup `json:"data"` + + EntryCount uint64 `json:"entryCount"` +} diff --git a/pkg/cloudbroker/user.go b/pkg/cloudbroker/user.go new file mode 100644 index 0000000..3451386 --- /dev/null +++ b/pkg/cloudbroker/user.go @@ -0,0 +1,7 @@ +package cloudbroker + +import "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/user" + +func (cb *CloudBroker) User() *user.User { + return user.New(cb.client) +} diff --git a/pkg/cloudbroker/user/api_list.go b/pkg/cloudbroker/user/api_list.go new file mode 100644 index 0000000..dc2b303 --- /dev/null +++ b/pkg/cloudbroker/user/api_list.go @@ -0,0 +1,43 @@ +package user + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting API list. +type APIListRequest struct { + // ID of the user. + // Required: true + UserID string `url:"userId" json:"userId" validate:"required"` +} + +// APIList gets a list of all API functions that a given user has +// access to according to their apiaccess group membership. +func (u User) APIList(ctx context.Context, req APIListRequest) (*APIsEndpoints, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/apiList" + + info := APIsEndpoints{} + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/cloudbroker/user/apiaccess_join.go b/pkg/cloudbroker/user/apiaccess_join.go new file mode 100644 index 0000000..3306165 --- /dev/null +++ b/pkg/cloudbroker/user/apiaccess_join.go @@ -0,0 +1,44 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for joining user into apiaccess group. +type APIAccessJoinRequest struct { + // ID of the user whose membership will be updated. + // Required: true + UserID string `url:"userId" json:"userId" validate:"required"` + + // ID of the API access group to join + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` +} + +// APIAccessJoin joins user into apiaccess group. +func (u User) APIAccessJoin(ctx context.Context, req APIAccessJoinRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/apiaccessJoin" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/user/apiaccess_leave.go b/pkg/cloudbroker/user/apiaccess_leave.go new file mode 100644 index 0000000..02e645e --- /dev/null +++ b/pkg/cloudbroker/user/apiaccess_leave.go @@ -0,0 +1,44 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for leaving user from apiaccess group. +type APIAccessLeaveRequest struct { + // ID of the user whose membership will be updated. + // Required: true + UserID string `url:"userId" json:"userId" validate:"required"` + + // ID of the API access group to leave. + // Required: true + APIAccessID uint64 `url:"apiaccessId" json:"apiaccessId" validate:"required"` +} + +// APIAccessLeave leaves user from apiaccess group. +func (u User) APIAccessLeave(ctx context.Context, req APIAccessLeaveRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/apiaccessLeave" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/user/apiaccess_list.go b/pkg/cloudbroker/user/apiaccess_list.go new file mode 100644 index 0000000..cbbeb36 --- /dev/null +++ b/pkg/cloudbroker/user/apiaccess_list.go @@ -0,0 +1,44 @@ +package user + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for showing list of dicts with information about +// apiaccess groups contains to the user. +type APIAccessListRequest struct { + // ID of the user to list API access groups for. + // Required: true + UserID string `url:"userId" json:"userId" validate:"required"` +} + +// APIAccessList shows list of dicts with information about apiaccess groups contains to the user. +func (u User) APIAccessList(ctx context.Context, req APIAccessListRequest) (ListAPIAccess, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/apiaccessList" + + list := ListAPIAccess{} + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &list) + + if err != nil { + return nil, err + } + + return list, nil +} diff --git a/pkg/cloudbroker/user/create.go b/pkg/cloudbroker/user/create.go new file mode 100644 index 0000000..7053284 --- /dev/null +++ b/pkg/cloudbroker/user/create.go @@ -0,0 +1,56 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for creating a user. +type CreateRequest struct { + // ID of user. + // Required: true + Username string `url:"username" json:"username" validate:"required"` + + // Email addresses of the user. + // Required: true + EmailAddress []string `url:"emailaddress" json:"emailaddress" validate:"required"` + + // Password of user + // Required: false + Password string `url:"password,omitempty" json:"password,omitempty"` + + // List of groups this user belongs to. + // Required: false + Groups []string `url:"groups,omitempty" json:"groups,omitempty"` + + // List of apiaccess groups this user belongs to. + // Required: false + APIAccess []uint64 `url:"apiaccess,omitempty" json:"apiaccess,omitempty"` +} + +// Create creates a user. +func (u User) Create(ctx context.Context, req CreateRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/create" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/user/delete.go b/pkg/cloudbroker/user/delete.go new file mode 100644 index 0000000..55dd898 --- /dev/null +++ b/pkg/cloudbroker/user/delete.go @@ -0,0 +1,40 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for deleting a user. +type DeleteRequest struct { + // ID of user. + // Required: true + Username string `url:"username" json:"username" validate:"required"` +} + +// Delete deletes a user. +func (u User) Delete(ctx context.Context, req DeleteRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/delete" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/user/delete_by_guid.go b/pkg/cloudbroker/user/delete_by_guid.go new file mode 100644 index 0000000..fbd9212 --- /dev/null +++ b/pkg/cloudbroker/user/delete_by_guid.go @@ -0,0 +1,42 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for deleting a user using user's GUID. +type DeleteByGUIDRequest struct { + // GUID of user. + // Required: true + GUID string `url:"userguid" json:"userguid" validate:"required"` +} + +// DeleteByGUID deletes a user using user's GUID. +// Note: This actor can also be called using username instead of guid to workaround CBGrid +// allowing userguid or username. +func (u User) DeleteByGUID(ctx context.Context, req DeleteByGUIDRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/deleteByGuid" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/user/delete_users.go b/pkg/cloudbroker/user/delete_users.go new file mode 100644 index 0000000..c6153c3 --- /dev/null +++ b/pkg/cloudbroker/user/delete_users.go @@ -0,0 +1,39 @@ +package user + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for bulk delete a list of users. +type DeleteUsersRequest struct { + // List of user ids + UserIDs string +} + +// DeleteUsers bulk delete a list of users. +func (u User) DeleteUsers(ctx context.Context, req DeleteUsersRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return false, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/deleteUsers" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return false, err + } + + result, err := strconv.ParseBool(string(res)) + if err != nil { + return false, err + } + + return result, nil +} diff --git a/pkg/cloudbroker/user/get.go b/pkg/cloudbroker/user/get.go new file mode 100644 index 0000000..18ef769 --- /dev/null +++ b/pkg/cloudbroker/user/get.go @@ -0,0 +1,42 @@ +package user + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting user details. +type GetRequest struct { + // ID of the user. + // Required: true + UserID string `url:"userId" json:"userId" validate:"required"` +} + +// Get gets user details. +func (u User) Get(ctx context.Context, req GetRequest) (*ItemUser, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/get" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + item := ItemUser{} + + err = json.Unmarshal(res, &item) + if err != nil { + return nil, err + } + + return &item, nil +} diff --git a/pkg/cloudbroker/user/get_audit.go b/pkg/cloudbroker/user/get_audit.go new file mode 100644 index 0000000..9b7d97e --- /dev/null +++ b/pkg/cloudbroker/user/get_audit.go @@ -0,0 +1,50 @@ +package user + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting user's audits. +type GetAuditRequest struct { + // Name of user (get audits for current user if set to empty). + // Required: false + Username string `url:"username,omitempty" json:"username,omitempty"` + + // Page number. + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size, maximum - 100. + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` +} + +// GetAudits gets user's audits. +func (u User) GetAudit(ctx context.Context, req GetAuditRequest) (ListAudits, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/getAudit" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + list := ListAudits{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return list, nil +} diff --git a/pkg/cloudbroker/user/get_matching_usernames.go b/pkg/cloudbroker/user/get_matching_usernames.go new file mode 100644 index 0000000..665cded --- /dev/null +++ b/pkg/cloudbroker/user/get_matching_usernames.go @@ -0,0 +1,47 @@ +package user + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting a list of the matching usernames for a given string. +type GetMatchingUsernamesRequest struct { + // Regex of the usernames to searched for. + // Required: true + UsernameRegex string `url:"usernameregex" json:"usernameregex" validate:"required"` + + // The number of usernames to return. + // Required: true + Limit uint64 `url:"limit" json:"limit" validate:"required"` +} + +// GetMatchingUsernames gets a list of the matching usernames for a given string. +func (u User) GetMatchingUsernames(ctx context.Context, req GetMatchingUsernamesRequest) (ListMatchingUsernames, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/getMatchingUsernames" + + list := ListMatchingUsernames{} + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + err = json.Unmarshal(res, &list) + + if err != nil { + return nil, err + } + + return list, nil +} diff --git a/pkg/cloudbroker/user/list.go b/pkg/cloudbroker/user/list.go new file mode 100644 index 0000000..66e4f2e --- /dev/null +++ b/pkg/cloudbroker/user/list.go @@ -0,0 +1,58 @@ +package user + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// Request struct for getting all non deleted user instances. +type ListRequest struct { + // Find by ID. + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Find by active. True or False. + // Required: false + Active bool `url:"active,omitempty" json:"active,omitempty"` + + // Find by serviceaccount. True or False. + // Required: false + ServiceAccount bool `url:"serviceaccount,omitempty" json:"serviceaccount,omitempty"` + + // Page number. + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size, maximum - 100. + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` +} + +// List gets all non deleted user instances. +func (u User) List(ctx context.Context, req ListRequest) (*ListUsers, error) { + err := validators.ValidateRequest(req) + if err != nil { + for _, validationError := range validators.GetErrors(err) { + return nil, validators.ValidationError(validationError) + } + } + + url := "/cloudbroker/user/list" + + res, err := u.client.DecortApiCall(ctx, http.MethodPost, url, req) + if err != nil { + return nil, err + } + + list := ListUsers{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return &list, nil +} diff --git a/pkg/cloudbroker/user/models.go b/pkg/cloudbroker/user/models.go new file mode 100644 index 0000000..34a0e42 --- /dev/null +++ b/pkg/cloudbroker/user/models.go @@ -0,0 +1,276 @@ +package user + +import "strconv" + +type ItemUser struct { + // CKey + CKey string `json:"_ckey"` + + // Meta + Meta []interface{} `json:"_meta"` + + // Is active + Active bool `json:"active"` + + // APIAccess + APIAccess []uint64 `json:"apiaccess"` + + // AuthKey + AuthKey string `json:"authkey"` + + // AuthKeys + AuthKeys []interface{} + + // Data + Data string `json:"data"` + + // Description + Description string `json:"description"` + + // Domain + Domain string `json:"domain"` + + // Emails + Emails []string `json:"emails"` + + // GID + GID uint64 `json:"gid"` + + // Groups + Groups []string `json:"groups"` + + // GUID + GUID string `json:"guid"` + + // ID + ID string `json:"id"` + + // LastCheck + LastCheck uint64 `json:"lastcheck"` + + // Mobile + Mobile []interface{} `json:"mobile"` + + // Password + Password string `json:"password"` + + // Protected + Protected bool `json:"protected"` + + // Roles + Roles []interface{} `json:"roles"` + + // ServiceAccount + ServiceAccount bool `json:"serviceaccount"` + + // XMPP + XMPP []interface{} `json:"xmpp"` +} + +type ListUsers struct { + Data []ItemUser `json:"data"` + + EntryCount uint64 `json:"entryCount"` +} + +type ItemAPIAccess struct { + // Description + Description string `json:"desc"` + + // ID + ID uint64 `json:"id"` + + // Name + Name string `json:"name"` +} + +type ListAPIAccess []ItemAPIAccess + +type ItemMatchingUsername struct { + // Gravatar URL + GravatarURL string `json:"gravatarurl"` + + // Username + Username string `json:"username"` +} + +type ListMatchingUsernames []ItemMatchingUsername + +type ItemAudit struct { + // Call + Call string `json:"Call"` + + // Response time + ResponseTime ResponseTime `json:"Response Time"` + + // StatusCode + StatusCode StatusCode `json:"Status Code"` + + // Time + Time float64 `json:"Time"` +} + +type ListAudits []ItemAudit + +type ResponseTime float64 + +func (r *ResponseTime) UnmarshalJSON(b []byte) error { + if string(b) == "null" { + *r = ResponseTime(-1) + + return nil + } + + res, err := strconv.ParseFloat(string(b), 64) + if err != nil { + return err + } + + *r = ResponseTime(res) + + return nil +} + +type StatusCode int64 + +func (s *StatusCode) UnmarshalJSON(b []byte) error { + if string(b) == "null" { + *s = StatusCode(-1) + + return nil + } + + res, err := strconv.ParseInt(string(b), 10, 64) + if err != nil { + return err + } + + *s = StatusCode(res) + + return nil +} + +type APIsEndpoints struct { + // CloudAPI endpoints + CloudAPI CloudAPIEndpoints `json:"cloudapi,omitempty"` + + // CloudBroker endpoints + CloudBroker CloudBrokerEndpoints `json:"cloudbroker,omitempty"` + + // LibCloud endpoints + LibCloud LibCloudEndpoints `json:"libcloud,omitempty"` + + // System endpoints + System SystemEndpoints `json:"system,omitempty"` +} + +type CloudAPIEndpoints struct { + Account []string `json:"account,omitempty"` + BService []string `json:"bservice,omitempty"` + CloudSpace []string `json:"cloudspace,omitempty"` + Compute []string `json:"compute,omitempty"` + ComputeCI []string `json:"computeci,omitempty"` + Disks []string `json:"disks,omitempty"` + ExtNet []string `json:"extnet,omitempty"` + FLIPGroup []string `json:"flipgroup,omitempty"` + GPU []string `json:"gpu,omitempty"` + Image []string `json:"image,omitempty"` + K8CI []string `json:"k8ci,omitempty"` + K8S []string `json:"k8s,omitempty"` + KVMPPC []string `json:"kvmppc,omitempty"` + KVMX86 []string `json:"kvmx86,omitempty"` + LB []string `json:"lb,omitempty"` + Loactions []string `json:"locations,omitempty"` + Machine []string `json:"machine,omitempty"` + Openshift []string `json:"openshift,omitempty"` + OpenshiftCI []string `json:"openshiftci,omitempty"` + PCIDevice []string `json:"pcidevice,omitempty"` + PortForwarding []string `json:"portforwarding,omitempty"` + Prometheus []string `json:"prometheus,omitempty"` + RG []string `json:"rg,omitempty"` + Sizes []string `json:"sizes,omitempty"` + Tasks []string `json:"tasks,omitempty"` + User []string `json:"user,omitempty"` + VGPU []string `json:"vgpu,omitempty"` + VINS []string `json:"vins,omitempty"` + All bool `json:"ALL,omitempty"` +} + +type CloudBrokerEndpoints struct { + Account []string `json:"account,omitempty"` + APIAccess []string `json:"apiaccess,omitempty"` + Audit []string `json:"audit,omitempty"` + AuditBeat []string `json:"auditbeat,omitempty"` + AuditCollector []string `json:"auditcollector,omitempty"` + BackupCreator []string `json:"backupcreator,omitempty"` + BService []string `json:"bservice,omitempty"` + CloudSpace []string `json:"cloudspace,omitempty"` + Compute []string `json:"compute,omitempty"` + ComputeCI []string `json:"computeci,omitempty"` + Desnode []string `json:"desnode,omitempty"` + Diagnostics []string `json:"diagnostics,omitempty"` + Disks []string `json:"disks,omitempty"` + Eco []string `json:"eco,omitempty"` + ExtNet []string `json:"extnet,omitempty"` + FlIPgroup []string `json:"flipgroup,omitempty"` + Grid []string `json:"grid,omitempty"` + Group []string `json:"group,omitempty"` + Health []string `json:"health,omitempty"` + IaaS []string `json:"iaas,omitempty"` + Image []string `json:"image,omitempty"` + Job []string `json:"job,omitempty"` + K8CI []string `json:"k8ci,omitempty"` + K8S []string `json:"k8s,omitempty"` + KVMPPC []string `json:"kvmppc,omitempty"` + KVMX86 []string `json:"kvmx86,omitempty"` + LB []string `json:"lb,omitempty"` + Machine []string `json:"machine,omitempty"` + Metering []string `json:"metering,omitempty"` + Milestones []string `json:"milestones,omitempty"` + Node []string `json:"node,omitempty"` + Openshift []string `json:"openshift,omitempty"` + OpenshiftCI []string `json:"openshiftci,omitempty"` + Ovsnode []string `json:"ovsnode,omitempty"` + PCIDevice []string `json:"pcidevice,omitempty"` + PGPU []string `json:"pgpu,omitempty"` + Prometheus []string `json:"prometheus,omitempty"` + QOS []string `json:"qos,omitempty"` + Resmon []string `json:"resmon,omitempty"` + RG []string `json:"rg,omitempty"` + Sep []string `json:"sep,omitempty"` + Stack []string `json:"stack,omitempty"` + Tasks []string `json:"tasks,omitempty"` + TLock []string `json:"tlock,omitempty"` + User []string `json:"user,omitempty"` + VGPU []string `json:"vgpu,omitempty"` + VINS []string `json:"vins,omitempty"` + VNFDev []string `json:"vnfdev,omitempty"` + ZeroAccess []string `json:"zeroaccess,omitempty"` + All bool `json:"ALL,omitempty"` +} + +type LibCloudEndpoints struct { + Libvirt []string `json:"libvirt,omitempty"` + All bool `json:"ALL,omitempty"` +} + +type SystemEndpoints struct { + AgentController []string `json:"agentcontroller,omitempty"` + Alerts []string `json:"alerts,omitempty"` + Audits []string `json:"audits,omitempty"` + ContentManager []string `json:"contentmanager,omitempty"` + DocGenerator []string `json:"docgenerator,omitempty"` + EmailSender []string `json:"emailsender,omitempty"` + ErrorConditionHandler []string `json:"errorconditionhandler,omitempty"` + GridManager []string `json:"gridmanager,omitempty"` + Health []string `json:"health,omitempty"` + Info []string `json:"info,omitempty"` + InfoMGR []string `json:"infomgr,omitempty"` + Job []string `json:"job,omitempty"` + Log []string `json:"log,omitempty"` + Logo []string `json:"logo,omitempty"` + Oauth []string `json:"oauth,omitempty"` + Task []string `json:"task,omitempty"` + UserManager []string `json:"usermanager,omitempty"` + All bool `json:"ALL,omitempty"` +} diff --git a/pkg/cloudbroker/user/user.go b/pkg/cloudbroker/user/user.go new file mode 100644 index 0000000..119eb55 --- /dev/null +++ b/pkg/cloudbroker/user/user.go @@ -0,0 +1,15 @@ +package user + +import "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" + +// Structure for creating request to User +type User struct { + client interfaces.Caller +} + +// Builder for User endpoints +func New(client interfaces.Caller) *User { + return &User{ + client: client, + } +}