From 17017b6d5d2dc48ab6b32087ab212352943eb6ac Mon Sep 17 00:00:00 2001 From: Alexey Fetisov Date: Fri, 13 Mar 2026 17:03:28 +0300 Subject: [PATCH] v1.14.3 --- CHANGELOG.md | 55 ++++--- .../compute/abort_shared_snapshot_merge.go | 14 +- pkg/cloudapi/compute/models.go | 3 + pkg/cloudapi/disks/models.go | 9 ++ pkg/cloudapi/kvmx86/create.go | 4 +- pkg/cloudapi/zone/models.go | 2 +- .../compute/abort_shared_snapshot_merge.go | 14 +- pkg/cloudbroker/compute/models.go | 3 + pkg/cloudbroker/disks/models.go | 3 + pkg/cloudbroker/kvmx86/create.go | 4 +- pkg/cloudbroker/kvmx86/mass_create.go | 4 +- .../node/get_logical_cores_count.go | 6 +- pkg/cloudbroker/rg/update.go | 4 + pkg/sdn/logicalports/create.go | 14 +- pkg/sdn/logicalports/create_batch.go | 134 ++++++++++++++++++ pkg/sdn/logicalports/delete_batch.go | 50 +++++++ pkg/sdn/logicalports/exclude_firewall.go | 63 ++++++++ pkg/sdn/logicalports/list.go | 10 +- pkg/sdn/logicalports/models.go | 34 ++++- pkg/sdn/logicalports/unexclude_firewall.go | 55 +++++++ pkg/sdn/logicalports/update.go | 14 +- 21 files changed, 435 insertions(+), 64 deletions(-) create mode 100644 pkg/sdn/logicalports/create_batch.go create mode 100644 pkg/sdn/logicalports/delete_batch.go create mode 100644 pkg/sdn/logicalports/exclude_firewall.go create mode 100644 pkg/sdn/logicalports/unexclude_firewall.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 645475b..9badfdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Version 1.14.2 +## Version 1.14.3 Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и в следующих версиях будут удалены, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами Методы `AccessGrant`, `AccessGrantToPool`, `AccessRevoke`, `AccessRevokeToPool` в cloudbroker/sep стали deprecated и в следующих версиях будут удалены @@ -9,47 +9,62 @@ ### Добавлено -#### account -| Идентификатор
задачи | Описание | -| --- | --- | -| BGOS-796 | Опциональное поле `CpuAllocationParameter` в структуру запроса `UpdateRequest` в cloudbroker/account | -| BGOS-790 | Вычисляемое поле `UpdatedBy` в структуру ответа `ItemAccount` в cloudapi/account | - #### compute | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-793 | Вычисляемые поля `Aborted` и `BlockcopyAbortJobID` в структуру ответа `RecordCloneAbort` в cloudbroker/compute | -| BGOS-792 | Структуры ответа `RecordCloneAbort` и `ListCloneAbort` в cloudapi/compute | -| BGOS-791 | Вычисляемое поле `Independent` в структуру ответа `ItemComputeDisk` в cloudapi/compute и в структуру ответа `ItemDisk` в cloudbroker/compute | +| BGOS-805 | Вычисляемое поле `Provision` в структуру ответа `ItemComputeDisk` в cloudapi/compute и в структуру ответа `ItemDisk` в cloudbroker/compute | #### disks | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-791 | Вычисляемое поле `Independent` в структуры ответа `ItemDisk` и `RecordDisk` в cloudapi/disks и в структуру ответа `RecordDisk` в cloudbroker/disks | -| BGOS-797 | Вычисляемые поля `ToClean` и `StoragePolicyID` в структуру ответа `ItemDiskUnattached` в cloudapi/disks | +| BGOS-806 | Вычисляемое поле `Provision` в структуры ответа `ItemDisk`, `ItemDiskUnattached` и `RecordDisk` в cloudapi/disks и в структуру ответа `InfoDisk` в cloudbroker/disks | -#### image +### node | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-791 | Вычисляемое поле `Independent` в структуру ответа `RecordImage` в cloudapi/image и в структуры ответа `RecordImage` и `ItemImage` в cloudbroker/image | +| BGOS-802 | Опциональное поле `Target` в структуру запроса `GetLogicalCoresCountRequest` в cloudbroker/node | +#### rg +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-803 | Опциональное поле `CPUAllocationParameter` в структуру запроса `UpdateRequest` в cloudbroker/rg | + +#### SDN Logical Ports +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-695 | Опциональное поле `Labels` в структуры запроса `CreateRequest` и `UpdateRequest` в sdn/logical_ports | +| BGOS-695 | Вычисляемое поле `Labels` в структуру ответа `LogicalPort` в sdn/logical_ports | +| BGOS-695 | Опциональные поля `OperationStatus` и `HypervisorStatus` в структуру запроса `ListRequest` в sdn/logical_ports | +| BGOS-695 | Вычисляемые поля `OperationStatus` и `HypervisorStatus` в структуре `Status` в структуру ответа `LogicalPort` в sdn/logical_ports | ### Изменено #### compute | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-799 | Минимальное значение поля `MTU` в структуре запроса `NetAttachRequest` в cloudapi/compute и cloudbroker/compute с 1 на 1500 | -| BGOS-792 | Тип возвращаемого значения метода `CloneAbort` с `bool` на `ListCloneAbort` в cloudapi/compute | +| BGOS-794 | Тип возвращаемого значения метода `AbortSharedSnapshotMerge` с `bool` на `string` в cloudapi/compute и в cloudbroker/compute | -#### node +#### kvmx86 | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-789 | Дефолтное значение поля `Force` в структуре запроса `EnableRequest` в cloudbroker/node с `true` на `false` | +| BGOS-808 | Минимальное значение поля `MTU` в структуре `Interface` в cloudapi/kvmx86 и cloudbroker/kvmx86 и в структуре `InterfaceMassCreate` в cloudbroker/kvmx86 с 1 на 1500 | + +#### zone +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-807 | JSON-тег у вычисляемого поля `LBIDs` в структуре ответа `RecordZone` с `lbIds` на `lbsIds` в cloudapi/zone | + +#### SDN Logical Ports +| Идентификатор
задачи | Описание | +| --- | --- | +| BGOS-695 | Имя вычисляемого поля со `Status` на `OperationStatus` в sdn/logical_ports | ### Удалено -#### compute +#### SDN Logical Ports | Идентификатор
задачи | Описание | | --- | --- | -| BGOS-793 | Вычисляемое поле `Status` из структуры ответа `RecordCloneAbort` в cloudbroker/compute | +| BGOS-695 | Обязательное поле `IsExcludedFromFirewall` в структурах запроса `CreateRequest` и `UpdateRequest` в sdn/logical_ports | +| BGOS-695 | Вычисляемое поле `IsExcludedFromFirewall` в структуре `Bindings` в структуре ответа `LogicalPort` в sdn/logical_ports | +| BGOS-695 | Вычисляемое поле `Common` в структуре `Status` в структуре ответа `LogicalPort` в sdn/logical_ports | +| BGOS-695 | Структуры запроса `ExcludeFirewallRequest`, `UnexcludeFirewallRequest`, `CreateBatchRequest` и `DeleteBatchRequest` и методы `ExcludeFirewall`, `UnexcludeFirewall`, `CreateBatch` и `DeleteBatch` в sdn/logical_ports | \ No newline at end of file diff --git a/pkg/cloudapi/compute/abort_shared_snapshot_merge.go b/pkg/cloudapi/compute/abort_shared_snapshot_merge.go index 5b4a925..fce0d51 100644 --- a/pkg/cloudapi/compute/abort_shared_snapshot_merge.go +++ b/pkg/cloudapi/compute/abort_shared_snapshot_merge.go @@ -3,7 +3,6 @@ package compute import ( "context" "net/http" - "strconv" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) @@ -20,23 +19,18 @@ type AbortSharedSnapshotMergeRequest struct { } // AbortSharedSnapshotMerge shared snapshots merge abort -func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSnapshotMergeRequest) (bool, error) { +func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSnapshotMergeRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudapi/compute/abort_shared_snapshot_merge" res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - result, err := strconv.ParseBool(string(res)) - if err != nil { - return false, err - } - - return result, nil + return string(res), nil } diff --git a/pkg/cloudapi/compute/models.go b/pkg/cloudapi/compute/models.go index 0fa2386..143434d 100644 --- a/pkg/cloudapi/compute/models.go +++ b/pkg/cloudapi/compute/models.go @@ -882,6 +882,9 @@ type ItemComputeDisk struct { // Present to PresentTo map[string]uint64 `json:"presentTo"` + // Provision + Provision string `json:"provision"` + // Purge time PurgeTime uint64 `json:"purgeTime"` diff --git a/pkg/cloudapi/disks/models.go b/pkg/cloudapi/disks/models.go index 5448e3c..00fa370 100644 --- a/pkg/cloudapi/disks/models.go +++ b/pkg/cloudapi/disks/models.go @@ -89,6 +89,9 @@ type ItemDisk struct { // Present to PresentTo map[string]uint64 `json:"presentTo"` + // Provision + Provision string `json:"provision"` + // Purge time PurgeTime uint64 `json:"purgeTime"` @@ -241,6 +244,9 @@ type ItemDiskUnattached struct { // Present to PresentTo map[string]uint64 `json:"presentTo"` + // Provision + Provision string `json:"provision"` + // Purge attempts PurgeAttempts uint64 `json:"purgeAttempts"` @@ -471,6 +477,9 @@ type RecordDisk struct { // Present to PresentTo map[string]uint64 `json:"presentTo"` + // Provision + Provision string `json:"provision"` + // Purge time PurgeTime uint64 `json:"purgeTime"` diff --git a/pkg/cloudapi/kvmx86/create.go b/pkg/cloudapi/kvmx86/create.go index 043ac69..901c2a0 100644 --- a/pkg/cloudapi/kvmx86/create.go +++ b/pkg/cloudapi/kvmx86/create.go @@ -30,8 +30,8 @@ type Interface struct { // Required: false IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` - // Maximum transmission unit, must be 1-9216 - // Used only to DPDK net type + // Used for EXTNET, TRUNK and DPDK + // Must be 1500-9216 // Required: false MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"` diff --git a/pkg/cloudapi/zone/models.go b/pkg/cloudapi/zone/models.go index 3c22c6b..bbf5dda 100644 --- a/pkg/cloudapi/zone/models.go +++ b/pkg/cloudapi/zone/models.go @@ -47,7 +47,7 @@ type RecordZone struct { K8SIDs []uint64 `json:"k8sIds"` // List of associated LB IDs - LBIDs []uint64 `json:"lbIds"` + LBIDs []uint64 `json:"lbsIds"` // Status Status string `json:"status"` diff --git a/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go b/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go index d4aa9ec..89c5dfa 100644 --- a/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go +++ b/pkg/cloudbroker/compute/abort_shared_snapshot_merge.go @@ -3,7 +3,6 @@ package compute import ( "context" "net/http" - "strconv" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) @@ -20,23 +19,18 @@ type AbortSharedSnapshotMergeRequest struct { } // AbortSharedSnapshotMerge shared snapshots merge abort -func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSnapshotMergeRequest) (bool, error) { +func (c Compute) AbortSharedSnapshotMerge(ctx context.Context, req AbortSharedSnapshotMergeRequest) (string, error) { err := validators.ValidateRequest(req) if err != nil { - return false, validators.ValidationErrors(validators.GetErrors(err)) + return "", validators.ValidationErrors(validators.GetErrors(err)) } url := "/cloudbroker/compute/abort_shared_snapshot_merge" res, err := c.client.DecortApiCall(ctx, http.MethodPost, url, req) if err != nil { - return false, err + return "", err } - result, err := strconv.ParseBool(string(res)) - if err != nil { - return false, err - } - - return result, nil + return string(res), nil } diff --git a/pkg/cloudbroker/compute/models.go b/pkg/cloudbroker/compute/models.go index ad4fb30..b1a186c 100644 --- a/pkg/cloudbroker/compute/models.go +++ b/pkg/cloudbroker/compute/models.go @@ -481,6 +481,9 @@ type ItemDisk struct { // Present to PresentTo map[string]uint64 `json:"presentTo"` + // Provision + Provision string `json:"provision"` + // Purge attempts PurgeAttempts uint64 `json:"purgeAttempts"` diff --git a/pkg/cloudbroker/disks/models.go b/pkg/cloudbroker/disks/models.go index cce7f70..59d25c0 100644 --- a/pkg/cloudbroker/disks/models.go +++ b/pkg/cloudbroker/disks/models.go @@ -131,6 +131,9 @@ type InfoDisk struct { // Present to PresentTo map[string]uint64 `json:"presentTo"` + // Provision + Provision string `json:"provision"` + // Purge attempts PurgeAttempts uint64 `json:"purgeAttempts"` diff --git a/pkg/cloudbroker/kvmx86/create.go b/pkg/cloudbroker/kvmx86/create.go index 27a44a8..c3fe873 100644 --- a/pkg/cloudbroker/kvmx86/create.go +++ b/pkg/cloudbroker/kvmx86/create.go @@ -28,8 +28,8 @@ type Interface struct { // Required: false IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` - // Maximum transmission unit, must be 1-9216 - // Used only to DPDK net type + // Used for EXTNET, TRUNK and DPDK + // Must be 1500-9216 // Required: false MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"` diff --git a/pkg/cloudbroker/kvmx86/mass_create.go b/pkg/cloudbroker/kvmx86/mass_create.go index 5f2ddef..5ad8bdc 100644 --- a/pkg/cloudbroker/kvmx86/mass_create.go +++ b/pkg/cloudbroker/kvmx86/mass_create.go @@ -27,8 +27,8 @@ type InterfaceMassCreate struct { // Required: false IPAddr string `url:"ipAddr,omitempty" json:"ipAddr,omitempty"` - // Maximum transmission unit, must be 1-9216 - // Used only to DPDK net type + // Used for EXTNET, TRUNK and DPDK + // Must be 1500-9216 // Required: false MTU uint64 `url:"mtu,omitempty" json:"mtu,omitempty" validate:"omitempty,mtu"` diff --git a/pkg/cloudbroker/node/get_logical_cores_count.go b/pkg/cloudbroker/node/get_logical_cores_count.go index ff6925e..55bb677 100644 --- a/pkg/cloudbroker/node/get_logical_cores_count.go +++ b/pkg/cloudbroker/node/get_logical_cores_count.go @@ -13,6 +13,10 @@ type GetLogicalCoresCountRequest struct { // Node ID // Required: true NodeId uint64 `url:"node_id" json:"node_id" validate:"required"` + + // Target + // Required: false + Target string `url:"target,omitempty" json:"target,omitempty" validate:"omitempty,oneof=core node"` } // GetLogicalCoresCount get logical cores count by node @@ -24,7 +28,7 @@ func (i Node) GetLogicalCoresCount(ctx context.Context, req GetLogicalCoresCount url := "/cloudbroker/node/get_logical_cores_count" - res, err := i.client.DecortApiCall(ctx, http.MethodPost, url, req) + res, err := i.client.DecortApiCall(ctx, http.MethodGet, url, req) if err != nil { return 0, err } diff --git a/pkg/cloudbroker/rg/update.go b/pkg/cloudbroker/rg/update.go index 133725f..5d5fd07 100644 --- a/pkg/cloudbroker/rg/update.go +++ b/pkg/cloudbroker/rg/update.go @@ -51,6 +51,10 @@ type UpdateRequest struct { // Storage policies // Required: false StoragePolicies []StoragePolicy `url:"-" json:"storage_policies,omitempty"` + + // CPU allocation parameter + // Required: false + CPUAllocationParameter string `url:"cpu_allocation_parameter,omitempty" json:"cpu_allocation_parameter,omitempty"` } // Update updates resource group diff --git a/pkg/sdn/logicalports/create.go b/pkg/sdn/logicalports/create.go index f124d44..48405ba 100644 --- a/pkg/sdn/logicalports/create.go +++ b/pkg/sdn/logicalports/create.go @@ -9,6 +9,12 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) +// Label struct +type CreateLabels struct { + VMID string `url:"vm_id,omitempty" json:"vm_id,omitempty"` + VMName string `url:"vm_name,omitempty" json:"vm_name,omitempty"` +} + // CreateRequest struct to create logical port type CreateRequest struct { // ID of the access group @@ -27,10 +33,6 @@ type CreateRequest struct { // Required: true Enabled interface{} `url:"enabled" json:"enabled" validate:"required,isBool"` - // Is excluded from firewall. True or False - // Required: true - IsExcludedFromFirewall interface{} `url:"is_excluded_from_firewall" json:"is_excluded_from_firewall" validate:"required,isBool"` - // Hypervisor // Required: true Hypervisor string `url:"hypervisor" json:"hypervisor" validate:"required"` @@ -54,6 +56,10 @@ type CreateRequest struct { // Logical port addresses // Required: false LogicalPortAddresses []LogicalPortAddress `url:"logical_port_addresses,omitempty" json:"logical_port_addresses,omitempty" validate:"dive"` + + // Labels + // Required: false + Labels CreateLabels `url:"labels,omitempty" json:"labels,omitempty"` } // LogicalPortAddressRequest struct representing logical port address diff --git a/pkg/sdn/logicalports/create_batch.go b/pkg/sdn/logicalports/create_batch.go new file mode 100644 index 0000000..332b03d --- /dev/null +++ b/pkg/sdn/logicalports/create_batch.go @@ -0,0 +1,134 @@ +package logicalports + +import ( + "context" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type CreateBatchLogicalPortAddress struct { + // IP + // Required: true + IP string `url:"ip" json:"ip" validate:"required"` + + // IP Type + // Required: true + IPType string `url:"ip_type" json:"ip_type" validate:"required"` + + // Is Discovered + // Required: true + IsDiscovered bool `url:"is_discovered" json:"is_discovered" validate:"required"` + + // Is Primary + // Required: true + IsPrimary bool `url:"is_primary" json:"is_primary" validate:"required"` + + // MAC + // Required: false + MAC string `url:"mac,omitempty" json:"mac,omitempty"` +} + +type CreateBatchBindings struct { + // Address Detection + // Required: true + AddressDetection bool `url:"address_detection" json:"address_detection" validate:"required"` + + // Logical Port Address + // Required: true + LogicalPortAddresses []CreateBatchLogicalPortAddress `url:"logical_port_addresses" json:"logical_port_addresses" validate:"required,dive"` + + // Port Security + // Required: true + PortSecurity bool `url:"port_security" json:"port_security" validate:"required"` + + // Segment ID + // Required: true + SegmentID string `url:"segment_id" json:"segment_id" validate:"required"` +} + +type CreateBatchLabels struct { + // VM ID + // Required: false + VMID string `url:"vm_id,omitempty" json:"vm_id,omitempty"` + + // VM Name + // Required: false + VMName string `url:"vm_name,omitempty" json:"vm_name,omitempty"` +} + +type NetObjectGroups struct { + // ID + // Required: true + ID string `url:"id" json:"id" validate:"required"` + + // Version ID + // Required: true + VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` +} + +type Ports struct { + // Adapter MAC + // Required: false + AdapterMAC string `url:"adapter_mac,omitempty" json:"adapter_mac,omitempty"` + + // Bindings + // Required: true + Bindings CreateBatchBindings `url:"bindings" json:"bindings" validate:"required"` + + // Description + // Required: true + Description string `url:"description" json:"description" validate:"required"` + + // Display Name + // Required: true + DisplayName string `url:"display_name" json:"display_name" validate:"required"` + + // Enabled + // Required: true + Enabled bool `url:"enabled" json:"enabled" validate:"required"` + + // Hypervisor + // Required: true + Hypervisor string `url:"hypervisor" json:"hypervisor" validate:"required"` + + // Net Object Groups + // Required: false + NetObjectGroups []NetObjectGroups `json:"net_object_groups" validate:"required,dive"` + + // Labels + // Required: false + Labels []CreateBatchLabels `url:"labels,omitempty" json:"labels,omitempty" validate:"required,dive"` + + // Unique Identifier + // Required: false + UniqueIdentifier string `url:"unique_identifier,omitempty" json:"unique_identifier,omitempty"` +} + +// CreateBatchRequest struct to create a batch of logical ports +type CreateBatchRequest struct { + // Access Group ID + // Required: true + AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` + + // Ports + // Required: true + Ports []Ports `json:"ports" validate:"required,dive"` +} + +// CreateBatch creates a batch of logical ports +func (lp LogicalPorts) CreateBatch(ctx context.Context, req CreateBatchRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + url := "/sdn/logical_port/create_batch" + + _, err = lp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req) + if err != nil { + return false, err + } + + return true, nil +} diff --git a/pkg/sdn/logicalports/delete_batch.go b/pkg/sdn/logicalports/delete_batch.go new file mode 100644 index 0000000..e7703f5 --- /dev/null +++ b/pkg/sdn/logicalports/delete_batch.go @@ -0,0 +1,50 @@ +package logicalports + +import ( + "context" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type PortsInfo struct { + // Force + // Required: true + Force bool `url:"force" json:"force" validate:"required"` + + // ID + // Required: true + ID string `url:"id" json:"id" validate:"required"` + + // Version ID + // Required: true + VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` +} + +// DeleteBatchRequest struct to delete a batch of logical ports +type DeleteBatchRequest struct { + // Access Group ID + // Required: true + AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` + + // Ports Info + // Required: true + PortsInfo []PortsInfo `json:"ports_info" validate:"required,dive"` +} + +// DeleteBatch deletes a batch of logical ports +func (lp LogicalPorts) DeleteBatch(ctx context.Context, req DeleteBatchRequest) (bool, error) { + err := validators.ValidateRequest(req) + if err != nil { + return false, validators.ValidationErrors(validators.GetErrors(err)) + } + url := "/sdn/logical_port/delete_batch" + + _, err = lp.client.DecortApiCallCtype(ctx, http.MethodDelete, url, constants.MIMEJSON, req) + if err != nil { + return false, err + } + + return true, nil +} diff --git a/pkg/sdn/logicalports/exclude_firewall.go b/pkg/sdn/logicalports/exclude_firewall.go new file mode 100644 index 0000000..57c9640 --- /dev/null +++ b/pkg/sdn/logicalports/exclude_firewall.go @@ -0,0 +1,63 @@ +package logicalports + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type LogicalPortsForExcludeFromFirewall struct { + // Exclude IP Addresses + // Required: true + ExcludeIPAddresses bool `url:"exclude_ip_addresses" json:"exclude_ip_addresses" validate:"required"` + + // ID + // Required: true + ID string `url:"id" json:"id" validate:"required"` + + // Version ID + // Required: true + VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` +} + +// ExcludeFirewallRequest struct to exclude firewall for logical port +type ExcludeFirewallRequest struct { + // Access Group ID + // Required: true + AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` + + // Logical Ports For Exclude From Firewall + // Required: true + LogicalPortsForExcludeFromFirewall []LogicalPortsForExcludeFromFirewall `json:"logical_ports_for_exclude_from_firewall" validate:"required,dive"` + + // Exclusion Reason + // Required: false + ExclusionReason string `url:"exclusion_reason,omitempty" json:"exclusion_reason,omitempty"` +} + +// ExcludeFirewall excludes firewall from a logical port +func (lp LogicalPorts) ExcludeFirewall(ctx context.Context, req ExcludeFirewallRequest) (*RecordVersion, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/sdn/logical_port/exclude_firewall" + + res, err := lp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req) + if err != nil { + return nil, err + } + + info := RecordVersion{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/sdn/logicalports/list.go b/pkg/sdn/logicalports/list.go index a980e44..8be330a 100644 --- a/pkg/sdn/logicalports/list.go +++ b/pkg/sdn/logicalports/list.go @@ -70,6 +70,14 @@ type ListRequest struct { // Required: false CreatedTo string `url:"created_to,omitempty" json:"created_to,omitempty"` + // Filter by operation status + // Required: false + OperationStatus string `url:"operation_status,omitempty" json:"operation_status,omitempty"` + + // Filter by hypervisor status + // Required: false + HypervisorStatus string `url:"hypervisor_status,omitempty" json:"hypervisor_status,omitempty"` + // Page number for pagination // Required: false Page uint64 `url:"page,omitempty" json:"page,omitempty"` @@ -87,7 +95,7 @@ type ListRequest struct { SortOrder string `url:"sort_order,omitempty" json:"sort_order,omitempty"` } -// List of logical portts +// List of logical ports func (i LogicalPorts) List(ctx context.Context, req ListRequest) (*LogicalPortsList, error) { res, err := i.ListRaw(ctx, req) if err != nil { diff --git a/pkg/sdn/logicalports/models.go b/pkg/sdn/logicalports/models.go index c3c009f..98905cf 100644 --- a/pkg/sdn/logicalports/models.go +++ b/pkg/sdn/logicalports/models.go @@ -43,6 +43,9 @@ type LogicalPort struct { // Hypervisor display name HypervisorDisplayName string `json:"hypervisor_display_name"` + // Labels + Labels Labels `json:"labels"` + // Live migration target hypervisor LiveMigrationTargetHV string `json:"live_migration_target_hv"` @@ -64,17 +67,21 @@ type LogicalPort struct { // Status information type Status struct { - // Common status - Common string `json:"common"` + + // Operation status + OperationStatus string `json:"operation_status"` // Hypervisors status Hypervisors []HypervisorStatus `json:"hypervisors"` + + // Hypervisor status + HypervisorStatus string `json:"hypervisor_status"` } // HypervisorStatus information type HypervisorStatus struct { - // Status - Status string `json:"status"` + // Operation status + OperationStatus string `json:"operation_status"` // Name Name string `json:"name"` @@ -106,9 +113,6 @@ type Bindings struct { // Address detection AddressDetection bool `json:"address_detection"` - // Is excluded from firewall - IsExcludedFromFirewall bool `json:"is_excluded_from_firewall"` - // Version ID VersionID uint64 `json:"version_id"` @@ -149,6 +153,7 @@ type LogicalPortAddress struct { AssignedAt string `json:"assigned_at"` } +// Migration status information type MigrationStatus struct { // ID ID string `json:"id"` @@ -156,3 +161,18 @@ type MigrationStatus struct { // Version ID VersionID uint64 `json:"version_id"` } + +// Labels information +type Labels struct { + // VM ID + VMID string `json:"vm_id"` + + // VM name + VMName string `json:"vm_name"` +} + +// Information about a version +type RecordVersion struct { + // Version ID + VersionID uint64 `json:"version_id"` +} diff --git a/pkg/sdn/logicalports/unexclude_firewall.go b/pkg/sdn/logicalports/unexclude_firewall.go new file mode 100644 index 0000000..0063832 --- /dev/null +++ b/pkg/sdn/logicalports/unexclude_firewall.go @@ -0,0 +1,55 @@ +package logicalports + +import ( + "context" + "encoding/json" + "net/http" + + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" + "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" +) + +type LogicalPortsForUnexcludeFromFirewall struct { + // Exclude IP Addresses + // Required: true + ID string `url:"id" json:"id" validate:"required"` + + // Version ID + // Required: true + VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` +} + +// UnexcludeFirewallRequest struct to unexclude firewall for logical port +type UnexcludeFirewallRequest struct { + // Access Group ID + // Required: true + AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` + + // Logical Ports For Unexclude From Firewall + // Required: true + LogicalPortsForUnexcludeFromFirewall []LogicalPortsForUnexcludeFromFirewall `json:"logical_ports_for_unexclude_from_firewall" validate:"required,dive"` +} + +// UnexcludeFirewallRequest struct to unexclude firewall for logical port +func (lp LogicalPorts) UnexcludeFirewall(ctx context.Context, req UnexcludeFirewallRequest) (*RecordVersion, error) { + err := validators.ValidateRequest(req) + if err != nil { + return nil, validators.ValidationErrors(validators.GetErrors(err)) + } + + url := "/sdn/logical_port/unexclude_firewall" + + res, err := lp.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req) + if err != nil { + return nil, err + } + + info := RecordVersion{} + + err = json.Unmarshal(res, &info) + if err != nil { + return nil, err + } + + return &info, nil +} diff --git a/pkg/sdn/logicalports/update.go b/pkg/sdn/logicalports/update.go index 1fb46b6..4025300 100644 --- a/pkg/sdn/logicalports/update.go +++ b/pkg/sdn/logicalports/update.go @@ -9,6 +9,12 @@ import ( "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) +// Label struct +type UpdateLabels struct { + VMID string `url:"vm_id,omitempty" json:"vm_id,omitempty"` + VMName string `url:"vm_name,omitempty" json:"vm_name,omitempty"` +} + // UpdateRequest struct to update logical port type UpdateRequest struct { // ID of the logical port @@ -47,10 +53,6 @@ type UpdateRequest struct { // Required: true PortSecurity interface{} `url:"port_security" json:"port_security" validate:"required,isBool"` - // Is excluded from firewall. True or False - // Required: true - IsExcludedFromFirewall interface{} `url:"is_excluded_from_firewall" json:"is_excluded_from_firewall" validate:"required,isBool"` - // Segment ID // Required: true SegmentID string `url:"segment_id" json:"segment_id" validate:"required"` @@ -62,6 +64,10 @@ type UpdateRequest struct { // Add addresses // Required: false AddAddresses []AddAddress `url:"add_addresses,omitempty" json:"add_addresses,omitempty" validate:"dive"` + + // Labels + // Required: false + Labels UpdateLabels `url:"labels,omitempty" json:"labels,omitempty"` } // UpdateAddress struct representing update address