Compare commits

..

4 Commits

Author SHA1 Message Date
1972956aeb v1.6.0-gamma 2023-09-15 12:41:04 +03:00
afcbc7e749 1.6.0-beta 2023-09-14 15:05:38 +03:00
0b3de4df7f 1.6.0-alfa 2023-09-11 13:11:33 +03:00
c0608d08b9 1.5.8-gostech 2023-09-07 18:11:25 +03:00
14 changed files with 86 additions and 278 deletions

View File

@@ -1,4 +1,4 @@
## Version 1.5.13
## Version 1.6.0-beta
### Bugfix
- Fix EOF error by closing request
- Refactored client, made it concurrent safe

View File

@@ -62,11 +62,12 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
- `Account` - управление аккаунтами - внутренними учетными записями платформы, которые являются владельцами вычислительных ресурсов;
- `BService` - управление группами виртуальных машин (computes);
- `Compute` - управление виртуальными машинами (индивидуально);
- `ComputeCI` - управление конвейром для создания виртуальных машин;
- `Disks` - управление виртуальными дисками;
- `ExtNet` - управление виртуальными сетями, отвечающими за внешний доступ;
- `FLIPgroup` - управление группами "плавающими" ip - адресами;
- `Image` - управление образами операционных систем;
- `K8CI` - получение информации о конвейере для создания кластера;
- `K8CI` - управление конвейром для создания кластера;
- `K8S` - управление кластерами kubernetes;
- `KVMPPC` - создание виртуальной машины Power PC (IBM);
- `KVMx86` - создание виртуальной машины x86;
@@ -83,39 +84,30 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
Данная группа ручек позволяет выполнять следующие операции в платформе:
- `Account` - управление аккаунтами - внутренними учетными записями платформы, которые являются владельцами вычислительных ресурсов;
- `APIAccess` - управление доступом к API и его объектам;
- `Backup` - управление резервным копированием;
- `Compute` - управление виртуальными машинами (индивидуально);
- `Disks` - управление виртуальными дисками;
- `ExtNet` - управление виртуальными сетями, отвечающими за внешний доступ;
- `FLIPGroup` - управление группами с «плавающими» ip адресами;
- `Grid` - управление площадками;
- `Group` - управление группами пользователей;
- `Image` - управление образами операционных систем;
- `K8CI` - управление конвейром для создания кластера;
- `K8S` - управление кластерами kubernetes;
- `KVMPPC` - создание виртуальной машины Power PC (IBM);
- `KVMx86` - создание виртуальной машины x86;
- `LB` - управление балансировщиками нагрузки;
- `PCIDevice` - управление устройствами;
- `RG` - управление ресурсными группами аккаунта;
- `SEP` - управление storage endpoint (sep);
- `Stack` - получение информации о стеках;
- `Tasks` - получение информации о ходе выполнения асинхронных задач (например, создание кластера);
- `User` - управление пользователями (индивидуально);
- `VGPU` - управление виртуальными графическими процессорами;
- `VINS` - управление виртуальными изолированными сетями.
## Работа с библиотекой
Алгоритм работы с библиотекой выглядит следующим образом:
1. Выполнение одного из действий:
- настройка конфигурации клиента;
- парсинг конфигурации из файла.
2. Создание клиента.
3. Создание структуры запроса.
4. Выполнение запроса.
1. Настройка конфигурации клиента.
2. Парсинг конфигурации из файла.
3. Создание клиента.
4. Создание структуры запроса.
5. Выполнение запроса.
### Настройка конфигурации клиента
@@ -128,7 +120,7 @@ go get -u repository.basistech.ru/BASIS/decort-golang-sdk
| DecortURL | string | Да | URL адрес платформы, с которой будет осуществляться взаимодействие |
| Retries | uint | Нет | Кол-во неудачных попыток выполнения запроса, по умолчанию - 5 |
| Timeout | config.Duration | Нет | Таймаут HTTP клиента, по умолчанию - без ограничений |
| SSLSkipVerify | bool | Нет | Пропуск проверки подлинности сертификата |
| SSLSkipVerify | bool | Нет | Пропуск проверки подлинности сертификата, по умолчанию - true |
| Token | string | Нет | JWT токен |
#### Пример конфигурации клиента
@@ -239,6 +231,7 @@ func main() {
- `pkg/cloudapi/account` - для `Account`
- `pkg/cloudapi/bservice` - для `Basic Service`
- `pkg/cloudapi/compute` - для `Compute`
- `pkg/cloudapi/computeci` - для `ComputeCI`
- `pkg/cloudapi/disks` - для `Disks`
- `pkg/cloudapi/extnet` - для `ExtNet`
- `pkg/cloudapi/flipgroup` - для `FLIPGroup`
@@ -255,27 +248,19 @@ func main() {
- `pkg/cloudapi/vins` - для `VINS`
- **cloudbroker**:
- `pkg/cloudbroker/account` - для `Account`
- `pkg/cloudbroker/apiaccess` - для `APIAccess`
- `pkg/cloudbroker/backup` - для `Backup`
- `pkg/cloudbroker/compute` - для `Compute`
- `pkg/cloudbroker/disks` - для `Disks`
- `pkg/cloudbroker/extnet` - для `ExtNet`
- `pkg/cloudbroker/flipgroup` - для `FLIPGroup`
- `pkg/cloudbroker/grid` - для `Grid`
- `pkg/cloudbroker/group` - для `Group`
- `pkg/cloudbroker/image` - для `Image`
- `pkg/cloudbroker/k8ci` - для `K8CI`
- `pkg/cloudbroker/k8s` - для `K8S`
- `pkg/cloudbroker/kvmppc` - для `KVMPPC`
- `pkg/cloudbroker/kvmx86` - для `KVMX86`
- `pkg/cloudbroker/lb` - для `LB`
- `pkg/cloudbroker/pcidevice` - для `PCIDevice`
- `pkg/cloudbroker/rg` - для `RG`
- `pkg/cloudbroker/sep` - для `SEP`
- `pkg/cloudbroker/stack` - для `Stack`
- `pkg/cloudbroker/tasks` - для `Tasks`
- `pkg/cloudbroker/user` - для `User`
- `pkg/cloudbroker/vgpu` - для `VGPU`
- `pkg/cloudbroker/vins` - для `VINS`
Все поля структуры имеют описание, в которых содержится:
@@ -420,6 +405,7 @@ func main() {
- `.Account()` - для работы с `Account`
- `.BService()` - для работы с `BService`
- `.Compute()` - для работы с `Compute`
- `.ComputeCI()` - для работы с `ComputeCI`
- `.Disks()` - для работы с `Disks`
- `.ExtNet()` - для работы с `ExtNet`
- `.FLIPgroup()` - для работы с `FLIPGroup`
@@ -438,27 +424,19 @@ func main() {
Доступные методы для `.CloudBroker()`:
- `.Account()` - для работы с `Account`
- `.APIAccess()` - для работы с `APIAccess`
- `.Backup()` - для работы с `Backup`
- `.Compute()` - для работы с `Compute`
- `.Disks()` - для работы с `Disks`
- `.ExtNet()` - для работы с `ExtNet`
- `.FLIPGroup()` - для работы с `FLIPGroup`
- `.Grid()` - для работы с `Grid`
- `.Group()` - для работы с `Group`
- `.Image()` - для работы с `Image`
- `.K8CI()` - для работы с `K8CI`
- `.K8S()` - для работы с `K8S`
- `.KVMPPC()` - для работы с `KVMPPC`
- `.KVMx86()` - для работы с `KVMX86`
- `.LB()` - для работы с `LB`
- `.PCIDevice()` - для работы с `PCIDevice`
- `.RG()` - для работы с `RG`
- `.SEP()` - для работы с `SEP`
- `.Stack()` - для работы с `Stack`
- `.Tasks()` - для работы с `Tasks`
- `.User()` - для работы с `User`
- `.VGPU()` - для работы с `VGPU`
- `.VINS()` - для работы с `VINS`
3. Вызвать метод, отвечающий за выполнение запроса и передать в него:
@@ -470,7 +448,7 @@ func main() {
4. Обработать результат и ошибки.
Т.к. все вызовы методов идут последовательно, можно их объеденить в конвейер:
Общий вид конвейера будет выглядеть так:
Общий вид вонвейра будет выглядеть так:
```go
client.<API>.<группа>.<метод>
@@ -727,7 +705,7 @@ func main() {
| DecortURL | string | Да | URL адрес платформы, с которой будет осуществляться взаимодействие |
| Retries | uint | Нет | Кол-во неудачных попыток выполнения запроса, по умолчанию - 5 |
| Timeout | config.Duration | Нет | Таймаут HTTP клиента, по умолчанию - без ограничений |
| SSLSkipVerify | bool | Нет | Пропуск проверки подлинности сертификата |
| SSLSkipVerify | bool | Нет | Пропуск проверки подлинности сертификата, по умолчанию - true |
| Token | string | Нет | JWT токен |
#### Пример конфигурации legacy клиента

View File

@@ -140,35 +140,24 @@ func (dc *DecortClient) do(req *http.Request) (*http.Response, error) {
req.Header.Add("Authorization", "bearer "+dc.cfg.Token)
req.Header.Set("Accept", "application/json")
var resp *http.Response
var err error
buf, _ := io.ReadAll(req.Body)
req.Body = io.NopCloser(bytes.NewBuffer(buf))
resp, err := dc.client.Do(req)
req.Close = true
if err != nil || resp == nil {
if strings.Contains(err.Error(), "connection reset by peer") || errors.Is(err, io.EOF) {
for i := uint64(0); i < dc.cfg.Retries; i++ {
time.Sleep(5 * time.Second)
resp, err = dc.client.Do(req)
if strings.Contains(err.Error(), "connection reset by peer") || errors.Is(err, io.EOF) {
continue
} else if err == nil {
break
} else if err != nil {
return nil, err
}
for i := uint64(0); i < dc.cfg.Retries; i++ {
req := req.Clone(req.Context())
req.Body = io.NopCloser(bytes.NewBuffer(buf))
resp, err = dc.client.Do(req)
if err == nil {
if resp.StatusCode == 200 {
return resp, err
}
respBytes, _ := io.ReadAll(resp.Body)
err = fmt.Errorf("%s", respBytes)
resp.Body.Close()
}
return resp, err
}
if resp.StatusCode == 200 {
return resp, nil
}
respBytes, _ := io.ReadAll(resp.Body)
err = fmt.Errorf("%s", respBytes)
resp.Body.Close()
return nil, fmt.Errorf("could not execute request: %w", err)
}

View File

@@ -137,40 +137,24 @@ func (ldc *LegacyDecortClient) do(req *http.Request) (*http.Response, error) {
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Accept", "application/json")
// var resp *http.Response
// var err error
var resp *http.Response
var err error
buf, _ := io.ReadAll(req.Body)
// for i := uint64(0); i < ldc.cfg.Retries; i++ {
// req = req.Clone(req.Context())
req.Body = io.NopCloser(bytes.NewBuffer(buf))
resp, err := ldc.client.Do(req)
req.Close = true
if err != nil || resp == nil {
if strings.Contains(err.Error(), "connection reset by peer") || errors.Is(err, io.EOF) {
for i := uint64(0); i < ldc.cfg.Retries; i++ {
time.Sleep(5 * time.Second)
resp, err = ldc.client.Do(req)
if strings.Contains(err.Error(), "connection reset by peer") || errors.Is(err, io.EOF) {
continue
} else if err == nil {
break
} else if err != nil {
return nil, err
}
for i := uint64(0); i < ldc.cfg.Retries; i++ {
req := req.Clone(req.Context())
req.Body = io.NopCloser(bytes.NewBuffer(buf))
resp, err = ldc.client.Do(req)
if err == nil {
if resp.StatusCode == 200 {
return resp, err
}
respBytes, _ := io.ReadAll(resp.Body)
err = fmt.Errorf("%s", respBytes)
resp.Body.Close()
}
return resp, err
}
if resp.StatusCode == 200 {
return resp, nil
}
respBytes, _ := io.ReadAll(resp.Body)
err = fmt.Errorf("%s", respBytes)
resp.Body.Close()
// }
return nil, fmt.Errorf("could not execute request: %w", err)
}

View File

@@ -106,6 +106,10 @@ type CreateRequest struct {
// Text description of this Kubernetes cluster
// Required: false
Description string `url:"desc,omitempty" json:"desc,omitempty"`
//Use only selected ExtNet for infrastructure connections
// Required: false
ExtNetOnly bool `url:"extnetOnly,omitempty" json:"extnetOnly,omitempty"`
}
// Create creates a new Kubernetes cluster in the specified Resource Group

View File

@@ -2,6 +2,7 @@ package lb
import (
"context"
"errors"
"net/http"
"strings"
@@ -20,16 +21,16 @@ type CreateRequest struct {
Name string `url:"name" json:"name" validate:"required"`
// External network to connect this load balancer to
// Required: true
ExtNetID uint64 `url:"extnetId" json:"extnetId" validate:"required"`
// Required: false
ExtNetID uint64 `url:"extnetId" json:"extnetId"`
// Internal network (VINS) to connect this load balancer to
// Required: true
VINSID uint64 `url:"vinsId" json:"vinsId" validate:"required"`
// Required: false
VINSID uint64 `url:"vinsId" json:"vinsId"`
// Start now Load balancer
// Required: true
Start bool `url:"start" json:"start" validate:"required"`
// Required: false
Start bool `url:"start" json:"start"`
// Text description of this load balancer
// Required: false
@@ -45,6 +46,10 @@ func (l LB) Create(ctx context.Context, req CreateRequest) (string, error) {
}
}
if req.ExtNetID == 0 && req.VINSID == 0 {
return "", errors.New ("vinsId and extNetId cannot be both in the value 0")
}
url := "/cloudapi/lb/create"
res, err := l.client.DecortApiCall(ctx, http.MethodPost, url, req)

View File

@@ -36,7 +36,7 @@ type CreateInRGRequest struct {
// Number of pre created reservations
// Required: false
PreReservationsNum uint64 `url:"preReservationsNum,omitempty" json:"preReservationsNum,omitempty"`
PreReservationsNum uint `url:"preReservationsNum,omitempty" json:"preReservationsNum,omitempty"`
}
// CreateInRG creates VINS in resource group level

View File

@@ -397,11 +397,9 @@ type NATConfig struct {
Network string `json:"network"`
// List NAT rules
Rules ListNATRulesConfig `json:"rules"`
Rules ListNATRules `json:"rules"`
}
type ListNATRulesConfig []ItemNATRule
// Main information about GW
type RecordGW struct {
// CKey
@@ -572,6 +570,9 @@ type RecordVINS struct {
// Main information about VNF device
VNFDev RecordVNFDev `json:"VNFDev"`
// CKey
CKey string `json:"_ckey"`
// Account ID
AccountID uint64 `json:"accountId"`
@@ -581,24 +582,12 @@ type RecordVINS struct {
// List of VINS computes
Computes ListVINSComputes `json:"computes"`
// Created by
CreatedBy string `json:"createdBy"`
// Created time
CreatedTime uint64 `json:"createdTime"`
// Default GW
DefaultGW string `json:"defaultGW"`
// Default QOS
DefaultQOS QOS `json:"defaultQos"`
// Deleted by
DeletedBy string `json:"deletedBy"`
// Deleted time
DeletedTime uint64 `json:"deletedTime"`
// Description
Description string `json:"desc"`

View File

@@ -3,7 +3,7 @@ package k8ci
// FilterByID returns ListK8CI with specified ID.
func (lkc ListK8CI) FilterByID(id uint64) ListK8CI {
predicate := func(ikc ItemK8CI) bool {
return ikc.RecordK8CIList.ID == id
return ikc.RecordK8CI.ID == id
}
return lkc.FilterFunc(predicate)
@@ -12,7 +12,7 @@ func (lkc ListK8CI) FilterByID(id uint64) ListK8CI {
// FilterByName returns ListK8CI with specified Name.
func (lkc ListK8CI) FilterByName(name string) ListK8CI {
predicate := func(ikc ItemK8CI) bool {
return ikc.RecordK8CIList.Name == name
return ikc.RecordK8CI.Name == name
}
return lkc.FilterFunc(predicate)

View File

@@ -6,7 +6,7 @@ var k8ciItems = ListK8CI{
Data: []ItemK8CI{
{
CreatedTime: 123902139,
RecordK8CIList: RecordK8CIList{
RecordK8CI: RecordK8CI{
Description: "",
GID: 0,
GUID: 1,
@@ -17,7 +17,7 @@ var k8ciItems = ListK8CI{
MaxMasterCount: 2,
MaxWorkerCount: 3,
Name: "purple_snake",
SharedWith: []uint64{},
SharedWith: []interface{}{},
Status: "ENABLED",
Version: "1",
WorkerDriver: "KVM_X86",
@@ -26,7 +26,7 @@ var k8ciItems = ListK8CI{
},
{
CreatedTime: 123902232,
RecordK8CIList: RecordK8CIList{
RecordK8CI: RecordK8CI{
Description: "",
GID: 0,
GUID: 2,
@@ -37,7 +37,7 @@ var k8ciItems = ListK8CI{
MaxMasterCount: 3,
MaxWorkerCount: 5,
Name: "green_giant",
SharedWith: []uint64{},
SharedWith: []interface{}{},
Status: "DISABLED",
Version: "2",
WorkerDriver: "KVM_X86",
@@ -46,7 +46,7 @@ var k8ciItems = ListK8CI{
},
{
CreatedTime: 123902335,
RecordK8CIList: RecordK8CIList{
RecordK8CI: RecordK8CI{
Description: "",
GID: 0,
GUID: 3,
@@ -57,7 +57,7 @@ var k8ciItems = ListK8CI{
MaxMasterCount: 5,
MaxWorkerCount: 9,
Name: "magenta_cloud",
SharedWith: []uint64{},
SharedWith: []interface{}{},
Status: "ENABLED",
Version: "3",
WorkerDriver: "KVM_X86",

View File

@@ -1,11 +1,11 @@
package k8ci
// Main information about K8CI in List
// Main information about K8CI
type ItemK8CI struct {
// Created time
CreatedTime uint64 `json:"createdTime"`
// Detailed information about K8CI
RecordK8CIList
RecordK8CI
}
// List K8CI
@@ -17,55 +17,7 @@ type ListK8CI struct {
EntryCount uint64 `json:"entryCount"`
}
// Detailed information about K8CI in List
type RecordK8CIList struct {
// Description
Description string `json:"desc"`
// Grid ID
GID uint64 `json:"gid"`
// GUID
GUID uint64 `json:"guid"`
// ID
ID uint64 `json:"id"`
// Load balancer image ID
LBImageID uint64 `json:"lbImageId"`
// Master driver
MasterDriver string `json:"masterDriver"`
// Master image ID
MasterImageID uint64 `json:"masterImageId"`
// Max master count
MaxMasterCount uint64 `json:"maxMasterCount"`
// Max worker count
MaxWorkerCount uint64 `json:"maxWorkerCount"`
// Name
Name string `json:"name"`
// Shared with
SharedWith []uint64 `json:"sharedWith"`
// Status
Status string `json:"status"`
// Version
Version string `json:"version"`
// Worker driver
WorkerDriver string `json:"workerDriver"`
// Worker image ID
WorkerImageID uint64 `json:"workerImageId"`
}
// Detailed information about K8CI
// Detailed information about K8CI
type RecordK8CI struct {
// Description
Description string `json:"desc"`
@@ -100,11 +52,8 @@ type RecordK8CI struct {
// Name
Name string `json:"name"`
//NetworkPlugins
NetworkPlugins []string `json:"networkPlugins"`
// Shared with
SharedWith []uint64 `json:"sharedWith"`
SharedWith []interface{} `json:"sharedWith"`
// Status
Status string `json:"status"`

View File

@@ -2,24 +2,12 @@ package vins
import (
"context"
"encoding/json"
"net/http"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators"
)
type Route struct {
// Destination network
Destination string `url:"destination" json:"destination" validate:"required"`
//Destination network mask in 255.255.255.255 format
Netmask string `url:"netmask" json:"netmask" validate:"required"`
//Next hop host, IP address from ViNS ID free IP pool
Gateway string `url:"gateway" json:"gateway" validate:"required"`
}
// Request struct for create VINS in account
type CreateInAccountRequest struct {
// VINS name
@@ -46,20 +34,11 @@ type CreateInAccountRequest struct {
// Required: false
PreReservationsNum uint64 `url:"preReservationsNum,omitempty" json:"preReservationsNum,omitempty"`
// List of static routes, each item must have destination, netmask, and gateway fields
// Required: false
Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"`
// Reason for action
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
}
type wrapperCreateRequestInAcc struct {
CreateInAccountRequest
Routes []string `url:"routes,omitempty"`
}
// CreateInAccount creates VINS in account level
func (v VINS) CreateInAccount(ctx context.Context, req CreateInAccountRequest) (uint64, error) {
err := validators.ValidateRequest(req)
@@ -69,31 +48,9 @@ func (v VINS) CreateInAccount(ctx context.Context, req CreateInAccountRequest) (
}
}
var routes []string
if len(req.Routes) != 0 {
routes = make([]string, 0, len(req.Routes))
for r := range req.Routes {
b, err := json.Marshal(req.Routes[r])
if err != nil {
return 0, err
}
routes = append(routes, string(b))
}
} else {
routes = []string{"[]"}
}
reqWrapped := wrapperCreateRequestInAcc{
CreateInAccountRequest: req,
Routes: routes,
}
url := "/cloudbroker/vins/createInAccount"
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return 0, err
}

View File

@@ -2,7 +2,6 @@ package vins
import (
"context"
"encoding/json"
"net/http"
"strconv"
@@ -37,22 +36,13 @@ type CreateInRGRequest struct {
// Number of pre created reservations
// Required: false
PreReservationsNum uint64 `url:"preReservationsNum,omitempty" json:"preReservationsNum,omitempty"`
// List of static routes, each item must have destination, netmask, and gateway fields
// Required: false
Routes []Route `url:"-" json:"routes,omitempty" validate:"omitempty,dive"`
PreReservationsNum uint `url:"preReservationsNum,omitempty" json:"preReservationsNum,omitempty"`
// Reason for action
// Required: false
Reason string `url:"reason,omitempty" json:"reason,omitempty"`
}
type wrapperCreateRequestInRG struct {
CreateInRGRequest
Routes []string `url:"routes,omitempty"`
}
// CreateInRG creates VINS in resource group level
func (v VINS) CreateInRG(ctx context.Context, req CreateInRGRequest) (uint64, error) {
err := validators.ValidateRequest(req)
@@ -61,31 +51,10 @@ func (v VINS) CreateInRG(ctx context.Context, req CreateInRGRequest) (uint64, er
return 0, validators.ValidationError(validationError)
}
}
var routes []string
if len(req.Routes) != 0 {
routes = make([]string, 0, len(req.Routes))
for r := range req.Routes {
b, err := json.Marshal(req.Routes[r])
if err != nil {
return 0, err
}
routes = append(routes, string(b))
}
} else {
routes = []string{"[]"}
}
reqWrapped := wrapperCreateRequestInRG{
CreateInRGRequest: req,
Routes: routes,
}
url := "/cloudbroker/vins/createInRG"
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, req)
if err != nil {
return 0, err
}

View File

@@ -345,7 +345,7 @@ type NATConfig struct {
Network string `json:"network"`
// Rules
Rules []ItemNATRule `json:"rules"`
Rules []interface{} `json:"rules"`
}
// Main information about NAT
@@ -357,7 +357,7 @@ type RecordNAT struct {
InfoVNF
}
// DHCP/GW/NAT details
// NAT/GW/NAT details
type InfoVNF struct {
// CKey
CKey string `json:"_ckey"`
@@ -368,6 +368,9 @@ type InfoVNF struct {
// Account ID
AccountID uint64 `json:"accountId"`
// Config
Config NATConfig `json:"config"`
// CreatedTime
CreatedTime uint64 `json:"createdTime"`
@@ -398,9 +401,6 @@ type InfoVNF struct {
// Pure virtual
PureVirtual bool `json:"pureVirtual"`
// Routes
Routes ListRoutes `json:"routes"`
// Status
Status string `json:"status"`
@@ -411,28 +411,6 @@ type InfoVNF struct {
Type string `json:"type"`
}
type ListRoutes []ItemRoutes
type ItemRoutes struct {
//Compute Id
ComputeIds []uint64 `json:"computeIds"`
// Destination network
Destination string `json:"destination"`
//Next hop host, IP address from ViNS ID free IP pool
Gateway string `json:"gateway"`
// GUID
GUID uint64 `json:"guid"`
// ID
ID uint64 `json:"id"`
//Destination network mask in 255.255.255.255 format
Netmask string `json:"netmask"`
}
// main information about VNF
type RecordVNFs struct {
// DHCP
@@ -450,6 +428,12 @@ type RecordVINS struct {
// VNF device
VNFDev VNFDev `json:"VNFDev"`
// CKey
CKey string `json:"_ckey"`
// Meta
Meta []interface{} `json:"_meta"`
// Account ID
AccountID uint64 `json:"accountId"`