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{},