diff --git a/CHANGELOG.md b/CHANGELOG.md index 75dc482..e1da910 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Version 1.16.3 +## Version 1.16.4 ### Deprecated @@ -18,31 +18,98 @@ | `rg/AccessRevoke` | :heavy_check_mark: | :heavy_check_mark: | | `sep/ConfigFieldEdit` | :x: | :heavy_check_mark: | - ### Добавлено -#### extnet +#### apiaccess | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1034 | Методы `AsyncCreate`, `AsyncDeviceDeploy` и `AsyncSetHAMode` в cloudbroker/extnet | +| BGOS-1055 | Структура `SDNEndpoints` и опциональное поле `SDN` в структуру `APIsEndpoints` в cloudbroker/apiaccess | +| BGOS-1055 | Опциональные поля `Audit`, `DPDKNet`, `SecurityGroup`, `SEP`, `StoragePolicy`, `Trunk`, `VFPool`, `VMFolder`, `Zone` в структуру `CloudAPIEndpoints` в cloudbroker/apiaccess | +| BGOS-1055 | Опциональные поля `Backup`, `DPDKNet`, `SecurityGroup`, `StoragePolicy`, `Trunk`, `VFPool`, `VMFolder`, `Zone` в структуру `CloudBrokerEndpoints` в cloudbroker/apiaccess | +| BGOS-1055 | Опциональные поля `Cache`, `InfoWellknown` в структуру `SystemEndpoints` в cloudbroker/apiaccess | - -#### locations +#### compute | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1032 | Вычисляемое поле `VMFoldersEnabled` в структуру ответа `ItemLocation` в cloudapi/locations | +| BGOS-1043 | Опциональное поле `AsyncMode` в структуру запроса `SnapshotEvictDiskRequest` в cloudbroker/compute | +| BGOS-1044 | Методы `AsyncAffinityRuleAdd` и `AsyncAntiAffinityRuleAdd` в cloudapi/compute и cloudbroker/compute | +| BGOS-1054 | Опциональные поля `FolderID` и `IncludeDescendants` в структуру запроса `ListRequest` в cloudapi/compute | +| BGOS-1054 | Опциональные поля `FolderID` и `IncludeDescendants` в структуру запроса `ListRequest` в cloudbroker/compute | +| BGOS-1046 | Опциональное поле `Migrate` в структуры запросов `AffinityRuleAddRequest` и `AntiAffinityRuleAddRequest` в cloudapi/compute | +| BGOS-1046 | Опциональное поле `Migrate` в структуры запросов `AffinityRuleAddRequest` и `AntiAffinityRuleAddRequest` в cloudbroker/compute | -#### vins +#### session | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1033 | Методы `AsyncCreateInAccount`, `AsyncCreateInRG`, `AsyncEnable`, `AsyncVNFDevRedeploy` и `AsyncVNFDevRestart` в cloudapi/vins | -| BGOS-1033 | Методы `AsyncCreateInAccount`, `AsyncCreateInRG`, `AsyncEnable`, `AsyncVNFDevRedeploy`, `AsyncVNFDevRestart` и `AsyncVNFDevStart` в cloudbroker/vins | -| BGOS-1033 | Структура запроса `DisableRequest` и метод `Disable` в cloudapi/vins | -| BGOS-1033 | Структура запроса `EnableRequest` и метод `Enable` в cloudapi/vins | +| BGOS-1048 | Опциональное поле `IncludeArchive` в структуру запроса `ListRequest` в cloudbroker/session | -### Исправлено +#### stpolicy +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1047 | Вычисляемое поле `ReplicationProfileID` в структуры ответа `InfoStoragePolicy` и `ItemStoragePolicy` в cloudapi/stpolicy и в cloudbroker/stpolicy | +| BGOS-1047 | Вычисляемое поле `ReplicationProfileID` в структуру ответа `InfoStoragePolicyWithID` в cloudbroker/stpolicy | +| BGOS-1047 | Методы `GetReplicationProfile`, `ListReplicationProfile`, структуры запроса `GetReplicationProfileRequest`, `ListReplicationProfileRequest` и структуры ответа `InfoReplicationProfile`, `ListReplicationProfiles`, `ItemReplicationProfile`, `ListSchedules`, `Schedule`, `Calendar` в cloudapi/stpolicy и в cloudbroker/stpolicy | +| BGOS-1047 | Метод `CreateReplicationProfile`, структуры запроса `CreateReplicationProfileRequest`, `SchedulesRequest`, `CalendarRequest` в cloudbroker/stpolicy | +| BGOS-1047 | Метод `UpdateReplicationProfile`, структуры запроса `UpdateReplicationProfileRequest`, `ConfigRequest` в cloudbroker/stpolicy | +| BGOS-1047 | Метод `DeleteReplicationProfile` и структура запроса `DeleteReplicationProfileRequest` в cloudbroker/stpolicy | +| BGOS-1047 | Методы `AddAccessReplicationProfile`, `RevokeAccessReplicationProfile` и структуры запроса `AddAccessReplicationProfileRequest`, `RevokeAccessReplicationProfileRequest` в cloudbroker/stpolicy | + +#### vmfolder +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1049 | Группа апи методов vmfolder в cloudapi и cloudbroker | + +### Изменено + +#### backup +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1045 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структурах запроса `CreateDiskBackupRequest`, `CreateDisksBackupRequest`, `DeleteDiskBackupRequest`, `RestoreDiskFromBackupRequest` и `RestoreDisksFromBackupRequest` в cloudbroker/backup | + +#### compute +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1043 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структурах запроса `AbortSharedSnapshotMergeRequest`, `CDEjectRequest`, `CDInsertRequest`, `ChangeIPRequest`, `ChangeLinkStateRequest`, `ChangeMTURequest`, `ChangeQoSPoliciesRequest`, `ChangeSecGroupsRequest`, `CloneRequest`, `CreateTemplateRequest`, `CreateTemplateFromBlankRequest`, `DeleteRequest`, `DisableRequest`, `DiskAddRequest`, `DiskAttachRequest`, `DiskDelRequest`, `DiskDetachRequest`, `DiskQOSRequest`, `DiskResizeRequest`, `DiskSwitchToReplicationRequest`, `GuestAgentDisableRequest`, `GuestAgentEnableRequest`, `GuestAgentExecuteRequest`, `GuestAgentFeatureUpdateRequest`, `MigrateToZoneRequest`, `MoveToRGRequest`, `NetAttachRequest`, `NetDetachRequest`, `PauseRequest`, `PFWAddRequest`, `PFWDelRequest`, `PinToNodeRequest`, `PowerCycleRequest`, `RebootRequest`, `RedeployRequest`, `ResetRequest`, `ResizeRequest`, `RestoreRequest`, `ResumeRequest`, `SnapshotCreateRequest`, `SnapshotDeleteRequest`, `SnapshotRollbackRequest`, `StartRequest` и `StopRequest` в cloudapi/compute | +| BGOS-1043 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структурах запроса `AbortSharedSnapshotMergeRequest`, `CDEjectRequest`, `CDInsertRequest`, `ChangeIPRequest`, `ChangeLinkStateRequest`, `ChangeMTURequest`, `ChangeQoSPoliciesRequest`, `ChangeSecGroupsRequest`, `CloneRequest`, `CreateTemplateRequest`, `CreateTemplateFromBlankRequest`, `DeleteRequest`, `DisableRequest`, `DiskAddRequest`, `DiskAttachRequest`, `DiskDelRequest`, `DiskDetachRequest`, `DiskQOSRequest`, `DiskResizeRequest`, `DiskSwitchToReplicationRequest`, `GuestAgentDisableRequest`, `GuestAgentEnableRequest`, `GuestAgentExecuteRequest`, `GuestAgentFeatureUpdateRequest`, `MassDeleteRequest`, `MassRebootRequest`, `MassStartRequest`, `MassStopRequest`, `MigrateAbortRequest`, `MigrateStorageAbortRequest`, `MigrateStorageCleanUpRequest`, `MigrateToZoneRequest`, `MoveToRGRequest`, `NetAttachRequest`, `NetDetachRequest`, `NetQOSRequest`, `PauseRequest`, `PFWAddRequest`, `PFWDelRequest`, `PinToNodeRequest`, `PowerCycleRequest`, `RaiseDownRequest`, `RebootRequest`, `RedeployRequest`, `ResetRequest`, `ResizeRequest`, `RestoreRequest`, `ResumeRequest`, `SnapshotCreateRequest`, `SnapshotDeleteRequest`, `SnapshotRollbackRequest`, `StartRequest` и `StopRequest` в cloudbroker/compute | +| BGOS-1043 | Опциональное поле `SyncMode` на `AsyncMode` в структуре запроса `MigrateRequest` в cloudbroker/compute | +| BGOS-1043 | Опциональное поле `Sync` на `Async` в структуре запроса `MigrateStorageRequest` в cloudbroker/compute | + +#### disks +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1045 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структуре запроса `FromPlatformDiskRequest` в cloudapi/disks и в cloudbroker/disks | + +#### image +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1045 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структуре запроса `CreateRequest` в cloudapi/image и в cloudbroker/image | +| BGOS-1045 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структуре запроса `CreateCDROMImageRequest` в cloudbroker/image | #### kvmx86 | Идентификатор задачи | Описание | | --- | --- | -| BGOS-1040 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структуре запроса `CreateRequest` в cloudapi/kvmx86 и cloudbroker/kvmx86 | +| BGOS-1045 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структуре запроса `MassCreateRequest` в cloudbroker/kvmx86 | + +#### node +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1045 | JSON-тэг опционального поля `AsyncMode` с `asyncMode` на `async_mode` в структуре запроса `EnableRequest` в cloudbroker/node | + +### Исправлено + +#### apiaccess +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1055 | Ошибка при вызове метода `Update` в cloudbroker/apiaccess | +| BGOS-1055 | Исправлен тип ответа метода `DescUpdate` в cloudbroker/apiaccess | + + +#### Удалено + +#### apiaccess +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-1055 | Структура `LibCloudEndpoints` и опциональное поле `LibCloud` из структуры `APIsEndpoints` в cloudbroker/apiaccess | +| BGOS-1055 | Опциональные поля `CloudSpace`, `ComputeCI`, `DPDK`, `Machine`, `Openshift`, `OpenshiftCI`, `PortForwarding`, `Sizes` из структуры `CloudAPIEndpoints` в cloudbroker/apiaccess | +| BGOS-1055 | Опциональные поля `CloudSpace`, `ComputeCI`, `Desnode`, `Diagnostics`, `DPDK`, `IaaS`, `Machine`, `Openshift`, `OpenshiftCI`, `Ovsnode`, `QOS` из структуры `CloudBrokerEndpoints` в cloudbroker/apiaccess | +| BGOS-1055 | Опциональные поля `AgentController`, `Alerts`, `ErrorConditionHandler`, `Job`, `Log`, `Logo` из структуры `SystemEndpoints` в cloudbroker/apiaccess | diff --git a/README.md b/README.md index 09f16e1..48ebdc0 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk - `Trunk` - получение информации о транковых портах; - `VFPool` - управление пулом виртуальных сетевых функций; - `VINS` - управление виртуальными изолированными сетями; +- `VMFolder` – управление директориями ВМ; - `VGPU` - управление виртуальными графическими процессорами; - `Zone` - управление зонами. @@ -175,7 +176,8 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk - `User` - управление пользователями (индивидуально); - `VGPU` - управление виртуальными графическими процессорами; - `VFPool` - управление пулом виртуальных сетевых функций; -- `VINS` - управление виртуальными изолированными сетями. +- `VINS` - управление виртуальными изолированными сетями; +- `VMFolder` – управление директориями ВМ; - `Zone` - управление зонами. ### SDN @@ -352,6 +354,7 @@ func main() { - `pkg/cloudapi/vfpool` - для `VFPool` - `pkg/cloudapi/vins` - для `VINS` - `pkg/cloudapi/vgpu` - для `VGPU` + - `pkg/cloudapi/vmfolder` - для `VMFolder` - `pkg/cloudapi/zone` - для `Zone` - **cloudbroker**: - `pkg/cloudbroker/account` - для `Account` @@ -387,6 +390,7 @@ func main() { - `pkg/cloudbroker/vgpu` - для `VGPU` - `pkg/cloudbroker/vfpool` - для `VFPool` - `pkg/cloudbroker/vins` - для `VINS` + - `pkg/cloudbroker/vmfolder` - для `VMFolder` - `pkg/cloudbroker/zone` - для `Zone` - **sdn**: - `pkg/sdn/acsgroups` - для `Access groups` diff --git a/pkg/cloudapi/compute/abort_shared_snapshot_merge.go b/pkg/cloudapi/compute/abort_shared_snapshot_merge.go index 24775c3..57cdea4 100644 --- a/pkg/cloudapi/compute/abort_shared_snapshot_merge.go +++ b/pkg/cloudapi/compute/abort_shared_snapshot_merge.go @@ -20,7 +20,7 @@ type AbortSharedSnapshotMergeRequest struct { type wrapperAbortSharedSnapshotMergeRequest struct { AbortSharedSnapshotMergeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode" json:"async_mode"` } // AbortSharedSnapshotMerge shared snapshots merge abort diff --git a/pkg/cloudapi/compute/affinity_rule_add.go b/pkg/cloudapi/compute/affinity_rule_add.go index 7d4de8a..c660496 100644 --- a/pkg/cloudapi/compute/affinity_rule_add.go +++ b/pkg/cloudapi/compute/affinity_rule_add.go @@ -2,6 +2,7 @@ package compute import ( "context" + "encoding/json" "net/http" "strconv" @@ -40,6 +41,17 @@ type AffinityRuleAddRequest struct { // Value that must match the key to be taken into account when analyzing this rule // Required: true Value string `url:"value" json:"value" validate:"required"` + + // Migrate compute according to the rule + // Default: false + // Required: false + Migrate bool `url:"migrate" json:"migrate"` +} + +type wrapperAffinityRuleAddRequest struct { + AffinityRuleAddRequest + + AsyncMode bool `url:"async_mode"` } // AffinityRuleAdd add affinity rule @@ -51,7 +63,12 @@ func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest url := "/cloudapi/compute/affinityRuleAdd" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + aReq := wrapperAffinityRuleAddRequest{ + AffinityRuleAddRequest: req, + AsyncMode: false, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) if err != nil { return false, err } @@ -63,3 +80,32 @@ func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest return result, nil } + +// AsyncAffinityRuleAdd add affinity rule in async mode +func (c Compute) AsyncAffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/compute/affinityRuleAdd" + + aReq := wrapperAffinityRuleAddRequest{ + AffinityRuleAddRequest: req, + AsyncMode: true, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) + if err != nil { + return "", err + } + + var resp string + + err = json.Unmarshal(res, &resp) + if err != nil { + return "", err + } + + return resp, nil +} diff --git a/pkg/cloudapi/compute/anti_affinity_rule_add.go b/pkg/cloudapi/compute/anti_affinity_rule_add.go index 0b46a2c..17ab104 100644 --- a/pkg/cloudapi/compute/anti_affinity_rule_add.go +++ b/pkg/cloudapi/compute/anti_affinity_rule_add.go @@ -2,6 +2,7 @@ package compute import ( "context" + "encoding/json" "net/http" "strconv" @@ -40,6 +41,17 @@ type AntiAffinityRuleAddRequest struct { // Value that must match the key to be taken into account when analyzing this rule // Required: true Value string `url:"value" json:"value" validate:"required"` + + // Migrate compute according to the rule + // Default: false + // Required: false + Migrate bool `url:"migrate" json:"migrate"` +} + +type wrapperAntiAffinityRuleAddRequest struct { + AntiAffinityRuleAddRequest + + AsyncMode bool `url:"async_mode"` } // AntiAffinityRuleAdd add anti affinity rule @@ -51,7 +63,12 @@ func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAd url := "/cloudapi/compute/antiAffinityRuleAdd" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + aReq := wrapperAntiAffinityRuleAddRequest{ + AntiAffinityRuleAddRequest: req, + AsyncMode: false, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) if err != nil { return false, err } @@ -63,3 +80,32 @@ func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAd return result, nil } + +// AsyncAntiAffinityRuleAdd add anti affinity rule in async mode +func (c Compute) AsyncAntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAddRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/compute/antiAffinityRuleAdd" + + aReq := wrapperAntiAffinityRuleAddRequest{ + AntiAffinityRuleAddRequest: req, + AsyncMode: true, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) + if err != nil { + return "", err + } + + var resp string + + err = json.Unmarshal(res, &resp) + if err != nil { + return "", err + } + + return resp, nil +} diff --git a/pkg/cloudapi/compute/cd_eject.go b/pkg/cloudapi/compute/cd_eject.go index 3ff27bd..28451bb 100644 --- a/pkg/cloudapi/compute/cd_eject.go +++ b/pkg/cloudapi/compute/cd_eject.go @@ -18,7 +18,7 @@ type CDEjectRequest struct { type wrapperCDEjectRequest struct { CDEjectRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode" json:"async_mode"` } // CDEject eject CD image to compute's CD-ROM diff --git a/pkg/cloudapi/compute/cd_insert.go b/pkg/cloudapi/compute/cd_insert.go index 7b1c6b6..6926208 100644 --- a/pkg/cloudapi/compute/cd_insert.go +++ b/pkg/cloudapi/compute/cd_insert.go @@ -22,7 +22,7 @@ type CDInsertRequest struct { type wrapperCDInsertRequest struct { CDInsertRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode" json:"async_mode"` } // CDInsert insert new CD image to compute's CD-ROM diff --git a/pkg/cloudapi/compute/change_ip.go b/pkg/cloudapi/compute/change_ip.go index c119521..1b5ab4e 100644 --- a/pkg/cloudapi/compute/change_ip.go +++ b/pkg/cloudapi/compute/change_ip.go @@ -34,7 +34,7 @@ type ChangeIPRequest struct { type wrapperChangeIPRequest struct { ChangeIPRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeIP change reserved IP for compute instance diff --git a/pkg/cloudapi/compute/change_link_state.go b/pkg/cloudapi/compute/change_link_state.go index 07e4584..764d910 100644 --- a/pkg/cloudapi/compute/change_link_state.go +++ b/pkg/cloudapi/compute/change_link_state.go @@ -27,7 +27,7 @@ type ChangeLinkStateRequest struct { type wrapperChangeLinkStateRequest struct { ChangeLinkStateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeLinkState changes the status link virtual of compute diff --git a/pkg/cloudapi/compute/change_mtu.go b/pkg/cloudapi/compute/change_mtu.go index cb93e7b..9787b18 100644 --- a/pkg/cloudapi/compute/change_mtu.go +++ b/pkg/cloudapi/compute/change_mtu.go @@ -26,7 +26,7 @@ type ChangeMTURequest struct { type wrapperChangeMTURequest struct { ChangeMTURequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeMTU change MTU for compute instance diff --git a/pkg/cloudapi/compute/change_qos_policies.go b/pkg/cloudapi/compute/change_qos_policies.go index 6add3f4..37d7c2e 100644 --- a/pkg/cloudapi/compute/change_qos_policies.go +++ b/pkg/cloudapi/compute/change_qos_policies.go @@ -26,7 +26,7 @@ type ChangeQoSPoliciesRequest struct { type wrapperChangeQoSPoliciesRequest struct { ChangeQoSPoliciesRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeQoSPolicies change qos policies for compute diff --git a/pkg/cloudapi/compute/change_secutity_group.go b/pkg/cloudapi/compute/change_secutity_group.go index 1c8e060..86b7314 100644 --- a/pkg/cloudapi/compute/change_secutity_group.go +++ b/pkg/cloudapi/compute/change_secutity_group.go @@ -30,7 +30,7 @@ type ChangeSecGroupsRequest struct { type wrapperChangeSecGroupsRequest struct { ChangeSecGroupsRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeSecGroups changes security groups for compute diff --git a/pkg/cloudapi/compute/clone.go b/pkg/cloudapi/compute/clone.go index 8286ea1..3a854af 100644 --- a/pkg/cloudapi/compute/clone.go +++ b/pkg/cloudapi/compute/clone.go @@ -47,7 +47,7 @@ type CloneRequest struct { type wrapperCloneRequest struct { CloneRequest - AsyncMode bool `url:"asyncMode" json:"asyncMode"` + AsyncMode bool `url:"async_mode" json:"async_mode"` } // Clone clones compute instance diff --git a/pkg/cloudapi/compute/create_template.go b/pkg/cloudapi/compute/create_template.go index 1993143..f2c9af1 100644 --- a/pkg/cloudapi/compute/create_template.go +++ b/pkg/cloudapi/compute/create_template.go @@ -22,7 +22,7 @@ type CreateTemplateRequest struct { type wrapperCreateTemplateRequest struct { CreateTemplateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateTemplate create template from compute instance diff --git a/pkg/cloudapi/compute/create_template_from_blank.go b/pkg/cloudapi/compute/create_template_from_blank.go index 11d6940..63f81c9 100644 --- a/pkg/cloudapi/compute/create_template_from_blank.go +++ b/pkg/cloudapi/compute/create_template_from_blank.go @@ -55,7 +55,7 @@ type CreateTemplateFromBlankRequest struct { type wrapperCreateTemplateFromBlankRequest struct { CreateTemplateFromBlankRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateTemplateFromBlank creates template from boot disk of current compute in sync mode. diff --git a/pkg/cloudapi/compute/delete.go b/pkg/cloudapi/compute/delete.go index 963eac6..a94433a 100644 --- a/pkg/cloudapi/compute/delete.go +++ b/pkg/cloudapi/compute/delete.go @@ -26,7 +26,7 @@ type DeleteRequest struct { type wrapperDeleteRequest struct { DeleteRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Delete deletes compute diff --git a/pkg/cloudapi/compute/disable.go b/pkg/cloudapi/compute/disable.go index 2d3b24d..fe5935f 100644 --- a/pkg/cloudapi/compute/disable.go +++ b/pkg/cloudapi/compute/disable.go @@ -18,7 +18,7 @@ type DisableRequest struct { type wrapperDisableRequest struct { DisableRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Disable disables compute diff --git a/pkg/cloudapi/compute/disk_add.go b/pkg/cloudapi/compute/disk_add.go index 01baee9..e502a93 100644 --- a/pkg/cloudapi/compute/disk_add.go +++ b/pkg/cloudapi/compute/disk_add.go @@ -60,7 +60,7 @@ type DiskAddRequest struct { type wrapperDiskAddRequest struct { DiskAddRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskAdd creates new disk and attach to compute diff --git a/pkg/cloudapi/compute/disk_attach.go b/pkg/cloudapi/compute/disk_attach.go index f59c502..1e84803 100644 --- a/pkg/cloudapi/compute/disk_attach.go +++ b/pkg/cloudapi/compute/disk_attach.go @@ -34,7 +34,7 @@ type DiskAttachRequest struct { type wrapperDiskAttachRequest struct { DiskAttachRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskAttach attach disk to compute diff --git a/pkg/cloudapi/compute/disk_del.go b/pkg/cloudapi/compute/disk_del.go index 843ddc0..76995b1 100644 --- a/pkg/cloudapi/compute/disk_del.go +++ b/pkg/cloudapi/compute/disk_del.go @@ -26,7 +26,7 @@ type DiskDelRequest struct { type wrapperDiskDelRequest struct { DiskDelRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskDel delete disk and detach from compute diff --git a/pkg/cloudapi/compute/disk_detach.go b/pkg/cloudapi/compute/disk_detach.go index 0dd3084..be09b1a 100644 --- a/pkg/cloudapi/compute/disk_detach.go +++ b/pkg/cloudapi/compute/disk_detach.go @@ -22,7 +22,7 @@ type DiskDetachRequest struct { type wrapperDiskDetachRequest struct { DiskDetachRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskDetach detach disk from compute diff --git a/pkg/cloudapi/compute/disk_qos.go b/pkg/cloudapi/compute/disk_qos.go index ef97569..e14dfb9 100644 --- a/pkg/cloudapi/compute/disk_qos.go +++ b/pkg/cloudapi/compute/disk_qos.go @@ -26,7 +26,7 @@ type DiskQOSRequest struct { type wrapperDiskQOSRequest struct { DiskQOSRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskQOS change QoS of the disk diff --git a/pkg/cloudapi/compute/disk_resize.go b/pkg/cloudapi/compute/disk_resize.go index d4676a3..b90f0cf 100644 --- a/pkg/cloudapi/compute/disk_resize.go +++ b/pkg/cloudapi/compute/disk_resize.go @@ -26,7 +26,7 @@ type DiskResizeRequest struct { type wrapperDiskResizeRequest struct { DiskResizeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskResize change disk size diff --git a/pkg/cloudapi/compute/disk_switch_to_replication.go b/pkg/cloudapi/compute/disk_switch_to_replication.go index fc4d207..7817a8d 100644 --- a/pkg/cloudapi/compute/disk_switch_to_replication.go +++ b/pkg/cloudapi/compute/disk_switch_to_replication.go @@ -26,7 +26,7 @@ type DiskSwitchToReplicationRequest struct { type wrapperDiskSwitchToReplicationRequest struct { DiskSwitchToReplicationRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskSwitchToReplication switches disk to it's replication diff --git a/pkg/cloudapi/compute/guest_agent_disable.go b/pkg/cloudapi/compute/guest_agent_disable.go index 9d0435c..4ca494e 100644 --- a/pkg/cloudapi/compute/guest_agent_disable.go +++ b/pkg/cloudapi/compute/guest_agent_disable.go @@ -18,7 +18,7 @@ type GuestAgentDisableRequest struct { type wrapperGuestAgentDisableRequest struct { GuestAgentDisableRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Disable guest agent at a specific compute diff --git a/pkg/cloudapi/compute/guest_agent_enable.go b/pkg/cloudapi/compute/guest_agent_enable.go index 9a68df0..bfd807f 100644 --- a/pkg/cloudapi/compute/guest_agent_enable.go +++ b/pkg/cloudapi/compute/guest_agent_enable.go @@ -18,7 +18,7 @@ type GuestAgentEnableRequest struct { type wrapperGuestAgentEnableRequest struct { GuestAgentEnableRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Enable guest agent at a specific compute diff --git a/pkg/cloudapi/compute/guest_agent_execute.go b/pkg/cloudapi/compute/guest_agent_execute.go index ed35613..5b4e84c 100644 --- a/pkg/cloudapi/compute/guest_agent_execute.go +++ b/pkg/cloudapi/compute/guest_agent_execute.go @@ -26,7 +26,7 @@ type GuestAgentExecuteRequest struct { type wrapperGuestAgentExecuteRequest struct { GuestAgentExecuteRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Execute guest agent command diff --git a/pkg/cloudapi/compute/guest_agent_feature_update.go b/pkg/cloudapi/compute/guest_agent_feature_update.go index fd3318c..cb014d5 100644 --- a/pkg/cloudapi/compute/guest_agent_feature_update.go +++ b/pkg/cloudapi/compute/guest_agent_feature_update.go @@ -18,7 +18,7 @@ type GuestAgentFeatureUpdateRequest struct { type wrapperGuestAgentFeatureUpdateRequest struct { GuestAgentFeatureUpdateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Feature update guest agent diff --git a/pkg/cloudapi/compute/list.go b/pkg/cloudapi/compute/list.go index 284cf47..44b6e8d 100644 --- a/pkg/cloudapi/compute/list.go +++ b/pkg/cloudapi/compute/list.go @@ -63,6 +63,14 @@ type ListRequest struct { // Required: false ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"` + // Find by VM folder ID + // Required: false + FolderID uint64 `url:"folder_id,omitempty" json:"folder_id,omitempty"` + + // Include computes from descendant folders. + // Required: false + IncludeDescendants interface{} `url:"include_descendants,omitempty" json:"include_descendants,omitempty" validate:"omitempty,isBool"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` diff --git a/pkg/cloudapi/compute/migrate_to_zone.go b/pkg/cloudapi/compute/migrate_to_zone.go index 7ab05fb..33eee1b 100644 --- a/pkg/cloudapi/compute/migrate_to_zone.go +++ b/pkg/cloudapi/compute/migrate_to_zone.go @@ -22,7 +22,7 @@ type MigrateToZoneRequest struct { type wrapperMigrateToZoneRequest struct { MigrateToZoneRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MoveToRG moves compute instance to new resource group diff --git a/pkg/cloudapi/compute/move_to_rg.go b/pkg/cloudapi/compute/move_to_rg.go index bc1699e..447eaa1 100644 --- a/pkg/cloudapi/compute/move_to_rg.go +++ b/pkg/cloudapi/compute/move_to_rg.go @@ -37,7 +37,7 @@ type MoveToRGRequest struct { type wrapperMoveToRGRequest struct { MoveToRGRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MoveToRG moves compute instance to new resource group diff --git a/pkg/cloudapi/compute/net_attach.go b/pkg/cloudapi/compute/net_attach.go index 5f544ab..86a17e7 100644 --- a/pkg/cloudapi/compute/net_attach.go +++ b/pkg/cloudapi/compute/net_attach.go @@ -96,7 +96,7 @@ type NetAttachRequest struct { type wrapperNetAttachRequest struct { NetAttachRequest - AsyncMode bool `url:"asyncMode" json:"asyncMode"` + AsyncMode bool `url:"async_mode" json:"async_mode"` } // NetAttach attaches network to compute and gets info about network diff --git a/pkg/cloudapi/compute/net_detach.go b/pkg/cloudapi/compute/net_detach.go index ac53039..b6d00fa 100644 --- a/pkg/cloudapi/compute/net_detach.go +++ b/pkg/cloudapi/compute/net_detach.go @@ -26,7 +26,7 @@ type NetDetachRequest struct { type wrapperNetDetachRequest struct { NetDetachRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // NetDetach detaches network from compute diff --git a/pkg/cloudapi/compute/pause.go b/pkg/cloudapi/compute/pause.go index facb656..7050d8e 100644 --- a/pkg/cloudapi/compute/pause.go +++ b/pkg/cloudapi/compute/pause.go @@ -18,7 +18,7 @@ type PauseRequest struct { type wrapperPauseRequest struct { PauseRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Pause pause compute diff --git a/pkg/cloudapi/compute/pfw_add.go b/pkg/cloudapi/compute/pfw_add.go index 421ad9c..294cad1 100644 --- a/pkg/cloudapi/compute/pfw_add.go +++ b/pkg/cloudapi/compute/pfw_add.go @@ -36,7 +36,7 @@ type PFWAddRequest struct { type wrapperPFWAddRequest struct { PFWAddRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PFWAdd add port forward rule diff --git a/pkg/cloudapi/compute/pfw_del.go b/pkg/cloudapi/compute/pfw_del.go index e712868..9cc393c 100644 --- a/pkg/cloudapi/compute/pfw_del.go +++ b/pkg/cloudapi/compute/pfw_del.go @@ -39,7 +39,7 @@ type PFWDelRequest struct { type wrapperPFWDelRequest struct { PFWDelRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PFWDel deletes port forward rule diff --git a/pkg/cloudapi/compute/pin_to_node.go b/pkg/cloudapi/compute/pin_to_node.go index 7d4a67a..435017c 100644 --- a/pkg/cloudapi/compute/pin_to_node.go +++ b/pkg/cloudapi/compute/pin_to_node.go @@ -23,7 +23,7 @@ type PinToNodeRequest struct { type wrapperPinToNodeRequest struct { PinToNodeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PinToNode pin compute to current node diff --git a/pkg/cloudapi/compute/power_cycle.go b/pkg/cloudapi/compute/power_cycle.go index 6b5b380..ecc648a 100644 --- a/pkg/cloudapi/compute/power_cycle.go +++ b/pkg/cloudapi/compute/power_cycle.go @@ -18,7 +18,7 @@ type PowerCycleRequest struct { type wrapperPowerCycleRequest struct { PowerCycleRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PowerCycle makes force stop and start compute diff --git a/pkg/cloudapi/compute/reboot.go b/pkg/cloudapi/compute/reboot.go index fa478ef..7f7b573 100644 --- a/pkg/cloudapi/compute/reboot.go +++ b/pkg/cloudapi/compute/reboot.go @@ -18,7 +18,7 @@ type RebootRequest struct { type wrapperRebootRequest struct { RebootRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Reboot reboots compute diff --git a/pkg/cloudapi/compute/redeploy.go b/pkg/cloudapi/compute/redeploy.go index ea291af..ea4be0e 100644 --- a/pkg/cloudapi/compute/redeploy.go +++ b/pkg/cloudapi/compute/redeploy.go @@ -47,7 +47,7 @@ type RedeployRequest struct { type wrapperRedeployRequest struct { RedeployRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Redeploy redeploys compute diff --git a/pkg/cloudapi/compute/reset.go b/pkg/cloudapi/compute/reset.go index 3ff9d12..2b8654d 100644 --- a/pkg/cloudapi/compute/reset.go +++ b/pkg/cloudapi/compute/reset.go @@ -18,7 +18,7 @@ type ResetRequest struct { type wrapperResetRequest struct { ResetRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Reset resets compute diff --git a/pkg/cloudapi/compute/resize.go b/pkg/cloudapi/compute/resize.go index bf12f32..f3bd8ab 100644 --- a/pkg/cloudapi/compute/resize.go +++ b/pkg/cloudapi/compute/resize.go @@ -46,7 +46,7 @@ func (r ResizeRequest) GetRAM() map[string]uint64 { type wrapperResizeRequest struct { ResizeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Resize resizes compute instance diff --git a/pkg/cloudapi/compute/restore.go b/pkg/cloudapi/compute/restore.go index 80311d8..de9c7ae 100644 --- a/pkg/cloudapi/compute/restore.go +++ b/pkg/cloudapi/compute/restore.go @@ -18,7 +18,7 @@ type RestoreRequest struct { type wrapperRestoreRequest struct { RestoreRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Restore restores compute from recycle bin diff --git a/pkg/cloudapi/compute/resume.go b/pkg/cloudapi/compute/resume.go index 8e86c7b..40b4ed4 100644 --- a/pkg/cloudapi/compute/resume.go +++ b/pkg/cloudapi/compute/resume.go @@ -18,7 +18,7 @@ type ResumeRequest struct { type wrapperResumeRequest struct { ResumeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Resume resume Compute from paused state diff --git a/pkg/cloudapi/compute/snapshot_create.go b/pkg/cloudapi/compute/snapshot_create.go index 8a09b80..8abc114 100644 --- a/pkg/cloudapi/compute/snapshot_create.go +++ b/pkg/cloudapi/compute/snapshot_create.go @@ -29,7 +29,7 @@ type SnapshotCreateRequest struct { type wrapperSnapshotCreateRequest struct { SnapshotCreateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // SnapshotCreate creates compute snapshot diff --git a/pkg/cloudapi/compute/snapshot_delete.go b/pkg/cloudapi/compute/snapshot_delete.go index f5ecea1..0aa1ce0 100644 --- a/pkg/cloudapi/compute/snapshot_delete.go +++ b/pkg/cloudapi/compute/snapshot_delete.go @@ -21,7 +21,7 @@ type SnapshotDeleteRequest struct { type wrapperSnapshotDeleteRequeststruct struct { SnapshotDeleteRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // SnapshotDelete deletes specified compute snapshot diff --git a/pkg/cloudapi/compute/snapshot_rollback.go b/pkg/cloudapi/compute/snapshot_rollback.go index 091f74e..43744eb 100644 --- a/pkg/cloudapi/compute/snapshot_rollback.go +++ b/pkg/cloudapi/compute/snapshot_rollback.go @@ -26,7 +26,7 @@ type SnapshotRollbackRequest struct { type wrapperSnapshotRollbackRequest struct { SnapshotRollbackRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // SnapshotRollback rollbacks specified compute snapshot diff --git a/pkg/cloudapi/compute/start.go b/pkg/cloudapi/compute/start.go index dae3c0c..f0c9095 100644 --- a/pkg/cloudapi/compute/start.go +++ b/pkg/cloudapi/compute/start.go @@ -22,7 +22,7 @@ type StartRequest struct { type wrapperStartRequest struct { StartRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Start starts compute diff --git a/pkg/cloudapi/compute/stop.go b/pkg/cloudapi/compute/stop.go index aadf692..3506655 100644 --- a/pkg/cloudapi/compute/stop.go +++ b/pkg/cloudapi/compute/stop.go @@ -22,7 +22,7 @@ type StopRequest struct { type wrapperStopRequest struct { StopRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Stop stops compute diff --git a/pkg/cloudapi/disks/from_platform_disk.go b/pkg/cloudapi/disks/from_platform_disk.go index 41b1d69..fb1b3d4 100644 --- a/pkg/cloudapi/disks/from_platform_disk.go +++ b/pkg/cloudapi/disks/from_platform_disk.go @@ -54,7 +54,7 @@ type FromPlatformDiskRequest struct { type wrapperFromPlatformDiskRequest struct { FromPlatformDiskRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // FromPlatformDisk creates template from platform disk in sync mode. diff --git a/pkg/cloudapi/image/create.go b/pkg/cloudapi/image/create.go index 9d21bc8..3f8b387 100644 --- a/pkg/cloudapi/image/create.go +++ b/pkg/cloudapi/image/create.go @@ -77,7 +77,7 @@ type CreateRequest struct { type asyncWrapperCreateRequest struct { CreateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Create creates image from a media identified by URL diff --git a/pkg/cloudapi/stpolicy/get_replication_profile.go b/pkg/cloudapi/stpolicy/get_replication_profile.go new file mode 100644 index 0000000..2320182 --- /dev/null +++ b/pkg/cloudapi/stpolicy/get_replication_profile.go @@ -0,0 +1,46 @@ +package stpolicy + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// GetReplicationProfileRequest struct to get replication profile +type GetReplicationProfileRequest struct { + // ID of replication profile + // Required: true + ProfileID uint64 `url:"profile_id" json:"profile_id" validate:"required"` +} + +// GetReplicationProfile gets replication profile as an InfoReplicationProfile struct +func (sp StPolicy) GetReplicationProfile(ctx context.Context, req GetReplicationProfileRequest) (*InfoReplicationProfile, error) { + res, err := sp.GetReplicationProfileRaw(ctx, req) + if err != nil { + return nil, err + } + + info := InfoReplicationProfile{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetReplicationProfileRaw gets replication profile as an array of bytes +func (sp StPolicy) GetReplicationProfileRaw(ctx context.Context, req GetReplicationProfileRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/storage_policy/get_replication_profile" + + res, err := sp.client.DecortApiCall(ctx, http.MethodGet, url, req) + return res, err +} diff --git a/pkg/cloudapi/stpolicy/list_replication_profile.go b/pkg/cloudapi/stpolicy/list_replication_profile.go new file mode 100644 index 0000000..9da405c --- /dev/null +++ b/pkg/cloudapi/stpolicy/list_replication_profile.go @@ -0,0 +1,65 @@ +package stpolicy + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ListReplicationProfileRequest struct to get list of replication profiles +type ListReplicationProfileRequest 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"` + + // Search by replication profile ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Search by replication profile name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Search by replication type + // Required: false + ReplicationType string `url:"replication_type,omitempty" json:"replication_type,omitempty"` + + // Sort by one of supported fields, format ± + // Required: false + SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"` +} + +// ListReplicationProfile gets list of replication profiles as a ListReplicationProfiles struct +func (sp StPolicy) ListReplicationProfile(ctx context.Context, req ListReplicationProfileRequest) (*ListReplicationProfiles, error) { + res, err := sp.ListReplicationProfileRaw(ctx, req) + if err != nil { + return nil, err + } + + list := ListReplicationProfiles{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return &list, nil +} + +// ListReplicationProfileRaw gets list of replication profiles as an array of bytes +func (sp StPolicy) ListReplicationProfileRaw(ctx context.Context, req ListReplicationProfileRequest) ([]byte, error) { + if err := validators.ValidateRequest(req); err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/storage_policy/list_replication_profile" + + res, err := sp.client.DecortApiCall(ctx, http.MethodGet, url, req) + return res, err +} diff --git a/pkg/cloudapi/stpolicy/models.go b/pkg/cloudapi/stpolicy/models.go index eaeb2bc..d24ea4a 100644 --- a/pkg/cloudapi/stpolicy/models.go +++ b/pkg/cloudapi/stpolicy/models.go @@ -27,9 +27,12 @@ type ItemStoragePolicy struct { // Status of the storage policy Status string `json:"status"` - // Max IOPS for the sotrage policy + // Max IOPS for the storage policy LimitIOPS uint64 `json:"limit_iops"` + // ID of the replication profile + ReplicationProfileID uint64 `json:"replication_profile_id"` + // Storage policy ID StoragePolicyID uint64 `json:"storage_policy_id"` @@ -56,9 +59,12 @@ type InfoStoragePolicy struct { // Status of the storage policy Status string `json:"status"` - // Max IOPS for the sotrage policy + // Max IOPS for the storage policy LimitIOPS uint64 `json:"limit_iops"` + // ID of the replication profile + ReplicationProfileID uint64 `json:"replication_profile_id"` + // ID of the storage policy StoragePolicyID uint64 `json:"storage_policy_id"` @@ -89,3 +95,72 @@ type Usage struct { // List of resource groups Resgroups []uint64 `json:"resgroups"` } + +type ListReplicationProfiles struct { + // List + Data []ItemReplicationProfile `json:"data"` + + // Entry Count + EntryCount uint64 `json:"entryCount"` +} + +type ItemReplicationProfile struct { + // ID of the replication profile + ID uint64 `json:"id"` + + // GUID + GUID uint64 `json:"guid"` + + // Name of the replication profile + Name string `json:"name"` + + // Replication types + ReplicationType []string `json:"replication_type"` + + // Max copy rate + MAXCopyRate uint64 `json:"max_copy_rate"` + + // List of schedules + Schedules ListSchedules `json:"schedules"` +} + +type InfoReplicationProfile struct { + // ID of the replication profile + ID uint64 `json:"id"` + + // GUID + GUID uint64 `json:"guid"` + + // Name of the replication profile + Name string `json:"name"` + + // Replication types + ReplicationType []string `json:"replication_type"` + + // Max copy rate + MAXCopyRate uint64 `json:"max_copy_rate"` + + // List of schedules + Schedules ListSchedules `json:"schedules"` +} + +type ListSchedules []Schedule + +type Schedule struct { + // Type of the schedule + Type string `json:"type"` + + // Name of the schedule + Name string `json:"name"` + + // Min interval + MINInterval uint64 `json:"min_interval"` + + // Calendar of the schedule + Calendar Calendar `json:"calendar"` +} + +type Calendar struct { + // Weekly schedule + Weekly map[string][]string `json:"weekly"` +} diff --git a/pkg/cloudapi/vmfolder.go b/pkg/cloudapi/vmfolder.go new file mode 100644 index 0000000..35f3605 --- /dev/null +++ b/pkg/cloudapi/vmfolder.go @@ -0,0 +1,10 @@ +package cloudapi + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vmfolder" +) + +// Accessing the VMFolder method group +func (ca *CloudAPI) VMFolder() *vmfolder.VMFolder { + return vmfolder.New(ca.client) +} diff --git a/pkg/cloudapi/vmfolder/add_acl_access.go b/pkg/cloudapi/vmfolder/add_acl_access.go new file mode 100644 index 0000000..965df00 --- /dev/null +++ b/pkg/cloudapi/vmfolder/add_acl_access.go @@ -0,0 +1,47 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// AddACLAccessRequest adds ACL access to a vm folder +type AddACLAccessRequest struct { + // ID of a folder + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` + + // User or group name to grant access + // Required: true + User string `url:"user" json:"user" validate:"required"` + + // ID of a folder + // Required: true + Right string `url:"right" json:"right" validate:"required"` +} + +// AddACLAccess adds ACL access to a vm folder +func (v VMFolder) AddACLAccess(ctx context.Context, req AddACLAccessRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/add_acl_access" + + res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/cloudapi/vmfolder/computes_move.go b/pkg/cloudapi/vmfolder/computes_move.go new file mode 100644 index 0000000..cf14de7 --- /dev/null +++ b/pkg/cloudapi/vmfolder/computes_move.go @@ -0,0 +1,42 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ComputesMoveRequest struct to move computes to a vm folder +type ComputesMoveRequest struct { + // IDs of computes to move + // Required: true + ComputeIDs []uint64 `url:"compute_ids" json:"compute_ids" validate:"required"` + + // Target vm folder ID + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` +} + +// ComputesMove moves computes to a vm folder +func (v VMFolder) ComputesMove(ctx context.Context, req ComputesMoveRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/computes_move" + + res, err := v.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/cloudapi/vmfolder/create.go b/pkg/cloudapi/vmfolder/create.go new file mode 100644 index 0000000..0e35c4c --- /dev/null +++ b/pkg/cloudapi/vmfolder/create.go @@ -0,0 +1,47 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// CreateRequest struct to create a vm folder +type CreateRequest struct { + // Resource Group ID + // Required: true + RGID uint64 `url:"rg_id" json:"rg_id" validate:"required"` + + // Name + // Required: true + Name string `url:"name" json:"name" validate:"required"` + + // Parent ID + // Required: false + ParentID uint64 `url:"parent_id,omitempty" json:"parent_id,omitempty"` +} + +// Create creates a vm folder +func (v VMFolder) Create(ctx context.Context, req CreateRequest) (uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + return 0, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/create" + + res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/cloudapi/vmfolder/del_acl_access.go b/pkg/cloudapi/vmfolder/del_acl_access.go new file mode 100644 index 0000000..9f67e19 --- /dev/null +++ b/pkg/cloudapi/vmfolder/del_acl_access.go @@ -0,0 +1,43 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DeleteACLAccessRequest deletes ACL access from a vm folder +type DelACLAccessRequest struct { + // ID of a folder + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` + + // User or group name to revoke access from + // Required: true + User string `url:"user" json:"user" validate:"required"` +} + +// DeleteACLAccess deletes ACL access from a vm foler +func (v VMFolder) DeleteACLAccess(ctx context.Context, req DelACLAccessRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/del_acl_access" + + res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/cloudapi/vmfolder/delete.go b/pkg/cloudapi/vmfolder/delete.go new file mode 100644 index 0000000..00c60f0 --- /dev/null +++ b/pkg/cloudapi/vmfolder/delete.go @@ -0,0 +1,38 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DeleteRequest struct to delete a VM folder +type DeleteRequest struct { + // ID of a folder to delete + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` +} + +// Delete deletes a vm folder +func (v VMFolder) Delete(ctx context.Context, req DeleteRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/delete" + + res, err := v.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/cloudapi/vmfolder/get.go b/pkg/cloudapi/vmfolder/get.go new file mode 100644 index 0000000..e2879ac --- /dev/null +++ b/pkg/cloudapi/vmfolder/get.go @@ -0,0 +1,46 @@ +package vmfolder + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// GetRequest struct to get detailed information about a vm folder +type GetRequest struct { + // ID of a folder + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` +} + +// Get gets current configuration of the vm folder as a RecordVMFolder struct +func (v VMFolder) Get(ctx context.Context, req GetRequest) (*RecordVMFolder, error) { + res, err := v.GetRaw(ctx, req) + if err != nil { + return nil, err + } + + info := RecordVMFolder{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets current configuration of the vm folder as an array of bytes +func (v VMFolder) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/get" + + res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/vmfolder/list.go b/pkg/cloudapi/vmfolder/list.go new file mode 100644 index 0000000..77b0118 --- /dev/null +++ b/pkg/cloudapi/vmfolder/list.go @@ -0,0 +1,55 @@ +package vmfolder + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ListRequest struct to get list of vm folders +type ListRequest struct { + // Resource group ID + // Required: true + RGID uint64 `url:"rg_id" json:"rg_id" validate:"required"` + + // Page number + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` +} + +// List gets list of all vm folders in a resource group as a ListVMFolder struct +func (v VMFolder) List(ctx context.Context, req ListRequest) (*ListVMFolder, error) { + + res, err := v.ListRaw(ctx, req) + if err != nil { + return nil, err + } + + list := ListVMFolder{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return &list, nil +} + +// ListRaw gets list of all vm folders in a resource group as an array of bytes +func (v VMFolder) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) { + + if err := validators.ValidateRequest(req); err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/list" + + res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudapi/vmfolder/models.go b/pkg/cloudapi/vmfolder/models.go new file mode 100644 index 0000000..32e84ce --- /dev/null +++ b/pkg/cloudapi/vmfolder/models.go @@ -0,0 +1,79 @@ +package vmfolder + +// Detailed information about a folder +type RecordVMFolder struct { + // ID + ID uint64 `json:"id"` + + // RG ID + RGID uint64 `json:"rg_id"` + + // GID + GID uint64 `json:"gid"` + + // Name of a folder + Name string `json:"name"` + + // ACL + ACL []ACL `json:"acl"` + + // Time of creation + CreatedTime uint64 `json:"created_time"` + + // Parent ID + ParentID uint64 `json:"parent_id"` + + // Status of a folder + Status string `json:"status"` + + // Compute IDs + ComputeIDs []uint64 `json:"compute_ids"` +} + +// ACL +type ACL struct { + // Explicit + Explicit bool `json:"explicit"` + + // Right + Right string `json:"right"` + + // Status + Status string `json:"status"` + + // Type + Type string `json:"type"` + + // User group ID + UserGroupID string `json:"userGroupId"` +} + +// List of vm folders +type ListVMFolder struct { + // Entry count + EntryCount uint64 `json:"entryCount"` + + // Data + Data []ItemVMFolder `json:"data"` +} + +// Detailed information about a folder item +type ItemVMFolder struct { + // Folder ID + ID uint64 `json:"id"` + + // Parent ID + ParentID uint64 `json:"parent_id"` + + // Name + Name string `json:"name"` + + // ACL + ACL []ACL `json:"acl"` + + // Status + Status string `json:"status"` + + // VM count + VMCount uint64 `json:"vm_count"` +} diff --git a/pkg/cloudapi/vmfolder/move.go b/pkg/cloudapi/vmfolder/move.go new file mode 100644 index 0000000..a5f7f2b --- /dev/null +++ b/pkg/cloudapi/vmfolder/move.go @@ -0,0 +1,42 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// MoveRequest to move a vm folder to a compute +type MoveRequest struct { + // VM Folder ID + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id"` + + // New parent folder ID + // Required: true + NewParentID uint64 `url:"new_parent_id" json:"new_parent_id"` +} + +// Move moves a vm folder to a compute +func (v VMFolder) Move(ctx context.Context, req MoveRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/move" + + res, err := v.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/cloudapi/vmfolder/rename.go b/pkg/cloudapi/vmfolder/rename.go new file mode 100644 index 0000000..95d5c5a --- /dev/null +++ b/pkg/cloudapi/vmfolder/rename.go @@ -0,0 +1,42 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// RenameRequest struct to rename a VM folder +type RenameRequest struct { + // ID of a folder to rename + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` + + // A new name + // Required: true + Name string `url:"name" json:"name" validate:"required"` +} + +// Rename renames a vm folder +func (v VMFolder) Rename(ctx context.Context, req RenameRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudapi/vmfolder/rename" + + res, err := v.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/cloudapi/vmfolder/vmfolder.go b/pkg/cloudapi/vmfolder/vmfolder.go new file mode 100644 index 0000000..b6dbc43 --- /dev/null +++ b/pkg/cloudapi/vmfolder/vmfolder.go @@ -0,0 +1,17 @@ +package vmfolder + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" +) + +// Structure for creating request to VMFolder +type VMFolder struct { + client interfaces.Caller +} + +// Builder for VMFolder endpoints +func New(client interfaces.Caller) *VMFolder { + return &VMFolder{ + client, + } +} diff --git a/pkg/cloudbroker/apiaccess/desc_update.go b/pkg/cloudbroker/apiaccess/desc_update.go index 1434aa9..8460d7e 100644 --- a/pkg/cloudbroker/apiaccess/desc_update.go +++ b/pkg/cloudbroker/apiaccess/desc_update.go @@ -2,8 +2,8 @@ package apiaccess import ( "context" + "encoding/json" "net/http" - "strconv" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) @@ -20,23 +20,25 @@ type DescUpdateRequest struct { } // DescUpdate sets a new text description of the apiaccess group. -func (a APIAccess) DescUpdate(ctx context.Context, req DescUpdateRequest) (bool, error) { +func (a APIAccess) DescUpdate(ctx context.Context, req DescUpdateRequest) (*ItemAPIAccess, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return nil, validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/apiaccess/descUpdate" res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return nil, err } - result, err := strconv.ParseBool(string(res)) + info := ItemAPIAccess{} + + err = json.Unmarshal(res, &info) if err != nil { - return false, err + return nil, err } - return result, nil + return &info, nil } diff --git a/pkg/cloudbroker/apiaccess/models.go b/pkg/cloudbroker/apiaccess/models.go index 61a1d84..9b808fa 100644 --- a/pkg/cloudbroker/apiaccess/models.go +++ b/pkg/cloudbroker/apiaccess/models.go @@ -1,5 +1,7 @@ package apiaccess +import "encoding/json" + type ItemAPIAccess struct { // APIs APIs APIsEndpoints `json:"apis"` @@ -88,43 +90,74 @@ type APIsEndpoints struct { // CloudBroker endpoints CloudBroker CloudBrokerEndpoints `json:"cloudbroker,omitempty"` - // LibCloud endpoints - LibCloud LibCloudEndpoints `json:"libcloud,omitempty"` + // SDN endpoints + SDN SDNEndpoints `json:"sdn,omitempty"` // System endpoints System SystemEndpoints `json:"system,omitempty"` } +// MarshalJSON omits empty namespaces, so that "{}" is not sent in requests. +func (a APIsEndpoints) MarshalJSON() ([]byte, error) { + namespaces := []struct { + key string + value interface{} + }{ + {"cloudapi", a.CloudAPI}, + {"cloudbroker", a.CloudBroker}, + {"sdn", a.SDN}, + {"system", a.System}, + } + + result := make(map[string]json.RawMessage, len(namespaces)) + + for _, ns := range namespaces { + data, err := json.Marshal(ns.value) + if err != nil { + return nil, err + } + + if string(data) == "{}" { + continue + } + + result[ns.key] = data + } + + return json.Marshal(result) +} + 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"` - DPDK []string `json:"dpdk,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"` - 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"` + Account []string `json:"account,omitempty"` + Audit []string `json:"audit,omitempty"` + BService []string `json:"bservice,omitempty"` + Compute []string `json:"compute,omitempty"` + Disks []string `json:"disks,omitempty"` + DPDKNet []string `json:"dpdknet,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"` + KVMX86 []string `json:"kvmx86,omitempty"` + LB []string `json:"lb,omitempty"` + Loactions []string `json:"locations,omitempty"` + PCIDevice []string `json:"pcidevice,omitempty"` + Prometheus []string `json:"prometheus,omitempty"` + RG []string `json:"rg,omitempty"` + SecurityGroup []string `json:"security_group,omitempty"` + SEP []string `json:"sep,omitempty"` + StoragePolicy []string `json:"storage_policy,omitempty"` + Tasks []string `json:"tasks,omitempty"` + Trunk []string `json:"trunk,omitempty"` + User []string `json:"user,omitempty"` + VFPool []string `json:"vfpool,omitempty"` + VGPU []string `json:"vgpu,omitempty"` + VINS []string `json:"vins,omitempty"` + VMFolder []string `json:"vmfolder,omitempty"` + Zone []string `json:"zone,omitempty"` + All bool `json:"ALL,omitempty"` } type CloudBrokerEndpoints struct { @@ -133,74 +166,85 @@ type CloudBrokerEndpoints struct { Audit interface{} `json:"audit,omitempty"` AuditBeat []string `json:"auditbeat,omitempty"` AuditCollector []string `json:"auditcollector,omitempty"` + Backup []string `json:"backup,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"` - DPDK []string `json:"dpdk,omitempty"` + DPDKNet []string `json:"dpdknet,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 interface{} `json:"job,omitempty"` K8CI []string `json:"k8ci,omitempty"` K8S []string `json:"k8s,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"` - Openshift []string `json:"openshift,omitempty"` - OpenshiftCI []string `json:"openshiftci,omitempty"` - Ovsnode []string `json:"ovsnode,omitempty"` + Node []string `json:"node,omitempty"` PCIDevice []string `json:"pcidevice,omitempty"` PGPU []string `json:"pgpu,omitempty"` Prometheus []string `json:"prometheus,omitempty"` - QOS []string `json:"qos,omitempty"` Resmon interface{} `json:"resmon,omitempty"` RG []string `json:"rg,omitempty"` + SecurityGroup []string `json:"security_group,omitempty"` Sep []string `json:"sep,omitempty"` - Node []string `json:"node,omitempty"` + StoragePolicy []string `json:"storage_policy,omitempty"` Tasks []string `json:"tasks,omitempty"` TLock []string `json:"tlock,omitempty"` + Trunk []string `json:"trunk,omitempty"` User []string `json:"user,omitempty"` + VFPool []string `json:"vfpool,omitempty"` VGPU []string `json:"vgpu,omitempty"` VINS []string `json:"vins,omitempty"` + VMFolder []string `json:"vmfolder,omitempty"` VNFDev []string `json:"vnfdev,omitempty"` ZeroAccess []string `json:"zeroaccess,omitempty"` + Zone []string `json:"zone,omitempty"` All bool `json:"ALL,omitempty"` } -type LibCloudEndpoints struct { - Libvirt []string `json:"libvirt,omitempty"` - All bool `json:"ALL,omitempty"` +type SDNEndpoints struct { + AccessGroup []string `json:"access_group,omitempty"` + AddressPool []string `json:"address_pool,omitempty"` + DefaultSecurityPolicy []string `json:"default_security_policy,omitempty"` + ExternalNetwork []string `json:"external_network,omitempty"` + FloatingIP []string `json:"floating_ip,omitempty"` + Hypervisor []string `json:"hypervisor,omitempty"` + L2ExternalNetwork []string `json:"l2_external_network,omitempty"` + LogicalPort []string `json:"logical_port,omitempty"` + NetworkObjectGroup []string `json:"network_object_group,omitempty"` + Router []string `json:"router,omitempty"` + RouterGatewayPort []string `json:"router/gateway_port,omitempty"` + RouterPolicies []string `json:"router/policies,omitempty"` + RouterRouterPort []string `json:"router/router_port,omitempty"` + RouterStaticRoute []string `json:"router/static_route,omitempty"` + SecurityPolicy []string `json:"security_policy,omitempty"` + SecurityPolicyRule []string `json:"security_policy/rule,omitempty"` + SecurityRule []string `json:"security_rule,omitempty"` + Segment []string `json:"segment,omitempty"` + Version []string `json:"version,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"` + Audits []string `json:"audits,omitempty"` + Cache []string `json:"cache,omitempty"` + ContentManager []string `json:"contentmanager,omitempty"` + DocGenerator []string `json:"docgenerator,omitempty"` + EmailSender []string `json:"emailsender,omitempty"` + GridManager []string `json:"gridmanager,omitempty"` + Health []string `json:"health,omitempty"` + Info []string `json:"info,omitempty"` + InfoWellknown []string `json:"info/wellknown,omitempty"` + InfoMGR []string `json:"infomgr,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/update.go b/pkg/cloudbroker/apiaccess/update.go index 2567537..2b15655 100644 --- a/pkg/cloudbroker/apiaccess/update.go +++ b/pkg/cloudbroker/apiaccess/update.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "net/http" - "strconv" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) @@ -27,10 +26,10 @@ type wrapperUpdateRequest struct { } // Update updates apis of apiaccess group. -func (a APIAccess) Update(ctx context.Context, req UpdateRequest) (bool, error) { +func (a APIAccess) Update(ctx context.Context, req UpdateRequest) (*ItemAPIAccess, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return nil, validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/apiaccess/update" @@ -41,20 +40,22 @@ func (a APIAccess) Update(ctx context.Context, req UpdateRequest) (bool, error) apiJSON, err := json.Marshal(&req.APIs) if err != nil { - return false, err + return nil, err } reqWrapped.APIString = string(apiJSON) res, err := a.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped) if err != nil { - return false, err + return nil, err } - result, err := strconv.ParseBool(string(res)) + info := ItemAPIAccess{} + + err = json.Unmarshal(res, &info) if err != nil { - return false, err + return nil, err } - return result, nil + return &info, nil } diff --git a/pkg/cloudbroker/backup/create_disk_backup.go b/pkg/cloudbroker/backup/create_disk_backup.go index 5f294f4..2a8f181 100644 --- a/pkg/cloudbroker/backup/create_disk_backup.go +++ b/pkg/cloudbroker/backup/create_disk_backup.go @@ -31,7 +31,7 @@ type CreateDiskBackupRequest struct { type wrapperCreateDiskBackupRequest struct { CreateDiskBackupRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateDiskBackup creates disk backup diff --git a/pkg/cloudbroker/backup/create_disks_backup.go b/pkg/cloudbroker/backup/create_disks_backup.go index e14f100..a988069 100644 --- a/pkg/cloudbroker/backup/create_disks_backup.go +++ b/pkg/cloudbroker/backup/create_disks_backup.go @@ -33,7 +33,7 @@ type CreateDisksBackupRequest struct { type wrapperCreateDisksBackupRequest struct { CreateDisksBackupRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateDisksBackup creates disks backup diff --git a/pkg/cloudbroker/backup/delete_disk_backup.go b/pkg/cloudbroker/backup/delete_disk_backup.go index 225e5e5..92feec9 100644 --- a/pkg/cloudbroker/backup/delete_disk_backup.go +++ b/pkg/cloudbroker/backup/delete_disk_backup.go @@ -21,7 +21,7 @@ type DeleteDiskBackupRequest struct { type wrapperDeleteDiskBackupRequest struct { DeleteDiskBackupRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DeleteDiskBackup deletes disk backup diff --git a/pkg/cloudbroker/backup/restore_disk_from_backup.go b/pkg/cloudbroker/backup/restore_disk_from_backup.go index ce04722..63a4c68 100644 --- a/pkg/cloudbroker/backup/restore_disk_from_backup.go +++ b/pkg/cloudbroker/backup/restore_disk_from_backup.go @@ -30,7 +30,7 @@ type RestoreDiskFromBackupRequest struct { type wrapperRestoreDiskFromBackupRequest struct { RestoreDiskFromBackupRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // RestoreDiskFromBackup restores disk from backup diff --git a/pkg/cloudbroker/backup/restore_disks_from_backup.go b/pkg/cloudbroker/backup/restore_disks_from_backup.go index 1e0d1c6..00c7b02 100644 --- a/pkg/cloudbroker/backup/restore_disks_from_backup.go +++ b/pkg/cloudbroker/backup/restore_disks_from_backup.go @@ -35,7 +35,7 @@ type RestoreDisksFromBackupRequest struct { type wrapperRestoreDisksFromBackupRequest struct { RestoreDisksFromBackupRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // RestoreDisksFromBackup restores disks from backup diff --git a/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go b/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go index 7840f96..975e83e 100644 --- a/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go +++ b/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go @@ -20,7 +20,7 @@ type AbortSharedSnapshotMergeRequest struct { type wrapperAbortSharedSnapshotMergeRequest struct { AbortSharedSnapshotMergeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // AbortSharedSnapshotMerge shared snapshots merge abort diff --git a/pkg/cloudbroker/compute/affinity_rule_add.go b/pkg/cloudbroker/compute/affinity_rule_add.go index 0addc87..7461e49 100644 --- a/pkg/cloudbroker/compute/affinity_rule_add.go +++ b/pkg/cloudbroker/compute/affinity_rule_add.go @@ -2,6 +2,7 @@ package compute import ( "context" + "encoding/json" "net/http" "strconv" @@ -42,6 +43,17 @@ type AffinityRuleAddRequest struct { // Value that must match the key to be taken into account when analyzing this rule // Required: true Value string `url:"value" json:"value" validate:"required"` + + // Migrate compute according to the rule + // Default: false + // Required: false + Migrate bool `url:"migrate" json:"migrate"` +} + +type wrapperAffinityRuleAddRequest struct { + AffinityRuleAddRequest + + AsyncMode bool `url:"async_mode"` } // AffinityRuleAdd adds affinity rule @@ -53,7 +65,12 @@ func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest url := "/cloudbroker/compute/affinityRuleAdd" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + aReq := wrapperAffinityRuleAddRequest{ + AffinityRuleAddRequest: req, + AsyncMode: false, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) if err != nil { return false, err } @@ -65,3 +82,32 @@ func (c Compute) AffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest return result, nil } + +// AsyncAffinityRuleAdd add affinity rule in async mode +func (c Compute) AsyncAffinityRuleAdd(ctx context.Context, req AffinityRuleAddRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/compute/affinityRuleAdd" + + aReq := wrapperAffinityRuleAddRequest{ + AffinityRuleAddRequest: req, + AsyncMode: true, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) + if err != nil { + return "", err + } + + var resp string + + err = json.Unmarshal(res, &resp) + if err != nil { + return "", err + } + + return resp, nil +} diff --git a/pkg/cloudbroker/compute/anti_affinity_rule_add.go b/pkg/cloudbroker/compute/anti_affinity_rule_add.go index d9007b7..cc6dd98 100644 --- a/pkg/cloudbroker/compute/anti_affinity_rule_add.go +++ b/pkg/cloudbroker/compute/anti_affinity_rule_add.go @@ -2,6 +2,7 @@ package compute import ( "context" + "encoding/json" "net/http" "strconv" @@ -40,6 +41,17 @@ type AntiAffinityRuleAddRequest struct { // Value that must match the key to be taken into account when analyzing this rule // Required: true Value string `url:"value" json:"value" validate:"required"` + + // Migrate compute according to the rule + // Default: false + // Required: false + Migrate bool `url:"migrate" json:"migrate"` +} + +type wrapperAntiAffinityRuleAddRequest struct { + AntiAffinityRuleAddRequest + + AsyncMode bool `url:"async_mode"` } // AntiAffinityRuleAdd adds anti affinity rule @@ -51,7 +63,12 @@ func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAd url := "/cloudbroker/compute/antiAffinityRuleAdd" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + aReq := wrapperAntiAffinityRuleAddRequest{ + AntiAffinityRuleAddRequest: req, + AsyncMode: false, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) if err != nil { return false, err } @@ -63,3 +80,32 @@ func (c Compute) AntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAd return result, nil } + +// AsyncAntiAffinityRuleAdd add anti affinity rule in async mode +func (c Compute) AsyncAntiAffinityRuleAdd(ctx context.Context, req AntiAffinityRuleAddRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/compute/antiAffinityRuleAdd" + + aReq := wrapperAntiAffinityRuleAddRequest{ + AntiAffinityRuleAddRequest: req, + AsyncMode: true, + } + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) + if err != nil { + return "", err + } + + var resp string + + err = json.Unmarshal(res, &resp) + if err != nil { + return "", err + } + + return resp, nil +} diff --git a/pkg/cloudbroker/compute/cd_eject.go b/pkg/cloudbroker/compute/cd_eject.go index e5c4a2a..6306a07 100644 --- a/pkg/cloudbroker/compute/cd_eject.go +++ b/pkg/cloudbroker/compute/cd_eject.go @@ -18,7 +18,7 @@ type CDEjectRequest struct { type wrapperCDEjectRequest struct { CDEjectRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CDEject ejects CD image to compute's CD-ROM diff --git a/pkg/cloudbroker/compute/cd_insert.go b/pkg/cloudbroker/compute/cd_insert.go index 28bd246..036d816 100644 --- a/pkg/cloudbroker/compute/cd_insert.go +++ b/pkg/cloudbroker/compute/cd_insert.go @@ -21,7 +21,7 @@ type CDInsertRequest struct { type wrapperCDInsertRequest struct { CDInsertRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CDInsert inserts new CD image to compute's CD-ROM diff --git a/pkg/cloudbroker/compute/change_ip.go b/pkg/cloudbroker/compute/change_ip.go index f37f03b..7ad9fa5 100644 --- a/pkg/cloudbroker/compute/change_ip.go +++ b/pkg/cloudbroker/compute/change_ip.go @@ -34,7 +34,7 @@ type ChangeIPRequest struct { type wrapperChangeIPRequest struct { ChangeIPRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeIP change reserved IP for compute instance diff --git a/pkg/cloudbroker/compute/change_link_state.go b/pkg/cloudbroker/compute/change_link_state.go index bf877a3..88044f8 100644 --- a/pkg/cloudbroker/compute/change_link_state.go +++ b/pkg/cloudbroker/compute/change_link_state.go @@ -27,7 +27,7 @@ type ChangeLinkStateRequest struct { type wrapperChangeLinkStateRequest struct { ChangeLinkStateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeLinkState changes the status link virtual of compute diff --git a/pkg/cloudbroker/compute/change_mtu.go b/pkg/cloudbroker/compute/change_mtu.go index 1486624..c1c4715 100644 --- a/pkg/cloudbroker/compute/change_mtu.go +++ b/pkg/cloudbroker/compute/change_mtu.go @@ -26,7 +26,7 @@ type ChangeMTURequest struct { type wrapperChangeMTURequest struct { ChangeMTURequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeMTU change MTU for compute instance diff --git a/pkg/cloudbroker/compute/change_qos_policies.go b/pkg/cloudbroker/compute/change_qos_policies.go index 0bf74a2..6e19dfa 100644 --- a/pkg/cloudbroker/compute/change_qos_policies.go +++ b/pkg/cloudbroker/compute/change_qos_policies.go @@ -26,7 +26,7 @@ type ChangeQoSPoliciesRequest struct { type wrapperChangeQoSPoliciesRequest struct { ChangeQoSPoliciesRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeQoSPolicies change qos policies for compute diff --git a/pkg/cloudbroker/compute/change_secutity_group.go b/pkg/cloudbroker/compute/change_secutity_group.go index 8f5b6b2..4d904b2 100644 --- a/pkg/cloudbroker/compute/change_secutity_group.go +++ b/pkg/cloudbroker/compute/change_secutity_group.go @@ -30,7 +30,7 @@ type ChangeSecGroupsRequest struct { type wrapperChangeSecGroupsRequest struct { ChangeSecGroupsRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // ChangeSecGroups changes security groups for compute diff --git a/pkg/cloudbroker/compute/clone.go b/pkg/cloudbroker/compute/clone.go index 633428e..46ca5a7 100644 --- a/pkg/cloudbroker/compute/clone.go +++ b/pkg/cloudbroker/compute/clone.go @@ -47,7 +47,7 @@ type CloneRequest struct { type wrapperCloneRequest struct { CloneRequest - AsyncMode bool `url:"asyncMode" json:"asyncMode"` + AsyncMode bool `url:"async_mode" json:"async_mode"` } // Clone clones compute instance diff --git a/pkg/cloudbroker/compute/create_template.go b/pkg/cloudbroker/compute/create_template.go index d3883ae..739cf91 100644 --- a/pkg/cloudbroker/compute/create_template.go +++ b/pkg/cloudbroker/compute/create_template.go @@ -22,7 +22,7 @@ type CreateTemplateRequest struct { type wrapperCreateTemplateRequest struct { CreateTemplateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateTemplate create template from compute instance diff --git a/pkg/cloudbroker/compute/create_template_from_blank.go b/pkg/cloudbroker/compute/create_template_from_blank.go index c63c4a6..cbd0c0b 100644 --- a/pkg/cloudbroker/compute/create_template_from_blank.go +++ b/pkg/cloudbroker/compute/create_template_from_blank.go @@ -55,7 +55,7 @@ type CreateTemplateFromBlankRequest struct { type wrapperCreateTemplateFromBlankRequest struct { CreateTemplateFromBlankRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateTemplateFromBlank creates template from boot disk of current compute in sync mode. diff --git a/pkg/cloudbroker/compute/delete.go b/pkg/cloudbroker/compute/delete.go index d63dd8d..6efce2c 100644 --- a/pkg/cloudbroker/compute/delete.go +++ b/pkg/cloudbroker/compute/delete.go @@ -26,7 +26,7 @@ type DeleteRequest struct { type wrapperDeleteRequest struct { DeleteRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Delete deletes compute diff --git a/pkg/cloudbroker/compute/disable.go b/pkg/cloudbroker/compute/disable.go index 8d36e49..c2d529b 100644 --- a/pkg/cloudbroker/compute/disable.go +++ b/pkg/cloudbroker/compute/disable.go @@ -18,7 +18,7 @@ type DisableRequest struct { type wrapperDisableRequest struct { DisableRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Disable disables compute diff --git a/pkg/cloudbroker/compute/disk_add.go b/pkg/cloudbroker/compute/disk_add.go index 1bac6ad..39beff3 100644 --- a/pkg/cloudbroker/compute/disk_add.go +++ b/pkg/cloudbroker/compute/disk_add.go @@ -68,7 +68,7 @@ type DiskAddRequest struct { type wrapperDiskAddRequest struct { DiskAddRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskAdd creates new disk and attach to compute diff --git a/pkg/cloudbroker/compute/disk_attach.go b/pkg/cloudbroker/compute/disk_attach.go index 9ef2727..511513b 100644 --- a/pkg/cloudbroker/compute/disk_attach.go +++ b/pkg/cloudbroker/compute/disk_attach.go @@ -34,7 +34,7 @@ type DiskAttachRequest struct { type wrapperDiskAttachRequest struct { DiskAttachRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskAttach attach disk to compute diff --git a/pkg/cloudbroker/compute/disk_del.go b/pkg/cloudbroker/compute/disk_del.go index 4399fcb..6d1b1c1 100644 --- a/pkg/cloudbroker/compute/disk_del.go +++ b/pkg/cloudbroker/compute/disk_del.go @@ -26,7 +26,7 @@ type DiskDelRequest struct { type wrapperDiskDelRequest struct { DiskDelRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskDel deletes disk and detaches it from compute diff --git a/pkg/cloudbroker/compute/disk_detach.go b/pkg/cloudbroker/compute/disk_detach.go index 1ad29ee..82cc76f 100644 --- a/pkg/cloudbroker/compute/disk_detach.go +++ b/pkg/cloudbroker/compute/disk_detach.go @@ -22,7 +22,7 @@ type DiskDetachRequest struct { type wrapperDiskDetachRequest struct { DiskDetachRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskDetach detaches disk from compute diff --git a/pkg/cloudbroker/compute/disk_qos.go b/pkg/cloudbroker/compute/disk_qos.go index 63af8fe..8717b40 100644 --- a/pkg/cloudbroker/compute/disk_qos.go +++ b/pkg/cloudbroker/compute/disk_qos.go @@ -26,7 +26,7 @@ type DiskQOSRequest struct { type wrapperDiskQOSRequest struct { DiskQOSRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskQOS changes QOS of the disk diff --git a/pkg/cloudbroker/compute/disk_resize.go b/pkg/cloudbroker/compute/disk_resize.go index 5c135f8..53c8820 100644 --- a/pkg/cloudbroker/compute/disk_resize.go +++ b/pkg/cloudbroker/compute/disk_resize.go @@ -26,7 +26,7 @@ type DiskResizeRequest struct { type wrapperDiskResizeRequest struct { DiskResizeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskResize changes disk size diff --git a/pkg/cloudbroker/compute/disk_switch_to_replication.go b/pkg/cloudbroker/compute/disk_switch_to_replication.go index 056585f..9465df9 100644 --- a/pkg/cloudbroker/compute/disk_switch_to_replication.go +++ b/pkg/cloudbroker/compute/disk_switch_to_replication.go @@ -26,7 +26,7 @@ type DiskSwitchToReplicationRequest struct { type wrapperDiskSwitchToReplicationRequest struct { DiskSwitchToReplicationRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // DiskSwitchToReplication switches disk to it's replication diff --git a/pkg/cloudbroker/compute/guest_agent_disable.go b/pkg/cloudbroker/compute/guest_agent_disable.go index 5218228..b085f10 100644 --- a/pkg/cloudbroker/compute/guest_agent_disable.go +++ b/pkg/cloudbroker/compute/guest_agent_disable.go @@ -18,7 +18,7 @@ type GuestAgentDisableRequest struct { type wrapperGuestAgentDisableRequest struct { GuestAgentDisableRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Disable guest agent at a specific compute diff --git a/pkg/cloudbroker/compute/guest_agent_enable.go b/pkg/cloudbroker/compute/guest_agent_enable.go index c082103..acd8160 100644 --- a/pkg/cloudbroker/compute/guest_agent_enable.go +++ b/pkg/cloudbroker/compute/guest_agent_enable.go @@ -18,7 +18,7 @@ type GuestAgentEnableRequest struct { type wrapperGuestAgentEnableRequest struct { GuestAgentEnableRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Enable guest agent at a specific compute diff --git a/pkg/cloudbroker/compute/guest_agent_execute.go b/pkg/cloudbroker/compute/guest_agent_execute.go index c4c3bb6..5cef919 100644 --- a/pkg/cloudbroker/compute/guest_agent_execute.go +++ b/pkg/cloudbroker/compute/guest_agent_execute.go @@ -26,7 +26,7 @@ type GuestAgentExecuteRequest struct { type wrapperGuestAgentExecuteRequest struct { GuestAgentExecuteRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Execute guest agent command diff --git a/pkg/cloudbroker/compute/guest_agent_feature_update.go b/pkg/cloudbroker/compute/guest_agent_feature_update.go index 8c6b623..ea5735d 100644 --- a/pkg/cloudbroker/compute/guest_agent_feature_update.go +++ b/pkg/cloudbroker/compute/guest_agent_feature_update.go @@ -18,7 +18,7 @@ type GuestAgentFeatureUpdateRequest struct { type wrapperGuestAgentFeatureUpdateRequest struct { GuestAgentFeatureUpdateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Feature update guest agent diff --git a/pkg/cloudbroker/compute/list.go b/pkg/cloudbroker/compute/list.go index fab1eec..6bf205f 100644 --- a/pkg/cloudbroker/compute/list.go +++ b/pkg/cloudbroker/compute/list.go @@ -75,6 +75,14 @@ type ListRequest struct { // Required: false ZoneID uint64 `url:"zone_id,omitempty" json:"zone_id,omitempty"` + // Find by VM folder ID + // Required: false + FolderID uint64 `url:"folder_id,omitempty" json:"folder_id,omitempty"` + + // Include computes from descendant folders. + // Required: false + IncludeDescendants interface{} `url:"include_descendants,omitempty" json:"include_descendants,omitempty" validate:"omitempty,isBool"` + // Page number // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` diff --git a/pkg/cloudbroker/compute/mass_delete.go b/pkg/cloudbroker/compute/mass_delete.go index 3668232..6989095 100644 --- a/pkg/cloudbroker/compute/mass_delete.go +++ b/pkg/cloudbroker/compute/mass_delete.go @@ -22,7 +22,7 @@ type MassDeleteRequest struct { type wrapperMassDeleteRequest struct { MassDeleteRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MassDelete starts jobs to delete several computes diff --git a/pkg/cloudbroker/compute/mass_reboot.go b/pkg/cloudbroker/compute/mass_reboot.go index d9e9c17..f91dec5 100644 --- a/pkg/cloudbroker/compute/mass_reboot.go +++ b/pkg/cloudbroker/compute/mass_reboot.go @@ -18,7 +18,7 @@ type MassRebootRequest struct { type wrapperMassRebootRequest struct { MassRebootRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MassReboot starts jobs to reboot several computes diff --git a/pkg/cloudbroker/compute/mass_start.go b/pkg/cloudbroker/compute/mass_start.go index e099ba2..9ca246c 100644 --- a/pkg/cloudbroker/compute/mass_start.go +++ b/pkg/cloudbroker/compute/mass_start.go @@ -18,7 +18,7 @@ type MassStartRequest struct { type wrapperMassStartRequest struct { MassStartRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MassStart starts jobs to start several computes diff --git a/pkg/cloudbroker/compute/mass_stop.go b/pkg/cloudbroker/compute/mass_stop.go index 20047fd..e09713a 100644 --- a/pkg/cloudbroker/compute/mass_stop.go +++ b/pkg/cloudbroker/compute/mass_stop.go @@ -22,7 +22,7 @@ type MassStopRequest struct { type wrapperMassStopRequest struct { MassStopRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MassStop starts jobs to stop several computes diff --git a/pkg/cloudbroker/compute/migrate.go b/pkg/cloudbroker/compute/migrate.go index 74fed6d..5ed7c6a 100644 --- a/pkg/cloudbroker/compute/migrate.go +++ b/pkg/cloudbroker/compute/migrate.go @@ -22,7 +22,7 @@ type MigrateRequest struct { type AsyncWrapperMigrateRequest struct { MigrateRequest - SyncMode bool `url:"sync"` + AsyncMode bool `url:"async_mode"` } // Migrate migrates compute to another node @@ -34,7 +34,7 @@ func (c Compute) Migrate(ctx context.Context, req MigrateRequest) (bool, error) url := "/cloudbroker/compute/migrate" - syncReq := AsyncWrapperMigrateRequest{MigrateRequest: req, SyncMode: true} + syncReq := AsyncWrapperMigrateRequest{MigrateRequest: req, AsyncMode: false} res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, syncReq) if err != nil { @@ -58,7 +58,7 @@ func (c Compute) AsyncMigrate(ctx context.Context, req MigrateRequest) (string, url := "/cloudbroker/compute/migrate" - asyncReq := AsyncWrapperMigrateRequest{MigrateRequest: req, SyncMode: false} + asyncReq := AsyncWrapperMigrateRequest{MigrateRequest: req, AsyncMode: true} res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, asyncReq) if err != nil { diff --git a/pkg/cloudbroker/compute/migrate_abort.go b/pkg/cloudbroker/compute/migrate_abort.go index 8465602..1f8756e 100644 --- a/pkg/cloudbroker/compute/migrate_abort.go +++ b/pkg/cloudbroker/compute/migrate_abort.go @@ -18,7 +18,7 @@ type MigrateAbortRequest struct { type wrapperMigrateAbortRequest struct { MigrateAbortRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MigrateAbort aborts compute migration diff --git a/pkg/cloudbroker/compute/migrate_storage.go b/pkg/cloudbroker/compute/migrate_storage.go index 1fb09d0..9ed5c2e 100644 --- a/pkg/cloudbroker/compute/migrate_storage.go +++ b/pkg/cloudbroker/compute/migrate_storage.go @@ -28,7 +28,7 @@ type MigrateStorageRequest struct { // Async API call // Required: true - Sync bool `url:"sync" json:"sync" validate:"required"` + Async interface{} `url:"async_mode" json:"async_mode" validate:"required,isBool"` } // MigrateStorage gets complex compute migration diff --git a/pkg/cloudbroker/compute/migrate_storage_abort.go b/pkg/cloudbroker/compute/migrate_storage_abort.go index 20cbf01..454aed6 100644 --- a/pkg/cloudbroker/compute/migrate_storage_abort.go +++ b/pkg/cloudbroker/compute/migrate_storage_abort.go @@ -23,7 +23,7 @@ type MigrateStorageAbortRequest struct { type wrapperMigrateStorageAbortRequest struct { MigrateStorageAbortRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MigrateStorageAbort aborts complex compute migration job diff --git a/pkg/cloudbroker/compute/migrate_storage_clean_up.go b/pkg/cloudbroker/compute/migrate_storage_clean_up.go index 8a81709..a350488 100644 --- a/pkg/cloudbroker/compute/migrate_storage_clean_up.go +++ b/pkg/cloudbroker/compute/migrate_storage_clean_up.go @@ -18,7 +18,7 @@ type MigrateStorageCleanUpRequest struct { type wrapperMigrateStorageCleanUpRequest struct { MigrateStorageCleanUpRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MigrateStorageCleanUp cleanup resources after finished (success of failed) complex compute migration. diff --git a/pkg/cloudbroker/compute/migrate_to_zone.go b/pkg/cloudbroker/compute/migrate_to_zone.go index d674f1c..93ca3fe 100644 --- a/pkg/cloudbroker/compute/migrate_to_zone.go +++ b/pkg/cloudbroker/compute/migrate_to_zone.go @@ -22,7 +22,7 @@ type MigrateToZoneRequest struct { type wrapperMigrateToZoneRequest struct { MigrateToZoneRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MigrateToZone moves compute to new zone diff --git a/pkg/cloudbroker/compute/move_to_rg.go b/pkg/cloudbroker/compute/move_to_rg.go index cd57152..82e042e 100644 --- a/pkg/cloudbroker/compute/move_to_rg.go +++ b/pkg/cloudbroker/compute/move_to_rg.go @@ -37,7 +37,7 @@ type MoveToRGRequest struct { type wrapperMoveToRGRequest struct { MoveToRGRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // MoveToRG moves compute instance to new resource group diff --git a/pkg/cloudbroker/compute/net_attach.go b/pkg/cloudbroker/compute/net_attach.go index fac2539..5a3143e 100644 --- a/pkg/cloudbroker/compute/net_attach.go +++ b/pkg/cloudbroker/compute/net_attach.go @@ -96,7 +96,7 @@ type NetAttachRequest struct { type wrapperNetAttachRequest struct { NetAttachRequest - AsyncMode bool `url:"asyncMode" json:"asyncMode"` + AsyncMode bool `url:"async_mode" json:"async_mode"` } // NetAttach attaches network to compute and gets info about network diff --git a/pkg/cloudbroker/compute/net_detach.go b/pkg/cloudbroker/compute/net_detach.go index 6b40d51..f4f0a5b 100644 --- a/pkg/cloudbroker/compute/net_detach.go +++ b/pkg/cloudbroker/compute/net_detach.go @@ -26,7 +26,7 @@ type NetDetachRequest struct { type wrapperNetDetachRequest struct { NetDetachRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // NetDetach detaches network from compute diff --git a/pkg/cloudbroker/compute/net_qos.go b/pkg/cloudbroker/compute/net_qos.go index 0dfc117..979d000 100644 --- a/pkg/cloudbroker/compute/net_qos.go +++ b/pkg/cloudbroker/compute/net_qos.go @@ -41,7 +41,7 @@ type NetQOSRequest struct { type wrapperNetQOSRequest struct { NetQOSRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // NetQOS updates compute interfaces QOS diff --git a/pkg/cloudbroker/compute/pause.go b/pkg/cloudbroker/compute/pause.go index bbedf5e..a1a3a97 100644 --- a/pkg/cloudbroker/compute/pause.go +++ b/pkg/cloudbroker/compute/pause.go @@ -18,7 +18,7 @@ type PauseRequest struct { type wrapperPauseRequest struct { PauseRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Pause pause compute diff --git a/pkg/cloudbroker/compute/pfw_add.go b/pkg/cloudbroker/compute/pfw_add.go index d9b05c9..ab308fc 100644 --- a/pkg/cloudbroker/compute/pfw_add.go +++ b/pkg/cloudbroker/compute/pfw_add.go @@ -38,7 +38,7 @@ type PFWAddRequest struct { type wrapperPFWAddRequest struct { PFWAddRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PFWAdd adds port forward rule diff --git a/pkg/cloudbroker/compute/pfw_del.go b/pkg/cloudbroker/compute/pfw_del.go index 1d76394..86cd704 100644 --- a/pkg/cloudbroker/compute/pfw_del.go +++ b/pkg/cloudbroker/compute/pfw_del.go @@ -41,7 +41,7 @@ type PFWDelRequest struct { type wrapperPFWDelRequest struct { PFWDelRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PFWDel deletes port forward rule diff --git a/pkg/cloudbroker/compute/pin_to_node.go b/pkg/cloudbroker/compute/pin_to_node.go index e78c38a..6a3ed17 100644 --- a/pkg/cloudbroker/compute/pin_to_node.go +++ b/pkg/cloudbroker/compute/pin_to_node.go @@ -31,7 +31,7 @@ type PinToNodeRequest struct { type wrapperPinToNodeRequest struct { PinToNodeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PinToNode pins compute to current node diff --git a/pkg/cloudbroker/compute/power_cycle.go b/pkg/cloudbroker/compute/power_cycle.go index 6b40182..d61ddf9 100644 --- a/pkg/cloudbroker/compute/power_cycle.go +++ b/pkg/cloudbroker/compute/power_cycle.go @@ -18,7 +18,7 @@ type PowerCycleRequest struct { type wrapperPowerCycleRequest struct { PowerCycleRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // PowerCycle makes force stop and start compute diff --git a/pkg/cloudbroker/compute/raise_down.go b/pkg/cloudbroker/compute/raise_down.go index fa300c7..5cd623f 100644 --- a/pkg/cloudbroker/compute/raise_down.go +++ b/pkg/cloudbroker/compute/raise_down.go @@ -7,7 +7,7 @@ import ( ) type wrapperRaiseDownRequest struct { - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // RaiseDown starting all computes in "DOWN" tech status diff --git a/pkg/cloudbroker/compute/reboot.go b/pkg/cloudbroker/compute/reboot.go index 98f8717..f0b4266 100644 --- a/pkg/cloudbroker/compute/reboot.go +++ b/pkg/cloudbroker/compute/reboot.go @@ -18,7 +18,7 @@ type RebootRequest struct { type wrapperRebootRequest struct { RebootRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Reboot reboots compute diff --git a/pkg/cloudbroker/compute/redeploy.go b/pkg/cloudbroker/compute/redeploy.go index b83246a..9bc665b 100644 --- a/pkg/cloudbroker/compute/redeploy.go +++ b/pkg/cloudbroker/compute/redeploy.go @@ -50,7 +50,7 @@ type RedeployRequest struct { type wrapperRedeployRequest struct { RedeployRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Redeploy redeploys compute diff --git a/pkg/cloudbroker/compute/reset.go b/pkg/cloudbroker/compute/reset.go index 9074f99..13005d6 100644 --- a/pkg/cloudbroker/compute/reset.go +++ b/pkg/cloudbroker/compute/reset.go @@ -18,7 +18,7 @@ type ResetRequest struct { type wrapperResetRequest struct { ResetRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Reset resets compute diff --git a/pkg/cloudbroker/compute/resize.go b/pkg/cloudbroker/compute/resize.go index b54dcbd..c186602 100644 --- a/pkg/cloudbroker/compute/resize.go +++ b/pkg/cloudbroker/compute/resize.go @@ -46,7 +46,7 @@ func (r ResizeRequest) GetRAM() map[string]uint64 { type wrapperResizeRequest struct { ResizeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Resize resizes compute instance diff --git a/pkg/cloudbroker/compute/restore.go b/pkg/cloudbroker/compute/restore.go index 1e252c0..f17751e 100644 --- a/pkg/cloudbroker/compute/restore.go +++ b/pkg/cloudbroker/compute/restore.go @@ -18,7 +18,7 @@ type RestoreRequest struct { type wrapperRestoreRequest struct { RestoreRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Restore restores compute from recycle bin diff --git a/pkg/cloudbroker/compute/resume.go b/pkg/cloudbroker/compute/resume.go index dd89a95..a528b60 100644 --- a/pkg/cloudbroker/compute/resume.go +++ b/pkg/cloudbroker/compute/resume.go @@ -18,7 +18,7 @@ type ResumeRequest struct { type wrapperResumeRequest struct { ResumeRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Resume resumes Compute from paused state diff --git a/pkg/cloudbroker/compute/snapshot_create.go b/pkg/cloudbroker/compute/snapshot_create.go index 8ac720f..5426e01 100644 --- a/pkg/cloudbroker/compute/snapshot_create.go +++ b/pkg/cloudbroker/compute/snapshot_create.go @@ -29,7 +29,7 @@ type SnapshotCreateRequest struct { type wrapperSnapshotCreateRequest struct { SnapshotCreateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // SnapshotCreate creates compute snapshot diff --git a/pkg/cloudbroker/compute/snapshot_delete.go b/pkg/cloudbroker/compute/snapshot_delete.go index 7541a9c..625c357 100644 --- a/pkg/cloudbroker/compute/snapshot_delete.go +++ b/pkg/cloudbroker/compute/snapshot_delete.go @@ -21,7 +21,7 @@ type SnapshotDeleteRequest struct { type wrapperSnapshotDeleteRequest struct { SnapshotDeleteRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // SnapshotDelete deletes specified compute snapshot diff --git a/pkg/cloudbroker/compute/snapshot_evict_disk.go b/pkg/cloudbroker/compute/snapshot_evict_disk.go index ecef14a..f91d29f 100644 --- a/pkg/cloudbroker/compute/snapshot_evict_disk.go +++ b/pkg/cloudbroker/compute/snapshot_evict_disk.go @@ -2,6 +2,7 @@ package compute import ( "context" + "encoding/json" "net/http" "strconv" @@ -17,6 +18,15 @@ type SnapshotEvictDiskRequest struct { // ID of the disk instance // Required: true DiskID uint64 `url:"diskId" json:"diskId" validate:"required"` + + // Is mode async + // Required: false + AsyncMode interface{} `url:"async_mode,omitempty" json:"async_mode,omitempty" validate:"omitempty,isBool"` +} + +type asyncWrapperSnapshotEvictDiskRequest struct { + SnapshotEvictDiskRequest + AsyncMode bool `url:"asyncMode" json:"asyncMode"` } // SnapshotEvictDisk evicts specified disk from all snapshots of a compute instance @@ -26,9 +36,14 @@ func (c Compute) SnapshotEvictDisk(ctx context.Context, req SnapshotEvictDiskReq return false, validators.ValidationErrors(validators.GetErrors(err)) } + aReq := asyncWrapperSnapshotEvictDiskRequest{ + SnapshotEvictDiskRequest: req, + AsyncMode: false, + } + url := "/cloudbroker/compute/snapshotEvictDisk" - res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) if err != nil { return false, err } @@ -40,3 +55,32 @@ func (c Compute) SnapshotEvictDisk(ctx context.Context, req SnapshotEvictDiskReq return result, nil } + +// AsyncSnapshotEvictDisk evicts specified disk from all snapshots of a compute instance in async mode +func (c Compute) AsyncSnapshotEvictDisk(ctx context.Context, req SnapshotEvictDiskRequest) (string, error) { + err := validators.ValidateRequest(req) + if err != nil { + return "", validators.ValidationErrors(validators.GetErrors(err)) + } + + aReq := asyncWrapperSnapshotEvictDiskRequest{ + SnapshotEvictDiskRequest: req, + AsyncMode: true, + } + + url := "/cloudbroker/compute/snapshotEvictDisk" + + res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, aReq) + if err != nil { + return "", err + } + + var resp string + + err = json.Unmarshal(res, &resp) + if err != nil { + return "", err + } + + return resp, nil +} diff --git a/pkg/cloudbroker/compute/snapshot_rollback.go b/pkg/cloudbroker/compute/snapshot_rollback.go index d76867c..0c6f172 100644 --- a/pkg/cloudbroker/compute/snapshot_rollback.go +++ b/pkg/cloudbroker/compute/snapshot_rollback.go @@ -30,7 +30,7 @@ type SnapshotRollbackRequest struct { type wrapperSnapshotRollbackRequest struct { SnapshotRollbackRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // SnapshotRollback rollbacks specified compute snapshot diff --git a/pkg/cloudbroker/compute/start.go b/pkg/cloudbroker/compute/start.go index aeeb3dd..ff437dd 100644 --- a/pkg/cloudbroker/compute/start.go +++ b/pkg/cloudbroker/compute/start.go @@ -26,7 +26,7 @@ type StartRequest struct { type wrapperStartRequest struct { StartRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Start starts compute diff --git a/pkg/cloudbroker/compute/stop.go b/pkg/cloudbroker/compute/stop.go index 3747b84..768b666 100644 --- a/pkg/cloudbroker/compute/stop.go +++ b/pkg/cloudbroker/compute/stop.go @@ -22,7 +22,7 @@ type StopRequest struct { type wrapperStopRequest struct { StopRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Stop stops compute diff --git a/pkg/cloudbroker/disks/from_platform_disk.go b/pkg/cloudbroker/disks/from_platform_disk.go index 21bc3ba..957a6f2 100644 --- a/pkg/cloudbroker/disks/from_platform_disk.go +++ b/pkg/cloudbroker/disks/from_platform_disk.go @@ -54,7 +54,7 @@ type FromPlatformDiskRequest struct { type wrapperFromPlatformDiskRequest struct { FromPlatformDiskRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // FromPlatformDisk creates template from platform disk in sync mode. diff --git a/pkg/cloudbroker/image/create_cdrom_image.go b/pkg/cloudbroker/image/create_cdrom_image.go index 525440d..4ca8a53 100644 --- a/pkg/cloudbroker/image/create_cdrom_image.go +++ b/pkg/cloudbroker/image/create_cdrom_image.go @@ -46,7 +46,7 @@ type CreateCDROMImageRequest struct { type asyncWrapperCreateCDROMImageRequest struct { CreateCDROMImageRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateCDROMImage creates CD-ROM image from an ISO identified by URL diff --git a/pkg/cloudbroker/image/create_image.go b/pkg/cloudbroker/image/create_image.go index f56b8b3..9d6aa49 100644 --- a/pkg/cloudbroker/image/create_image.go +++ b/pkg/cloudbroker/image/create_image.go @@ -84,7 +84,7 @@ type CreateRequest struct { type asyncWrapperCreateRequest struct { CreateRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // CreateImage creates image from a media identified by URL diff --git a/pkg/cloudbroker/kvmx86/mass_create.go b/pkg/cloudbroker/kvmx86/mass_create.go index 249ae29..790635b 100644 --- a/pkg/cloudbroker/kvmx86/mass_create.go +++ b/pkg/cloudbroker/kvmx86/mass_create.go @@ -210,7 +210,7 @@ func (r MassCreateRequest) GetRAM() map[string]uint64 { type wrapperMassCreateRequest struct { MassCreateRequest - AsyncMode bool `json:"asyncMode"` + AsyncMode bool `json:"async_mode"` } type massCreateResponse struct { diff --git a/pkg/cloudbroker/node/enable.go b/pkg/cloudbroker/node/enable.go index 1169520..71be5a6 100644 --- a/pkg/cloudbroker/node/enable.go +++ b/pkg/cloudbroker/node/enable.go @@ -30,7 +30,7 @@ type EnableRequest struct { type wrapperEnableRequest struct { EnableRequest - AsyncMode bool `url:"asyncMode"` + AsyncMode bool `url:"async_mode"` } // Enable enables node from maintenance status to enabled diff --git a/pkg/cloudbroker/session/list.go b/pkg/cloudbroker/session/list.go index e300aa7..4ceff03 100644 --- a/pkg/cloudbroker/session/list.go +++ b/pkg/cloudbroker/session/list.go @@ -33,6 +33,11 @@ type ListRequest struct { // Filter sessions active at this timestamp (login_time <= T < logout_time/expires_at) ActiveAt uint64 `url:"active_at,omitempty" json:"active_at,omitempty"` + // Include archived sessions + // Default: true + // Required: false + IncludeArchive interface{} `url:"include_archive,omitempty" json:"include_archive,omitempty" validate:"omitempty,isBool"` + // Page size // Required: false Size uint64 `url:"size,omitempty" json:"size,omitempty"` diff --git a/pkg/cloudbroker/stpolicy/add_access_replication_profile.go b/pkg/cloudbroker/stpolicy/add_access_replication_profile.go new file mode 100644 index 0000000..b703a6a --- /dev/null +++ b/pkg/cloudbroker/stpolicy/add_access_replication_profile.go @@ -0,0 +1,43 @@ +package stpolicy + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// AddAccessReplicationProfileRequest struct to grant storage policy access to replication profile +type AddAccessReplicationProfileRequest struct { + // ID of replication profile + // Required: true + ProfileID uint64 `url:"profile_id" json:"profile_id" validate:"required"` + + // ID of storage policy + // Required: true + StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"` +} + +// AddAccessReplicationProfile grants storage policy access to replication profile +func (sp StPolicy) AddAccessReplicationProfile(ctx context.Context, req AddAccessReplicationProfileRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/storage_policy/add_access_replication_profile" + + res, err := sp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/stpolicy/create_replication_profile.go b/pkg/cloudbroker/stpolicy/create_replication_profile.go new file mode 100644 index 0000000..5dfc7c8 --- /dev/null +++ b/pkg/cloudbroker/stpolicy/create_replication_profile.go @@ -0,0 +1,77 @@ +package stpolicy + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// CalendarRequest struct for replication schedule calendar +type CalendarRequest struct { + // Weekly schedule + // Required: true + Weekly []string `url:"weekly" json:"weekly" validate:"required"` +} + +// SchedulesRequest struct for replication profile schedule +type SchedulesRequest struct { + // Type of the schedule + // Required: true + Type string `url:"type" json:"type" validate:"required"` + + // Name of the schedule + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Min interval + // Required: false + MINInterval uint64 `url:"min_interval,omitempty" json:"min_interval,omitempty"` + + // Calendar of the schedule + // Required: false + Calendar []CalendarRequest `url:"calendar,omitempty" json:"calendar,omitempty" validate:"omitempty,dive"` +} + +// CreateReplicationProfileRequest struct to create replication profile +type CreateReplicationProfileRequest struct { + // Name of the replication profile + // Required: true + Name string `url:"name" json:"name" validate:"required"` + + // Replication type + // Required: true + ReplicationType string `url:"replication_type" json:"replication_type" validate:"required"` + + // Max copy rate + // Required: false + MAXCopyRate uint64 `url:"max_copy_rate,omitempty" json:"max_copy_rate,omitempty"` + + // List of schedules + // Required: false + Schedules []SchedulesRequest `url:"schedules,omitempty" json:"schedules,omitempty" validate:"omitempty,dive"` +} + +// CreateReplicationProfile creates a new replication profile +func (sp StPolicy) CreateReplicationProfile(ctx context.Context, req CreateReplicationProfileRequest) (uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + return 0, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/storage_policy/create_replication_profile" + + res, err := sp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/stpolicy/delete_replication_profile.go b/pkg/cloudbroker/stpolicy/delete_replication_profile.go new file mode 100644 index 0000000..7e798ff --- /dev/null +++ b/pkg/cloudbroker/stpolicy/delete_replication_profile.go @@ -0,0 +1,39 @@ +package stpolicy + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DeleteReplicationProfileRequest struct to delete replication profile +type DeleteReplicationProfileRequest struct { + // ID of replication profile + // Required: true + ProfileID uint64 `url:"profile_id" json:"profile_id" validate:"required"` +} + +// DeleteReplicationProfile deletes replication profile +func (sp StPolicy) DeleteReplicationProfile(ctx context.Context, req DeleteReplicationProfileRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/storage_policy/delete_replication_profile" + + res, err := sp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/stpolicy/get_replication_profile.go b/pkg/cloudbroker/stpolicy/get_replication_profile.go new file mode 100644 index 0000000..8e05926 --- /dev/null +++ b/pkg/cloudbroker/stpolicy/get_replication_profile.go @@ -0,0 +1,46 @@ +package stpolicy + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// GetReplicationProfileRequest struct to get replication profile +type GetReplicationProfileRequest struct { + // ID of replication profile + // Required: true + ProfileID uint64 `url:"profile_id" json:"profile_id" validate:"required"` +} + +// GetReplicationProfile gets replication profile as an InfoReplicationProfile struct +func (sp StPolicy) GetReplicationProfile(ctx context.Context, req GetReplicationProfileRequest) (*InfoReplicationProfile, error) { + res, err := sp.GetReplicationProfileRaw(ctx, req) + if err != nil { + return nil, err + } + + info := InfoReplicationProfile{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetReplicationProfileRaw gets replication profile as an array of bytes +func (sp StPolicy) GetReplicationProfileRaw(ctx context.Context, req GetReplicationProfileRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/storage_policy/get_replication_profile" + + res, err := sp.client.DecortApiCall(ctx, http.MethodGet, url, req) + return res, err +} diff --git a/pkg/cloudbroker/stpolicy/list_replication_profile.go b/pkg/cloudbroker/stpolicy/list_replication_profile.go new file mode 100644 index 0000000..cb746dd --- /dev/null +++ b/pkg/cloudbroker/stpolicy/list_replication_profile.go @@ -0,0 +1,65 @@ +package stpolicy + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ListReplicationProfileRequest struct to get list of replication profiles +type ListReplicationProfileRequest 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"` + + // Search by replication profile ID + // Required: false + ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"` + + // Search by replication profile name + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // Search by replication type + // Required: false + ReplicationType string `url:"replication_type,omitempty" json:"replication_type,omitempty"` + + // Sort by one of supported fields, format ± + // Required: false + SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"` +} + +// ListReplicationProfile gets list of replication profiles as a ListReplicationProfiles struct +func (sp StPolicy) ListReplicationProfile(ctx context.Context, req ListReplicationProfileRequest) (*ListReplicationProfiles, error) { + res, err := sp.ListReplicationProfileRaw(ctx, req) + if err != nil { + return nil, err + } + + list := ListReplicationProfiles{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return &list, nil +} + +// ListReplicationProfileRaw gets list of replication profiles as an array of bytes +func (sp StPolicy) ListReplicationProfileRaw(ctx context.Context, req ListReplicationProfileRequest) ([]byte, error) { + if err := validators.ValidateRequest(req); err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/storage_policy/list_replication_profile" + + res, err := sp.client.DecortApiCall(ctx, http.MethodGet, url, req) + return res, err +} diff --git a/pkg/cloudbroker/stpolicy/models.go b/pkg/cloudbroker/stpolicy/models.go index 88f2511..bf6f11c 100644 --- a/pkg/cloudbroker/stpolicy/models.go +++ b/pkg/cloudbroker/stpolicy/models.go @@ -19,9 +19,12 @@ type InfoStoragePolicyWithID struct { // Status of the storage policy Status string `json:"status"` - // Max IOPS for the sotrage policy + // Max IOPS for the storage policy LimitIOPS uint64 `json:"limit_iops"` + // ID of the replication profile + ReplicationProfileID uint64 `json:"replication_profile_id"` + // Which accounts and resource groups use the storage policy Usage Usage `json:"usage"` } @@ -53,9 +56,12 @@ type ItemStoragePolicy struct { // Status of the storage policy Status string `json:"status"` - // Max IOPS for the sotrage policy + // Max IOPS for the storage policy LimitIOPS uint64 `json:"limit_iops"` + // ID of the replication profile + ReplicationProfileID uint64 `json:"replication_profile_id"` + // Storage policy ID StoragePolicyID uint64 `json:"storage_policy_id"` @@ -85,6 +91,9 @@ type InfoStoragePolicy struct { // Max IOPS for the storage policy LimitIOPS uint64 `json:"limit_iops"` + // ID of the replication profile + ReplicationProfileID uint64 `json:"replication_profile_id"` + // Storage policy ID StoragePolicyID uint64 `json:"storage_policy_id"` @@ -115,3 +124,72 @@ type Usage struct { // List of resource groups Resgroups []uint64 `json:"resgroups"` } + +type ListReplicationProfiles struct { + // List + Data []ItemReplicationProfile `json:"data"` + + // Entry Count + EntryCount uint64 `json:"entryCount"` +} + +type ItemReplicationProfile struct { + // ID of the replication profile + ID uint64 `json:"id"` + + // GUID + GUID uint64 `json:"guid"` + + // Name of the replication profile + Name string `json:"name"` + + // Replication types + ReplicationType []string `json:"replication_type"` + + // Max copy rate + MAXCopyRate uint64 `json:"max_copy_rate"` + + // List of schedules + Schedules ListSchedules `json:"schedules"` +} + +type InfoReplicationProfile struct { + // ID of the replication profile + ID uint64 `json:"id"` + + // GUID + GUID uint64 `json:"guid"` + + // Name of the replication profile + Name string `json:"name"` + + // Replication types + ReplicationType []string `json:"replication_type"` + + // Max copy rate + MAXCopyRate uint64 `json:"max_copy_rate"` + + // List of schedules + Schedules ListSchedules `json:"schedules"` +} + +type ListSchedules []Schedule + +type Schedule struct { + // Type of the schedule + Type string `json:"type"` + + // Name of the schedule + Name string `json:"name"` + + // Min interval + MINInterval uint64 `json:"min_interval"` + + // Calendar of the schedule + Calendar Calendar `json:"calendar"` +} + +type Calendar struct { + // Weekly schedule + Weekly map[string][]string `json:"weekly"` +} diff --git a/pkg/cloudbroker/stpolicy/revoke_access_replication_profile.go b/pkg/cloudbroker/stpolicy/revoke_access_replication_profile.go new file mode 100644 index 0000000..d3dbba7 --- /dev/null +++ b/pkg/cloudbroker/stpolicy/revoke_access_replication_profile.go @@ -0,0 +1,43 @@ +package stpolicy + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// RevokeAccessReplicationProfileRequest struct to revoke storage policy access to replication profile +type RevokeAccessReplicationProfileRequest struct { + // ID of replication profile + // Required: true + ProfileID uint64 `url:"profile_id" json:"profile_id" validate:"required"` + + // ID of storage policy + // Required: true + StoragePolicyID uint64 `url:"storage_policy_id" json:"storage_policy_id" validate:"required"` +} + +// RevokeAccessReplicationProfile revokes storage policy access to replication profile +func (sp StPolicy) RevokeAccessReplicationProfile(ctx context.Context, req RevokeAccessReplicationProfileRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/storage_policy/revoke_access_replication_profile" + + res, err := sp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/stpolicy/update_replication_profile.go b/pkg/cloudbroker/stpolicy/update_replication_profile.go new file mode 100644 index 0000000..aa6106d --- /dev/null +++ b/pkg/cloudbroker/stpolicy/update_replication_profile.go @@ -0,0 +1,70 @@ +package stpolicy + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ConfigRequest struct for replication profile config +type ConfigRequest struct { + // New name of the replication profile + // Required: false + Name string `url:"name,omitempty" json:"name,omitempty"` + + // New replication type + // Required: false + ReplicationType string `url:"replication_type,omitempty" json:"replication_type,omitempty"` + + // New max copy rate + // Required: false + MAXCopyRate uint64 `url:"max_copy_rate,omitempty" json:"max_copy_rate,omitempty"` + + // New list of schedules + // Required: false + Schedules []SchedulesRequest `url:"schedules,omitempty" json:"schedules,omitempty" validate:"omitempty,dive"` +} + +// UpdateReplicationProfileRequest struct to update replication profile +type UpdateReplicationProfileRequest struct { + // ID of replication profile + // Required: true + ProfileID uint64 `url:"profile_id" json:"profile_id" validate:"required"` + + // Config of the replication profile + // Required: true + Config []ConfigRequest `url:"config" json:"config" validate:"required,dive"` +} + +// UpdateReplicationProfile updates replication profile +func (sp StPolicy) UpdateReplicationProfile(ctx context.Context, req UpdateReplicationProfileRequest) (*InfoReplicationProfile, error) { + res, err := sp.UpdateReplicationProfileRaw(ctx, req) + if err != nil { + return nil, err + } + + info := InfoReplicationProfile{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// UpdateReplicationProfileRaw updates replication profile and returns result as an array of bytes +func (sp StPolicy) UpdateReplicationProfileRaw(ctx context.Context, req UpdateReplicationProfileRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/storage_policy/update_replication_profile" + + res, err := sp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req) + return res, err +} diff --git a/pkg/cloudbroker/vmfolder.go b/pkg/cloudbroker/vmfolder.go new file mode 100644 index 0000000..dd1dfdf --- /dev/null +++ b/pkg/cloudbroker/vmfolder.go @@ -0,0 +1,10 @@ +package cloudbroker + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vmfolder" +) + +// Accessing the VMFolder method group +func (cb *CloudBroker) VMFolder() *vmfolder.VMFolder { + return vmfolder.New(cb.client) +} diff --git a/pkg/cloudbroker/vmfolder/add_acl_access.go b/pkg/cloudbroker/vmfolder/add_acl_access.go new file mode 100644 index 0000000..3fc48d9 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/add_acl_access.go @@ -0,0 +1,47 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// AddACLAccessRequest adds ACL access to a vm folder +type AddACLAccessRequest struct { + // ID of a folder + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` + + // User or group name to grant access + // Required: true + User string `url:"user" json:"user" validate:"required"` + + // ID of a folder + // Required: true + Right string `url:"right" json:"right" validate:"required"` +} + +// AddACLAccess adds ACL access to a vm folder +func (v VMFolder) AddACLAccess(ctx context.Context, req AddACLAccessRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/add_acl_access" + + res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/vmfolder/computes_move.go b/pkg/cloudbroker/vmfolder/computes_move.go new file mode 100644 index 0000000..0055dc6 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/computes_move.go @@ -0,0 +1,42 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ComputesMoveRequest struct to move computes to a vm folder +type ComputesMoveRequest struct { + // IDs of computes to move + // Required: true + ComputeIDs []uint64 `url:"compute_ids" json:"compute_ids" validate:"required"` + + // Target vm folder ID + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` +} + +// ComputesMove moves computes to a vm folder +func (v VMFolder) ComputesMove(ctx context.Context, req ComputesMoveRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/computes_move" + + res, err := v.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/vmfolder/create.go b/pkg/cloudbroker/vmfolder/create.go new file mode 100644 index 0000000..5751823 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/create.go @@ -0,0 +1,47 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// CreateRequest struct to create a vm folder +type CreateRequest struct { + // Resource Group ID + // Required: true + RGID uint64 `url:"rg_id" json:"rg_id" validate:"required"` + + // Name + // Required: true + Name string `url:"name" json:"name" validate:"required"` + + // Parent ID + // Required: false + ParentID uint64 `url:"parent_id,omitempty" json:"parent_id,omitempty"` +} + +// Create creates a vm folder +func (v VMFolder) Create(ctx context.Context, req CreateRequest) (uint64, error) { + err := validators.ValidateRequest(req) + if err != nil { + return 0, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/create" + + res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/vmfolder/del_acl_access.go b/pkg/cloudbroker/vmfolder/del_acl_access.go new file mode 100644 index 0000000..52ed707 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/del_acl_access.go @@ -0,0 +1,43 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DeleteACLAccessRequest deletes ACL access from a vm folder +type DelACLAccessRequest struct { + // ID of a folder + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id"` + + // User or group name to revoke access from + // Required: true + User string `url:"user" json:"user"` +} + +// DeleteACLAccess deletes ACL access from a vm foler +func (v VMFolder) DeleteACLAccess(ctx context.Context, req DelACLAccessRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/del_acl_access" + + res, err := v.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, 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/vmfolder/delete.go b/pkg/cloudbroker/vmfolder/delete.go new file mode 100644 index 0000000..03f9d47 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/delete.go @@ -0,0 +1,38 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// DeleteRequest struct to delete a VM folder +type DeleteRequest struct { + // ID of a folder to delete + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` +} + +// Delete deletes a vm folder +func (v VMFolder) Delete(ctx context.Context, req DeleteRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/delete" + + res, err := v.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/vmfolder/get.go b/pkg/cloudbroker/vmfolder/get.go new file mode 100644 index 0000000..089547a --- /dev/null +++ b/pkg/cloudbroker/vmfolder/get.go @@ -0,0 +1,46 @@ +package vmfolder + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// GetRequest struct to get detailed information about a vm folder +type GetRequest struct { + // ID of a folder + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` +} + +// Get gets current configuration of the vm folder as a RecordVMFolder struct +func (v VMFolder) Get(ctx context.Context, req GetRequest) (*RecordVMFolder, error) { + res, err := v.GetRaw(ctx, req) + if err != nil { + return nil, err + } + + info := RecordVMFolder{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// GetRaw gets current configuration of the vm folder as an array of bytes +func (v VMFolder) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/get" + + res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudbroker/vmfolder/list.go b/pkg/cloudbroker/vmfolder/list.go new file mode 100644 index 0000000..f0e1322 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/list.go @@ -0,0 +1,55 @@ +package vmfolder + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// ListRequest struct to get list of vm folders +type ListRequest struct { + // Resource group ID + // Required: true + RGID uint64 `url:"rg_id" json:"rg_id" validate:"required"` + + // Page number + // Required: false + Page uint64 `url:"page,omitempty" json:"page,omitempty"` + + // Page size + // Required: false + Size uint64 `url:"size,omitempty" json:"size,omitempty"` +} + +// List gets list of all vm folders in a resource group as a ListVMFolder struct +func (v VMFolder) List(ctx context.Context, req ListRequest) (*ListVMFolder, error) { + + res, err := v.ListRaw(ctx, req) + if err != nil { + return nil, err + } + + list := ListVMFolder{} + + err = json.Unmarshal(res, &list) + if err != nil { + return nil, err + } + + return &list, nil +} + +// ListRaw gets list of all vm folders in a resource group as an array of bytes +func (v VMFolder) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) { + + if err := validators.ValidateRequest(req); err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/list" + + res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req) + return res, err +} diff --git a/pkg/cloudbroker/vmfolder/models.go b/pkg/cloudbroker/vmfolder/models.go new file mode 100644 index 0000000..2a8c31e --- /dev/null +++ b/pkg/cloudbroker/vmfolder/models.go @@ -0,0 +1,82 @@ +package vmfolder + +// Detailed information about a folder +type RecordVMFolder struct { + // ID + ID uint64 `json:"id"` + + // RG ID + RGID uint64 `json:"rg_id"` + + // GID + GID uint64 `json:"gid"` + + // Name of a folder + Name string `json:"name"` + + // ACL + ACL []ACL `json:"acl"` + + // Time of creation + CreatedTime uint64 `json:"created_time"` + + // Parent ID + ParentID uint64 `json:"parent_id"` + + // Status of a folder + Status string `json:"status"` + + // Compute IDs + ComputeIDs []uint64 `json:"compute_ids"` + + // Time of update + UpdatedTime uint64 `json:"updated_time"` +} + +// ACL +type ACL struct { + // Explicit + Explicit bool `json:"explicit"` + + // Right + Right string `json:"right"` + + // Status + Status string `json:"status"` + + // Type + Type string `json:"type"` + + // User group ID + UserGroupID string `json:"userGroupId"` +} + +// List of vm folders +type ListVMFolder struct { + // Entry count + EntryCount uint64 `json:"entryCount"` + + // Data + Data []ItemVMFolder `json:"data"` +} + +// Detailed information about a folder item +type ItemVMFolder struct { + // Folder ID + ID uint64 `json:"id"` + + // Parent ID + ParentID uint64 `json:"parent_id"` + + // Name + Name string `json:"name"` + + // ACL + ACL []ACL `json:"acl"` + + // Status + Status string `json:"status"` + + // VM count + VMCount uint64 `json:"vm_count"` +} diff --git a/pkg/cloudbroker/vmfolder/move.go b/pkg/cloudbroker/vmfolder/move.go new file mode 100644 index 0000000..aa16959 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/move.go @@ -0,0 +1,42 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// MoveRequest to move a vm folder to a compute +type MoveRequest struct { + // VM Folder ID + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id"` + + // New parent folder ID + // Required: true + NewParentID uint64 `url:"new_parent_id" json:"new_parent_id"` +} + +// Move moves a vm folder to a compute +func (v VMFolder) Move(ctx context.Context, req MoveRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/move" + + res, err := v.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/vmfolder/rename.go b/pkg/cloudbroker/vmfolder/rename.go new file mode 100644 index 0000000..0340c56 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/rename.go @@ -0,0 +1,42 @@ +package vmfolder + +import ( + "context" + "net/http" + "strconv" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +// RenameRequest struct to rename a VM folder +type RenameRequest struct { + // ID of a folder to rename + // Required: true + FolderID uint64 `url:"folder_id" json:"folder_id" validate:"required"` + + // A new name + // Required: true + Name string `url:"name" json:"name" validate:"required"` +} + +// Rename renames a vm folder +func (v VMFolder) Rename(ctx context.Context, req RenameRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/cloudbroker/vmfolder/rename" + + res, err := v.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/vmfolder/vmfolder.go b/pkg/cloudbroker/vmfolder/vmfolder.go new file mode 100644 index 0000000..b6dbc43 --- /dev/null +++ b/pkg/cloudbroker/vmfolder/vmfolder.go @@ -0,0 +1,17 @@ +package vmfolder + +import ( + "repository.basistech.ru/BASIS/decort-golang-sdk/interfaces" +) + +// Structure for creating request to VMFolder +type VMFolder struct { + client interfaces.Caller +} + +// Builder for VMFolder endpoints +func New(client interfaces.Caller) *VMFolder { + return &VMFolder{ + client, + } +} diff --git a/tests/platform_upgrade/cloud_test.go b/tests/platform_upgrade/cloud_test.go index 7b4e328..c35ac9f 100644 --- a/tests/platform_upgrade/cloud_test.go +++ b/tests/platform_upgrade/cloud_test.go @@ -26,6 +26,7 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vgpu" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vins" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vmfolder" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/acsgroups" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/adrspools" @@ -59,6 +60,7 @@ import ( tasks_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks" trunk_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk" vins_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins" + vmfolder_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vmfolder" zone_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" extnet_sdn "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/extnet" @@ -379,6 +381,26 @@ func TestGetListCloudAPI(t *testing.T) { t.Errorf("Can not test Storage policy get because Storage policy list is empty") } + // Replication profile + // List + bytes, err = client.CloudAPI().StPolicy().ListReplicationProfileRaw(context.Background(), stpolicy.ListReplicationProfileRequest{}) + if err != nil { + t.Error(err) + } + getResult("Replication profile list", bytes, stpolicy.ListReplicationProfiles{}, t) + // Get + listReplicationProfiles, _ := client.CloudAPI().StPolicy().ListReplicationProfile(context.Background(), stpolicy.ListReplicationProfileRequest{}) + if len(listReplicationProfiles.Data) > 0 { + id := listReplicationProfiles.Data[0].ID + bytes, err = client.CloudAPI().StPolicy().GetReplicationProfileRaw(context.Background(), stpolicy.GetReplicationProfileRequest{ProfileID: id}) + if err != nil { + t.Error(err) + } + getResult("Replication profile get", bytes, stpolicy.InfoReplicationProfile{}, t) + } else { + t.Errorf("Can not test Replication profile get because Replication profile list is empty") + } + // Security group // List bytes, err = client.CloudAPI().SecurityGroup().ListRaw(context.Background(), secgroup.ListRequest{}) @@ -459,6 +481,26 @@ func TestGetListCloudAPI(t *testing.T) { t.Errorf("Can not test VINS get because VINS list is empty") } + // VM folder + // List + bytes, err = client.CloudAPI().VMFolder().ListRaw(context.Background(), vmfolder.ListRequest{}) + if err != nil { + t.Error(err) + } + getResult("VM folder list", bytes, vmfolder.ListVMFolder{}, t) + // Get + listVMFolders, _ := client.CloudAPI().VMFolder().List(context.Background(), vmfolder.ListRequest{}) + if len(listVMFolders.Data) > 0 { + id := listVMFolders.Data[0].ID + bytes, err = client.CloudAPI().VMFolder().GetRaw(context.Background(), vmfolder.GetRequest{FolderID: id}) + if err != nil { + t.Error(err) + } + getResult("VM folder get", bytes, vmfolder.RecordVMFolder{}, t) + } else { + t.Errorf("Can not test VM folder get because VM folder list is empty") + } + // VGPU // List bytes, err = client.CloudAPI().VGPU().ListRaw(context.Background(), vgpu.ListRequest{}) @@ -897,6 +939,26 @@ func TestGetListCloudbroker(t *testing.T) { t.Errorf("Can not test Storage policy get because Storage policy list is empty") } + // Replication profile + // List + bytes, err = client.CloudBroker().StPolicy().ListReplicationProfileRaw(context.Background(), stpolicy_cb.ListReplicationProfileRequest{}) + if err != nil { + t.Error(err) + } + getResult("Replication profile list", bytes, stpolicy_cb.ListReplicationProfiles{}, t) + // Get + listReplicationProfiles, _ := client.CloudBroker().StPolicy().ListReplicationProfile(context.Background(), stpolicy_cb.ListReplicationProfileRequest{}) + if len(listReplicationProfiles.Data) > 0 { + id := listReplicationProfiles.Data[0].ID + bytes, err = client.CloudBroker().StPolicy().GetReplicationProfileRaw(context.Background(), stpolicy_cb.GetReplicationProfileRequest{ProfileID: id}) + if err != nil { + t.Error(err) + } + getResult("Replication profile get", bytes, stpolicy_cb.InfoReplicationProfile{}, t) + } else { + t.Errorf("Can not test Replication profile get because Replication profile list is empty") + } + // Tasks // List bytes, err = client.CloudBroker().Tasks().ListRaw(context.Background(), tasks_cb.ListRequest{}) @@ -945,6 +1007,26 @@ func TestGetListCloudbroker(t *testing.T) { t.Errorf("Can not test VINS get because VINS list is empty") } + // VM folder + // List + bytes, err = client.CloudBroker().VMFolder().ListRaw(context.Background(), vmfolder_cb.ListRequest{}) + if err != nil { + t.Error(err) + } + getResult("VM folder list", bytes, vmfolder_cb.ListVMFolder{}, t) + // Get + listVMFolders, _ := client.CloudBroker().VMFolder().List(context.Background(), vmfolder_cb.ListRequest{}) + if len(listVMFolders.Data) > 0 { + id := listVMFolders.Data[0].ID + bytes, err = client.CloudBroker().VMFolder().GetRaw(context.Background(), vmfolder_cb.GetRequest{FolderID: id}) + if err != nil { + t.Error(err) + } + getResult("VM folder get", bytes, vmfolder_cb.RecordVMFolder{}, t) + } else { + t.Errorf("Can not test VM folder get because VM folder list is empty") + } + // Zone // List bytes, err = client.CloudBroker().Zone().ListRaw(context.Background(), zone_cb.ListRequest{}) diff --git a/tests/platform_upgrade/request_map.go b/tests/platform_upgrade/request_map.go index 84ee16b..14a45af 100644 --- a/tests/platform_upgrade/request_map.go +++ b/tests/platform_upgrade/request_map.go @@ -28,6 +28,7 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vfpool" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vgpu" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vins" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vmfolder" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/acsgroups" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/adrspools" @@ -71,6 +72,7 @@ import ( vfpool_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vfpool" vgpu_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vgpu" vins_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins" + vmfolder_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vmfolder" zone_cb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" extnet_sdn "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/extnet" @@ -434,8 +436,10 @@ func getRequestsMapCloudAPI() map[string]interface{} { "/restmachine/cloudapi/tasks/list": tasks.ListRequest{}, // storage policy - "/restmachine/cloudapi/storage_policy/get": stpolicy.GetRequest{}, - "/restmachine/cloudapi/storage_policy/list": stpolicy.ListRequest{}, + "/restmachine/cloudapi/storage_policy/get": stpolicy.GetRequest{}, + "/restmachine/cloudapi/storage_policy/list": stpolicy.ListRequest{}, + "/restmachine/cloudapi/storage_policy/get_replication_profile": stpolicy.GetReplicationProfileRequest{}, + "/restmachine/cloudapi/storage_policy/list_replication_profile": stpolicy.ListReplicationProfileRequest{}, // trunk "/restmachine/cloudapi/trunk/get": trunk.GetRequest{}, @@ -485,6 +489,17 @@ func getRequestsMapCloudAPI() map[string]interface{} { "/restmachine/cloudapi/vins/vnfdevRestart": vins.VNFDevRestartRequest{}, "/restmachine/cloudapi/vins/migrateToZone": vins.MigrateToZoneRequest{}, + // VM folder + "/restmachine/cloudapi/vmfolder/create": vmfolder.CreateRequest{}, + "/restmachine/cloudapi/vmfolder/computes_move": vmfolder.ComputesMoveRequest{}, + "/restmachine/cloudapi/vmfolder/delete": vmfolder.DeleteRequest{}, + "/restmachine/cloudapi/vmfolder/rename": vmfolder.RenameRequest{}, + "/restmachine/cloudapi/vmfolder/move": vmfolder.MoveRequest{}, + "/restmachine/cloudapi/vmfolder/get": vmfolder.GetRequest{}, + "/restmachine/cloudapi/vmfolder/list": vmfolder.ListRequest{}, + "/restmachine/cloudapi/vmfolder/add_acl_access": vmfolder.AddACLAccessRequest{}, + "/restmachine/cloudapi/vmfolder/del_acl_access": vmfolder.DelACLAccessRequest{}, + // zone "/restmachine/cloudapi/zone/get": zone.GetRequest{}, "/restmachine/cloudapi/zone/list": zone.ListRequest{}, @@ -1030,15 +1045,22 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/session/list": session.ListRequest{}, // storage_policy - "/restmachine/cloudbroker/storage_policy/get": stpolicy_cb.GetRequest{}, - "/restmachine/cloudbroker/storage_policy/list": stpolicy_cb.ListRequest{}, - "/restmachine/cloudbroker/storage_policy/create": stpolicy_cb.CreateRequest{}, - "/restmachine/cloudbroker/storage_policy/update": stpolicy_cb.UpdateRequest{}, - "/restmachine/cloudbroker/storage_policy/add_pool": stpolicy_cb.AddPoolRequest{}, - "/restmachine/cloudbroker/storage_policy/delete": stpolicy_cb.DeleteRequest{}, - "/restmachine/cloudbroker/storage_policy/disable": stpolicy_cb.DisableRequest{}, - "/restmachine/cloudbroker/storage_policy/enable": stpolicy_cb.EnableRequest{}, - "/restmachine/cloudbroker/storage_policy/delete_pool": stpolicy_cb.DeletePoolRequest{}, + "/restmachine/cloudbroker/storage_policy/get": stpolicy_cb.GetRequest{}, + "/restmachine/cloudbroker/storage_policy/list": stpolicy_cb.ListRequest{}, + "/restmachine/cloudbroker/storage_policy/create": stpolicy_cb.CreateRequest{}, + "/restmachine/cloudbroker/storage_policy/update": stpolicy_cb.UpdateRequest{}, + "/restmachine/cloudbroker/storage_policy/add_pool": stpolicy_cb.AddPoolRequest{}, + "/restmachine/cloudbroker/storage_policy/delete": stpolicy_cb.DeleteRequest{}, + "/restmachine/cloudbroker/storage_policy/disable": stpolicy_cb.DisableRequest{}, + "/restmachine/cloudbroker/storage_policy/enable": stpolicy_cb.EnableRequest{}, + "/restmachine/cloudbroker/storage_policy/delete_pool": stpolicy_cb.DeletePoolRequest{}, + "/restmachine/cloudbroker/storage_policy/get_replication_profile": stpolicy_cb.GetReplicationProfileRequest{}, + "/restmachine/cloudbroker/storage_policy/list_replication_profile": stpolicy_cb.ListReplicationProfileRequest{}, + "/restmachine/cloudbroker/storage_policy/create_replication_profile": stpolicy_cb.CreateReplicationProfileRequest{}, + "/restmachine/cloudbroker/storage_policy/update_replication_profile": stpolicy_cb.UpdateReplicationProfileRequest{}, + "/restmachine/cloudbroker/storage_policy/delete_replication_profile": stpolicy_cb.DeleteReplicationProfileRequest{}, + "/restmachine/cloudbroker/storage_policy/add_access_replication_profile": stpolicy_cb.AddAccessReplicationProfileRequest{}, + "/restmachine/cloudbroker/storage_policy/revoke_access_replication_profile": stpolicy_cb.RevokeAccessReplicationProfileRequest{}, // tasks "/restmachine/cloudbroker/tasks/get": tasks_cb.GetRequest{}, @@ -1124,6 +1146,17 @@ func getRequestsMapCloudbroker() map[string]interface{} { "/restmachine/cloudbroker/vins/vnfdevStop": vins_cb.VNFDevStopRequest{}, "/restmachine/cloudbroker/vins/migrateToZone": vins_cb.MigrateToZoneRequest{}, + // VM folder + "/restmachine/cloudbroker/vmfolder/create": vmfolder_cb.CreateRequest{}, + "/restmachine/cloudbroker/vmfolder/computes_move": vmfolder_cb.ComputesMoveRequest{}, + "/restmachine/cloudbroker/vmfolder/delete": vmfolder_cb.DeleteRequest{}, + "/restmachine/cloudbroker/vmfolder/rename": vmfolder_cb.RenameRequest{}, + "/restmachine/cloudbroker/vmfolder/move": vmfolder_cb.MoveRequest{}, + "/restmachine/cloudbroker/vmfolder/get": vmfolder_cb.GetRequest{}, + "/restmachine/cloudbroker/vmfolder/list": vmfolder_cb.ListRequest{}, + "/restmachine/cloudbroker/vmfolder/add_acl_access": vmfolder_cb.AddACLAccessRequest{}, + "/restmachine/cloudbroker/vmfolder/del_acl_access": vmfolder_cb.DelACLAccessRequest{}, + // zone "/restmachine/cloudbroker/zone/get": zone_cb.GetRequest{}, "/restmachine/cloudbroker/zone/list": zone_cb.ListRequest{},