# Dynamix standard SDK
Dynamix standard SDK - это библиотека, написанная на языке GO, позволяющая взаимодействовать с API облачной платформы **Vcontrol** . Библиотека содержит в с е б е структуры и методы, необходимые для отправки запросов. Dynamix standard SDK имеет встроенный http-клиент и поддерживает разные способы авторизации на платформе. Библиотека так же содержит в с е б е модели ответов от платформы.
## Оглавление
- [Dynamix standard SDK ](#dynamix-standard-sdk )
- [Оглавление ](#оглавление )
- [Установка ](#установка )
- [Список API ](#список-api )
- [API ](#api )
- [Работа с библиотекой ](#работа-с -библиотекой )
- [Настройка конфигурации клиента ](#настройка-конфигурации-клиента )
- [Пример конфигурации клиента ](#пример-конфигурации-клиента )
- [Парсинг конфигурации из файла ](#парсинг-конфигурации-из-файла )
- [Пример JSON конфигурации ](#пример-json-конфигурации )
- [Пример YAML конфигурации ](#пример-yaml-конфигурации )
- [Создание клиента ](#создание-клиента )
- [Пример ](#пример )
- [Создание структуры запроса ](#создание-структуры-запроса )
- [Пример комментариев структуры ](#пример-комментариев-структуры )
- [Пример создания запроса для развертывания виртуальной машины: ](#пример-создания-запроса-для-развертывания-виртуальной-машины )
- [Выполнение запроса ](#выполнение-запроса )
- [Пример выполнения запроса ](#пример-выполнения-запроса )
- [Пример выполнения GetRaw и ListRaw запросов ](#пример-выполнения-getraw-и-listraw-запросов )
## Установка
Выполните команду в терминале:
```bash
go get -u repository.basistech.ru/BASIS/dynamix-standard-go-sdk
```
## Список API
Библиотека поддерживает одну группу API платформы:
- `api` - группа, которая позволяет воспользоваться всем стандартным функционалом платформы;
### API
Данная группа ручек позволяет выполнять следующие операции в платформе:
- `Cluster` - управление списками кластеров
- `Extstorage` - управление хранилищами для дисков В М ;
- `Folder` - управление списками логических папок;
- `Image` - управление списками образов В М ;
- `Node` - управление списками хостов;
- `Respool` - управление списками пулов р е с у р cо в;
- `Tempate` - управление шаблонами виртуальных машин;
- `VM` - управление виртуальными машинами;
## Работа с библиотекой
Алгоритм работы с библиотекой выглядит следующим образом:
1. Выполнение одного из действий:
- настройка конфигурации клиента;
- парсинг конфигурации из файла.
2. Создание клиента.
3. Создание структуры запроса.
4. Выполнение запроса.
### Настройка конфигурации клиента
Сначала, необходимо создать переменную конфигурации клиента. Конфигурация состоит как из обязательных, так и необязательных полей.
| Поле | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| Username | string | Да | username пользователя для выполнения запроса |
| Password | string | Да | password пользователя для выполнения запроса |
| VControlURL | string | Да | URL адрес платформы, с которой будет осуществляться взаимодействие |
| Retries | uint | Нет | Кол-во неудачных попыток выполнения запроса, по умолчанию - 5 |
| Timeout | config.Duration | Нет | Таймаут HTTP клиента, по умолчанию - без ограничений |
| SSLSkipVerify | bool | Нет | Пропуск проверки подлинности сертификата |
| Token | string | Нет | JWT токен |
##### Пример конфигурации клиента
```go
import (
"repository.basistech.ru/BASIS/dynamix-standard-go-sdk/config"
)
func main(){
// Настройка конфигурации
cfg := config.Config{
Username: "< USERNAME > ",
Password: "< PASSWORD > ",
VControlURL: "< VCONTROL_URL > ",
Retries: 5,
SSLSkipVerify: true,
}
cfg.SetTimeout(5 * time.Minute)
}
```
#### Парсинг конфигурации из файла
Также возможно создать переменную конфигурации из JSON или YAML файла, используя функцию `ParseConfigJSON` (или `ParseConfigYAML` ) из пакета config.
< br >
*См. пример файлов конфигурации ниже и в директории `samples/` .*
```go
import (
"repository.basistech.ru/BASIS/dynamix-standard-go-sdk/config"
)
func main() {
// Парсинг конфигурации из JSON-файла
cfg, _ := config.ParseConfigJSON("< PATH > ")
}
```
#### Пример JSON конфигурации
```json
{
"username": "< USERNAME > ",
"password": "< PASSWORD > ",
"vControlURL": "< VCONTROL_URL > ",
"retries": 5,
"timeout": "5m",
"sslSkipVerify": false
}
```
#### Пример YAML конфигурации
```yaml
username: < USERNAME >
password: < PASSWORD >
vControlURL: < VCONTROL_URL >
retries: 5
timeout: 5m
sslSkipVerify: false
```
### Создание клиента
Создание клиента происходит с помощью функции-строителя `New` из основного пакета `dynamix-standard-go-sdk` , для избежания проблем с именами, пакету можно присвоить алиас `vcontrol` . Функция принимает конфигурацию, возвращает структуру `VControlClient` , с помощью которой можно взаимодействовать с платформой.
### Пример
```go
package main
import (
vcontrol "repository.basistech.ru/BASIS/dynamix-standard-go-sdk"
"repository.basistech.ru/BASIS/dynamix-standard-go-sdk/config"
)
func main() {
// Настройка конфигурации
cfg := config.Config{
Username: "< USERNAME > ",
Password: "< PASSWORD > ",
VControlURL: "< VCONTROL_URL > ",
Retries: 5,
}
cfg.SetTimeout(5*time.Minute)
// Создание клиента
client := vcontrol.New(cfg)
}
```
### Создание структуры запроса
Структуры запросов определены в пакете `pkg/` :
В пакете находятся пакеты групп API:
- **api**:
- `pkg/cluster` - для `Cluster`
- `pkg/extstorage` - для `External storage`
- `pkg/folder` - для `Folrer`
- `pkg/image` - для `Image`
- `pkg/node` - для `Node`
- `pkg/respool` - для `Resourse pool`
- `pkg/tempalte` - для `Template`
- `pkg/vm` - для `VM`
В каждом пакете находится пакет `requests` с структурами запросов
В с е поля структуры имеют описание, в которых содержится:
- Их назначение;
- Обязательный или нет - поле required в комментариях;
- Доп. информация (допустимые значения, значения по умолчанию).
#### Пример комментариев структуры
```go
// ListImageRequest struct to get list of images
type ListImageRequest struct {
// Name of image
// Required: false
Name string `url:"name,omitempty" json:"name,omitempty"`
// Size of image
// Required: false
Size string `url:"size,omitempty" json:"size,omitempty"`
// Type of image
// Required: false
ImageType string `url:"image_type,omitempty" json:"image_type,omitempty" validate:"omitempty,image_type"`
// Status of image
// Required: false
Status string `url:"status,omitempty" json:"status,omitempty" validate:"omitempty,image_status"`
// ShareID of image
// Required: false
ShareID string `url:"share_id,omitempty" json:"share_id,omitempty"`
// Active if True Image is active
// Required: false
Active interface{} `url:"active,omitempty" json:"active,omitempty" validate:"omitempty,is_bool"`
// IsTemplateImage If True Image is template
// Required: false
// Default: False
IsTemplateImage bool `url:"is_template_image,omitempty" json:"is_template_image,omitempty"`
// Mark of image
// Required: false
Mark string `url:"mark,omitempty" json:"mark,omitempty"`
// image for filtering by text field
// Required: false
FilterText string `url:"filter_text,omitempty" json:"filter_text,omitempty"`
// List columns which will be used by filter_text
// Required: false
FilterColumns string `url:"filter_columns,omitempty" json:"filter_columns,omitempty"`
// List of columns for sorting.
// Required: false
Sort []string `url:"sort,omitempty" json:"sort,omitempty"`
// Visibility status of the interface (visible, all, deleted).
// Required: false
Visibility string `url:"visibility,omitempty" json:"visibility,omitempty" validate:"omitempty,visibility"`
// Filter VM Images that are unavailable now, because share is unavailable
// Required: false
HideUnavailable interface{} `url:"hide_unavailable,omitempty" json:"hide_unavailable,omitempty" validate:"omitempty,is_bool"`
// Number of the page to return.
// Required: false
Page int `url:"page,omitempty" json:"page,omitempty"`
// Number of items to return per page.
// Required: false
Limit int `url:"limit,omitempty" json:"limit,omitempty"`
}
```
#### Пример создания запроса для развертывания виртуальной машины:
```go
package main
import (
vcontrol "repository.basistech.ru/BASIS/dynamix-standard-go-sdk"
"repository.basistech.ru/BASIS/dynamix-standard-go-sdk/config"
vm "repository.basistech.ru/BASIS/dynamix-standard-go-sdk/pkg/vm/requests"
)
func main() {
// Настройка конфигурации
cfg := config.Config{
Username: "< USERNAME > ",
Password: "< PASSWORD > ",
VControlURL: "< VCONTROL_URL > ",
Retries: 5,
}
// Создание клиента
client := vcontrol.New(cfg)
// Создание структуры запроса
// CreateRequest - реквест на создание виртуальной машины
req := vm.CreateVMRequest{
Name: "VMname",
RAMSize: 1024,
VideoRAMSize: 64
CPUCount: 1,
CPUSockets: 1,
}
}
```
### Выполнение запроса
Чтобы выполнить запрос, необходимо:
1. Вызвать у клиента метод, отвечающий за определение группы API для взаимодействия, на данный момент это `.API()` . Данный метод возвращает соответствующие структуры, с помощью которых можно совершать запросы.
2. Вызвать у возвращенной структуры метод, определяющий группу ручек для взаимодействия.
Доступные методы для `.API()` :
- `.Cluster()` - для работы с `Cluster`
- `.Extstorage()` - для работы с `External storage`
- `.Folder()` - для работы с `Folder`
- `.Image()` - для работы с `Image`
- `.Node()` - для работы с `Node`
- `.Respool()` - для работы с `Resource pool`
- `.Template()` - для работы с `Template`
- `.VM()` - для работы с `VM`
3. Вызвать метод, отвечающий за выполнение запроса и передать в него:
- контекст;
- структуру запроса.
4. Обработать результат и ошибки.
Т .к. все вызовы методов идут последовательно, можно их объединить в конвейер:
Общий вид конвейера будет выглядеть так:
```go
client.< API > .< группа>.< метод>
```
#### Пример выполнения запроса
```go
package main
import (
"context"
"fmt"
"log"
"time"
vcontrol "repository.basistech.ru/BASIS/dynamix-standard-go-sdk"
"repository.basistech.ru/BASIS/dynamix-standard-go-sdk/config"
vm "repository.basistech.ru/BASIS/dynamix-standard-go-sdk/pkg/vm/requests"
)
func main() {
// Настройка конфигурации
cfg := config.Config{
Username: "< USERNAME > ",
Password: "< PASSWORD > ",
VControlURL: "< VCONTROL_URL > ",
Retries: 5,
}
cfg.SetTimeout(5 * time.Minute)
// Создание клиента
client := vcontrol.New(cfg)
// Создание структуры запроса
req := vm.CreateVMRequest{
Name: "VMname",
RAMSize: 1024,
VideoRAMSize: 64,
CPUCount: 1,
CPUSockets: 1,
}
// Выполнение запроса с помощью конвейера
res, err := client.API().VM().Create(context.Background(), req)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v", res)
}
```
Для запросов Get и List реализованы запросы GetRaw и ListRaw, которые возвращают ответ не в виде соответствующей структуры, а в виде массива байт (JSON).
Выполнение таких запросов происходит аналогично.
#### Пример выполнения GetRaw и ListRaw запросов
```go
package main
import (
"context"
"fmt"
"log"
"time"
vcontrol "repository.basistech.ru/BASIS/dynamix-standard-go-sdk"
"repository.basistech.ru/BASIS/dynamix-standard-go-sdk/config"
vm "repository.basistech.ru/BASIS/dynamix-standard-go-sdk/pkg/vm/requests"
)
func main() {
// Настройка конфигурации
cfg := config.Config{
Username: "< USERNAME > ",
Password: "< PASSWORD > ",
VControlURL: "< VCONTROL_URL > ",
Retries: 5,
}
cfg.SetTimeout(5 * time.Minute)
// Создание клиента
client := vcontrol.New(cfg)
// Создание структуры запроса
// 1. Создание структуры запроса GetVMRequest на получение информации о б виртуальной машине и выполнение GetRaw запроса с помощью конвейера
req1 := vm.GetVMRequest{
VmID: 360,
}
res1, err := client.API().VM().GetRaw(context.Background(), req1)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(res1))
// 2. Создание структуры запроса ListVMRequest на получение информации о б виртуальных машинах и выполнение ListRaw запроса с помощью конвейера
req2 := vm.ListVMRequest{}
res2, err := client.API().VM().ListRaw(context.Background(), req2)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(res2))
}
```