diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f59523..8170a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Version 1.15.4 +## Version 1.15.5 Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и будут удалены в версии 1.16, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke`, `AccessRevokeToPool` в cloudbroker/sep стали deprecated и будут удалены в версии 1.16 @@ -11,36 +11,69 @@ Методы `ExecuteMaintenanceScript`, `ListEmails`, `ServicesRestart` в cloudbroker/grid стали deprecated и будут удалены в версии 1.16 Метод `Get` в cloudbroker/group стал deprecated и будет удален в версии 1.16 -Все методы группы `.SDN()` находятся в альфа-версии. - - ### Добавлено #### compute | Идентификатор задачи | Описание | | --- | --- | -| BGOS-941 | Вычисляемое поле `PoolName` в структуру ответа `SnapshotExtend` в cloudapi/compute | -| BGOS-941 | Вычисляемое поле `PoolName` в структуру ответа `ItemSnapshotDetailed` в cloudbroker/compute | -| BGOS-942 | Вычилсяемое поле `MachineID` в структуру ответа `ItemNode` в cloudbroker/node | +| BGOS-954 | Вычисляемое поле `ResizedOnline` в структуры ответа `RecordCompute` и `ItemCompute` в cloudapi/compute и cloudbroker/compute | -#### disks +#### resmon | Идентификатор задачи | Описание | | --- | --- | -| BGOS-940 | Вычисляемое поле `PoolName` в структуру ответа `ItemSnapshot` в cloudapi/disks и cloudbroker/disks | +| BGOS-947 | Вычисляемое поле `UID` в структуру ответа `GetByNodePoint` в cloudbroker/resmon | +| BGOS-947 | Вычисляемые поля `ThreadCount`, `ModelName`, `Flags` и `MaxSupportedGeneration` в структуру ответа `CPUinfoByNode` в cloudbroker/resmon | +| BGOS-947 | Вычисляемые поля `UsedGiB` и `TotalGiB` в структуру ответа `ItemStorage` в cloudbroker/resmon | -#### grid +#### SDN logicalports | Идентификатор задачи | Описание | | --- | --- | -| BGOS-925 | Вычисляемые поля `ReservedCPU` и `ReservedRAM` в структуры ответа `RecordGrid` и `ItemGridList` в cloudbroker/grid | +| BGOS-951 | Вычисляемое поле `ExcludeFirewall` в структуру ответа `LogicalPort` в sdn/logicalports | -#### rg +### Изменено + +#### compute | Идентификатор задачи | Описание | | --- | --- | -| BGOS-944 | Опциональное поле `EnableDefaultGateway` в структуру запроса `CreateRequest` в cloudapi/rg и cloudbroker/rg | +| BGOS-958 | Тип возвращаемого значения с `string` на `RecordMigrateStorageInfo` в методе `MigrateStorageInfo` в cloudbroker/compute | + +#### resmon +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-947 | Тип вычисляемых полей `CPUTime` и `RAMConsumedReal` с `uint64` на `float64` в структуре ответа `ComputeUsage` в cloudbroker/resmon | +| BGOS-947 | Тип вычисляемого поля `IsUp` с `uint64` на `bool` в структуре ответа `ComputeUsage` в cloudbroker/resmon | +| BGOS-947 | Тип вычисляемого поля `SizeMax` с `float64` на `uint64` в структуре ответа `ItemDisk` в cloudbroker/resmon | +| BGOS-947 | Тип вычисляемых полей `CPUPower`, `CPUUtil`, `TotalMem`, `ReservedMem`, `UsedMem` и `FreeMem` с `uint64` на `float64` в структуре ответа `ItemTotalByGRID` в cloudbroker/resmon | +| BGOS-947 | Тип вычисляемых полей `PCPU` и `CPUUtil` с `uint64` на `float64` в структуре ответа `NodeUsage` в cloudbroker/resmon | + +#### SDN hypervisors +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-956 | Тип возвращаемого значения в методе `Delete` c `bool` на `RecordVersion` в sdn/hypervisors | + +#### SDN logicalports +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-951 | Тип опционального поля `LogicalPortAddresses` в структуре запроса `CreateRequest` с `[]LogicalPortAddress` на `[]LogicalPortAddressRequest` в sdn/logicalports | +| BGOS-951 | Тип обязательного поля `IP` в структуре запроса `LogicalPortAddressRequest` с `string` на `interface{}` в sdn/logicalports | +| BGOS-951 | Тип обязательного поля `IsDiscovered` в структуре запроса `UpdateAddress` и `AddAddress` с `bool` на `interface{}` в sdn/logicalports | +| BGOS-951 | Тип опционального поля `Labels` в структуре запроса `CreateRequest` с `CreateLabels` на `*CreateLabels` в sdn/logicalports | +| BGOS-951 | Тип опционального поля `Labels` в структуре запроса `UpdateRequest` с `UpdateLabels` на `*UpdateLabels` в sdn/logicalports | + +#### SDN netobjgroups +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-957 | Тип вычисляемого поля `ExternalNetworkPorts` с массива на объект в sdn/netobjgroups | ### Удалено -#### grid +#### resmon | Идентификатор задачи | Описание | | --- | --- | -| BGOS-925 | Поля `CPUAllocationRatio`, `CPUAllocationRatioVM`, `CustomBackupPath` и `Networks` из структуры ответа `RecordSettingsGrid` в cloudbroker/grid | +| BGOS-947 | Вычисляемые поля `NodesCPU`, `StorageCapacity` и `VCPUConsumed` из структуры ответа `ItemTotalByGRID` в cloudbroker/resmon | +| BGOS-947 | Вычисляемые поля `CapacityLimit`, `Consumed`, `Type` и `UID` из структуры ответа `ItemStorage` в cloudbroker/resmon | + +#### SDN netobjgroups +| Идентификатор задачи | Описание | +| --- | --- | +| BGOS-957 | Вычисляемые поля `Comment`, `Enabled`, `IPv4` и `MAC` в структуре `ExternalNetworkPorts` в структуре ответа `RecordNetObjGroup` в sdn/netobjgroups | \ No newline at end of file diff --git a/internal/validators/custom.go b/internal/validators/custom.go index 7a92a55..676d476 100644 --- a/internal/validators/custom.go +++ b/internal/validators/custom.go @@ -350,6 +350,10 @@ func isBoolTypeValidator(fe validator.FieldLevel) bool { return fe.Field().CanConvert(reflect.TypeOf(true)) } +func isStringTypeValidator(fe validator.FieldLevel) bool { + return fe.Field().Kind() == reflect.String +} + func urlValidartor(fl validator.FieldLevel) bool { fieldValues := fl.Field().String() diff --git a/internal/validators/messages.go b/internal/validators/messages.go index 6894d6d..dca4fc4 100644 --- a/internal/validators/messages.go +++ b/internal/validators/messages.go @@ -27,6 +27,8 @@ func errorMessage(fe validator.FieldError) string { return fmt.Sprintf("%s %s: unexpected E-Mail format", prefix, fe.Field()) case "isBool": return fmt.Sprintf("%s %s: must be bool type", prefix, fe.Field()) + case "isString": + return fmt.Sprintf("%s %s: must be string type", prefix, fe.Field()) case "accessType": return fmt.Sprintf("%s %s must be one of the following: %s", diff --git a/internal/validators/validator.go b/internal/validators/validator.go index 5ad2545..47444d6 100644 --- a/internal/validators/validator.go +++ b/internal/validators/validator.go @@ -231,6 +231,11 @@ func registerAllValidators(validate *validator.Validate) error { return err } + err = validate.RegisterValidation("isString", isStringTypeValidator) + if err != nil { + return err + } + err = validate.RegisterValidation("url", urlValidartor) if err != nil { return err diff --git a/pkg/cloudapi/compute/models.go b/pkg/cloudapi/compute/models.go index 53c8305..47cdce0 100644 --- a/pkg/cloudapi/compute/models.go +++ b/pkg/cloudapi/compute/models.go @@ -515,6 +515,9 @@ type RecordCompute struct { // Registered or not Registered bool `json:"registered"` + // Whether a compute has been resized online + ResizedOnline bool `json:"resizedOnline"` + // Resource name ResName string `json:"resName"` @@ -1500,6 +1503,9 @@ type ItemCompute struct { // Registered Registered bool `json:"registered"` + // Whether a compute has been resized online + ResizedOnline bool `json:"resizedOnline"` + // Resource name ResName string `json:"resName"` diff --git a/pkg/cloudbroker/compute/migrate_storage_info.go b/pkg/cloudbroker/compute/migrate_storage_info.go index 305dcc0..251cbef 100644 --- a/pkg/cloudbroker/compute/migrate_storage_info.go +++ b/pkg/cloudbroker/compute/migrate_storage_info.go @@ -2,8 +2,8 @@ package compute import ( "context" + "encoding/json" "net/http" - "strings" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) @@ -16,20 +16,35 @@ type MigrateStorageInfoRequest struct { } // MigrateStorageInfo gets info about last (include ongoing) storage migration -func (c Compute) MigrateStorageInfo(ctx context.Context, req MigrateStorageInfoRequest) (string, error) { +func (c Compute) MigrateStorageInfo(ctx context.Context, req MigrateStorageInfoRequest) (*RecordMigrateStorageInfo, error) { + res, err := c.MigrateStorageInfoRaw(ctx, req) + if err != nil { + return nil, err + } + + info := RecordMigrateStorageInfo{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} + +// MigrateStorageInfoRaw gets info about last (include ongoing) storage migration as an array of bytes +func (c Compute) MigrateStorageInfoRaw(ctx context.Context, req MigrateStorageInfoRequest) ([]byte, error) { err := validators.ValidateRequest(req) if err != nil { - return "", validators.ValidationErrors(validators.GetErrors(err)) + return nil, validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/compute/migrateStorageInfo" res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return "", err + return nil, err } - result := strings.ReplaceAll(string(res), "\"", "") - - return result, nil + return res, nil } diff --git a/pkg/cloudbroker/compute/models.go b/pkg/cloudbroker/compute/models.go index 0c8b056..99f3f59 100644 --- a/pkg/cloudbroker/compute/models.go +++ b/pkg/cloudbroker/compute/models.go @@ -864,6 +864,9 @@ type InfoCompute struct { // Registered Registered bool `json:"registered"` + // Whether a compute has been resized online + ResizedOnline bool `json:"resizedOnline"` + // Resource name ResName string `json:"resName"` @@ -1166,6 +1169,9 @@ type RecordCompute struct { // Registered Registered bool `json:"registered"` + // Whether a compute has been resized online + ResizedOnline bool `json:"resizedOnline"` + // Resource name ResName string `json:"resName"` @@ -1520,6 +1526,405 @@ type MigrateStorageItem struct { TargetNodeID uint64 `json:"targetNodeId"` } +// Info about last (including ongoing) storage migration +type RecordMigrateStorageInfo struct { + // Migration completion status + Completed bool `json:"completed"` + + // Daemon address + DaemonAddr string `json:"daemonAddr"` + + // Domain name + DomainName string `json:"domainName"` + + // Domain UUID + DomainUUID string `json:"domainUUID"` + + // Elapsed time + ElapsedTime uint64 `json:"elapsedTime"` + + // GID + GID uint64 `json:"gid"` + + // GUID + GUID uint64 `json:"guid"` + + // ID + ID uint64 `json:"id"` + + // List interfaces + Interfaces []ItemShadowComputeInterface `json:"interfaces"` + + // Log + Log []string `json:"log"` + + // New disk XMLs + NewDiskXmls []string `json:"newDiskXmls"` + + // New disks + NewDisks []uint64 `json:"newDisks"` + + // Old disks + OldDisks []uint64 `json:"oldDisks"` + + // PID + PID uint64 `json:"pid"` + + // Source node ID + SourceNodeID uint64 `json:"sourceNodeId"` + + // Source numa node ID + SourceNumaNodeID int64 `json:"sourceNumaNodeId"` + + // Source reserved node CPUs + SourceReservedNodeCpus []uint64 `json:"sourceReservedNodeCpus"` + + // Source URL + SourceURL string `json:"sourceURL"` + + // Status + Status string `json:"status"` + + // Target shadow compute + TargetShadowCompute ShadowCompute `json:"target_shadow_compute"` + + // Target node ID + TargetNodeID uint64 `json:"targetNodeId"` + + // Target URL + TargetURL string `json:"targetURL"` + + // VM log directory + VMLogDir string `json:"vmlogDir"` +} + +// Shadow compute created for the duration of a storage migration +type ShadowCompute struct { + // Account ID + AccountID uint64 `json:"accountId"` + + // Access Control List + ACL []interface{} `json:"acl"` + + // Affinity label + AffinityLabel string `json:"affinityLabel"` + + // Affinity rules + AffinityRules ListShadowComputeRules `json:"affinityRules"` + + // Affinity weight + AffinityWeight uint64 `json:"affinityWeight"` + + // Anti affinity rules + AntiAffinityRules ListShadowComputeRules `json:"antiAffinityRules"` + + // Architecture + Arch string `json:"arch"` + + // Auto start when node restarted + AutoStart bool `json:"autoStart"` + + // Boot image ID + BootImageID uint64 `json:"boot_image_id"` + + // Boot order + BootOrder []string `json:"bootOrder"` + + // Boot type + BootType string `json:"bootType"` + + // Boot disk size + BootDiskSize uint64 `json:"bootdiskSize"` + + // CD Image ID + CDImageID uint64 `json:"cdImageId"` + + // Chipset + Chipset string `json:"chipset"` + + // Clone reference + CloneReference uint64 `json:"cloneReference"` + + // List clone IDs + Clones []uint64 `json:"clones"` + + // Compute CI ID + ComputeCIID uint64 `json:"computeciId"` + + // CPU pin + CPUPin bool `json:"cpupin"` + + // Number of CPU + CPUs uint64 `json:"cpus"` + + // Custom fields + CustomFields map[string]interface{} `json:"customFields"` + + // Description + Description string `json:"desc"` + + // Devices + Devices interface{} `json:"devices"` + + // List disks + Disks []ItemShadowComputeDisk `json:"disks"` + + // Driver + Driver string `json:"driver"` + + // GID + GID uint64 `json:"gid"` + + // GUID + GUID uint64 `json:"guid"` + + // HPBacked + HPBacked bool `json:"hpBacked"` + + // Hot resize + HotResize bool `json:"hotResize"` + + // ID + ID uint64 `json:"id"` + + // List interfaces + Interfaces []ItemShadowComputeInterface `json:"interfaces"` + + // Live migration job ID + LiveMigrationJobID uint64 `json:"live_migration_job_id"` + + // Loader type + LoaderType string `json:"loaderType"` + + // Lock status + LockStatus string `json:"lockStatus"` + + // Manager ID + ManagerID uint64 `json:"managerId"` + + // Manager type + ManagerType string `json:"managerType"` + + // Migration job + MigrationJob uint64 `json:"migrationjob"` + + // Milestones + Milestones uint64 `json:"milestones"` + + // Name + Name string `json:"name"` + + // Need reboot + NeedReboot bool `json:"needReboot"` + + // Network interface naming + NetworkInterfaceNaming string `json:"networkInterfaceNaming"` + + // Node ID + NodeID uint64 `json:"node_id"` + + // NumaAffinity + NumaAffinity string `json:"numaAffinity"` + + // NumaNodeId + NumaNodeID int64 `json:"numaNodeId"` + + // List OS users + OSUsers ListOSUsers `json:"osUsers"` + + // Name of OS + OSVersion string `json:"os_version"` + + // Pinned to node + PinnedToNode int64 `json:"pinnedToNode"` + + // Preferred CPU + PreferredCPU []int64 `json:"preferredCpu"` + + // Qemu guest + QemuGuest QemuQuest `json:"qemu_guest"` + + // ReadOnly indicates read-only mode state + ReadOnly bool `json:"read_only"` + + // Number of RAM + RAM uint64 `json:"ram"` + + // Reference ID + ReferenceID string `json:"referenceId"` + + // Reserved node CPUs + ReservedNodeCpus []uint64 `json:"reservedNodeCpus"` + + // Resized online + ResizedOnline bool `json:"resizedOnline"` + + // Resource name + ResName string `json:"resName"` + + // Resource group ID + RGID uint64 `json:"rgId"` + + // SnapSets + SnapSets ListShadowComputeSnapshots `json:"snapSets"` + + // Stateless SEP ID + StatelessSEPID int64 `json:"statelessSepId"` + + // Stateless SEP type + StatelessSEPType string `json:"statelessSepType"` + + // Status + Status string `json:"status"` + + // Tags + Tags map[string]interface{} `json:"tags"` + + // Tech status + TechStatus string `json:"techStatus"` + + // User managed + UserManaged bool `json:"userManaged"` + + // Userdata + Userdata interface{} `json:"userdata"` + + // List VGPU IDs + VGPUs []uint64 `json:"vgpus"` + + // VNC password + VNCPassword string `json:"vncPasswd"` + + // Zone ID + ZoneID uint64 `json:"zoneId"` +} + +// Disk of a shadow compute +type ItemShadowComputeDisk struct { + // ID + ID uint64 `json:"id"` +} + +// Affinity/anti-affinity rule of a shadow compute +type ItemShadowComputeRule struct { + // Key + Key string `json:"key"` + + // Mode + Mode string `json:"mode"` + + // Policy + Policy string `json:"policy"` + + // Topology + Topology string `json:"topology"` + + // Value + Value string `json:"value"` +} + +// List of shadow compute affinity/anti-affinity rules +type ListShadowComputeRules []ItemShadowComputeRule + +// Snapshot of a shadow compute +type ItemShadowComputeSnapshot struct { + // List of disk IDs + Disks []uint64 `json:"disks"` + + // GUID + GUID string `json:"guid"` + + // Label + Label string `json:"label"` + + // Timestamp + Timestamp uint64 `json:"timestamp"` +} + +// List of shadow compute snapshots +type ListShadowComputeSnapshots []ItemShadowComputeSnapshot + +// Network interface of a shadow compute +type ItemShadowComputeInterface struct { + // Name + Name string `json:"name"` + + // Target + Target string `json:"target"` + + // PCI slot + PCISlot int64 `json:"pciSlot"` + + // Bus number + BusNumber int64 `json:"bus_number"` + + // MAC + MAC string `json:"mac"` + + // Maximum transmission unit + MTU int64 `json:"mtu"` + + // Type + Type string `json:"type"` + + // Connection type + ConnType string `json:"connType"` + + // Connection ID + ConnID uint64 `json:"connId"` + + // FLIPGroup ID + FLIPGroupID uint64 `json:"flipgroupId"` + + // Network type + NetType string `json:"netType"` + + // Network ID + NetID uint64 `json:"netId"` + + // IP address + IPAddress string `json:"ipAddress"` + + // Network mask + NetMask int64 `json:"netMask"` + + // Default GW + DefGW string `json:"defGw"` + + // List of VNF IDs + VNFs []uint64 `json:"vnfs"` + + // QOS + QOS QOS `json:"qos"` + + // Libvirt settings + LibvirtSettings LibvirtSettings `json:"libvirtSettings"` + + // GUID + GUID string `json:"guid"` + + // Listen SSH or not + ListenSSH bool `json:"listenSsh"` + + // Enabled + Enabled bool `json:"enabled"` + + // Node ID + NodeID uint64 `json:"nodeId"` + + // SDN interface ID + SDNInterfaceID string `json:"sdn_interface_id"` + + // List of security groups + SecGroups []uint64 `json:"security_groups"` + + // Enable security groups + EnableSecGroups bool `json:"enable_secgroups"` + + // Trunk tags + TrunkTags []int64 `json:"trunk_tags"` +} + type RecordCloneAbort struct { // Disk ID DiskID uint64 `json:"disk_id"` diff --git a/pkg/cloudbroker/resmon/get_by_node.go b/pkg/cloudbroker/resmon/get_by_node.go index a79640e..9b227cd 100644 --- a/pkg/cloudbroker/resmon/get_by_node.go +++ b/pkg/cloudbroker/resmon/get_by_node.go @@ -11,7 +11,7 @@ import ( type GetByNodeRequest struct { // Node ID // Required: true - NodeID uint64 `url:"nodeId" json:"nodeId" validate:"required"` + NodeID uint64 `url:"node_id" json:"node_id" validate:"required"` // Start of time period - unixtime // Required: false diff --git a/pkg/cloudbroker/resmon/models.go b/pkg/cloudbroker/resmon/models.go index ec0d71c..d6de1a5 100644 --- a/pkg/cloudbroker/resmon/models.go +++ b/pkg/cloudbroker/resmon/models.go @@ -16,15 +16,15 @@ type GetByComputePoint struct { } type ComputeUsage struct { - VCPUsConsumed uint64 `json:"vcpusConsumed"` - Storage uint64 `json:"storage"` - CPUTime uint64 `json:"cpuTime"` - ExtIPs uint64 `json:"extips"` - RAMConsumed uint64 `json:"ramConsumed"` - VCPUsReserved uint64 `json:"vcpusReserved"` - IsUp uint64 `json:"isUp"` - RAMConsumedReal uint64 `json:"ramConsumedReal"` - RAMReserved uint64 `json:"ramReserved"` + VCPUsConsumed uint64 `json:"vcpusConsumed"` + Storage uint64 `json:"storage"` + CPUTime float64 `json:"cpuTime"` + ExtIPs uint64 `json:"extips"` + RAMConsumed uint64 `json:"ramConsumed"` + VCPUsReserved uint64 `json:"vcpusReserved"` + IsUp bool `json:"isUp"` + RAMConsumedReal float64 `json:"ramConsumedReal"` + RAMReserved uint64 `json:"ramReserved"` } type ItemDisk struct { @@ -33,7 +33,7 @@ type ItemDisk struct { ResID string `json:"resId"` SizeUsed float64 `json:"sizeUsed"` SizeAvailable float64 `json:"sizeAvailable"` - SizeMax float64 `json:"sizeMax"` + SizeMax uint64 `json:"sizeMax"` } // GetByGRIDData represents an array of data points @@ -46,22 +46,17 @@ type GetByGRIDPoint struct { } type ItemTotalByGRID struct { - NodesCPU uint64 `json:"nodesCPU"` - StorageCapacity uint64 `json:"storageCapacity"` - CPUPower uint64 `json:"cpuPower"` - CPUUtil uint64 `json:"cpuUtil"` - TotalMem uint64 `json:"totalMem"` - ReservedMem uint64 `json:"reservedMem"` - UsedMem uint64 `json:"usedMem"` - FreeMem uint64 `json:"freeMem"` - VCPUConsumed uint64 `json:"vcpuConsumed"` + CPUPower float64 `json:"cpuPower"` + CPUUtil float64 `json:"cpuUtil"` + TotalMem float64 `json:"totalMem"` + ReservedMem float64 `json:"reservedMem"` + UsedMem float64 `json:"usedMem"` + FreeMem float64 `json:"freeMem"` } type ItemStorage struct { - CapacityLimit uint64 `json:"capacityLimit"` - Consumed uint64 `json:"consumed"` - Type string `json:"type"` - UID string `json:"uid"` + UsedGiB uint64 `json:"usedGiB"` + TotalGiB uint64 `json:"totalGiB"` } // GetByNodeData represents an array of data points @@ -72,20 +67,25 @@ type GetByNodePoint struct { CPUInfo CPUinfoByNode `json:"cpuInfo"` Name string `json:"name"` ID uint64 `json:"id"` + UID string `json:"uid"` } type NodeUsage struct { - CPUPower uint64 `json:"cpuPower"` - UsedVCPUs uint64 `json:"usedVcpus"` - PCPU uint64 `json:"pcpu"` - UsedMem uint64 `json:"usedMem"` - CPUUtil uint64 `json:"cpuUtil"` - ReservedMem uint64 `json:"reservedMem"` - FreeMem uint64 `json:"freeMem"` + CPUPower uint64 `json:"cpuPower"` + UsedVCPUs uint64 `json:"usedVcpus"` + PCPU float64 `json:"pcpu"` + UsedMem uint64 `json:"usedMem"` + CPUUtil float64 `json:"cpuUtil"` + ReservedMem uint64 `json:"reservedMem"` + FreeMem uint64 `json:"freeMem"` } type CPUinfoByNode struct { - ClockSpeed uint64 `json:"clockSpeed"` - CoreCount uint64 `json:"coreCount"` - PhysCount uint64 `json:"physCount"` + ClockSpeed uint64 `json:"clockSpeed"` + CoreCount uint64 `json:"coreCount"` + PhysCount uint64 `json:"physCount"` + ThreadCount uint64 `json:"threadCount"` + ModelName string `json:"model_name"` + Flags []string `json:"flags"` + MaxSupportedGeneration string `json:"max_supported_generation"` } diff --git a/pkg/sdn/hypervisors/delete.go b/pkg/sdn/hypervisors/delete.go index 71cb463..e1fea54 100644 --- a/pkg/sdn/hypervisors/delete.go +++ b/pkg/sdn/hypervisors/delete.go @@ -2,8 +2,8 @@ package hypervisors import ( "context" + "encoding/json" "net/http" - "strconv" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" @@ -17,27 +17,21 @@ type DeleteRequest struct { } // Delete a hypervisor -func (hv Hypervisors) Delete(ctx context.Context, req DeleteRequest) (bool, error) { +func (hv Hypervisors) Delete(ctx context.Context, req DeleteRequest) (*RecordVersion, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return nil, validators.ValidationErrors(validators.GetErrors(err)) } url := "/sdn/hypervisor/delete" res, err := hv.client.DecortApiCallCtype(ctx, http.MethodDelete, url, constants.MIMEJSON, req) + info := RecordVersion{} + + err = json.Unmarshal(res, &info) if err != nil { - return false, err + return nil, err } - if string(res) == "" { - return true, nil - } - - result, err := strconv.ParseBool(string(res)) - if err != nil { - return false, err - } - - return result, nil + return &info, nil } diff --git a/pkg/sdn/hypervisors/models.go b/pkg/sdn/hypervisors/models.go index cd4ec2c..e65b943 100644 --- a/pkg/sdn/hypervisors/models.go +++ b/pkg/sdn/hypervisors/models.go @@ -1,5 +1,11 @@ package hypervisors +// Information about a version +type RecordVersion struct { + // Version ID + VersionID uint64 `json:"version_id"` +} + // Main information about hypervisor type RecordHypervisor struct { // Created at diff --git a/pkg/sdn/logicalports/create.go b/pkg/sdn/logicalports/create.go index 7d45800..fa846dc 100644 --- a/pkg/sdn/logicalports/create.go +++ b/pkg/sdn/logicalports/create.go @@ -55,34 +55,35 @@ type CreateRequest struct { // Logical port addresses // Required: false - LogicalPortAddresses []LogicalPortAddress `url:"logical_port_addresses,omitempty" json:"logical_port_addresses,omitempty" validate:"dive"` + LogicalPortAddresses []LogicalPortAddressRequest `url:"logical_port_addresses,omitempty" json:"logical_port_addresses,omitempty" validate:"dive"` // Labels // Required: false - Labels CreateLabels `url:"labels,omitempty" json:"labels,omitempty"` + Labels *CreateLabels `url:"labels,omitempty" json:"labels"` } // LogicalPortAddressRequest struct representing logical port address type LogicalPortAddressRequest struct { - // IP address + // IP address. IPv4 or IPv6 address of the logical port + // If nil (allowed only when IsPrimary is true), the system will automatically generate a valid address // Required: true - IP string `url:"ip" json:"ip" validate:"required"` + IP interface{} `url:"ip" json:"ip" validate:"omitempty,isString"` // IP type // Required: true IPType string `url:"ip_type" json:"ip_type" validate:"required,oneof=IPv4 IPv6"` - // Is primary. True or False + // Is primary // Required: true IsPrimary interface{} `url:"is_primary" json:"is_primary" validate:"required,isBool"` + // Is discovered + // Required: true + IsDiscovered interface{} `url:"is_discovered" json:"is_discovered" validate:"required,isBool"` + // MAC address // Required: false MAC string `url:"mac,omitempty" json:"mac,omitempty"` - - // Is discovered. True or False - // Required: true - IsDiscovered bool `url:"is_discovered" json:"is_discovered" validate:"required"` } // Create creates a logical port diff --git a/pkg/sdn/logicalports/models.go b/pkg/sdn/logicalports/models.go index 98905cf..d4322be 100644 --- a/pkg/sdn/logicalports/models.go +++ b/pkg/sdn/logicalports/models.go @@ -34,6 +34,9 @@ type LogicalPort struct { // Enabled Enabled bool `json:"enabled"` + // Exclude firewall information + ExcludeFirewall ExcludeFirewall `json:"exclude_firewall"` + // External network ID ExternalNetworkID string `json:"external_network_id"` @@ -162,6 +165,18 @@ type MigrationStatus struct { VersionID uint64 `json:"version_id"` } +// ExcludeFirewall information +type ExcludeFirewall struct { + // Exclusion reason + ExclusionReason string `json:"exclusion_reason"` + + // Whether logical port addresses are excluded from firewall + LogicalPortAddressesExcluded bool `json:"logical_port_addresses_excluded"` + + // Whether logical port is excluded from firewall + LogicalPortExcluded bool `json:"logical_port_excluded"` +} + // Labels information type Labels struct { // VM ID diff --git a/pkg/sdn/logicalports/update.go b/pkg/sdn/logicalports/update.go index ba8213f..9333122 100644 --- a/pkg/sdn/logicalports/update.go +++ b/pkg/sdn/logicalports/update.go @@ -67,7 +67,7 @@ type UpdateRequest struct { // Labels // Required: false - Labels UpdateLabels `url:"labels,omitempty" json:"labels,omitempty"` + Labels *UpdateLabels `url:"labels,omitempty" json:"labels"` } // UpdateAddress struct representing update address @@ -86,7 +86,7 @@ type UpdateAddress struct { // Is discovered. True or False // Required: true - IsDiscovered bool `url:"is_discovered" json:"is_discovered" validate:"required"` + IsDiscovered interface{} `url:"is_discovered" json:"is_discovered" validate:"required,isBool"` // Is primary. True or False // Required: true @@ -107,11 +107,11 @@ type AddAddress struct { // Required: true IPType string `url:"ip_type" json:"ip_type" validate:"required,oneof=IPv4 IPv6"` - // Is discovered. True or False + // Is discovered // Required: true - IsDiscovered bool `url:"is_discovered" json:"is_discovered" validate:"required"` + IsDiscovered interface{} `url:"is_discovered" json:"is_discovered" validate:"required,isBool"` - // Is primary. True or False + // Is primary // Required: true IsPrimary interface{} `url:"is_primary" json:"is_primary" validate:"required,isBool"` diff --git a/pkg/sdn/netobjgroups/models.go b/pkg/sdn/netobjgroups/models.go index 70519b1..3f0e963 100644 --- a/pkg/sdn/netobjgroups/models.go +++ b/pkg/sdn/netobjgroups/models.go @@ -182,7 +182,7 @@ type L2ExternalNetwork struct { } // Info about an external network port -type ExternalNetworkPort struct { +type ExternalNetworkPorts struct { // Access group ID AccessGroupID string `json:"access_group_id"` @@ -192,9 +192,6 @@ type ExternalNetworkPort struct { // Bridge network name BridgeNetworkName string `json:"bridge_network_name"` - // Comment - Comment string `json:"comment"` - // Default gateway for IPv4 DefaultGatewayIPv4 string `json:"default_gateway_ipv4"` @@ -204,9 +201,6 @@ type ExternalNetworkPort struct { // Description Description string `json:"description"` - // Is a logical port enabled - Enabled bool `json:"enabled"` - // Details of external network ports ExternalNetworkPorts ExternalNetworkPortsField `json:"external_network_ports"` @@ -216,9 +210,6 @@ type ExternalNetworkPort struct { // ID of an external network port ID string `json:"id"` - // IP v4 - IPv4 string `json:"ipv4"` - // Status Status Status `json:"status"` @@ -239,14 +230,8 @@ type ExternalNetworkPort struct { // VLAN Tag VLANTag int `json:"vlan_tag"` - - // MAC - MAC string `json:"mac"` } -// List of external network ports -type ExternalNetworkPorts []ExternalNetworkPort - // Info about a logical port type LogicalPort struct { // ID