mirror of
https://github.com/APIParkLab/APIPark.git
synced 2026-06-04 10:13:53 +08:00
175 lines
4.6 KiB
Go
175 lines
4.6 KiB
Go
package plugin_cluster
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
plugin_cluster "github.com/APIParkLab/APIPark/service/plugin-cluster"
|
|
|
|
"github.com/APIParkLab/APIPark/gateway"
|
|
"github.com/APIParkLab/APIPark/model/plugin_model"
|
|
"github.com/APIParkLab/APIPark/module/plugin-cluster/dto"
|
|
"github.com/APIParkLab/APIPark/service/cluster"
|
|
"github.com/eolinker/eosc/log"
|
|
"github.com/eolinker/go-common/auto"
|
|
"github.com/eolinker/go-common/utils"
|
|
)
|
|
|
|
var (
|
|
_ IPluginClusterModule = (*imlPluginClusterModule)(nil)
|
|
)
|
|
|
|
type imlPluginClusterModule struct {
|
|
service plugin_cluster.IPluginService `autowired:""`
|
|
//partitionService partition.IPartitionService `autowired:""`
|
|
clusterService cluster.IClusterService `autowired:""`
|
|
}
|
|
|
|
func (m *imlPluginClusterModule) UpdateDefine(ctx context.Context, defines []*plugin_model.Define) error {
|
|
err := m.service.SaveDefine(ctx, defines)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return m.initAllCluster(ctx)
|
|
}
|
|
func (m *imlPluginClusterModule) initAllCluster(ctx context.Context) error {
|
|
|
|
clusters, err := m.clusterService.List(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, c := range clusters {
|
|
err := m.initCluster(ctx, c.Uuid)
|
|
if err != nil {
|
|
log.Warn("init cluster:%s %s", c.Name, err.Error())
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
func (m *imlPluginClusterModule) initGateway(ctx context.Context, clusterId string, clientDriver gateway.IClientDriver) error {
|
|
configForPartitions, err := m.service.ListCluster(ctx, clusterId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pluginConfigs := utils.SliceToSlice(configForPartitions, func(s *plugin_cluster.ConfigPartition) *gateway.PluginConfig {
|
|
|
|
return &gateway.PluginConfig{
|
|
Id: s.Extend,
|
|
Name: s.Plugin,
|
|
Config: s.Config.Config,
|
|
Status: s.Status.String(),
|
|
}
|
|
})
|
|
|
|
return clientDriver.PluginSetting().Set(ctx, pluginConfigs)
|
|
}
|
|
func (m *imlPluginClusterModule) GetDefine(ctx context.Context, name string) (*dto.Define, error) {
|
|
define, err := m.service.GetDefine(ctx, name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.Define{
|
|
Name: define.Name,
|
|
Cname: define.Cname,
|
|
Desc: define.Desc,
|
|
Default: define.Config,
|
|
Render: define.Render,
|
|
Extend: define.Extend,
|
|
}, nil
|
|
}
|
|
|
|
func (m *imlPluginClusterModule) Options(ctx context.Context) ([]*dto.PluginOption, error) {
|
|
defines, err := m.service.Defines(ctx, plugin_model.OpenKind)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return utils.SliceToSlice(defines, func(s *plugin_cluster.PluginDefine) *dto.PluginOption {
|
|
return &dto.PluginOption{
|
|
Name: s.Name,
|
|
Cname: s.Cname,
|
|
Desc: s.Desc,
|
|
Default: s.Config,
|
|
Render: s.Render,
|
|
}
|
|
}), nil
|
|
}
|
|
|
|
func (m *imlPluginClusterModule) List(ctx context.Context, clusterId string) ([]*dto.Item, error) {
|
|
|
|
configPartitions, err := m.service.ListCluster(ctx, clusterId, plugin_model.OpenKind)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return utils.SliceToSlice(configPartitions, func(s *plugin_cluster.ConfigPartition) *dto.Item {
|
|
return &dto.Item{
|
|
|
|
Name: s.Plugin,
|
|
Cname: s.Cname,
|
|
Desc: s.Desc,
|
|
Extend: s.Extend,
|
|
Operator: auto.UUIDP(s.Operator),
|
|
Update: (*auto.TimeLabel)(s.Update),
|
|
Create: (*auto.TimeLabel)(s.Create),
|
|
}
|
|
}), nil
|
|
}
|
|
|
|
func (m *imlPluginClusterModule) Get(ctx context.Context, clusterId string, name string) (config *dto.PluginOutput, render plugin_model.Render, er error) {
|
|
if clusterId == "" {
|
|
return nil, nil, fmt.Errorf("partition is require")
|
|
}
|
|
cf, define, err := m.service.GetConfig(ctx, clusterId, name)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
if define.Kind != plugin_model.OpenKind {
|
|
return nil, nil, fmt.Errorf("plugin %s [extend:%s] not support for setting ", name, define.Extend)
|
|
}
|
|
out := &dto.PluginOutput{
|
|
//Cluster: auto.UUID(cf.Cluster),
|
|
Name: cf.Plugin,
|
|
Cname: define.Cname,
|
|
Extend: define.Extend,
|
|
Desc: define.Desc,
|
|
Status: cf.Status,
|
|
Config: cf.Config,
|
|
}
|
|
if cf.Operator != "" {
|
|
out.Operator = auto.UUIDP(cf.Operator)
|
|
}
|
|
if cf.Create != nil {
|
|
out.Create = (*auto.TimeLabel)(cf.Create)
|
|
}
|
|
if cf.Update != nil {
|
|
out.Update = (*auto.TimeLabel)(cf.Update)
|
|
}
|
|
return out, define.Render, nil
|
|
|
|
}
|
|
|
|
func (m *imlPluginClusterModule) Set(ctx context.Context, clusterId string, name string, config *dto.PluginSetting) error {
|
|
|
|
err := m.service.SetCluster(ctx, clusterId, name, config.Status, config.Config)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return m.initCluster(ctx, clusterId)
|
|
}
|
|
|
|
func (m *imlPluginClusterModule) initCluster(ctx context.Context, clusterId string) error {
|
|
client, err := m.clusterService.GatewayClient(ctx, clusterId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func() {
|
|
err := client.Close(ctx)
|
|
if err != nil {
|
|
log.Warn("close apinto client:", err)
|
|
}
|
|
}()
|
|
return m.initGateway(ctx, clusterId, client)
|
|
}
|