Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bd93e92c2 | ||
|
|
5cdae8520f | ||
| 30e464e4d2 |
81
CHANGELOG.md
81
CHANGELOG.md
@@ -1,4 +1,4 @@
|
||||
## Version 1.14.5
|
||||
## 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,41 +9,86 @@
|
||||
|
||||
### Добавлено
|
||||
|
||||
#### compute
|
||||
#### resource optimizer
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-360 | Валидация поля `Label` в структуре запроса `SnapshotCreateRequest` в cloudapi/compute и cloudbroker/compute |
|
||||
| BGOS-842 | Опциональные поля `Username`, `Password`, `BroadcastAddr`, `PingAddr`, `SSLSkipVerify` и `Domain` в структуры запросов `DRSCreateRequest` и `DRSUpdateRequest` в `cloudbroker/resource_optimizer` |
|
||||
| BGOS-842 | Обязательное поле `SSOType` в структуры запросов `DRSCreateRequest` и `DRSUpdateRequest` в `cloudbroker/resource_optimizer` |
|
||||
|
||||
#### image
|
||||
#### grid
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-820 | Обязательное поле `SEPID` в структуру запроса `MultiImageExportRequest` в cloudbroker/image |
|
||||
| BGOS-846 | Вычисляемое поле `BROEnabled` в структуры ответов `RecordGrid` и `ItemGridList` в cloudbroker/grid |
|
||||
|
||||
#### locations
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-823 | Вычисляемое поле `ZeroAccessEnabled` в структуру ответа `ItemLocation` в cloudapi/locations |
|
||||
| BGOS-845 | Вычисляемое поле `BROEnabled` в структуру ответа `ItemLocation` в cloudapi/locations |
|
||||
|
||||
#### resource_optimizer
|
||||
#### zone
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-818 | Группа методов `cloudbroker/resource_optimizer` для управления инструментом оптимизации ресурсов (DRS) |
|
||||
| BGOS-841 | Вычисляемые поля `PingAddr`, `BroadcastAddr`, `SSLSkipVerify` и `Domain` в структуры ответов `ItemZone` и `RecordZone` в cloudapi/zone и в cloudbroker/zone |
|
||||
| BGOS-844 | Вычисляемое поле `SSOType` в структуры ответов `ItemZone` и `RecordZone` в cloudapi/zone и в cloudbroker/zone |
|
||||
|
||||
### zone
|
||||
#### SDN segments
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-819 | Вычисляемые поля `DRS`, `DRSUID`, `AppID`, `DecortURL`, `DRSName` и `SSOURL` в структуру ответа `RecordZone` в cloudapi/zone и в cloudbroker/zone |
|
||||
| BGOS-819 | Структура ответа `ItemZone` в cloudapi/zone и в cloudbroker/zone |
|
||||
| BGOS-819 | Опциональное поле `DRS` в структуру запроса `CreateRequest` в cloudbroker/zone |
|
||||
| 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 |
|
||||
|
||||
### Изменено
|
||||
|
||||
#### image
|
||||
#### SDN network object groups
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-822 | Тип полей `HotResize` и `Bootable` в структуре запроса `EditRequest` с bool на interface в cloudbroker/image |
|
||||
| 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 |
|
||||
|
||||
#### node
|
||||
### Исправлено
|
||||
|
||||
#### SDN access groups
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-821 | Тип вычисляемого поля `VCPU` с `uint64` на `float64` в структуре ответа `FreeResourcesInfo` в cloudbroker/node |
|
||||
| BGOS-836 | Тип возвращаемого значения с `bool` на `string` в методе `Delete` в sdn/acsgroups |
|
||||
|
||||
#### SDN hypervisors
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-847 | Тип вычисляемого поля `Ports` с `[]string` на структуру `Ports` в структуре ответа `RecordHypervisor` в sdn/hypervisors |
|
||||
|
||||
#### SDN hetwork object groups
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| 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
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-836 | Поля `CreatedBy` и `UpdatedBy` в структуре ответа `AccessGroup` в sdn/acsgroups |
|
||||
|
||||
#### SDN segments
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-798 | Метод `GetStatus` и структура запроса `GetStatusRequest` в sdn/segments |
|
||||
|
||||
#### SDN network object groups
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BGOS-837 | Поле `IsExcludedFromFirewall` из структуры `Bindings` в sdn/netobjgroups |
|
||||
| BGOS-837 | Поле `AppliedToNetObjectGroupID` из структуры `SecurityPolicy` в sdn/netobjgroups |
|
||||
|
||||
@@ -182,12 +182,14 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
|
||||
- `Address pool` - управление пулами адресов;
|
||||
- `DefaultSecurityPolicies` - управление политиками хранения по умолчанию;
|
||||
- `ExtNet` - управление виртуальными сетями, отвечающими за внешний доступ;
|
||||
- `Hypervisors` - управление гипервизорами;
|
||||
- `FloatingIPs` - управление плавающими IP-адресами;
|
||||
- `Logical ports` - управление логическими портами;
|
||||
- `NetworkObjectGroups` - управление группами объектов сети;
|
||||
- `Routers` - управление роутерами;
|
||||
- `SecurityPolicies` - управление политиками хранения;
|
||||
- `Segments` - управление сегментами;
|
||||
- `Version` - получение информации о версии SDN;
|
||||
|
||||
## Работа с библиотекой
|
||||
|
||||
@@ -383,12 +385,14 @@ func main() {
|
||||
- `pkg/sdn/adrspools` - для `Address pool`
|
||||
- `pkg/sdn/defsecpolicies` - для `DefaultSecurityPolicies`
|
||||
- `pkg/sdn/external_networks` - для `ExtNet`
|
||||
- `pkg/sdn/hypervisors` - для `Hypervisors`
|
||||
- `pkg/sdn/flips` - для `FloatingIPs`
|
||||
- `pkg/sdn/logicalports` - для `Logical ports`
|
||||
- `pkg/sdn/netobjgroups` - для `NetworkObjectGroups`
|
||||
- `pkg/sdn/routers` - для `Routers`
|
||||
- `pkg/sdn/secpolicies` - для `SecurityPolicies`
|
||||
- `pkg/sdn/segments` - для `Segments`
|
||||
- `pkg/sdn/version` - для `Version`
|
||||
|
||||
Все поля структуры имеют описание, в которых содержится:
|
||||
|
||||
@@ -584,12 +588,14 @@ func main() {
|
||||
- `.AddressPool()` - для работы с `Addres pool`
|
||||
- `.DefaultSecurityPolicies()` - для работы с `DefaultSecurityPolicies`
|
||||
- `.ExtNet()` - для работы с `ExtNet`
|
||||
- `.Hypervisors()` - для работы с `Hypervisors`
|
||||
- `.FloatingIPs()` - для работы с `FloatingIPs`
|
||||
- `.LogicalPorts()` - для работы с `Logical ports`
|
||||
- `.NetworkObjectGroups()` - для работы с `NetworkObjectGroups`
|
||||
- `.Routers()` - для работы с `Routers`
|
||||
- `.SecurityPolicies()` - для работы с `SecurityPolicies`
|
||||
- `.Segments()` - для работы с `Segments`
|
||||
- `.Version()` - для работы с `Version`
|
||||
|
||||
3. Вызвать метод, отвечающий за выполнение запроса и передать в него:
|
||||
|
||||
|
||||
@@ -74,6 +74,7 @@ type NetAttachRequest struct {
|
||||
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
|
||||
|
||||
// Flag indicating whether security groups are enabled for this interface
|
||||
// Not applicable to netType VFNIC, TRUNK, or SDN
|
||||
// Required: false
|
||||
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ type Interface struct {
|
||||
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
|
||||
|
||||
// Flag indicating whether security groups are enabled for this interface
|
||||
// Not applicable to netType VFNIC, TRUNK, or SDN
|
||||
// Required: false
|
||||
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
|
||||
|
||||
|
||||
@@ -16,22 +16,22 @@ type HighlyAvailableRequest struct {
|
||||
}
|
||||
|
||||
// HighlyAvailable makes load balancer highly available
|
||||
func (l LB) HighlyAvailable(ctx context.Context, req HighlyAvailableRequest) (uint64, error) {
|
||||
func (l LB) HighlyAvailable(ctx context.Context, req HighlyAvailableRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return 0, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudapi/lb/makeHighlyAvailable"
|
||||
|
||||
res, err := l.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
return false, err
|
||||
}
|
||||
|
||||
result, err := strconv.ParseUint(string(res), 10, 64)
|
||||
result, err := strconv.ParseBool(string(res))
|
||||
if err != nil {
|
||||
return 0, err
|
||||
return false, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -57,6 +57,11 @@ type CreateInAccountRequest struct {
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
|
||||
// Enable security groups for VINS
|
||||
// Required: false
|
||||
// Default: false
|
||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequestInAcc struct {
|
||||
|
||||
@@ -51,6 +51,11 @@ type CreateInRGRequest struct {
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
|
||||
// Enable security groups for VINS
|
||||
// Required: false
|
||||
// Default: false
|
||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequestInRG struct {
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
@@ -74,6 +74,7 @@ type NetAttachRequest struct {
|
||||
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
|
||||
|
||||
// Flag indicating whether security groups are enabled for this interface
|
||||
// Not applicable to netType VFNIC, TRUNK, or SDN
|
||||
// Required: false
|
||||
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
|
||||
|
||||
|
||||
@@ -37,6 +37,11 @@ type CreateRequest struct {
|
||||
// List of resource groups IDs to which DPDK network will be available. Empty field means all resource groups in the system.
|
||||
// Required: false
|
||||
RGAccess []uint64 `url:"rgAccess,omitempty" json:"rgAccess,omitempty"`
|
||||
|
||||
// Enable security groups for DPDK network
|
||||
// Required: false
|
||||
// Default: false
|
||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
// Create creates a DPDK networks
|
||||
|
||||
@@ -104,6 +104,11 @@ type CreateRequest struct {
|
||||
// Required: false
|
||||
// Default: false
|
||||
HAMode bool `url:"highlyAvailable,omitempty" json:"highlyAvailable,omitempty"`
|
||||
|
||||
// Enable security groups for external network
|
||||
// Required: false
|
||||
// Default: false
|
||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequest struct {
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
package grid
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// AddRequest struct for location code
|
||||
type AddRequest struct {
|
||||
// Grid (platform) ID
|
||||
// Required: true
|
||||
GID uint64 `url:"gid" json:"gid" validate:"required"`
|
||||
|
||||
// Name of the location
|
||||
// Required: true
|
||||
Name string `url:"name" json:"name" validate:"required"`
|
||||
|
||||
// Location code typicly used in dns names
|
||||
// Required: true
|
||||
LocationCode string `url:"locationcode" json:"locationcode" validate:"required"`
|
||||
}
|
||||
|
||||
// Add location code (e.g. DNS name of this grid)
|
||||
func (g Grid) Add(ctx context.Context, req AddRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/grid/add"
|
||||
|
||||
res, err := g.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
result, err := strconv.ParseBool(string(res))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
@@ -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
|
||||
@@ -129,6 +132,12 @@ type ItemGridList struct {
|
||||
|
||||
// SDN support
|
||||
SDNSupport bool `json:"sdn_support"`
|
||||
|
||||
// Is Zero Access enabled
|
||||
ZeroAccessEnabled bool `json:"zeroaccess_enabled"`
|
||||
|
||||
// Is BRO enabled
|
||||
BROEnabled bool `json:"bro_enabled"`
|
||||
}
|
||||
|
||||
// List Grids
|
||||
|
||||
@@ -51,6 +51,7 @@ type Interface struct {
|
||||
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
|
||||
|
||||
// Flag indicating whether security groups are enabled for this interface
|
||||
// Not applicable to netType VFNIC, TRUNK, or SDN
|
||||
// Required: false
|
||||
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ type InterfaceMassCreate struct {
|
||||
SecGroups []uint64 `url:"security_groups,omitempty" json:"security_groups,omitempty"`
|
||||
|
||||
// Flag indicating whether security groups are enabled for this interface
|
||||
// Not applicable to netType VFNIC, TRUNK, or SDN
|
||||
// Required: false
|
||||
EnableSecGroups bool `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty"`
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -3,6 +3,8 @@ package sep
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
@@ -13,32 +15,66 @@ type AddPoolRequest struct {
|
||||
// Required: true
|
||||
SEPID uint64 `url:"sep_id" json:"sep_id" validate:"required"`
|
||||
|
||||
// Method Async/Sync
|
||||
// Default: true
|
||||
// Required: false
|
||||
Sync bool `url:"sync" json:"sync"`
|
||||
|
||||
// Pool structure which contains fields such as "name", "usage_limit", "types", "system", "accessAccountIds", "accessResGroupIds". Added fields for other pool types: Des, Ovs - "uris" list of "ip, port".
|
||||
// Dorado, Tatlin no additional fields required. Hitachi - "id", "snapshotable", "snapshot_pool_id", "minLdevId", "maxLdevId", "clone_technology". Shared - "description", "wwns", "allocate_type", "stripes", "metadata_size", "metadatatalun". Local - "description", "node_consumer", "block_disk".
|
||||
// Required: true
|
||||
Pool string `url:"pool" json:"pool" validate:"required"`
|
||||
}
|
||||
|
||||
// AddPool adds pool to SEP
|
||||
func (s SEP) AddPool(ctx context.Context, req AddPoolRequest) (string, error) {
|
||||
type wrapperAddPoolRequest struct {
|
||||
AddPoolRequest
|
||||
AsyncMode bool `url:"asyncMode"`
|
||||
}
|
||||
|
||||
// AddPool adds pool to SEP in sync mode.
|
||||
// It returns result of operation and error.
|
||||
func (s SEP) AddPool(ctx context.Context, req AddPoolRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
reqWrapped := wrapperAddPoolRequest{
|
||||
AddPoolRequest: req,
|
||||
AsyncMode: false,
|
||||
}
|
||||
|
||||
url := "/cloudbroker/sep/addPool"
|
||||
|
||||
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
result, err := strconv.ParseBool(string(res))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// AddPoolAsync adds pool to SEP in async mode.
|
||||
// It returns guid of task and error.
|
||||
func (s SEP) AddPoolAsync(ctx context.Context, req AddPoolRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
reqWrapped := wrapperAddPoolRequest{
|
||||
AddPoolRequest: req,
|
||||
AsyncMode: true,
|
||||
}
|
||||
|
||||
url := "/cloudbroker/sep/addPool"
|
||||
|
||||
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
result := string(res)
|
||||
result := strings.ReplaceAll(string(res), "\"", "")
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@ package sep
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
@@ -34,23 +34,25 @@ type ConfigFieldEditRequest struct {
|
||||
}
|
||||
|
||||
// ConfigFieldEdit edits SEP config field value
|
||||
func (s SEP) ConfigFieldEdit(ctx context.Context, req ConfigFieldEditRequest) (bool, error) {
|
||||
func (s SEP) ConfigFieldEdit(ctx context.Context, req ConfigFieldEditRequest) (*RecordConfigFieldEdit, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/sep/configFieldEdit"
|
||||
|
||||
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := strconv.ParseBool(string(res))
|
||||
info := RecordConfigFieldEdit{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@ package sep
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
@@ -25,22 +25,24 @@ type DelConsumerNodesRequest struct {
|
||||
}
|
||||
|
||||
// DelConsumerNodes excludes consumer nodes from SEP parameters
|
||||
func (s SEP) DelConsumerNodes(ctx context.Context, req DelConsumerNodesRequest) (bool, error) {
|
||||
func (s SEP) DelConsumerNodes(ctx context.Context, req DelConsumerNodesRequest) (interface{}, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/cloudbroker/sep/delConsumerNodes"
|
||||
|
||||
res, err := s.client.DecortApiCall(ctx, http.MethodPost, url, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := strconv.ParseBool(string(res))
|
||||
var result interface{}
|
||||
|
||||
err = json.Unmarshal(res, &result)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package sep
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
// Total resource information
|
||||
type Total struct {
|
||||
// Capacity limit
|
||||
@@ -185,3 +187,93 @@ type ListAvailableSEP struct {
|
||||
// Data
|
||||
Data []SEPData `json:"data"`
|
||||
}
|
||||
|
||||
// Disk clean settings
|
||||
type DiskCleanSettings struct {
|
||||
// Block size
|
||||
BlockSize string `json:"blocksize"`
|
||||
|
||||
// Write bytes per second
|
||||
WBPS uint64 `json:"wbps"`
|
||||
|
||||
// Write I/O operations per second
|
||||
WIOPS uint64 `json:"wiops"`
|
||||
}
|
||||
|
||||
// Pool configuration
|
||||
type PoolConfig struct {
|
||||
// Disk clean
|
||||
DiskClean *string `json:"disk_clean"`
|
||||
|
||||
// Disk clean settings
|
||||
DiskCleanSettings DiskCleanSettings `json:"disk_clean_settings"`
|
||||
|
||||
// Pool name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Usage limit
|
||||
UsageLimit uint64 `json:"usage_limit"`
|
||||
|
||||
// Additional properties
|
||||
AdditionalProperties map[string]interface{} `json:"-"`
|
||||
}
|
||||
|
||||
func (p *PoolConfig) UnmarshalJSON(data []byte) error {
|
||||
type tmpAlias PoolConfig
|
||||
if err := json.Unmarshal(data, (*tmpAlias)(p)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
all := make(map[string]interface{})
|
||||
if err := json.Unmarshal(data, &all); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
delete(all, "disk_clean")
|
||||
delete(all, "disk_clean_settings")
|
||||
delete(all, "name")
|
||||
delete(all, "usage_limit")
|
||||
|
||||
if len(all) > 0 {
|
||||
p.AdditionalProperties = all
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Sep configuration information
|
||||
type RecordConfigFieldEdit struct {
|
||||
// Format
|
||||
Format string `json:"format"`
|
||||
|
||||
// Pools
|
||||
Pools []PoolConfig `json:"pools"`
|
||||
|
||||
// Protocol
|
||||
Protocol string `json:"protocol"`
|
||||
|
||||
// Additional properties
|
||||
AdditionalProperties map[string]interface{} `json:"-"`
|
||||
}
|
||||
|
||||
func (r *RecordConfigFieldEdit) UnmarshalJSON(data []byte) error {
|
||||
type tmpAlias RecordConfigFieldEdit
|
||||
if err := json.Unmarshal(data, (*tmpAlias)(r)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
all := make(map[string]interface{})
|
||||
if err := json.Unmarshal(data, &all); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
delete(all, "format")
|
||||
delete(all, "pools")
|
||||
delete(all, "protocol")
|
||||
|
||||
if len(all) > 0 {
|
||||
r.AdditionalProperties = all
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -57,6 +57,11 @@ type CreateInAccountRequest struct {
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
|
||||
// Enable security groups for VINS
|
||||
// Required: false
|
||||
// Default: false
|
||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequestInAcc struct {
|
||||
|
||||
@@ -51,6 +51,11 @@ type CreateInRGRequest struct {
|
||||
// Zone ID
|
||||
// Required: false
|
||||
ZoneID uint64 `url:"zoneId,omitempty" json:"zoneId,omitempty"`
|
||||
|
||||
// Enable security groups for VINS
|
||||
// Required: false
|
||||
// Default: false
|
||||
EnableSecGroups interface{} `url:"enable_secgroups,omitempty" json:"enable_secgroups,omitempty" validate:"omitempty,isBool"`
|
||||
}
|
||||
|
||||
type wrapperCreateRequestInRG struct {
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
10
pkg/sdn/hypervisors.go
Normal file
10
pkg/sdn/hypervisors.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package sdn
|
||||
|
||||
import (
|
||||
hv "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/hypervisors"
|
||||
)
|
||||
|
||||
// Accessing the SDN method group
|
||||
func (sdn *SDN) Hypervisors() *hv.Hypervisors {
|
||||
return hv.New(sdn.client)
|
||||
}
|
||||
30
pkg/sdn/hypervisors/connect_node.go
Normal file
30
pkg/sdn/hypervisors/connect_node.go
Normal file
@@ -0,0 +1,30 @@
|
||||
package hypervisors
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// ConnectNodeRequest to connect a node
|
||||
type ConnectNodeRequest struct {
|
||||
// Node to connect
|
||||
// Required: true
|
||||
NodeID uint64 `url:"node_id" json:"node_id" validate:"required"`
|
||||
}
|
||||
|
||||
func (hv Hypervisors) ConnectNode(ctx context.Context, req ConnectNodeRequest) (string, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return "", validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
url := "/sdn/hypervisor/connect_node"
|
||||
result, err := hv.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(result), nil
|
||||
}
|
||||
43
pkg/sdn/hypervisors/delete.go
Normal file
43
pkg/sdn/hypervisors/delete.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package hypervisors
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// DeleteRequest to delete a hypervisor
|
||||
type DeleteRequest struct {
|
||||
// Name of a hypervisor
|
||||
// Required: true
|
||||
Name string `url:"name" json:"name" validate:"required"`
|
||||
}
|
||||
|
||||
// Delete a hypervisor
|
||||
func (hv Hypervisors) Delete(ctx context.Context, req DeleteRequest) (bool, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return false, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/sdn/hypervisor/delete"
|
||||
|
||||
res, err := hv.client.DecortApiCallCtype(ctx, http.MethodDelete, url, constants.MIMEJSON, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if string(res) == "" {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
result, err := strconv.ParseBool(string(res))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
50
pkg/sdn/hypervisors/get.go
Normal file
50
pkg/sdn/hypervisors/get.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package hypervisors
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// GetRequest struct to get information about hypervisor
|
||||
type GetRequest struct {
|
||||
// Name
|
||||
// Required: true
|
||||
Name string `url:"name" json:"name" validate:"required"`
|
||||
|
||||
// Port info (available options: detailed, general)
|
||||
// Required: false
|
||||
PortInfo string `url:"port_info,omitempty" json:"port_info,omitempty"`
|
||||
}
|
||||
|
||||
// Get gets current configuration of a hypervisor as a RecordHypervisor
|
||||
func (hv Hypervisors) Get(ctx context.Context, req GetRequest) (*RecordHypervisor, error) {
|
||||
res, err := hv.GetRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := RecordHypervisor{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets information about a hypervisor as an array of bytes
|
||||
func (hv Hypervisors) GetRaw(ctx context.Context, req GetRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/sdn/hypervisor/get"
|
||||
|
||||
res, err := hv.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||
return res, err
|
||||
}
|
||||
17
pkg/sdn/hypervisors/hypervisors.go
Normal file
17
pkg/sdn/hypervisors/hypervisors.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package hypervisors
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
|
||||
)
|
||||
|
||||
// Structure for creating request to hypervisors
|
||||
type Hypervisors struct {
|
||||
client interfaces.Caller
|
||||
}
|
||||
|
||||
// Builder for hypervisors endpoints
|
||||
func New(client interfaces.Caller) *Hypervisors {
|
||||
return &Hypervisors{
|
||||
client,
|
||||
}
|
||||
}
|
||||
90
pkg/sdn/hypervisors/list.go
Normal file
90
pkg/sdn/hypervisors/list.go
Normal file
@@ -0,0 +1,90 @@
|
||||
package hypervisors
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// ListRequest struct to get a list of hypervisors
|
||||
type ListRequest struct {
|
||||
// Page
|
||||
// Required: false
|
||||
Page uint64 `url:"page,omitempty" json:"page,omitempty"`
|
||||
|
||||
// Per page
|
||||
// Required: false
|
||||
PerPage uint64 `url:"per_page,omitempty" json:"per_page,omitempty"`
|
||||
|
||||
// Sort by (available options: name, hostname, last_sync, display_name, ip, created_at, updated_at)
|
||||
// Required: false
|
||||
SortBy string `url:"sort_by,omitempty" json:"sort_by,omitempty"`
|
||||
|
||||
// Sort order (available options: asc, desc)
|
||||
// Required: false
|
||||
SortOrder string `url:"sort_order,omitempty" json:"sort_order,omitempty"`
|
||||
|
||||
// Port info (available options: detailed, general)
|
||||
// Required: false
|
||||
PortInfo string `url:"port_info,omitempty" json:"port_info,omitempty"`
|
||||
|
||||
// Hostname
|
||||
// Required: false
|
||||
Hostname string `url:"hostname,omitempty" json:"hostname,omitempty"`
|
||||
|
||||
// Display name
|
||||
// Required: false
|
||||
DisplayName string `url:"display_name,omitempty" json:"display_name,omitempty"`
|
||||
|
||||
// IP
|
||||
// Required: false
|
||||
IP string `url:"ip,omitempty" json:"ip,omitempty"`
|
||||
|
||||
// Created from
|
||||
// Required: false
|
||||
CreatedFrom string `url:"created_from,omitempty" json:"created_from,omitempty"`
|
||||
|
||||
// Created to
|
||||
// Required: false
|
||||
CreatedTo string `url:"created_to,omitempty" json:"created_to,omitempty"`
|
||||
|
||||
// Updated from
|
||||
// Required: false
|
||||
UpdatedFrom string `url:"updated_from,omitempty" json:"updated_from,omitempty"`
|
||||
|
||||
// Updated to
|
||||
// Required: false
|
||||
UpdatedTo string `url:"updated_to,omitempty" json:"updated_to,omitempty"`
|
||||
}
|
||||
|
||||
// List of hypervisors
|
||||
func (hv Hypervisors) List(ctx context.Context, req ListRequest) (HypervisorsList, error) {
|
||||
res, err := hv.ListRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
hvs := HypervisorsList{}
|
||||
|
||||
err = json.Unmarshal(res, &hvs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return hvs, nil
|
||||
}
|
||||
|
||||
// ListRaw gets a list of all hypervisors as an array of bytes
|
||||
func (hv Hypervisors) ListRaw(ctx context.Context, req ListRequest) ([]byte, error) {
|
||||
|
||||
if err := validators.ValidateRequest(req); err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/sdn/hypervisor/list"
|
||||
|
||||
res, err := hv.client.DecortApiCall(ctx, http.MethodGet, url, req)
|
||||
return res, err
|
||||
}
|
||||
58
pkg/sdn/hypervisors/models.go
Normal file
58
pkg/sdn/hypervisors/models.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package hypervisors
|
||||
|
||||
// Main information about hypervisor
|
||||
type RecordHypervisor struct {
|
||||
// Created at
|
||||
CreatedAt string `json:"created_at"`
|
||||
|
||||
// Display name
|
||||
DisplayName string `json:"display_name"`
|
||||
|
||||
// Hostname
|
||||
Hostname string `json:"hostname"`
|
||||
|
||||
// IP
|
||||
IP string `json:"ip"`
|
||||
|
||||
// Synced at
|
||||
SyncedAt string `json:"synced_at"`
|
||||
|
||||
// Name
|
||||
Name string `json:"name"`
|
||||
|
||||
// Ports
|
||||
Ports Ports `json:"ports"`
|
||||
|
||||
// Status
|
||||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
// 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"`
|
||||
}
|
||||
50
pkg/sdn/hypervisors/update_display_name.go
Normal file
50
pkg/sdn/hypervisors/update_display_name.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package hypervisors
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
|
||||
)
|
||||
|
||||
// UpdateDisplayNameRequest struct to update display name for a hypervisor
|
||||
type UpdateDisplayNameRequest struct {
|
||||
// Current name of the hypervisor
|
||||
// Required: true
|
||||
Name string `url:"name" json:"name" validate:"required"`
|
||||
|
||||
// New display name to set
|
||||
// Required: true
|
||||
DisplayName string `url:"display_name" json:"display_name" validate:"required"`
|
||||
}
|
||||
|
||||
// UpdateDisplayName updates display name for a hypervisor
|
||||
func (hv Hypervisors) UpdateDisplayName(ctx context.Context, req UpdateDisplayNameRequest) (*RecordHypervisor, error) {
|
||||
res, err := hv.UpdateDisplayNameRaw(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := RecordHypervisor{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// UpdateDisplayNameRaw update display name for a hypervisor and get its information as an array of bytes
|
||||
func (hv Hypervisors) UpdateDisplayNameRaw(ctx context.Context, req UpdateDisplayNameRequest) ([]byte, error) {
|
||||
err := validators.ValidateRequest(req)
|
||||
if err != nil {
|
||||
return nil, validators.ValidationErrors(validators.GetErrors(err))
|
||||
}
|
||||
|
||||
url := "/sdn/hypervisor/update_display_name"
|
||||
|
||||
res, err := hv.client.DecortApiCall(ctx, http.MethodPut, url, req)
|
||||
return res, err
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
46
pkg/sdn/segments/get_faa.go
Normal file
46
pkg/sdn/segments/get_faa.go
Normal file
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
10
pkg/sdn/version.go
Normal file
10
pkg/sdn/version.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package sdn
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/version"
|
||||
)
|
||||
|
||||
// Accessing the SDN method group
|
||||
func (sdn *SDN) Version() *version.Version {
|
||||
return version.New(sdn.client)
|
||||
}
|
||||
33
pkg/sdn/version/get.go
Normal file
33
pkg/sdn/version/get.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Get gets SDN version info as a RecordVersion struct
|
||||
func (v Version) Get(ctx context.Context) (*RecordVersion, error) {
|
||||
res, err := v.GetRaw(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := RecordVersion{}
|
||||
|
||||
err = json.Unmarshal(res, &info)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &info, nil
|
||||
}
|
||||
|
||||
// GetRaw gets SDN version info as an array of bytes
|
||||
func (v Version) GetRaw(ctx context.Context) ([]byte, error) {
|
||||
|
||||
url := "/sdn/version/get"
|
||||
|
||||
res, err := v.client.DecortApiCall(ctx, http.MethodGet, url, nil)
|
||||
return res, err
|
||||
}
|
||||
25
pkg/sdn/version/models.go
Normal file
25
pkg/sdn/version/models.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package version
|
||||
|
||||
// Version info of the SDN platform
|
||||
type RecordVersion struct {
|
||||
// Core component version info
|
||||
Core ComponentVersion `json:"core"`
|
||||
|
||||
// Director component version info
|
||||
Director ComponentVersion `json:"director"`
|
||||
}
|
||||
|
||||
// Version info of a single component
|
||||
type ComponentVersion struct {
|
||||
// Branch name
|
||||
Branch string `json:"branch"`
|
||||
|
||||
// Build time
|
||||
BuildTime string `json:"build_time"`
|
||||
|
||||
// Commit hash
|
||||
Commit string `json:"commit"`
|
||||
|
||||
// Version string
|
||||
Version string `json:"version"`
|
||||
}
|
||||
18
pkg/sdn/version/version.go
Normal file
18
pkg/sdn/version/version.go
Normal file
@@ -0,0 +1,18 @@
|
||||
// API Actor API for managing SDN version
|
||||
package version
|
||||
|
||||
import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/interfaces"
|
||||
)
|
||||
|
||||
// Structure for creating request to version
|
||||
type Version struct {
|
||||
client interfaces.Caller
|
||||
}
|
||||
|
||||
// Builder for version endpoints
|
||||
func New(client interfaces.Caller) *Version {
|
||||
return &Version{
|
||||
client,
|
||||
}
|
||||
}
|
||||
@@ -26,17 +26,17 @@ func NewMigrator(cfg *Config, c decortsdk.ClientInterface) Migrator {
|
||||
}
|
||||
}
|
||||
|
||||
func (m *migrator) Migrate(ctxOrigin context.Context, dxVMID, stackID uint64) (bool, error) {
|
||||
func (m *migrator) Migrate(ctxOrigin context.Context, dxVMID, nodeID uint64) (bool, error) {
|
||||
req := compute.MigrateRequest{
|
||||
ComputeID: dxVMID,
|
||||
TargetStackID: stackID,
|
||||
Force: false,
|
||||
ComputeID: dxVMID,
|
||||
TargetNodeID: nodeID,
|
||||
Force: false,
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(ctxOrigin, m.cfg.QueryTimeout)
|
||||
ok, err := m.client.CloudBroker().Compute().Migrate(ctx, req)
|
||||
cancel()
|
||||
if err != nil {
|
||||
return false, errors.Join(err, fmt.Errorf("Migrate VM %d to Node %d", dxVMID, stackID))
|
||||
return false, errors.Join(err, fmt.Errorf("Migrate VM %d to Node %d", dxVMID, nodeID))
|
||||
}
|
||||
return ok, nil
|
||||
}
|
||||
|
||||
@@ -60,17 +60,17 @@ func TestMigrator(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
|
||||
dxVMID := uint64(100500)
|
||||
stackID := uint64(100501)
|
||||
nodeID := uint64(100501)
|
||||
|
||||
// Записываем поведение клиента
|
||||
mockCaller.EXPECT().DecortApiCall(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Eq(compute.AsyncWrapperMigrateRequest{
|
||||
MigrateRequest: compute.MigrateRequest{
|
||||
ComputeID: dxVMID,
|
||||
TargetStackID: stackID,
|
||||
ComputeID: dxVMID,
|
||||
TargetNodeID: nodeID,
|
||||
},
|
||||
SyncMode: true})).Return(b, nil).AnyTimes()
|
||||
|
||||
ok, err := migrator.Migrate(context.Background(), dxVMID, stackID)
|
||||
ok, err := migrator.Migrate(context.Background(), dxVMID, nodeID)
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, ok)
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import (
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/acsgroups"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/adrspools"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/defsecpolicies"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/hypervisors"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/logicalports"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/routers"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/secpolicies"
|
||||
@@ -59,6 +60,7 @@ import (
|
||||
extnet_sdn "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/extnet"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/flips"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/netobjgroups"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/version"
|
||||
)
|
||||
|
||||
// TestGetListCloudAPI tests platforms responses vs. json tags of golang structures in cloudapi get/list methods
|
||||
@@ -1025,6 +1027,26 @@ func TestGetListSDNAPI(t *testing.T) {
|
||||
t.Errorf("Can not test segments get because list is empty")
|
||||
}
|
||||
|
||||
// Hypervisors
|
||||
// List
|
||||
bytes, err = client.SDN().Hypervisors().ListRaw(context.Background(), hypervisors.ListRequest{})
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
getResult("Hypervisors list", bytes, hypervisors.HypervisorsList{}, t)
|
||||
// Get
|
||||
listHypervisors, _ := client.SDN().Hypervisors().List(context.Background(), hypervisors.ListRequest{})
|
||||
if len(listHypervisors) > 0 {
|
||||
id := listHypervisors[0].Name
|
||||
bytes, err = client.SDN().Hypervisors().GetRaw(context.Background(), hypervisors.GetRequest{Name: id})
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
getResult("Hypervisors get", bytes, hypervisors.RecordHypervisor{}, t)
|
||||
} else {
|
||||
t.Errorf("Can not test Hypervisors get because listHypervisors list is empty")
|
||||
}
|
||||
|
||||
// FloatingIPs
|
||||
// List
|
||||
bytes, err = client.SDN().FloatingIPs().ListRaw(context.Background(), flips.ListRequest{})
|
||||
@@ -1084,6 +1106,13 @@ func TestGetListSDNAPI(t *testing.T) {
|
||||
} else {
|
||||
t.Errorf("Can not test routers get because routerList list is empty")
|
||||
}
|
||||
|
||||
// Version
|
||||
bytes, err = client.SDN().Version().GetRaw(context.Background())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
getResult("Version get", bytes, version.RecordVersion{}, t)
|
||||
}
|
||||
|
||||
// TestRequestsCloudAPI tests platform requests vs. golang request structures in sdk for cloudapi requests
|
||||
|
||||
@@ -72,6 +72,7 @@ import (
|
||||
|
||||
extnet_sdn "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/extnet"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/flips"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/hypervisors"
|
||||
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/netobjgroups"
|
||||
)
|
||||
|
||||
@@ -749,7 +750,6 @@ func getRequestsMapCloudbroker() map[string]interface{} {
|
||||
"/restmachine/cloudbroker/flipgroup/list": flipgroup_cb.ListRequest{},
|
||||
|
||||
// grid
|
||||
"/restmachine/cloudbroker/grid/add": grid_cb.AddRequest{},
|
||||
"/restmachine/cloudbroker/grid/addCustomBackupPath": grid_cb.AddCustomBackupPathRequest{},
|
||||
"/restmachine/cloudbroker/grid/changeSettings": grid_cb.ChangeSettingsRequest{},
|
||||
"/restmachine/cloudbroker/grid/executeMaintenanceScript": grid_cb.ExecuteMaintenanceScriptRequest{},
|
||||
@@ -1168,6 +1168,13 @@ func getRequestsMapSDN() map[string]interface{} {
|
||||
"/restmachine/sdn/floating_ip/list": flips.ListRequest{},
|
||||
"/restmachine/sdn/floating_ip/update": flips.UpdateRequest{},
|
||||
|
||||
// hypervisors
|
||||
"/restmachine/sdn/hypervisor/connect_node": hypervisors.ConnectNodeRequest{},
|
||||
"/restmachine/sdn/hypervisor/delete": hypervisors.DeleteRequest{},
|
||||
"/restmachine/sdn/hypervisor/get": hypervisors.GetRequest{},
|
||||
"/restmachine/sdn/hypervisor/list": hypervisors.ListRequest{},
|
||||
"/restmachine/sdn/hypervisor/update_display_name": hypervisors.UpdateDisplayNameRequest{},
|
||||
|
||||
// network object groups
|
||||
"/restmachine/sdn/network_object_group/attach_external_network_ports": netobjgroups.AttachExtNetPortsRequest{},
|
||||
"/restmachine/sdn/network_object_group/attach_logical_ports": netobjgroups.AttachLogicalPortsRequest{},
|
||||
@@ -1182,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{},
|
||||
@@ -1211,5 +1218,8 @@ func getRequestsMapSDN() map[string]interface{} {
|
||||
"/restmachine/sdn/router/list": routers.ListRequest{},
|
||||
"/restmachine/sdn/router/policies/list": policies.ListRequest{},
|
||||
"/restmachine/sdn/router/update": routers.UpdateRequest{},
|
||||
|
||||
// version
|
||||
"/restmachine/sdn/version/get": nil,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user