Skip to content
Snippets Groups Projects
Commit db3c68f9 authored by Alena Petraki's avatar Alena Petraki
Browse files

extension.Storage возвращает только список установленных расширений

В параметрах ListExtensionsRequest передается список состояний вместо флагов installed/not_installed
parent ed993584
No related branches found
No related tags found
No related merge requests found
Showing
with 295 additions and 333 deletions
Subproject commit 606cf8070bc9a930cadd5117bf49cc119ff3a16e
Subproject commit dc83f92e5b9bb690c52486ee326a798365afd85f
......@@ -89,3 +89,20 @@ func GlobToRegexp(s string) string {
return replacer.Replace(s)
}
func GetRegexMatches(s string, matches ...string) []string {
var res []string
for _, match := range matches {
if match == "" {
continue
}
if s == match || match == ".*" {
res = append(res, match)
continue
}
if ok, _ := regexp.MatchString(match, s); ok {
res = append(res, match)
}
}
return res
}
......@@ -12,6 +12,7 @@ import (
)
const (
StateNotInstalled = pb.State_NOT_INSTALLED
StatePending = pb.State_PENDING
StateInstalled = pb.State_INSTALLED
StateInProgress = pb.State_IN_PROGRESS
......@@ -71,7 +72,7 @@ func CheckInstalled(ctx context.Context, content *content.Content, spaceID, envI
if err != nil {
return false, err
}
return status.Installed, nil
return status.State == StateInstalled, nil
}
func isMetadataEqual(s1, s2 *schema.Schema) bool {
......
......@@ -13,37 +13,20 @@ type Manager interface {
Extension
RegisterExtensions(ctx context.Context, ext ...*ExtensionConnector) error
UnregisterExtensions(ctx context.Context, ext ...*ExtensionConnector) error
ListRegisteredExtensions(ctx context.Context, extensions []string) ([]*ExtensionConnector, error)
ListExtensions(ctx context.Context, space, env string, extensions []string, opts ...ListExtensionsOption) ([]*Info, error)
ListRegisteredExtensions(ctx context.Context, extensions ...string) ([]*ExtensionConnector, error)
ListExtensions(ctx context.Context, space, env string, filter *ListExtensionsFilter) ([]*Info, error)
}
type (
ListExtensionsOptions struct {
Installed bool
NotInstalled bool
type ListExtensionsFilter struct {
Extensions []string
States []State
}
ListExtensionsOption func(o *ListExtensionsOptions)
)
func WithInstalled() ListExtensionsOption {
return func(o *ListExtensionsOptions) {
o.Installed = true
}
}
func WithNotInstalled() ListExtensionsOption {
return func(o *ListExtensionsOptions) {
o.NotInstalled = true
}
}
func NewListExtensionsOptions(options ...ListExtensionsOption) *ListExtensionsOptions {
opt := new(ListExtensionsOptions)
for _, o := range options {
o(opt)
func NewListExtensionsFilter(extensions []string, states ...State) *ListExtensionsFilter {
return &ListExtensionsFilter{
Extensions: extensions,
States: states,
}
return opt
}
type ExtensionConnector struct {
......
......@@ -57,7 +57,7 @@ func (c *ManagerClient) UnregisterExtensions(ctx context.Context, exts ...*Exten
return err
}
func (c *ManagerClient) ListRegisteredExtensions(ctx context.Context, extensions []string) ([]*ExtensionConnector, error) {
func (c *ManagerClient) ListRegisteredExtensions(ctx context.Context, extensions ...string) ([]*ExtensionConnector, error) {
resp, err := c.manager.ListRegisteredExtensions(ctx, &pb.ListRegisteredExtensionsRequest{Extension: extensions}, grpc.WaitForReady(true))
if err != nil {
return nil, err
......@@ -71,14 +71,15 @@ func (c *ManagerClient) ListRegisteredExtensions(ctx context.Context, extensions
return exts, nil
}
func (c *ManagerClient) ListExtensions(ctx context.Context, space, env string, extensions []string, opts ...ListExtensionsOption) ([]*Info, error) {
options := NewListExtensionsOptions(opts...)
func (c *ManagerClient) ListExtensions(ctx context.Context, space, env string, filter *ListExtensionsFilter) ([]*Info, error) {
if filter == nil {
filter = new(ListExtensionsFilter)
}
resp, err := c.manager.ListExtensions(ctx, &pb.ListExtensionsRequest{
Extensions: extensions,
Extensions: filter.Extensions,
SpaceId: space,
EnvId: env,
Installed: options.Installed,
NotInstalled: options.NotInstalled,
State: filter.States,
}, grpc.WaitForReady(true))
if err != nil {
return nil, err
......
......@@ -63,24 +63,24 @@ func (m *errorLoggingMiddleware) Install(ctx context.Context, in *extension.Inst
return m.next.Install(ctx, in)
}
func (m *errorLoggingMiddleware) ListExtensions(ctx context.Context, space string, env string, extensions []string, opts ...extension.ListExtensionsOption) (ipa1 []*extension.Info, err error) {
func (m *errorLoggingMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
logger := m.logger
defer func() {
if err != nil {
logger.Warn("response error", zap.Error(err))
}
}()
return m.next.ListExtensions(ctx, space, env, extensions, opts...)
return m.next.ListExtensions(ctx, space, env, filter)
}
func (m *errorLoggingMiddleware) ListRegisteredExtensions(ctx context.Context, extensions []string) (epa1 []*extension.ExtensionConnector, err error) {
func (m *errorLoggingMiddleware) ListRegisteredExtensions(ctx context.Context, extensions ...string) (epa1 []*extension.ExtensionConnector, err error) {
logger := m.logger
defer func() {
if err != nil {
logger.Warn("response error", zap.Error(err))
}
}()
return m.next.ListRegisteredExtensions(ctx, extensions)
return m.next.ListRegisteredExtensions(ctx, extensions...)
}
func (m *errorLoggingMiddleware) RegisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
......
......@@ -169,15 +169,14 @@ func (m *loggingMiddleware) Install(ctx context.Context, in *extension.InstallRe
return err
}
func (m *loggingMiddleware) ListExtensions(ctx context.Context, space string, env string, extensions []string, opts ...extension.ListExtensionsOption) (ipa1 []*extension.Info, err error) {
func (m *loggingMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
begin := time.Now()
var fields []zapcore.Field
for k, v := range map[string]interface{}{
"ctx": ctx,
"space": space,
"env": env,
"extensions": extensions,
"opts": opts} {
"filter": filter} {
if k == "ctx" {
fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
continue
......@@ -187,7 +186,7 @@ func (m *loggingMiddleware) ListExtensions(ctx context.Context, space string, en
m.logger.Debug("ListExtensions.Request", fields...)
ipa1, err = m.next.ListExtensions(ctx, space, env, extensions, opts...)
ipa1, err = m.next.ListExtensions(ctx, space, env, filter)
fields = []zapcore.Field{
zap.Duration("time", time.Since(begin)),
......@@ -209,7 +208,7 @@ func (m *loggingMiddleware) ListExtensions(ctx context.Context, space string, en
return ipa1, err
}
func (m *loggingMiddleware) ListRegisteredExtensions(ctx context.Context, extensions []string) (epa1 []*extension.ExtensionConnector, err error) {
func (m *loggingMiddleware) ListRegisteredExtensions(ctx context.Context, extensions ...string) (epa1 []*extension.ExtensionConnector, err error) {
begin := time.Now()
var fields []zapcore.Field
for k, v := range map[string]interface{}{
......@@ -224,7 +223,7 @@ func (m *loggingMiddleware) ListRegisteredExtensions(ctx context.Context, extens
m.logger.Debug("ListRegisteredExtensions.Request", fields...)
epa1, err = m.next.ListRegisteredExtensions(ctx, extensions)
epa1, err = m.next.ListRegisteredExtensions(ctx, extensions...)
fields = []zapcore.Field{
zap.Duration("time", time.Since(begin)),
......
......@@ -77,7 +77,7 @@ func (m *recoveringMiddleware) Install(ctx context.Context, in *extension.Instal
return m.next.Install(ctx, in)
}
func (m *recoveringMiddleware) ListExtensions(ctx context.Context, space string, env string, extensions []string, opts ...extension.ListExtensionsOption) (ipa1 []*extension.Info, err error) {
func (m *recoveringMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
logger := m.logger
defer func() {
if r := recover(); r != nil {
......@@ -86,10 +86,10 @@ func (m *recoveringMiddleware) ListExtensions(ctx context.Context, space string,
}
}()
return m.next.ListExtensions(ctx, space, env, extensions, opts...)
return m.next.ListExtensions(ctx, space, env, filter)
}
func (m *recoveringMiddleware) ListRegisteredExtensions(ctx context.Context, extensions []string) (epa1 []*extension.ExtensionConnector, err error) {
func (m *recoveringMiddleware) ListRegisteredExtensions(ctx context.Context, extensions ...string) (epa1 []*extension.ExtensionConnector, err error) {
logger := m.logger
defer func() {
if r := recover(); r != nil {
......@@ -98,7 +98,7 @@ func (m *recoveringMiddleware) ListRegisteredExtensions(ctx context.Context, ext
}
}()
return m.next.ListRegisteredExtensions(ctx, extensions)
return m.next.ListRegisteredExtensions(ctx, extensions...)
}
func (m *recoveringMiddleware) RegisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
......
......@@ -86,32 +86,25 @@ func (_m *Manager) Install(ctx context.Context, in *extensions.InstallRequest) e
return r0
}
// ListExtensions provides a mock function with given fields: ctx, space, env, _a3, opts
func (_m *Manager) ListExtensions(ctx context.Context, space string, env string, _a3 []string, opts ...extension.ListExtensionsOption) ([]*extensions.ListExtensionsResponse_ExtensionInfo, error) {
_va := make([]interface{}, len(opts))
for _i := range opts {
_va[_i] = opts[_i]
}
var _ca []interface{}
_ca = append(_ca, ctx, space, env, _a3)
_ca = append(_ca, _va...)
ret := _m.Called(_ca...)
// ListExtensions provides a mock function with given fields: ctx, space, env, filter
func (_m *Manager) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) ([]*extensions.ListExtensionsResponse_ExtensionInfo, error) {
ret := _m.Called(ctx, space, env, filter)
var r0 []*extensions.ListExtensionsResponse_ExtensionInfo
var r1 error
if rf, ok := ret.Get(0).(func(context.Context, string, string, []string, ...extension.ListExtensionsOption) ([]*extensions.ListExtensionsResponse_ExtensionInfo, error)); ok {
return rf(ctx, space, env, _a3, opts...)
if rf, ok := ret.Get(0).(func(context.Context, string, string, *extension.ListExtensionsFilter) ([]*extensions.ListExtensionsResponse_ExtensionInfo, error)); ok {
return rf(ctx, space, env, filter)
}
if rf, ok := ret.Get(0).(func(context.Context, string, string, []string, ...extension.ListExtensionsOption) []*extensions.ListExtensionsResponse_ExtensionInfo); ok {
r0 = rf(ctx, space, env, _a3, opts...)
if rf, ok := ret.Get(0).(func(context.Context, string, string, *extension.ListExtensionsFilter) []*extensions.ListExtensionsResponse_ExtensionInfo); ok {
r0 = rf(ctx, space, env, filter)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).([]*extensions.ListExtensionsResponse_ExtensionInfo)
}
}
if rf, ok := ret.Get(1).(func(context.Context, string, string, []string, ...extension.ListExtensionsOption) error); ok {
r1 = rf(ctx, space, env, _a3, opts...)
if rf, ok := ret.Get(1).(func(context.Context, string, string, *extension.ListExtensionsFilter) error); ok {
r1 = rf(ctx, space, env, filter)
} else {
r1 = ret.Error(1)
}
......@@ -120,24 +113,31 @@ func (_m *Manager) ListExtensions(ctx context.Context, space string, env string,
}
// ListRegisteredExtensions provides a mock function with given fields: ctx, _a1
func (_m *Manager) ListRegisteredExtensions(ctx context.Context, _a1 []string) ([]*extension.ExtensionConnector, error) {
ret := _m.Called(ctx, _a1)
func (_m *Manager) ListRegisteredExtensions(ctx context.Context, _a1 ...string) ([]*extension.ExtensionConnector, error) {
_va := make([]interface{}, len(_a1))
for _i := range _a1 {
_va[_i] = _a1[_i]
}
var _ca []interface{}
_ca = append(_ca, ctx)
_ca = append(_ca, _va...)
ret := _m.Called(_ca...)
var r0 []*extension.ExtensionConnector
var r1 error
if rf, ok := ret.Get(0).(func(context.Context, []string) ([]*extension.ExtensionConnector, error)); ok {
return rf(ctx, _a1)
if rf, ok := ret.Get(0).(func(context.Context, ...string) ([]*extension.ExtensionConnector, error)); ok {
return rf(ctx, _a1...)
}
if rf, ok := ret.Get(0).(func(context.Context, []string) []*extension.ExtensionConnector); ok {
r0 = rf(ctx, _a1)
if rf, ok := ret.Get(0).(func(context.Context, ...string) []*extension.ExtensionConnector); ok {
r0 = rf(ctx, _a1...)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).([]*extension.ExtensionConnector)
}
}
if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok {
r1 = rf(ctx, _a1)
if rf, ok := ret.Get(1).(func(context.Context, ...string) error); ok {
r1 = rf(ctx, _a1...)
} else {
r1 = ret.Error(1)
}
......
......@@ -12,8 +12,8 @@ import (
)
const (
StatusCollectionID = "space_extensions"
StatusCollectionName = "Настройки/Расширения"
ExtensionsCollectionID = "space_extensions"
ExtensionsCollectionName = "Настройки/Расширения"
ActionsCollectionID = "space_actions"
ActionsCollectionName = "Настройки/Действия"
......@@ -141,10 +141,10 @@ func NewStatusCollection(spaceID, envID string) *collections.Collection {
sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
return &collections.Collection{
ID: StatusCollectionID,
ID: ExtensionsCollectionID,
SpaceID: spaceID,
EnvID: envID,
Name: StatusCollectionName,
Name: ExtensionsCollectionName,
Schema: sch,
Hidden: true,
}
......
......@@ -15,7 +15,9 @@ import (
"git.perx.ru/perxis/perxis-go/pkg/items"
)
type Info = pb.ListExtensionsResponse_ExtensionInfo
type (
Info = pb.ListExtensionsResponse_ExtensionInfo
)
// Storage описывает интерфейс хранилища состояний расширений
type Storage interface {
......@@ -37,7 +39,7 @@ func infoFromItem(extension string, item *items.Item) *Info {
if item == nil {
return &Info{
Extension: extension,
Installed: false,
State: StateNotInstalled,
}
}
......@@ -55,52 +57,38 @@ func infoFromItem(extension string, item *items.Item) *Info {
State: State(state),
Msg: msg,
Error: errmsg,
Installed: State(state) == StateInstalled,
InstalledVersion: ver,
}
}
// GetExtension возвращает состояние расширения в пространстве
func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, extension string) (*Info, error) {
res, err := s.content.Items.Get(ctx, spaceID, envID, StatusCollectionID, extension)
res, err := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollectionID, extension)
if err != nil && !strings.Contains(err.Error(), "not found") {
return nil, err
}
return infoFromItem(extension, res), nil
}
// FindExtensions возвращает состояния расширений в пространстве. Если расширение не установлено,
// возвращается статус с флагом `Installed: false`. Статусы возвращаются в том же порядке, что и
// переданные расширения
// FindExtensions возвращает состояния расширений в пространстве
func (s *storage) FindExtensions(ctx context.Context, spaceID, envID string, extensions ...string) ([]*Info, error) {
q := make([]interface{}, len(extensions))
var itemsFilter *items.Filter
if len(extensions) != 0 {
q := make([]interface{}, 0, len(extensions)+1)
for _, e := range extensions {
q = append(q, fmt.Sprintf("id contains '%s'", e))
}
}
itms, _, err := s.content.Items.Find(ctx, spaceID, envID, StatusCollectionID, items.NewFilter(q...))
itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollectionID, itemsFilter)
if err != nil && !strings.Contains(err.Error(), collections.ErrNotFound.Error()) {
return nil, err
}
res := make([]*Info, 0, len(itms))
if len(extensions) == 0 {
for _, item := range itms {
res = append(res, infoFromItem(item.ID, item))
}
return res, nil
}
extensionToItem := make(map[string]*items.Item, len(itms))
for _, item := range itms {
extensionToItem[item.ID] = item
res := make([]*Info, len(itms))
for i, item := range itms {
res[i] = infoFromItem(item.ID, item)
}
for _, extension := range extensions {
res = append(res, infoFromItem(extension, extensionToItem[extension]))
}
return res, nil
}
......@@ -114,7 +102,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten
ID: extension,
SpaceID: spaceID,
EnvID: envID,
CollectionID: StatusCollectionID,
CollectionID: ExtensionsCollectionID,
Data: make(map[string]interface{}),
}
......@@ -125,7 +113,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten
_ = item.Set("status_msg", status.Msg)
_ = item.Set("status_error", status.Error)
i, _ := s.content.Items.Get(ctx, spaceID, envID, StatusCollectionID, extension)
i, _ := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollectionID, extension)
if i == nil {
_, err := s.content.Items.Create(ctx, item)
return err
......@@ -140,7 +128,7 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex
ID: extension,
SpaceID: spaceID,
EnvID: envID,
CollectionID: StatusCollectionID,
CollectionID: ExtensionsCollectionID,
}
return s.content.Items.Delete(ctx, item)
}
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/error_log
// gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
import (
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/access_log
// gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
import (
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/error_log
// gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/images -i Images -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
import (
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/access_log
// gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/images -i Images -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
import (
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/error_log
// gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/items -i Items -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
import (
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/access_log
// gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/items -i Items -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
import (
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/error_log
// gowrap: http://github.com/hexdigest/gowrap
// DO NOT EDIT!
// This code is generated with http://github.com/hexdigest/gowrap tool
// using ../../../assets/templates/middleware/error_log template
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go
import (
"context"
......
package middleware
// Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/access_log
// gowrap: http://github.com/hexdigest/gowrap
// DO NOT EDIT!
// This code is generated with http://github.com/hexdigest/gowrap tool
// using ../../../assets/templates/middleware/access_log template
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/access_log -o logging_middleware.go
import (
"context"
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment