This commit is contained in:
2024-05-31 13:35:39 +03:00
parent e7c968797b
commit 3393934456
65 changed files with 905 additions and 393 deletions

View File

@@ -27,7 +27,7 @@ type CreateDiskBackupRequest struct {
type wrapperCreateDiskBackupRequest struct {
CreateDiskBackupRequest
Async bool `url:"async"`
AsyncMode bool `url:"asyncMode"`
}
// CreateDiskBackup creates disk backup
@@ -39,7 +39,7 @@ func (b Backup) CreateDiskBackup(ctx context.Context, req CreateDiskBackupReques
reqWrapped := wrapperCreateDiskBackupRequest{
CreateDiskBackupRequest: req,
Async: false,
AsyncMode: false,
}
url := "/cloudbroker/backup/createDiskBackup"
@@ -68,7 +68,7 @@ func (b Backup) CreateDiskBackupAsync(ctx context.Context, req CreateDiskBackupR
reqWrapped := wrapperCreateDiskBackupRequest{
CreateDiskBackupRequest: req,
Async: true,
AsyncMode: true,
}
url := "/cloudbroker/backup/createDiskBackup"

View File

@@ -29,7 +29,7 @@ type CreateDisksBackupRequest struct {
type wrapperCreateDisksBackupRequest struct {
CreateDisksBackupRequest
Async bool `url:"async"`
AsyncMode bool `url:"asyncMode"`
}
// CreateDisksBackup creates disks backup
@@ -41,7 +41,7 @@ func (b Backup) CreateDisksBackup(ctx context.Context, req CreateDisksBackupRequ
reqWrapped := wrapperCreateDisksBackupRequest{
CreateDisksBackupRequest: req,
Async: false,
AsyncMode: false,
}
url := "/cloudbroker/backup/createDisksBackup"
@@ -70,7 +70,7 @@ func (b Backup) CreateDisksBackupAsync(ctx context.Context, req CreateDisksBacku
reqWrapped := wrapperCreateDisksBackupRequest{
CreateDisksBackupRequest: req,
Async: true,
AsyncMode: true,
}
url := "/cloudbroker/backup/createDisksBackup"

View File

@@ -21,7 +21,7 @@ type DeleteDiskBackupRequest struct {
type wrapperDeleteDiskBackupRequest struct {
DeleteDiskBackupRequest
Async bool `url:"async"`
AsyncMode bool `url:"asyncMode"`
}
// DeleteDiskBackup deletes disk backup
@@ -33,7 +33,7 @@ func (b Backup) DeleteDiskBackup(ctx context.Context, req DeleteDiskBackupReques
reqWrapped := wrapperDeleteDiskBackupRequest{
DeleteDiskBackupRequest: req,
Async: false,
AsyncMode: false,
}
url := "/cloudbroker/backup/deleteDiskBackup"
@@ -60,7 +60,7 @@ func (b Backup) DeleteDiskBackupAsync(ctx context.Context, req DeleteDiskBackupR
reqWrapped := wrapperDeleteDiskBackupRequest{
DeleteDiskBackupRequest: req,
Async: true,
AsyncMode: true,
}
url := "/cloudbroker/backup/deleteDiskBackup"

View File

@@ -27,7 +27,7 @@ type RestoreDiskFromBackupRequest struct {
type wrapperRestoreDiskFromBackupRequest struct {
RestoreDiskFromBackupRequest
Async bool `url:"async"`
AsyncMode bool `url:"asyncMode"`
}
// RestoreDiskFromBackup restores disk from backup
@@ -39,7 +39,7 @@ func (b Backup) RestoreDiskFromBackup(ctx context.Context, req RestoreDiskFromBa
reqWrapped := wrapperRestoreDiskFromBackupRequest{
RestoreDiskFromBackupRequest: req,
Async: false,
AsyncMode: false,
}
url := "/cloudbroker/backup/restoreDiskFromBackup"
@@ -68,7 +68,7 @@ func (b Backup) RestoreDiskFromBackupAsync(ctx context.Context, req RestoreDiskF
reqWrapped := wrapperRestoreDiskFromBackupRequest{
RestoreDiskFromBackupRequest: req,
Async: true,
AsyncMode: true,
}
url := "/cloudbroker/backup/restoreDiskFromBackup"

View File

@@ -32,7 +32,7 @@ type RestoreDisksFromBackupRequest struct {
type wrapperRestoreDisksFromBackupRequest struct {
RestoreDisksFromBackupRequest
Async bool `url:"async"`
AsyncMode bool `url:"asyncMode"`
}
// RestoreDisksFromBackup restores disks from backup
@@ -44,7 +44,7 @@ func (b Backup) RestoreDisksFromBackup(ctx context.Context, req RestoreDisksFrom
reqWrapped := wrapperRestoreDisksFromBackupRequest{
RestoreDisksFromBackupRequest: req,
Async: false,
AsyncMode: false,
}
url := "/cloudbroker/backup/restoreDisksFromBackup"
@@ -73,7 +73,7 @@ func (b Backup) RestoreDisksFromBackupAsync(ctx context.Context, req RestoreDisk
reqWrapped := wrapperRestoreDisksFromBackupRequest{
RestoreDisksFromBackupRequest: req,
Async: true,
AsyncMode: true,
}
url := "/cloudbroker/backup/restoreDisksFromBackup"

View File

@@ -27,7 +27,7 @@ type CreateTemplateRequest struct {
type wrapperCreateTemplateRequest struct {
CreateTemplateRequest
Async bool `url:"async"`
AsyncMode bool `url:"asyncMode"`
}
// CreateTemplateAsync create template from compute instance
@@ -39,7 +39,7 @@ func (c Compute) CreateTemplateAsync(ctx context.Context, req CreateTemplateRequ
reqWrapped := wrapperCreateTemplateRequest{
CreateTemplateRequest: req,
Async: true,
AsyncMode: true,
}
url := "/cloudbroker/compute/createTemplate"
@@ -63,7 +63,7 @@ func (c Compute) CreateTemplate(ctx context.Context, req CreateTemplateRequest)
reqWrapped := wrapperCreateTemplateRequest{
CreateTemplateRequest: req,
Async: false,
AsyncMode: false,
}
url := "/cloudbroker/compute/createTemplate"

View File

@@ -440,7 +440,7 @@ type ItemDisk struct {
RealityDeviceNumber uint64 `json:"realityDeviceNumber"`
// Replication
Replication interface{} `json:"replication"`
Replication ItemReplication `json:"replication"`
// Reference ID
ReferenceID string `json:"referenceId"`
@@ -485,6 +485,26 @@ type ItemDisk struct {
VMID uint64 `json:"vmid"`
}
type ItemReplication struct {
// DiskID
DiskID uint64 `json:"diskId"`
// PoolID
PoolID string `json:"poolId"`
// Role
Role string `json:"role"`
// SelfVolumeID
SelfVolumeID string `json:"selfVolumeId"`
// StorageID
StorageID string `json:"storageId"`
// VolumeID
VolumeID string `json:"volumeId"`
}
// List disks
type ListDisks []ItemDisk
@@ -706,6 +726,9 @@ type InfoCompute struct {
// Resource name
ResName string `json:"resName"`
// Reserved Node Cpus
ReservedNodeCpus []uint64 `json:"reservedNodeCpus"`
// Resource group ID
RGID uint64 `json:"rgId"`
@@ -919,6 +942,9 @@ type RecordCompute struct {
// Resource name
ResName string `json:"resName"`
// Reserved Node Cpus
ReservedNodeCpus []uint64 `json:"reservedNodeCpus"`
// Resource group ID
RGID uint64 `json:"rgId"`
@@ -1010,6 +1036,7 @@ type ListComputes struct {
EntryCount uint64 `json:"entryCount"`
}
// Short information about audit
// Short information about audit
type ItemAudit struct {
// Epoch

View File

@@ -16,9 +16,10 @@ type NetAttachRequest struct {
// Network type
// 'EXTNET' for connect to external network directly
// and 'VINS' for connect to ViNS
// 'VINS' for connect to ViNS
// 'VFNIC' for connect to vfpool
// Required: true
NetType string `url:"netType" json:"netType" validate:"computeNetType"`
NetType string `url:"netType" json:"netType" validate:"computex86NetType"`
// Network ID for connect to
// For EXTNET - external network ID

View File

@@ -18,6 +18,11 @@ type StopRequest struct {
// Required: false
Force bool `url:"force,omitempty" json:"force,omitempty"`
// whether to depresent compute disks from node or not
// Default: true
// Required: false
Depresent bool `url:"depresent" json:"depresent"`
// Reason for action
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`

View File

@@ -22,6 +22,24 @@ type UpdateRequest struct {
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
// Rule for VM placement with NUMA affinity.
// Possible values - none (placement without NUMA affinity),
// strict (strictly with NUMA affinity, if not possible - do not start VM),
// loose (use NUMA affinity if possible)
// Required: false
// Default: none
NumaAffinity string `url:"numaAffinity,omitempty" json:"numaAffinity,omitempty" validate:"omitempty,numaAffinity"`
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
// Required: false
// Default: false
CPUPin bool `url:"cpupin" json:"cpupin"`
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
// Required: false
// Default: false
HPBacked bool `url:"hpBacked" json:"hpBacked"`
// Reason for action
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`

View File

@@ -0,0 +1,41 @@
package disks
import (
"context"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
"strconv"
)
// DepresentRequest struct to depresent disk from node
type DepresentRequest struct {
// ID of the disk to depresent
// Required: true
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
// ID of the node to depresent disk from
// Required: true
NodeID uint64 `url:"nodeId" json:"nodeId" validate:"required"`
}
// Depresent depresents disk from node
func (d Disks) Depresent(ctx context.Context, req DepresentRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/depresent"
res, err := d.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
}

View File

@@ -57,7 +57,7 @@ type FromPlatformDiskRequest struct {
// List of types of compute suitable for image
// Example: [ "KVM_X86" ]
// Required: false
Drivers []string `url:"drivers" json:"drivers" validate:"min=1,max=2,imageDrivers"`
Drivers []string `url:"drivers,omitempty" json:"drivers,omitempty"`
// Does this machine supports hot resize
// Required: false

View File

@@ -32,7 +32,7 @@ type ListRequest struct {
// Find by shared, true or false
// Required: false
Shared bool `url:"shared,omitempty" json:"shared,omitempty"`
Shared interface{} `url:"shared,omitempty" json:"shared,omitempty" validate:"omitempty,isBool"`
// ID of the account the disks belong to
// Required: false

View File

@@ -28,7 +28,7 @@ type ListDeletedRequest struct {
// Find by shared, true or false
// Required: false
Shared bool `url:"shared,omitempty" json:"shared,omitempty"`
Shared interface{} `url:"shared,omitempty" json:"shared,omitempty" validate:"omitempty,isBool"`
// ID of the account the disks belong to
// Required: false

View File

@@ -138,7 +138,7 @@ type InfoDisk struct {
ReferenceID string `json:"referenceId"`
// Replication
Replication interface{} `json:"replication"`
Replication ItemReplication `json:"replication"`
// Resource ID
ResID string `json:"resId"`
@@ -177,6 +177,26 @@ type InfoDisk struct {
VMID uint64 `json:"vmid"`
}
type ItemReplication struct {
// DiskID
DiskID uint64 `json:"diskId"`
// PoolID
PoolID string `json:"poolId"`
// Role
Role string `json:"role"`
// SelfVolumeID
SelfVolumeID string `json:"selfVolumeId"`
// StorageID
StorageID string `json:"storageId"`
// VolumeID
VolumeID string `json:"volumeId"`
}
// Detailed indormation about disk
type RecordDisk struct {
// Device name

View File

@@ -0,0 +1,41 @@
package disks
import (
"context"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
"strconv"
)
// PresentRequest struct to present disk to node
type PresentRequest struct {
// ID of the disk to present
// Required: true
DiskID uint64 `url:"diskId" json:"diskId" validate:"required"`
// ID of the node to present disk to
// Required: true
NodeID uint64 `url:"nodeId" json:"nodeId" validate:"required"`
}
// Present presents disk to node
func (d Disks) Present(ctx context.Context, req PresentRequest) (bool, error) {
err := validators.ValidateRequest(req)
if err != nil {
return false, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/present"
res, err := d.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
}

View File

@@ -15,23 +15,18 @@ type ReplicationStatusRequest struct {
}
// ReplicationStatus get replication status
func (d Disks) ReplicationStatus(ctx context.Context, req ReplicationStatusRequest) (interface{}, error) {
func (d Disks) ReplicationStatus(ctx context.Context, req ReplicationStatusRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/disks/replicationStatus"
res, err := d.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return nil, err
return "", err
}
// result, err := strconv.ParseBool(string(res))
// if err != nil {
// return nil, err
// }
return res, nil
return string(res), nil
}

View File

@@ -42,6 +42,10 @@ type ListRequest struct {
// Required: false
ByID uint64 `url:"by_id,omitempty" json:"by_id,omitempty"`
// Find by list of clientIds
// Required: false
ClientIDs []uint64 `url:"clientIds,omitempty" json:"clientIds,omitempty"`
// Sort by one of supported fields, format +|-(field)
// Required: false
SortBy string `url:"sortBy,omitempty" json:"sortBy,omitempty" validate:"omitempty,sortBy"`
@@ -88,6 +92,10 @@ func (f FLIPGroup) ListRaw(ctx context.Context, req ListRequest) ([]byte, error)
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
if err := validators.ValidateRequest(req); err != nil {
return nil, validators.ValidationErrors(validators.GetErrors(err))
}
url := "/cloudbroker/flipgroup/list"
res, err := f.client.DecortApiCall(ctx, http.MethodPost, url, req)

View File

@@ -31,6 +31,7 @@ type ListRequest struct {
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
// Find by active True or False.
// Default: true
// Required: false
Active bool `url:"active" json:"active"`
}

View File

@@ -48,15 +48,15 @@ type ListRequest struct {
// Find by public True or False
// Required: false
Public bool `url:"public,omitempty" json:"public,omitempty"`
Public interface{} `url:"public,omitempty" json:"public,omitempty" validate:"omitempty,isBool"`
// Find by hot resize True or False
// Required: false
HotResize bool `url:"hotResize,omitempty" json:"hotResize,omitempty"`
HotResize interface{} `url:"hotResize,omitempty" json:"hotResize,omitempty" validate:"omitempty,isBool"`
// Find by bootable True or False
// Required: false
Bootable bool `url:"bootable,omitempty" json:"bootable,omitempty"`
Bootable interface{} `url:"bootable,omitempty" json:"bootable,omitempty" validate:"omitempty,isBool"`
// Sort by one of supported fields, format +|-(field)
// Required: false

View File

@@ -0,0 +1,39 @@
package image
import (
"context"
"encoding/json"
"fmt"
"net/http"
"os"
)
// UploadImageFileResponse struct to enable image
type UploadImageFileResponse struct {
// ImageFileUri
ImageFileUri string `json:"image_file_uri"`
}
// UploadImageFile uploads file image to platform
func (i Image) UploadImageFile(ctx context.Context, filePath string) (string, error) {
file, err := os.ReadFile(filePath)
if err != nil {
return "", fmt.Errorf("can not read file %v", err)
}
url := "/cloudbroker/image/uploadImageFile"
res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, file)
if err != nil {
return "", err
}
result := UploadImageFileResponse{}
err = json.Unmarshal(res, &result)
if err != nil {
return "", err
}
return result.ImageFileUri, nil
}

View File

@@ -14,7 +14,8 @@ type Interface struct {
// Should be one of:
// - VINS
// - EXTNET
NetType string `url:"netType" json:"netType" validate:"required,kvmNetType"`
// - VFNIC
NetType string `url:"netType" json:"netType" validate:"required,kvmx86NetType"`
// Network ID for connect to,
// for EXTNET - external network ID,
@@ -74,10 +75,14 @@ type CreateRequest struct {
// Required: true
RAM uint64 `url:"ram" json:"ram" validate:"required"`
// If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state
// Required: false
WithoutBootDisk bool `url:"withoutBootDisk" json:"withoutBootDisk"`
// ID of the OS image to base this VM on;
// Could be boot disk image or CD-ROM image
// Required: true
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// Size of the boot disk in GB
// Required: false
@@ -136,6 +141,24 @@ type CreateRequest struct {
// Required: false
Driver string `url:"driver,omitempty" json:"driver,omitempty"`
// Rule for VM placement with NUMA affinity.
// Possible values - none (placement without NUMA affinity),
// strict (strictly with NUMA affinity, if not possible - do not start VM),
// loose (use NUMA affinity if possible)
// Required: false
// Default: none
NumaAffinity string `url:"numaAffinity,omitempty" json:"numaAffinity,omitempty" validate:"omitempty,numaAffinity"`
// Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node
// Required: false
// Default: false
CPUPin bool `url:"cpupin" json:"cpupin"`
// Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node
// Required: false
// Default: false
HPBacked bool `url:"hpBacked" json:"hpBacked"`
// Reason for action
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`

View File

@@ -28,18 +28,22 @@ type CreateBlankRequest struct {
// Required: true
RAM uint64 `url:"ram" json:"ram" validate:"required"`
// If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state
// Required: false
WithoutBootDisk bool `url:"withoutBootDisk" json:"withoutBootDisk"`
// Size of the boot disk in GB
// Required: true
BootDisk uint64 `url:"bootDisk" json:"bootDisk" validate:"required"`
// Required: false
BootDisk uint64 `url:"bootDisk,omitempty" json:"bootDisk,omitempty"`
// ID of SEP to create boot disk on.
// Uses images SEP ID if not set
// Required: true
SEPID uint64 `url:"sepId" json:"sepId" validate:"required"`
// Required: false
SEPID uint64 `url:"sepId,omitempty" json:"sepId,omitempty"`
// Pool to use if sepId is set, can be also empty if needed to be chosen by system
// Required: true
Pool string `url:"pool" json:"pool" validate:"required"`
// Required: false
Pool string `url:"pool,omitempty" json:"pool,omitempty"`
// Slice of structs with data disk description. Each disk has parameters: required - diskName, size; optional - sepId, pool, desc and imageId.
// If not specified, compute will be created without disks.

View File

@@ -31,9 +31,13 @@ type MassCreateRequest struct {
// Required: true
RAM uint64 `url:"ram" json:"ram" validate:"required"`
// Image ID
// Required: true
ImageID uint64 `url:"imageId" json:"imageId" validate:"required"`
// If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state
// Required: false
WithoutBootDisk bool `url:"withoutBootDisk" json:"withoutBootDisk"`
// ID of the OS image to base this VM on; Could be boot disk image or CD-ROM image
// Required: false
ImageID uint64 `url:"imageId,omitempty" json:"imageId,omitempty"`
// Size of the boot disk in GB
// Required: false

View File

@@ -102,7 +102,7 @@ type ConsumedResourcesInfo struct {
// Information about node CPU
type CpuInfo struct {
// Clock Speed
ClockSpeed uint64 `json:"clockSpeed"`
ClockSpeed float64 `json:"clockSpeed"`
// CoreCount
CoreCount uint64 `json:"coreCount"`

View File

@@ -22,10 +22,6 @@ type ListLBRequest struct {
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Find by account ID
// Required: false
AccountID uint64 `url:"accountId,omitempty" json:"accountId,omitempty"`
// Find by tech status
// Required: false
TechStatus string `url:"techStatus,omitempty" json:"techStatus,omitempty"`

View File

@@ -14,14 +14,17 @@ type ListRequest struct {
// Required: false
TaskID string `url:"taskId,omitempty" json:"taskId,omitempty"`
// Find by auditId
// Required: false
AuditID string `url:"auditId,omitempty" json:"auditId,omitempty"`
// Find by status
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty"`
// Find by completed True or False
// Default: false
// Required: false
Completed bool `url:"completed" json:"completed"`
Completed interface{} `url:"completed,omitempty" json:"completed,omitempty" validate:"omitempty,isBool"`
// Sort by one of supported fields, format +|-(field)
// Required: false
@@ -29,19 +32,21 @@ type ListRequest struct {
// Find all tasks after point in time (unixtime)
// Required: false
UpdateTimeAt uint64 `url:"page,updateTimeAt" json:"updateTimeAt,omitempty"`
UpdateTimeAt uint64 `url:"updateTimeAt,omitempty" json:"updateTimeAt,omitempty"`
// Find all tasks before point in time (unixtime)
// Required: false
UpdateTimeTo uint64 `url:"page,updateTimeTo" json:"updateTimeTo,omitempty"`
UpdateTimeTo uint64 `url:"updateTimeTo,omitempty" json:"updateTimeTo,omitempty"`
// Page number
// Default: 0
// Default: 0
// Required: false
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
// Page size
// Default: 0
// Default: 0
// Required: false
Size uint64 `url:"size,omitempty" json:"size,omitempty"`
}

View File

@@ -16,11 +16,11 @@ type ListRequest struct {
// Find by active. True or False.
// Required: false
Active bool `url:"active,omitempty" json:"active,omitempty"`
Active interface{} `url:"active,omitempty" json:"active,omitempty" validate:"omitempty,isBool"`
// Find by serviceaccount. True or False.
// Required: false
ServiceAccount bool `url:"serviceaccount,omitempty" json:"serviceaccount,omitempty"`
ServiceAccount interface{} `url:"serviceaccount,omitempty" json:"serviceaccount,omitempty" validate:"omitempty,isBool"`
// Sort by one of supported fields, format +|-(field)
// Required: false

View File

@@ -15,8 +15,8 @@ type DNSApplyRequest struct {
VINSID uint64 `url:"vinsId" json:"vinsId" validate:"required"`
// List of DNS ip address
// Required: true
DNSList []string `url:"dnsList" json:"dnsList" validate:"required"`
// Required: false
DNSList []string `url:"dnsList" json:"dnsList"`
}
// DNSApply applies new DNS list in VINS

View File

@@ -30,6 +30,10 @@ type ListRequest struct {
// Required: false
ExtIP string `url:"extIp,omitempty" json:"extIp,omitempty"`
// Find by VNF Device id
// Required: false
VNFDevID uint64 `url:"vnfdevId,omitempty" json:"vnfdevId,omitempty"`
// Include deleted
// Required: false
IncludeDeleted bool `url:"includeDeleted,omitempty" json:"includeDeleted,omitempty"`