This commit is contained in:
2023-09-18 14:13:55 +03:00
parent 4d9b8fc9d8
commit df8b045e77
16 changed files with 413 additions and 281 deletions

View File

@@ -2,12 +2,24 @@ 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
@@ -34,11 +46,20 @@ 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)
@@ -48,9 +69,31 @@ 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, req)
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return 0, err
}

View File

@@ -2,6 +2,7 @@ package vins
import (
"context"
"encoding/json"
"net/http"
"strconv"
@@ -36,13 +37,22 @@ type CreateInRGRequest struct {
// Number of pre created reservations
// Required: false
PreReservationsNum uint `url:"preReservationsNum,omitempty" json:"preReservationsNum,omitempty"`
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 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)
@@ -51,10 +61,31 @@ 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, req)
res, err := v.client.DecortApiCall(ctx, http.MethodPost, url, reqWrapped)
if err != nil {
return 0, err
}

View File

@@ -345,7 +345,7 @@ type NATConfig struct {
Network string `json:"network"`
// Rules
Rules []interface{} `json:"rules"`
Rules []ItemNATRule `json:"rules"`
}
// Main information about NAT
@@ -357,7 +357,7 @@ type RecordNAT struct {
InfoVNF
}
// NAT/GW/NAT details
// DHCP/GW/NAT details
type InfoVNF struct {
// CKey
CKey string `json:"_ckey"`
@@ -368,9 +368,6 @@ type InfoVNF struct {
// Account ID
AccountID uint64 `json:"accountId"`
// Config
Config NATConfig `json:"config"`
// CreatedTime
CreatedTime uint64 `json:"createdTime"`
@@ -401,6 +398,9 @@ type InfoVNF struct {
// Pure virtual
PureVirtual bool `json:"pureVirtual"`
// Routes
Routes ListRoutes `json:"routes"`
// Status
Status string `json:"status"`
@@ -411,6 +411,28 @@ 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
@@ -428,12 +450,6 @@ 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"`