Files
2024-08-12 21:38:09 +08:00

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)
}