Skip to content
Snippets Groups Projects
Select Git revision
  • a93dcaedb77e0411d2e0b90a3abc2722dba310e9
  • master default protected
  • feature/PRXS-3383-CollectionsSort
  • feature/2781-SpacesLoggingMiddleware
  • feature/PRXS-3421-ImplementNewRefAPI
  • feature/PRXS-3143-3235-ReferenceOptions
  • feature/PRXS-3143-LimitReferenceFields
  • feature/PRXS-3234-FeaturePruneIdents
  • PRXS-3421-RecursiveReferences
  • feature/3109-SerializeFeature
  • release/0.33
  • feature/3109-RecoverySchema
  • feature/3109-feature
  • fix/PRXS-3369-ValidateFields
  • refactor/PRXS-3306-MovePkgGroup1
  • refactor/6-pkg-refactor-expr
  • fix/PRXS-3360-TemplateBuilderPatch
  • feature/3293-MongoV2
  • feature/3272-GoVersionUp
  • feature/PRXS-3218-HideTemplateActions
  • feature/PRXS-3234-PruneIdents
  • v0.33.1
  • v0.32.0
  • v0.31.1
  • v0.31.0
  • v0.30.0
  • v0.29.0
  • v0.28.0
  • v0.27.0-alpha.1+16
  • v0.27.0-alpha.1+15
  • v0.27.0-alpha.1+14
  • v0.27.0-alpha.1+13
  • v0.27.0-alpha.1+12
  • v0.27.0-alpha.1+11
  • v0.27.0-alpha.1+10
  • v0.27.0-alpha.1+9
  • v0.27.0-alpha.1+8
  • v0.27.0-alpha.1+7
  • v0.27.0-alpha.1+6
  • v0.27.0-alpha.1+5
  • v0.27.0-alpha.1+4
41 results

storage.go

Blame
  • manager.go 2.16 KiB
    package extension
    
    import (
    	"context"
    
    	"git.perx.ru/perxis/perxis-go/pkg/auth"
    	"git.perx.ru/perxis/perxis-go/pkg/errors"
    	"google.golang.org/grpc"
    	"google.golang.org/grpc/credentials/insecure"
    )
    
    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, filter *ListExtensionsFilter) ([]*Info, error)
    }
    
    type ListExtensionsFilter struct {
    	Extensions []string
    	States     []State
    }
    
    func NewListExtensionsFilter(extensions []string, states ...State) *ListExtensionsFilter {
    	return &ListExtensionsFilter{
    		Extensions: extensions,
    		States:     states,
    	}
    }
    
    type ExtensionConnector struct {
    	Extension
    	Connection *grpc.ClientConn
    	Descriptor *ExtensionDescriptor
    }
    
    func (e *ExtensionConnector) Connect() error {
    	// Уже есть экземпляр расширение или клиент расширения
    	if e.Extension != nil {
    		return nil
    	}
    
    	// Уже есть соединение, создаем клиента расширения
    	if e.Connection != nil {
    		if e.Extension == nil {
    			e.Extension = NewClient(e.Connection)
    			return nil
    		}
    		return nil
    	}
    
    	// Нет дескриптора или Url для соединения с расширением
    	if e.Descriptor == nil || e.Descriptor.Url == "" {
    		return nil
    	}
    
    	conn, err := grpc.Dial(
    		e.Descriptor.Url,
    		grpc.WithTransportCredentials(insecure.NewCredentials()),
    		grpc.WithChainUnaryInterceptor(
    			auth.PrincipalClientInterceptor(),
    		),
    	)
    	if err != nil {
    		return err
    	}
    
    	e.Connection = conn
    	e.Extension = NewClient(conn)
    	return nil
    }
    
    func (e *ExtensionConnector) IsConnected() bool {
    	if e != nil && e.Connection != nil {
    		return true
    	}
    	return false
    }
    
    func (e *ExtensionConnector) Close() error {
    	if e.IsConnected() {
    		if err := e.Connection.Close(); err != nil {
    			return errors.Wrapf(err, "fail to close connection, extension %s (%s)", e.Extension, e.Descriptor.Url)
    		}
    		e.Connection = nil
    	}
    	return nil
    }