diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4797133..0aaf228 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## Version 1.12.9
+## Version 1.12.10
Методы `Audits` в cloudapi/compute, cloudbroker/compute, cloudapi/account, cloudbroker/account, cloudapi/vins, cloudbroker/vins, cloudapi/rg и cloudbroker/rg стали deprecated и в следующих версиях будут удалены, вместо них необходимо использовать метод `List` в cloudapi/audit и cloudbroker/audit с соответствующими фильтрами
Метод `ListStacks` в cloudbroker/image стал deprecated и в следующих версиях будет удалён
@@ -8,66 +8,14 @@
### Добавлено
-#### address pool
+#### ClientInterface
| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-515 | Группа методов address pool в sdn |
-
-#### compute
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-650 | Поля `BusNumber`, `EnableSecGroups`, `LibvirtSettings`, `MTU`, `NodeID`, `SDNInterfaceID`, `SecurityGroups`, `TrunkTags` в структуру ответа `RecordNetAttach` в compute/cloudapi и compute/cloudbroker |
-
-#### default security policies
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-516 | Группа методов default security policies в sdn |
-
-#### image
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-648 | Поле `ToClean` в структурах ответа `RecordImage` в cloudapi/image и `RecordImage`, `ItemImage` cloudbroker/image |
+| --- | ---|
+| BGOS-673 | Добавлен mock для интерфейса ClientInterface с примерами |
-#### network object groups
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| Идентификатор
задачи | Описание |
-| BGOS-520 | Группа методов network object groups в sdn |
+### Удалено
#### logical ports
| Идентификатор
задачи | Описание |
| --- | --- |
-| BGOS-519 | Группа методов logical ports в sdn |
-
-#### security policies
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-521 | Группа методов security policies в sdn |
-
-#### sdn external networks
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-517 | Группа методов external networks в sdn |
-
-#### sdn floating ips
-| Идентификатор
задачи | Описание |
-|--- | --- |
-| BGOS-594 | Группа методов floating ips в sdn |
-
-#### sdn routers
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-524 | Группа методов external routers в sdn |
-
-#### sdn segments
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-523 | Группа методов segments в sdn |
-
-### Исправлено
-
-#### kvmx86
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BGOS-652 | Структура `Interface` заменена на `InterfaceMassCreate` в структуре `MassCreateRequest` в cloudbroker/kvmx86 |
-
+| BGOS-668 | Поля `LogicalPortID` и `VersionID` в структуре запроса `CreateRequest` |
\ No newline at end of file
diff --git a/README.md b/README.md
index 29c59a5..0c4987e 100644
--- a/README.md
+++ b/README.md
@@ -83,6 +83,8 @@ Decort SDK - это библиотека, написанная на языке G
- [Пример выполнения запроса](#пример-выполнения-запроса-4)
- [Проверка соответствия версии платформы и версии dynamix](#проверка-соответствия-версии-платформы-и-версии-dynamix)
- [Пример выполнения запроса](#пример-выполнения-запроса-5)
+ - [Создание mock клиента](#создание-mock-клиента)
+ - [Пример создания mock клиента](#пример-создания-mock-клиента)
## Установка
@@ -1709,4 +1711,35 @@ func main(){
// Проверка соответствия версии
checkInfo, err := client.Check()
}
+```
+
+# Создание mock клиента
+
+Создание клиента происходит с помощью функции-строителя `NewMockDecortClient` из основного пакета `decort-sdk`. Функция принимает mock реализацию интерфейса interfaces.Calller, возвращает структуру `MockDecortClient`, с помощью которой можно производить unit тестирование API Decort SDK без подключения к серверу
+
+#### Пример создания mock клиента
+```go
+package unit_test
+
+import (
+ "testing"
+ "go.uber.org/mock/gomock"
+ decortsdk "repository.basistech.ru/BASIS/decort-golang-sdk"
+)
+
+// Пример юнит тестирования на моках
+func TestClient(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ // Создаем mock интерфейса Caller
+ mockCaller := decortsdk.NewMockCaller(ctrl)
+ // Создаем mock интерфейса DecortClient
+ mockClient := decortsdk.NewMockDecortClient(mockCaller)
+ // ....
+}
+```
+Пример юнит теста можно посмотреть в файле [samples/client/client_test.go](samples/client/client_test.go)
+
+При редактировании интерфеса interface.Caller необходимо перегенерировать Mock :
+``` shell
+make gen-mock
```
\ No newline at end of file
diff --git a/client_mock.go b/client_mock.go
new file mode 100644
index 0000000..ec30eaf
--- /dev/null
+++ b/client_mock.go
@@ -0,0 +1,32 @@
+package decortsdk
+
+import (
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn"
+)
+
+type MockDecortClient struct {
+ apiCaller *MockCaller
+}
+
+func NewMockDecortClient(apiCaller *MockCaller) ClientInterface {
+ return &MockDecortClient{
+ apiCaller: apiCaller,
+ }
+}
+
+// CloudAPI builder
+func (mdc *MockDecortClient) CloudAPI() *cloudapi.CloudAPI {
+ return cloudapi.New(mdc.apiCaller)
+}
+
+// CloudBroker builder
+func (mdc *MockDecortClient) CloudBroker() *cloudbroker.CloudBroker {
+ return cloudbroker.New(mdc.apiCaller)
+}
+
+// SDN builder
+func (mdc *MockDecortClient) SDN() *sdn.SDN {
+ return sdn.New(mdc.apiCaller)
+}
diff --git a/client_mock_gen.go b/client_mock_gen.go
new file mode 100644
index 0000000..e5fec24
--- /dev/null
+++ b/client_mock_gen.go
@@ -0,0 +1,86 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: interfaces/caller.go
+//
+// Generated by this command:
+//
+// mockgen -package decortsdk -source interfaces/caller.go
+//
+
+// Package decortsdk is a generated GoMock package.
+package decortsdk
+
+import (
+ context "context"
+ reflect "reflect"
+
+ gomock "go.uber.org/mock/gomock"
+)
+
+// MockCaller is a mock of Caller interface.
+type MockCaller struct {
+ ctrl *gomock.Controller
+ recorder *MockCallerMockRecorder
+ isgomock struct{}
+}
+
+// MockCallerMockRecorder is the mock recorder for MockCaller.
+type MockCallerMockRecorder struct {
+ mock *MockCaller
+}
+
+// NewMockCaller creates a new mock instance.
+func NewMockCaller(ctrl *gomock.Controller) *MockCaller {
+ mock := &MockCaller{ctrl: ctrl}
+ mock.recorder = &MockCallerMockRecorder{mock}
+ return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockCaller) EXPECT() *MockCallerMockRecorder {
+ return m.recorder
+}
+
+// DecortApiCall mocks base method.
+func (m *MockCaller) DecortApiCall(ctx context.Context, method, url string, params any) ([]byte, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "DecortApiCall", ctx, method, url, params)
+ ret0, _ := ret[0].([]byte)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// DecortApiCall indicates an expected call of DecortApiCall.
+func (mr *MockCallerMockRecorder) DecortApiCall(ctx, method, url, params any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DecortApiCall", reflect.TypeOf((*MockCaller)(nil).DecortApiCall), ctx, method, url, params)
+}
+
+// DecortApiCallCtype mocks base method.
+func (m *MockCaller) DecortApiCallCtype(ctx context.Context, method, url, ctype string, params any) ([]byte, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "DecortApiCallCtype", ctx, method, url, ctype, params)
+ ret0, _ := ret[0].([]byte)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// DecortApiCallCtype indicates an expected call of DecortApiCallCtype.
+func (mr *MockCallerMockRecorder) DecortApiCallCtype(ctx, method, url, ctype, params any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DecortApiCallCtype", reflect.TypeOf((*MockCaller)(nil).DecortApiCallCtype), ctx, method, url, ctype, params)
+}
+
+// DecortApiCallMP mocks base method.
+func (m *MockCaller) DecortApiCallMP(ctx context.Context, method, url string, params any) ([]byte, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "DecortApiCallMP", ctx, method, url, params)
+ ret0, _ := ret[0].([]byte)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// DecortApiCallMP indicates an expected call of DecortApiCallMP.
+func (mr *MockCallerMockRecorder) DecortApiCallMP(ctx, method, url, params any) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DecortApiCallMP", reflect.TypeOf((*MockCaller)(nil).DecortApiCallMP), ctx, method, url, params)
+}
diff --git a/go.mod b/go.mod
index 527c56d..95d3339 100644
--- a/go.mod
+++ b/go.mod
@@ -6,15 +6,19 @@ require (
github.com/go-playground/validator/v10 v10.28.0
github.com/google/go-querystring v1.1.0
github.com/joho/godotenv v1.5.1
+ github.com/stretchr/testify v1.9.0
+ go.uber.org/mock v0.6.0
gopkg.in/yaml.v3 v3.0.1
)
require (
+ github.com/davecgh/go-spew v1.1.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.10 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
+ github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/crypto v0.42.0 // indirect
golang.org/x/sys v0.36.0 // indirect
golang.org/x/text v0.29.0 // indirect
diff --git a/go.sum b/go.sum
index 8206be4..905981e 100644
--- a/go.sum
+++ b/go.sum
@@ -1,16 +1,13 @@
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0=
github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
-github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
-github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688=
github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -20,37 +17,22 @@ github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
-github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
-golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
-golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
-golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
+go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
-golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
-golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/pkg/sdn/logicalports/create.go b/pkg/sdn/logicalports/create.go
index 66cd731..f124d44 100644
--- a/pkg/sdn/logicalports/create.go
+++ b/pkg/sdn/logicalports/create.go
@@ -11,14 +11,6 @@ import (
// CreateRequest struct to create logical port
type CreateRequest struct {
- // ID of the logical port
- // Required: true
- LogicalPortID string `url:"logical_port_id" json:"logical_port_id" validate:"required"`
-
- // ID of the version
- // Required: true
- VersionID uint64 `url:"version_id" json:"version_id" validate:"required"`
-
// ID of the access group
// Required: true
AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"`
diff --git a/samples/client/client.go b/samples/client/client.go
new file mode 100644
index 0000000..2a9e401
--- /dev/null
+++ b/samples/client/client.go
@@ -0,0 +1,42 @@
+package client
+
+import (
+ "context"
+ "fmt"
+
+ "errors"
+
+ decortsdk "repository.basistech.ru/BASIS/decort-golang-sdk"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/compute"
+)
+
+type Migrator interface {
+ Migrate(ctxOrigin context.Context, vmUUID, to uint64) (bool, error)
+}
+
+type migrator struct {
+ cfg *Config
+ client decortsdk.ClientInterface
+}
+
+func NewMigrator(cfg *Config, c decortsdk.ClientInterface) Migrator {
+ return &migrator{
+ cfg: cfg,
+ client: c,
+ }
+}
+
+func (m *migrator) Migrate(ctxOrigin context.Context, dxVMID, stackID uint64) (bool, error) {
+ req := compute.MigrateRequest{
+ ComputeID: dxVMID,
+ TargetStackID: stackID,
+ 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 ok, nil
+}
diff --git a/samples/client/client_test.go b/samples/client/client_test.go
new file mode 100644
index 0000000..b474e0c
--- /dev/null
+++ b/samples/client/client_test.go
@@ -0,0 +1,76 @@
+package client_test
+
+import (
+ "context"
+ "encoding/json"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+ "go.uber.org/mock/gomock"
+ decortsdk "repository.basistech.ru/BASIS/decort-golang-sdk"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/compute"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/samples/client"
+)
+
+// Пример юнит тестирования на моках
+func TestClient(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ // Создаем мок инстанс интерфейса Caller
+ mockCaller := decortsdk.NewMockCaller(ctrl)
+ // Создаем мок инстанс интерфейса DecortClient
+ mockClient := decortsdk.NewMockDecortClient(mockCaller)
+
+ dxVMID := uint64(100500)
+ VMID := "vm-100500"
+
+ listComputes := &compute.ListComputes{
+ Data: []compute.ItemCompute{
+ {
+ InfoCompute: compute.InfoCompute{
+ ID: dxVMID,
+ ReferenceID: VMID,
+ },
+ },
+ }}
+
+ b, err := json.Marshal(listComputes)
+ assert.NoError(t, err)
+ // Подготавливаем мок для вызова метода CloudBroker().Compute().List()
+ mockCaller.EXPECT().DecortApiCall(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Eq(compute.ListRequest{})).Return(b, nil).AnyTimes()
+ listComputesRet, err := mockClient.CloudBroker().Compute().List(context.Background(), compute.ListRequest{})
+ assert.NoError(t, err)
+
+ assert.Equal(t, listComputes, listComputesRet)
+
+}
+
+// Пример юнит тестирования на моках
+func TestMigrator(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ // Создаем мок инстанс интерфейса Caller
+ mockCaller := decortsdk.NewMockCaller(ctrl)
+ // Создаем мок инстанс интерфейса interfaces.ClientInterface
+ mockClient := decortsdk.NewMockDecortClient(mockCaller)
+
+ // Передаем мок инстанс интерфейса interfaces.ClientInterface в конструктор Migrator
+ migrator := client.NewMigrator(&client.Config{QueryTimeout: time.Second}, mockClient)
+
+ b, err := json.Marshal(true)
+ assert.NoError(t, err)
+
+ dxVMID := uint64(100500)
+ stackID := uint64(100501)
+
+ // Записываем поведение клиента
+ mockCaller.EXPECT().DecortApiCall(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Eq(compute.AsyncWrapperMigrateRequest{
+ MigrateRequest: compute.MigrateRequest{
+ ComputeID: dxVMID,
+ TargetStackID: stackID,
+ },
+ SyncMode: true})).Return(b, nil).AnyTimes()
+
+ ok, err := migrator.Migrate(context.Background(), dxVMID, stackID)
+ assert.NoError(t, err)
+ assert.True(t, ok)
+}
diff --git a/samples/client/config.go b/samples/client/config.go
new file mode 100644
index 0000000..f41270e
--- /dev/null
+++ b/samples/client/config.go
@@ -0,0 +1,7 @@
+package client
+
+import "time"
+
+type Config struct {
+ QueryTimeout time.Duration
+}
diff --git a/universal-client.go b/universal-client.go
index bade8fd..af0c7a9 100644
--- a/universal-client.go
+++ b/universal-client.go
@@ -7,11 +7,13 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/config"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn"
)
type ClientInterface interface {
CloudAPI() *cloudapi.CloudAPI
CloudBroker() *cloudbroker.CloudBroker
+ SDN() *sdn.SDN
}
func NewUniversal(cfg config.UniversalConfig) (ClientInterface, error) {