diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3e96cfe..44ec668 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## Version 1.14.7
+## Version 1.14.8
Методы `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,12 +9,86 @@
### Добавлено
-#### SDN Hypervisors
+#### resource optimizer
| Идентификатор
задачи | Описание |
| --- | --- |
-| BGOS-518 | Группа методов Hypervisors |
+| BGOS-842 | Опциональные поля `Username`, `Password`, `BroadcastAddr`, `PingAddr`, `SSLSkipVerify` и `Domain` в структуры запросов `DRSCreateRequest` и `DRSUpdateRequest` в `cloudbroker/resource_optimizer` |
+| BGOS-842 | Обязательное поле `SSOType` в структуры запросов `DRSCreateRequest` и `DRSUpdateRequest` в `cloudbroker/resource_optimizer` |
-#### SDN Version
+#### grid
| Идентификатор
задачи | Описание |
| --- | --- |
-| BGOS-838 | Группа методов Version |
+| BGOS-846 | Вычисляемое поле `BROEnabled` в структуры ответов `RecordGrid` и `ItemGridList` в cloudbroker/grid |
+
+#### locations
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-845 | Вычисляемое поле `BROEnabled` в структуру ответа `ItemLocation` в cloudapi/locations |
+
+#### zone
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-841 | Вычисляемые поля `PingAddr`, `BroadcastAddr`, `SSLSkipVerify` и `Domain` в структуры ответов `ItemZone` и `RecordZone` в cloudapi/zone и в cloudbroker/zone |
+| BGOS-844 | Вычисляемое поле `SSOType` в структуры ответов `ItemZone` и `RecordZone` в cloudapi/zone и в cloudbroker/zone |
+
+#### SDN segments
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-798 | Опциональное поле `OperationStatus` в структуру запроса `ListRequest` в sdn/segments |
+| BGOS-798 | Опциональные поля `Type` в структуры запросов `CreateRequest` и `UpdateRequest` в sdn/segments |
+| BGOS-798 | Метод `GetFAA`, структура запроса `GetFAARequest` и структура ответа `GetFAAResponse` в sdn/segments |
+| BGOS-798 | Вычисляемые поля `Type` и `L2ConnectionPort` в структуру ответа `SegmentResponse` в sdn/segments |
+| BGOS-798 | Вычисляемое поле `OperationStatus` в структуры `Status` и `HypervisorStatus`, структуры `L2ConnectionPort` и `L2ExternalNetwork` в sdn/segments |
+
+#### SDN network object groups
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-837 | Опциональные поля `Addresses` и `L2ConnectionPortsBindings` в структуру запроса `CreateRequest` в sdn/netobjgroups |
+| BGOS-837 | Опциональное поле `Addresses` в структуру запроса `UpdateRequest` в sdn/netobjgroups |
+| BGOS-837 | Поле `PortBindings` и структура `DetachLogicalPortBinding` в структуру запроса `DetachLogicalPortsRequest` в sdn/netobjgroups |
+| BGOS-837 | Поля `Purpose`, `Type`, `Addresses`, `L2ConnectionPorts` в структуру ответа `RecordNetObjGroup` в sdn/netobjgroups |
+| BGOS-837 | Поля `AddressesCount`, `L2ConnectionPortsCount` в структуру ответа `Counter` в sdn/netobjgroups |
+| BGOS-837 | Поля `Type`, `AppliedNetObjectGroups` в структуру ответа `SecurityPolicy` в sdn/netobjgroups |
+| BGOS-837 | Поля `AccessGroupID`, `Action`, `Direction`, `DisplayName`, `Enabled`, `LogEnabled`, `LogSeverity`, `Priority`, `StatisticsEnabled`, `VersionID`, `Description`, `DestinationNetObject`, `Filter`, `ID`, `LogName`, `SecurityPolicyID`, `SourceNetObject` и `Type` в структуру ответа `SecurityRule` в sdn/netobjgroups |
+| BGOS-837 | Поля `ExcludeFirewall`, `Labels` в структуру ответа `LogicalPort` в sdn/netobjgroups |
+| BGOS-837 | Поля `AccessGroupID`, `AccessGroupName` в структуру ответа `ExternalNetworkPort` в sdn/netobjgroups |
+
+### Исправлено
+
+#### SDN access groups
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-836 | Тип возвращаемого значения с `bool` на `string` в методе `Delete` в sdn/acsgroups |
+
+#### SDN hypervisors
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-847 | Тип вычисляемого поля `Ports` с `[]string` на структуру `Ports` в структуре ответа `RecordHypervisor` в sdn/hypervisors |
+
+#### SDN hetwork object groups
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-837 | Тип ответа метода `AttachExtNetPorts` с `bool` на `*RecordVersion` в sdn/netobjgroups |
+| BGOS-837 | Тип ответа метода `AttachLogicalPorts` с `bool` на `*RecordVersion` в sdn/netobjgroups |
+| BGOS-837 | Поле `Common` на `OperationStatus` в структуре `Status` в sdn/netobjgroups |
+| BGOS-837 | Поле `Status` на `OperationStatus` в структуре `HypervisorInfo` в sdn/netobjgroups |
+| BGOS-837 | Тип поля `VersionID` со `string` на `uint64` в структуре `ExternalNetworkPort` в sdn/netobjgroups |
+| BGOS-837 | Тип поля `VLANTag` со `string` на `int` в структуре `ExternalNetworkPort` в sdn/netobjgroups |
+
+### Удалено
+
+#### SDN access groups
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-836 | Поля `CreatedBy` и `UpdatedBy` в структуре ответа `AccessGroup` в sdn/acsgroups |
+
+#### SDN segments
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-798 | Метод `GetStatus` и структура запроса `GetStatusRequest` в sdn/segments |
+
+#### SDN network object groups
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BGOS-837 | Поле `IsExcludedFromFirewall` из структуры `Bindings` в sdn/netobjgroups |
+| BGOS-837 | Поле `AppliedToNetObjectGroupID` из структуры `SecurityPolicy` в sdn/netobjgroups |
diff --git a/pkg/cloudapi/locations/models.go b/pkg/cloudapi/locations/models.go
index 42a0b24..16db21e 100644
--- a/pkg/cloudapi/locations/models.go
+++ b/pkg/cloudapi/locations/models.go
@@ -37,6 +37,9 @@ type ItemLocation struct {
// Is Zero Access enabled
ZeroAccessEnabled bool `json:"zeroaccess_enabled"`
+
+ // Is BRO enabled
+ BROEnabled bool `json:"bro_enabled"`
}
// List of locations
diff --git a/pkg/cloudapi/zone/models.go b/pkg/cloudapi/zone/models.go
index 25a6b19..5d56fbd 100644
--- a/pkg/cloudapi/zone/models.go
+++ b/pkg/cloudapi/zone/models.go
@@ -81,6 +81,21 @@ type RecordZone struct {
// SSO URL
SSOURL string `json:"sso_url"`
+
+ // SSO type
+ SSOType string `json:"sso_type"`
+
+ // Ping address
+ PingAddr string `json:"ping_addr"`
+
+ // Broadcast address
+ BroadcastAddr string `json:"broadcast_addr"`
+
+ // Skip ssl verify
+ SSLSkipVerify bool `json:"ssl_skip_verify"`
+
+ // Domain
+ Domain string `json:"domain"`
}
// A zone item from a list
@@ -130,9 +145,24 @@ type ItemZone struct {
// SSO URL
SSOURL string `json:"sso_url"`
+ // SSO type
+ SSOType string `json:"sso_type"`
+
// Status
Status string `json:"status"`
// Updated timestamp
UpdatedTime uint64 `json:"updatedTime"`
+
+ // Ping address
+ PingAddr string `json:"ping_addr"`
+
+ // Broadcast address
+ BroadcastAddr string `json:"broadcast_addr"`
+
+ // Skip ssl verify
+ SSLSkipVerify bool `json:"ssl_skip_verify"`
+
+ // Domain
+ Domain string `json:"domain"`
}
diff --git a/pkg/cloudbroker/grid/models.go b/pkg/cloudbroker/grid/models.go
index 5ce88bb..4a4d8ca 100644
--- a/pkg/cloudbroker/grid/models.go
+++ b/pkg/cloudbroker/grid/models.go
@@ -96,6 +96,9 @@ type RecordGrid struct {
// SDN support
SDNSupport bool `json:"sdn_support"`
+
+ // Is BRO enabled
+ BROEnabled bool `json:"bro_enabled"`
}
// Information about grid
@@ -132,6 +135,9 @@ type ItemGridList struct {
// Is Zero Access enabled
ZeroAccessEnabled bool `json:"zeroaccess_enabled"`
+
+ // Is BRO enabled
+ BROEnabled bool `json:"bro_enabled"`
}
// List Grids
diff --git a/pkg/cloudbroker/resource_optimizer/drs_create.go b/pkg/cloudbroker/resource_optimizer/drs_create.go
index b84a8c0..6d70963 100644
--- a/pkg/cloudbroker/resource_optimizer/drs_create.go
+++ b/pkg/cloudbroker/resource_optimizer/drs_create.go
@@ -14,6 +14,11 @@ type DRSCreateRequest struct {
// Required: true
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
+ // SSO provider type
+ // Available values: bvs, decs3o
+ // Required: true
+ SSOType string `url:"sso_type" json:"sso_type" validate:"required,oneof=bvs decs3o"`
+
// Application ID
// Required: true
AppID string `url:"app_id" json:"app_id" validate:"required"`
@@ -33,6 +38,30 @@ type DRSCreateRequest struct {
// DRS name
// Required: true
DRSName string `url:"drs_name" json:"drs_name" validate:"required"`
+
+ // Username
+ // Required: false
+ Username string `url:"username,omitempty" json:"username,omitempty"`
+
+ // Password
+ // Required: false
+ Password string `url:"password,omitempty" json:"password,omitempty"`
+
+ // Broadcast address
+ // Required: false
+ BroadcastAddr string `url:"broadcast_addr,omitempty" json:"broadcast_addr,omitempty"`
+
+ // Ping address
+ // Required: false
+ PingAddr string `url:"ping_addr,omitempty" json:"ping_addr,omitempty"`
+
+ // Skip SSL certificate verification
+ // Required: false
+ SSLSkipVerify interface{} `url:"ssl_skip_verify,omitempty" json:"ssl_skip_verify,omitempty"`
+
+ // Domain
+ // Required: false
+ Domain string `url:"domain,omitempty" json:"domain,omitempty"`
}
// DRSCreate creates a new DRS in the specified zone
diff --git a/pkg/cloudbroker/resource_optimizer/drs_update.go b/pkg/cloudbroker/resource_optimizer/drs_update.go
index b7d9a11..3027fef 100644
--- a/pkg/cloudbroker/resource_optimizer/drs_update.go
+++ b/pkg/cloudbroker/resource_optimizer/drs_update.go
@@ -14,6 +14,11 @@ type DRSUpdateRequest struct {
// Required: true
ZoneID uint64 `url:"zone_id" json:"zone_id" validate:"required"`
+ // SSO provider type
+ // Available values: bvs, decs3o
+ // Required: true
+ SSOType string `url:"sso_type" json:"sso_type" validate:"required,oneof=bvs decs3o"`
+
// Application ID
// Required: false
AppID string `url:"app_id,omitempty" json:"app_id,omitempty"`
@@ -33,6 +38,30 @@ type DRSUpdateRequest struct {
// DRS name
// Required: false
DRSName string `url:"drs_name,omitempty" json:"drs_name,omitempty"`
+
+ // Username
+ // Required: false
+ Username string `url:"username,omitempty" json:"username,omitempty"`
+
+ // Password
+ // Required: false
+ Password string `url:"password,omitempty" json:"password,omitempty"`
+
+ // Broadcast address
+ // Required: false
+ BroadcastAddr string `url:"broadcast_addr,omitempty" json:"broadcast_addr,omitempty"`
+
+ // Ping address
+ // Required: false
+ PingAddr string `url:"ping_addr,omitempty" json:"ping_addr,omitempty"`
+
+ // Skip SSL certificate verification
+ // Required: false
+ SSLSkipVerify interface{} `url:"ssl_skip_verify,omitempty" json:"ssl_skip_verify,omitempty"`
+
+ // Domain
+ // Required: false
+ Domain string `url:"domain,omitempty" json:"domain,omitempty"`
}
// DRSUpdate updates DRS configuration in the specified zone
diff --git a/pkg/cloudbroker/zone/models.go b/pkg/cloudbroker/zone/models.go
index ce35518..d79ce39 100644
--- a/pkg/cloudbroker/zone/models.go
+++ b/pkg/cloudbroker/zone/models.go
@@ -81,6 +81,21 @@ type RecordZone struct {
// SSO URL
SSOURL string `json:"sso_url"`
+
+ // SSO type
+ SSOType string `json:"sso_type"`
+
+ // Ping address
+ PingAddr string `json:"ping_addr"`
+
+ // Broadcast address
+ BroadcastAddr string `json:"broadcast_addr"`
+
+ // Skip ssl verify
+ SSLSkipVerify bool `json:"ssl_skip_verify"`
+
+ // Domain
+ Domain string `json:"domain"`
}
// A zone item from a list
@@ -130,9 +145,24 @@ type ItemZone struct {
// SSO URL
SSOURL string `json:"sso_url"`
+ // SSO type
+ SSOType string `json:"sso_type"`
+
// Status
Status string `json:"status"`
// Updated timestamp
UpdatedTime uint64 `json:"updatedTime"`
+
+ // Ping address
+ PingAddr string `json:"ping_addr"`
+
+ // Broadcast address
+ BroadcastAddr string `json:"broadcast_addr"`
+
+ // Skip ssl verify
+ SSLSkipVerify bool `json:"ssl_skip_verify"`
+
+ // Domain
+ Domain string `json:"domain"`
}
diff --git a/pkg/sdn/acsgroups/delete.go b/pkg/sdn/acsgroups/delete.go
index 6ce09b5..b411eb4 100644
--- a/pkg/sdn/acsgroups/delete.go
+++ b/pkg/sdn/acsgroups/delete.go
@@ -3,7 +3,6 @@ package acsgroups
import (
"context"
"net/http"
- "strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
@@ -16,24 +15,19 @@ type DeleteRequest struct {
GroupID string `url:"access_group_id" json:"access_group_id" validate:"required"`
}
-// Delete a access groups
-func (i AccessGroups) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
+// Delete an access groups
+func (i AccessGroups) Delete(ctx context.Context, req DeleteRequest) (string, error) {
err := validators.ValidateRequest(req)
if err != nil {
- return false, validators.ValidationErrors(validators.GetErrors(err))
+ return "", validators.ValidationErrors(validators.GetErrors(err))
}
url := "/sdn/access_group/delete"
res, err := i.client.DecortApiCallCtype(ctx, http.MethodDelete, url, constants.MIMEJSON, 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/sdn/acsgroups/models.go b/pkg/sdn/acsgroups/models.go
index 6d59e01..919f1c5 100644
--- a/pkg/sdn/acsgroups/models.go
+++ b/pkg/sdn/acsgroups/models.go
@@ -15,9 +15,7 @@ type AccessGroup struct {
DisplayName string `json:"display_name"`
Comment string `json:"comment"`
CreatedAt string `json:"created_at"`
- CreatedBy string `json:"created_by"`
UpdatedAt string `json:"updated_at"`
- UpdatedBy string `json:"updated_by"`
NetObjectAccessGroup NetObjectAccessGroup `json:"net_object_access_group"`
DefaultSecurityPolicy DefaultSecurityPolicy `json:"default_security_policy"`
}
diff --git a/pkg/sdn/hypervisors/models.go b/pkg/sdn/hypervisors/models.go
index 897c10c..cd4ec2c 100644
--- a/pkg/sdn/hypervisors/models.go
+++ b/pkg/sdn/hypervisors/models.go
@@ -21,7 +21,7 @@ type RecordHypervisor struct {
Name string `json:"name"`
// Ports
- Ports []string `json:"ports"`
+ Ports Ports `json:"ports"`
// Status
Status string `json:"status"`
@@ -29,3 +29,30 @@ type RecordHypervisor struct {
// List of hypervisors
type HypervisorsList []RecordHypervisor
+
+// Hypervisor ports
+type Ports struct {
+ Data []Port `json:"data"`
+ Info Info `json:"info"`
+}
+
+// Info about a port
+type Port struct {
+ // ID of a port
+ ID string `json:"id"`
+
+ // Unique ID of a port
+ UniqueIdentifier string `json:"unique_identifier"`
+
+ // Display name of a port
+ DisplayName string `json:"display_name"`
+
+ // Is a port up
+ UP bool `json:"up"`
+}
+
+// Port counters
+type Info struct {
+ ActivePorts uint64 `json:"active_ports"`
+ TotalPorts uint64 `json:"total_ports"`
+}
diff --git a/pkg/sdn/netobjgroups/attach_extnet_ports.go b/pkg/sdn/netobjgroups/attach_extnet_ports.go
index 329637d..23368c7 100644
--- a/pkg/sdn/netobjgroups/attach_extnet_ports.go
+++ b/pkg/sdn/netobjgroups/attach_extnet_ports.go
@@ -2,6 +2,7 @@ package netobjgroups
import (
"context"
+ "encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
@@ -24,18 +25,25 @@ type AttachExtNetPortsRequest struct {
}
// AttachExtNetPorts attaches external network ports to a network object group
-func (nog NetworkObjectGroups) AttachExtNetPorts(ctx context.Context, req AttachExtNetPortsRequest) (bool, error) {
+func (nog NetworkObjectGroups) AttachExtNetPorts(ctx context.Context, req AttachExtNetPortsRequest) (*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/network_object_group/attach_external_network_ports"
- _, err = nog.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
+ res, err := nog.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
- return false, err
+ return nil, err
}
- return true, nil
+ info := RecordVersion{}
+
+ err = json.Unmarshal(res, &info)
+ if err != nil {
+ return nil, err
+ }
+
+ return &info, nil
}
diff --git a/pkg/sdn/netobjgroups/attach_logical_ports.go b/pkg/sdn/netobjgroups/attach_logical_ports.go
index 7048a08..0f2e33b 100644
--- a/pkg/sdn/netobjgroups/attach_logical_ports.go
+++ b/pkg/sdn/netobjgroups/attach_logical_ports.go
@@ -2,6 +2,7 @@ package netobjgroups
import (
"context"
+ "encoding/json"
"net/http"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
@@ -26,6 +27,7 @@ type AttachLogicalPortsRequest struct {
// Required: true
PortBindings []PortBindings `url:"port_bindings" json:"port_bindings" validate:"required,dive"`
}
+
type PortBindings struct {
// ID of a logical port
// Required: true
@@ -37,18 +39,25 @@ type PortBindings struct {
}
// AttachLogicalPorts attaches logical ports to a network object group
-func (nog NetworkObjectGroups) AttachLogicalPorts(ctx context.Context, req AttachLogicalPortsRequest) (bool, error) {
+func (nog NetworkObjectGroups) AttachLogicalPorts(ctx context.Context, req AttachLogicalPortsRequest) (*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/network_object_group/attach_logical_ports"
- _, err = nog.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
+ res, err := nog.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
if err != nil {
- return false, err
+ return nil, err
}
- return true, nil
+ info := RecordVersion{}
+
+ err = json.Unmarshal(res, &info)
+ if err != nil {
+ return nil, err
+ }
+
+ return &info, nil
}
diff --git a/pkg/sdn/netobjgroups/create.go b/pkg/sdn/netobjgroups/create.go
index b1d8862..2d6f9e4 100644
--- a/pkg/sdn/netobjgroups/create.go
+++ b/pkg/sdn/netobjgroups/create.go
@@ -26,6 +26,14 @@ type CreateRequest struct {
// Logical ports bindings
// Required: false
LogicalPortsBindings []LogicalPortsBindings `url:"logical_ports_binding,omitempty" json:"logical_ports_bindings,omitempty" validate:"omitempty,dive"`
+
+ // L2 connection ports bindings
+ // Required: false
+ L2ConnectionPortsBindings []LogicalPortsBindings `url:"l2_connection_ports_binding,omitempty" json:"l2_connection_ports_bindings,omitempty" validate:"omitempty,dive"`
+
+ // Addresses
+ // Required: false
+ Addresses []NetAddressRequest `url:"addresses,omitempty" json:"addresses,omitempty" validate:"omitempty,dive"`
}
type LogicalPortsBindings struct {
// Port ID
@@ -34,7 +42,7 @@ type LogicalPortsBindings struct {
// Port version
// Required: true
- PortVersion int64 `url:"port_version" json:"port_version" validate:"required"`
+ PortVersion uint64 `url:"port_version" json:"port_version" validate:"required"`
}
// Create creates a network object group
diff --git a/pkg/sdn/netobjgroups/detach_logical_ports.go b/pkg/sdn/netobjgroups/detach_logical_ports.go
index 782fda0..170728b 100644
--- a/pkg/sdn/netobjgroups/detach_logical_ports.go
+++ b/pkg/sdn/netobjgroups/detach_logical_ports.go
@@ -9,7 +9,7 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
-// DetachLogicalPortsRequest struct to detach an logical port from a network object group
+// DetachLogicalPortsRequest struct to detach logical ports from a network object group
type DetachLogicalPortsRequest struct {
// ID of a network object group
// Required: true
@@ -23,13 +23,19 @@ type DetachLogicalPortsRequest struct {
// Required: true
VersionID uint64 `url:"version_id" json:"version_id" validate:"required"`
+ // Port bindings
+ // Required: true
+ PortBindings []DetachLogicalPortBinding `url:"port_bindings" json:"port_bindings" validate:"required,dive"`
+}
+
+type DetachLogicalPortBinding struct {
// ID of a logical port
// Required: true
- LogicalPortID string `url:"logical_port_id" json:"logical_port_id" validate:"required"`
+ PortID string `url:"port_id" json:"port_id" validate:"required"`
// Version of a logical port
// Required: true
- LogicalPortVersion uint64 `url:"logical_port_version" json:"logical_port_version" validate:"required"`
+ PortVersion uint64 `url:"port_version" json:"port_version" validate:"required"`
}
// DetachLogicalPorts detaches logical ports from a network object group
diff --git a/pkg/sdn/netobjgroups/models.go b/pkg/sdn/netobjgroups/models.go
index b7fbdd3..70519b1 100644
--- a/pkg/sdn/netobjgroups/models.go
+++ b/pkg/sdn/netobjgroups/models.go
@@ -19,6 +19,9 @@ type RecordNetObjGroup struct {
// Access group name
AccessGroupName string `json:"access_group_name"`
+ // Addresses
+ Addresses NetAddresses `json:"addresses"`
+
// Counters
Counters Counter `json:"counters"`
@@ -37,21 +40,36 @@ type RecordNetObjGroup struct {
// ID of a network object group
ID string `json:"id"`
+ // L2 connection ports attached to a network object group
+ L2ConnectionPorts L2ConnectionPorts `json:"l2_connection_ports"`
+
// Logical ports attached to a network object group
LogicalPorts LogicalPorts `json:"logical_ports"`
// Name of a network object group
Name string `json:"name"`
+ // Purpose of a network object group
+ Purpose string `json:"purpose"`
+
// Security policies of a network object group
SecurityPolicies SecurityPolicies `json:"security_policies"`
+ // Type of a network object group
+ Type string `json:"type"`
+
// Version ID
VersionID uint64 `json:"version_id"`
}
// Info about counters
type Counter struct {
+ // Amount of addresses
+ AddressesCount uint64 `json:"addresses_count"`
+
+ // Amount of L2 connection ports
+ L2ConnectionPortsCount uint64 `json:"l2_connection_ports_count"`
+
// Amount of logical ports
LogicalPortsCount uint64 `json:"logical_ports_count"`
@@ -62,23 +80,133 @@ type Counter struct {
SecurityRulesCount uint64 `json:"security_rules_count"`
}
-// List of counters
-type Counters []Counter
+// Info about a net address
+type NetAddress struct {
+ // ID
+ ID string `json:"id"`
-// Info about an external network port
-type ExternalNetworkPort struct {
+ // IP address
+ IPAddr string `json:"ip_addr"`
+
+ // IP address range end
+ IPAddrRangeEnd string `json:"ip_addr_range_end"`
+
+ // IP prefix
+ IPPrefix string `json:"ip_prefix"`
+
+ // MAC address
+ MACAddr string `json:"mac_addr"`
+
+ // Net address type
+ NetAddressType string `json:"net_address_type"`
+}
+
+// List of net addresses
+type NetAddresses []NetAddress
+
+// Request info about a net address
+type NetAddressRequest struct {
+ // IP address
+ // Required: false
+ IPAddr string `url:"ip_addr" json:"ip_addr"`
+
+ // IP address range end
+ // Required: false
+ IPAddrRangeEnd string `url:"ip_addr_range_end" json:"ip_addr_range_end"`
+
+ // IP prefix
+ // Required: false
+ IPPrefix string `url:"ip_prefix" json:"ip_prefix"`
+
+ // MAC address
+ // Required: false
+ MACAddr string `url:"mac_addr" json:"mac_addr"`
+
+ // Net address type
+ // Required: true
+ NetAddressType string `url:"net_address_type" json:"net_address_type" validate:"required"`
+}
+
+// Info about an L2 connection port
+type L2ConnectionPort struct {
+ // Access group ID
+ AccessGroupID string `json:"access_group_id"`
+
+ // Created at
+ CreatedAt string `json:"created_at"`
+
+ // ID
+ ID string `json:"id"`
+
+ // L2 external network
+ L2ExternalNetwork L2ExternalNetwork `json:"l2_external_network"`
+
+ // Updated at
+ UpdatedAt string `json:"updated_at"`
+
+ // Version ID
+ VersionID uint64 `json:"version_id"`
+}
+
+// List of L2 connection ports
+type L2ConnectionPorts []L2ConnectionPort
+
+// Info about an L2 external network
+type L2ExternalNetwork struct {
// Bridge network name
BridgeNetworkName string `json:"bridge_network_name"`
- // Default gateaway for IPv4
- DefaultGateawayIPv4 string `json:"default_gateaway_ipv4"`
-
- // Default gateaway for IPv6
- DefaultGateawayIPv6 string `json:"default_gateaway_ipv6"`
+ // Created at
+ CreatedAt string `json:"created_at"`
// Description
Description string `json:"description"`
+ // Display name
+ DisplayName string `json:"display_name"`
+
+ // Hypervisors
+ Hypervisors []string `json:"hypervisors"`
+
+ // ID
+ ID string `json:"id"`
+
+ // Updated at
+ UpdatedAt string `json:"updated_at"`
+
+ // Version ID
+ VersionID uint64 `json:"version_id"`
+
+ // VLAN Tag
+ VLANTag *int `json:"vlan_tag"`
+}
+
+// Info about an external network port
+type ExternalNetworkPort struct {
+ // Access group ID
+ AccessGroupID string `json:"access_group_id"`
+
+ // Access group name
+ AccessGroupName string `json:"access_group_name"`
+
+ // Bridge network name
+ BridgeNetworkName string `json:"bridge_network_name"`
+
+ // Comment
+ Comment string `json:"comment"`
+
+ // Default gateway for IPv4
+ DefaultGatewayIPv4 string `json:"default_gateway_ipv4"`
+
+ // Default gateway for IPv6
+ DefaultGatewayIPv6 string `json:"default_gateway_ipv6"`
+
+ // 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"`
@@ -88,11 +216,14 @@ type ExternalNetworkPort struct {
// ID of an external network port
ID string `json:"id"`
+ // IP v4
+ IPv4 string `json:"ipv4"`
+
// Status
Status Status `json:"status"`
// Version ID
- VersionID string `json:"version_id"`
+ VersionID uint64 `json:"version_id"`
// Subnet for V4
SubnetV4 string `json:"subnet_v4"`
@@ -107,7 +238,10 @@ type ExternalNetworkPort struct {
UpdatedAt string `json:"updated_at"`
// VLAN Tag
- VLANTag string `json:"vlan_tag"`
+ VLANTag int `json:"vlan_tag"`
+
+ // MAC
+ MAC string `json:"mac"`
}
// List of external network ports
@@ -142,6 +276,9 @@ type LogicalPort struct {
// Is a logical port enabled
Enabled bool `json:"enabled"`
+ // Exclude firewall settings
+ ExcludeFirewall ExcludeFirewall `json:"exclude_firewall"`
+
// External network ID
ExternalNetworkID string `json:"external_network_id"`
@@ -151,6 +288,9 @@ type LogicalPort struct {
// Hypervisor display name
HypervisorDisplayName string `json:"hypervisor_display_name"`
+ // Labels
+ Labels Labels `json:"labels"`
+
// Live migration target HV
LiveMigrationTargetHV string `json:"live_migration_target_hv"`
@@ -170,9 +310,30 @@ type LogicalPort struct {
VersionID uint64 `json:"version_id"`
}
-// List a logical ports
+// List of logical ports
type LogicalPorts []LogicalPort
+// Info about exclude firewall settings
+type ExcludeFirewall struct {
+ // Exclusion reason
+ ExclusionReason string `json:"exclusion_reason"`
+
+ // Is logical port addresses excluded
+ LogicalPortAddressesExcluded bool `json:"logical_port_addresses_excluded"`
+
+ // Is logical port excluded
+ LogicalPortExcluded bool `json:"logical_port_excluded"`
+}
+
+// Labels for a logical port
+type Labels struct {
+ // VM ID
+ VMID string `json:"vm_id"`
+
+ // VM name
+ VMName string `json:"vm_name"`
+}
+
// Info about a security policy
type SecurityPolicy struct {
// Access group ID
@@ -181,8 +342,8 @@ type SecurityPolicy struct {
// Access group name
AccessGroupName string `json:"access_group_name"`
- // Applied to net object group ID
- AppliedToNetObjectGroupID string `json:"applied_to_net_object_group_id"`
+ // Applied net object groups
+ AppliedNetObjectGroups AppliedNetObjectGroups `json:"applied_net_object_groups"`
// Created at
CreatedAt string `json:"created_at"`
@@ -211,6 +372,9 @@ type SecurityPolicy struct {
// Status
Status Status `json:"status"`
+ // Type
+ Type string `json:"type"`
+
// Version ID
VersionID uint64 `json:"version_id"`
@@ -221,6 +385,21 @@ type SecurityPolicy struct {
// List of security policies
type SecurityPolicies []SecurityPolicy
+// Info about an applied net object group in a security policy
+type AppliedNetObjectGroup struct {
+ // ID
+ ID string `json:"id"`
+
+ // Name
+ Name string `json:"name"`
+
+ // Version ID
+ VersionID uint64 `json:"version_id"`
+}
+
+// List of applied net object groups
+type AppliedNetObjectGroups []AppliedNetObjectGroup
+
// Details of external network ports field
type ExternalNetworkPortField struct {
// Access group ID
@@ -261,11 +440,14 @@ type ExternalNetworkPortsField []ExternalNetworkPortField
// Info about a status
type Status struct {
- // Common
- Common string `json:"common"`
+ // Operation status
+ OperationStatus string `json:"operation_status"`
// Info about hypervisors
Hypervisors HypervisorsInfo `json:"hypervisors"`
+
+ // Hypervisor status
+ HypervisorStatus string `json:"hypervisor_status"`
}
// Config for IP v6
@@ -396,9 +578,6 @@ type Bindings struct {
// Is an address detected
AddressDetection bool `json:"address_detection"`
- // Is excluded from firewall
- IsExcludedFromFirewall bool `json:"is_excluded_from_firewall"`
-
// Version ID
VersionID uint64 `json:"version_id"`
@@ -648,8 +827,8 @@ type RoutersInfo struct {
// Info about a hypervisor
type HypervisorInfo struct {
- // Status
- Status string `json:"status"`
+ // Operation status
+ OperationStatus string `json:"operation_status"`
// Name
Name string `json:"name"`
@@ -696,7 +875,128 @@ type LogicalPortAddress struct {
// List of logical port addresses
type LogicalPortAddresses []LogicalPortAddress
-// TODO
-type SecurityRule struct{}
+// Info about a security rule
+type SecurityRule struct {
+ // Access group ID
+ AccessGroupID string `json:"access_group_id"`
+ // Action
+ Action string `json:"action"`
+
+ // Description
+ Description string `json:"description"`
+
+ // Destination net object
+ DestinationNetObject *SecurityRuleNetObject `json:"destination_net_object"`
+
+ // Direction
+ Direction string `json:"direction"`
+
+ // Display name
+ DisplayName string `json:"display_name"`
+
+ // Is enabled
+ Enabled bool `json:"enabled"`
+
+ // Filter
+ Filter *SecurityRuleFilter `json:"filter"`
+
+ // ID
+ ID string `json:"id"`
+
+ // Is log enabled
+ LogEnabled bool `json:"log_enabled"`
+
+ // Log name
+ LogName string `json:"log_name"`
+
+ // Log severity
+ LogSeverity string `json:"log_severity"`
+
+ // Priority
+ Priority int `json:"priority"`
+
+ // Security policy ID
+ SecurityPolicyID string `json:"security_policy_id"`
+
+ // Source net object
+ SourceNetObject *SecurityRuleNetObject `json:"source_net_object"`
+
+ // Is statistics enabled
+ StatisticsEnabled bool `json:"statistics_enabled"`
+
+ // Type
+ Type string `json:"type"`
+
+ // Version ID
+ VersionID uint64 `json:"version_id"`
+}
+
+// List of security rules
type SecurityRules []SecurityRule
+
+// Info about a security rule net object
+type SecurityRuleNetObject struct {
+ // Display name
+ DisplayName string `json:"display_name"`
+
+ // Net address pool ID
+ NetAddressPoolID string `json:"net_address_pool_id"`
+
+ // Net object group ID
+ NetObjectGroupID string `json:"net_object_group_id"`
+}
+
+// Info about a security rule filter
+type SecurityRuleFilter struct {
+ // Filters
+ Filters SecurityRuleFilters `json:"filters"`
+
+ // Name
+ Name string `json:"name"`
+}
+
+// Security rule filters
+type SecurityRuleFilters struct {
+ // Filter all traffic
+ All bool `json:"all"`
+
+ // Filter ARP traffic
+ ARP bool `json:"arp"`
+
+ // Filter DHCP traffic
+ DHCP bool `json:"dhcp"`
+
+ // Custom filter expression
+ Expression string `json:"expression"`
+
+ // Filter ICMP traffic
+ ICMP bool `json:"icmp"`
+
+ // Filter IP traffic
+ IP bool `json:"ip"`
+
+ // Filter IPv4 traffic
+ IPv4 bool `json:"ip_v4"`
+
+ // Filter IPv6 traffic
+ IPv6 bool `json:"ip_v6"`
+
+ // Keep tracking opened sessions
+ KeepOpenedSessions bool `json:"keep_opened_sessions"`
+
+ // Filter Neighbor Discovery traffic
+ ND bool `json:"nd"`
+
+ // Filter TCP traffic
+ TCP bool `json:"tcp"`
+
+ // List of TCP destination ports to filter
+ TCPDstPorts []string `json:"tcp_dst_ports"`
+
+ // Filter UDP traffic
+ UDP bool `json:"udp"`
+
+ // List of UDP destination ports to filter
+ UDPDstPorts []string `json:"udp_dst_ports"`
+}
diff --git a/pkg/sdn/netobjgroups/update.go b/pkg/sdn/netobjgroups/update.go
index d4fa884..20cf6c0 100644
--- a/pkg/sdn/netobjgroups/update.go
+++ b/pkg/sdn/netobjgroups/update.go
@@ -30,6 +30,10 @@ type UpdateRequest struct {
// Name of the network object group
// Required: true
Name string `url:"name" json:"name" validate:"required"`
+
+ // Addresses
+ // Required: false
+ Addresses []NetAddressRequest `url:"addresses,omitempty" json:"addresses,omitempty" validate:"omitempty,dive"`
}
// Update updates a network object group
diff --git a/pkg/sdn/segments/create.go b/pkg/sdn/segments/create.go
index f71fa8b..1058e46 100644
--- a/pkg/sdn/segments/create.go
+++ b/pkg/sdn/segments/create.go
@@ -42,6 +42,10 @@ type CreateRequest struct {
// DHCP IPv6
// Required: false
DHCPv6 *DHCPv6ConfigRequest `url:"-" json:"dhcp_v6,omitempty"`
+
+ // Segment type
+ // Required: false
+ Type string `url:"type,omitempty" json:"type,omitempty"`
}
type DHCPv4ConfigRequest struct {
diff --git a/pkg/sdn/segments/get_faa.go b/pkg/sdn/segments/get_faa.go
new file mode 100644
index 0000000..69c09a3
--- /dev/null
+++ b/pkg/sdn/segments/get_faa.go
@@ -0,0 +1,46 @@
+package segments
+
+import (
+ "context"
+ "encoding/json"
+ "net/http"
+
+ "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
+)
+
+// GetFAARequest struct to get the floating/anycast IP address of a segment
+type GetFAARequest struct {
+ // ID of segment
+ // Required: true
+ SegmentID string `url:"segment_id" json:"segment_id" validate:"required"`
+}
+
+// GetFAA gets the floating/anycast IP address info for a segment
+func (s Segments) GetFAA(ctx context.Context, req GetFAARequest) (*GetFAAResponse, error) {
+ res, err := s.GetFAARaw(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ info := GetFAAResponse{}
+
+ err = json.Unmarshal(res, &info)
+ if err != nil {
+ return nil, err
+ }
+
+ return &info, nil
+}
+
+// GetFAARaw gets the floating/anycast IP address info for a segment as an array of bytes
+func (s Segments) GetFAARaw(ctx context.Context, req GetFAARequest) ([]byte, error) {
+ err := validators.ValidateRequest(req)
+ if err != nil {
+ return nil, validators.ValidationErrors(validators.GetErrors(err))
+ }
+
+ url := "/sdn/segment/get_faa"
+
+ res, err := s.client.DecortApiCall(ctx, http.MethodGet, url, req)
+ return res, err
+}
diff --git a/pkg/sdn/segments/get_status.go b/pkg/sdn/segments/get_status.go
deleted file mode 100644
index 07e3774..0000000
--- a/pkg/sdn/segments/get_status.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package segments
-
-import (
- "context"
- "encoding/json"
- "net/http"
-
- "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
-)
-
-// GetStatusRequest struct to get information about segment status
-type GetStatusRequest struct {
- // ID of segment
- // Required: true
- SegmentID string `url:"segment_id" json:"segment_id" validate:"required"`
-
- // ID of version
- // Required: false
- VersionID uint64 `url:"version_id,omitempty" json:"version_id,omitempty"`
-
- // Get detailed status or not
- // Required: false
- Detailed interface{} `url:"enabled,omitempty" json:"enabled,omitempty" validate:"omitempty,isBool"`
-}
-
-// GetStatus gets segment status
-func (s Segments) GetStatus(ctx context.Context, req GetStatusRequest) (string, error) {
- type temp struct {
- Status string `json:"status"`
- }
-
- err := validators.ValidateRequest(req)
- if err != nil {
- return "", validators.ValidationErrors(validators.GetErrors(err))
- }
-
- url := "/sdn/segment/get_status"
-
- res, err := s.client.DecortApiCall(ctx, http.MethodGet, url, req)
- if err != nil {
- return "", err
- }
-
- info := temp{}
- err = json.Unmarshal(res, &info)
- if err != nil {
- return "", err
- }
-
- return info.Status, nil
-}
diff --git a/pkg/sdn/segments/list.go b/pkg/sdn/segments/list.go
index 6375094..feb01e8 100644
--- a/pkg/sdn/segments/list.go
+++ b/pkg/sdn/segments/list.go
@@ -59,6 +59,10 @@ type ListRequest struct {
// Sort order (asc/desc)
// Required: false
SortOrder string `url:"sort_order,omitempty" json:"sort_order,omitempty"`
+
+ // Filter by operation status
+ // Required: false
+ OperationStatus string `url:"operation_status,omitempty" json:"operation_status,omitempty"`
}
// List gets list of all available segments as a ListSegment struct
diff --git a/pkg/sdn/segments/models.go b/pkg/sdn/segments/models.go
index a0bc13b..da55db8 100644
--- a/pkg/sdn/segments/models.go
+++ b/pkg/sdn/segments/models.go
@@ -16,7 +16,7 @@ type SegmentResponse struct {
// Created time
CreatedAt time.Time `json:"created_at"`
- // Detailed description of the router port
+ // Detailed description of the segment
Description string `json:"description"`
// DHCP IPv4
@@ -34,6 +34,9 @@ type SegmentResponse struct {
// ID of segment
ID string `json:"id"`
+ // L2 connection port info
+ L2ConnectionPort *L2ConnectionPort `json:"l2_connection_port,omitempty"`
+
// Logical ports info
LogicalPortsInfo []EntityInfo `json:"logical_ports_info"`
@@ -49,6 +52,9 @@ type SegmentResponse struct {
// IPv6 subnet in CIDR notation
SubnetV6 string `json:"subnet_v6"`
+ // Segment type
+ Type string `json:"type"`
+
// Update time
UpdatedAt time.Time `json:"updated_at"`
@@ -111,16 +117,16 @@ type EntityInfo struct {
}
type Status struct {
- // Common
- Common string `json:"common"`
+ // Operation status
+ OperationStatus string `json:"operation_status"`
// Hypervisors status
Hypervisors []HypervisorStatus `json:"hypervisors"`
}
type HypervisorStatus struct {
- // Status
- Status string `json:"status"`
+ // Operation status of the hypervisor
+ OperationStatus string `json:"operation_status"`
// Name of hypervisor
Name string `json:"name"`
@@ -134,3 +140,75 @@ type HypervisorStatus struct {
// Synced time
SyncedAt time.Time `json:"synced_at"`
}
+
+// L2ConnectionPort holds information about the L2 connection port of a segment
+type L2ConnectionPort struct {
+ // ID of the L2 connection port
+ ID string `json:"id"`
+
+ // Access group ID
+ AccessGroupID string `json:"access_group_id"`
+
+ // ID of version
+ VersionID uint64 `json:"version_id"`
+
+ // L2 external network details
+ L2ExternalNetwork L2ExternalNetwork `json:"l2_external_network"`
+
+ // Created time
+ CreatedAt time.Time `json:"created_at"`
+
+ // ID of the user who created the port
+ CreatedBy string `json:"created_by"`
+
+ // Updated time
+ UpdatedAt time.Time `json:"updated_at"`
+
+ // ID of the user who last updated the port
+ UpdatedBy string `json:"updated_by"`
+}
+
+// L2ExternalNetwork holds information about an L2 external network
+type L2ExternalNetwork struct {
+ // ID of the network
+ ID string `json:"id"`
+
+ // User-friendly name for the network
+ DisplayName string `json:"display_name"`
+
+ // Detailed description of the network
+ Description string `json:"description"`
+
+ // Bridge network name
+ BridgeNetworkName string `json:"bridge_network_name"`
+
+ // List of hypervisor IDs attached to the network
+ Hypervisors []string `json:"hypervisors"`
+
+ // VLAN tag
+ VLANTag uint64 `json:"vlan_tag"`
+
+ // ID of version
+ VersionID uint64 `json:"version_id"`
+
+ // Created time
+ CreatedAt time.Time `json:"created_at"`
+
+ // ID of the user who created the network
+ CreatedBy string `json:"created_by"`
+
+ // Updated time
+ UpdatedAt time.Time `json:"updated_at"`
+
+ // ID of the user who last updated the network
+ UpdatedBy string `json:"updated_by"`
+}
+
+// GetFAAResponse holds the floating/anycast IP address info for a segment
+type GetFAAResponse struct {
+ // IPv4 address
+ IPv4Address string `json:"ipv4_address"`
+
+ // IPv6 address
+ IPv6Address string `json:"ipv6_address"`
+}
diff --git a/pkg/sdn/segments/update.go b/pkg/sdn/segments/update.go
index dece2dd..a240140 100644
--- a/pkg/sdn/segments/update.go
+++ b/pkg/sdn/segments/update.go
@@ -50,6 +50,10 @@ type UpdateRequest struct {
// DHCP IPv6
// Required: false
DHCPv6 *DHCPv6ConfigRequest `url:"-" json:"dhcp_v6,omitempty"`
+
+ // Segment type
+ // Required: false
+ Type string `url:"type,omitempty" json:"type,omitempty"`
}
// Update updates segment
diff --git a/tests/platform_upgrade/request_map.go b/tests/platform_upgrade/request_map.go
index 51361ff..5b1676e 100644
--- a/tests/platform_upgrade/request_map.go
+++ b/tests/platform_upgrade/request_map.go
@@ -1189,12 +1189,12 @@ func getRequestsMapSDN() map[string]interface{} {
"/restmachine/sdn/network_object_group/detach_l2_connection_ports": netobjgroups.DetachL2ConnectionPortsRequest{},
// segments
- "/restmachine/sdn/segment/create": segments.CreateRequest{},
- "/restmachine/sdn/segment/delete": segments.DeleteRequest{},
- "/restmachine/sdn/segment/get": segments.GetRequest{},
- "/restmachine/sdn/segment/get_status": segments.GetStatusRequest{},
- "/restmachine/sdn/segment/list": segments.ListRequest{},
- "/restmachine/sdn/segment/update": segments.UpdateRequest{},
+ "/restmachine/sdn/segment/create": segments.CreateRequest{},
+ "/restmachine/sdn/segment/delete": segments.DeleteRequest{},
+ "/restmachine/sdn/segment/get": segments.GetRequest{},
+ "/restmachine/sdn/segment/get_faa": segments.GetFAARequest{},
+ "/restmachine/sdn/segment/list": segments.ListRequest{},
+ "/restmachine/sdn/segment/update": segments.UpdateRequest{},
// logical ports
"/restmachine/sdn/logical_port/create": logicalports.CreateRequest{},