From a267d35ddf4f6e18e65e511ca7e9e08d380396ff Mon Sep 17 00:00:00 2001 From: Alexey Fetisov Date: Tue, 18 Nov 2025 14:42:39 +0300 Subject: [PATCH] v1.12.10 --- CHANGELOG.md | 64 +++---------------------- README.md | 33 +++++++++++++ client_mock.go | 32 +++++++++++++ client_mock_gen.go | 86 ++++++++++++++++++++++++++++++++++ go.mod | 4 ++ go.sum | 32 +++---------- pkg/sdn/logicalports/create.go | 8 ---- samples/client/client.go | 42 +++++++++++++++++ samples/client/client_test.go | 76 ++++++++++++++++++++++++++++++ samples/client/config.go | 7 +++ universal-client.go | 2 + 11 files changed, 295 insertions(+), 91 deletions(-) create mode 100644 client_mock.go create mode 100644 client_mock_gen.go create mode 100644 samples/client/client.go create mode 100644 samples/client/client_test.go create mode 100644 samples/client/config.go 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) {