Files
APIPark/gateway/apinto/dynamic.go
2024-12-09 00:17:50 +08:00

108 lines
2.6 KiB
Go

package apinto
import (
"context"
"errors"
"github.com/eolinker/go-common/encoding"
"github.com/eolinker/eosc/process-admin/cmd/proto"
"github.com/APIParkLab/APIPark/gateway/apinto/entity"
"github.com/APIParkLab/APIPark/gateway"
admin_client "github.com/eolinker/eosc/process-admin/client"
)
var _ gateway.IDynamicClient = &DynamicClient{}
func NewDynamicClient(client admin_client.Client, resource string) (*DynamicClient, error) {
cfg, has := gateway.GetDynamicResourceDriver(resource)
if !has {
return nil, errors.New("resource not found")
}
return &DynamicClient{client: client, profession: cfg.Profession, driver: cfg.Driver}, nil
}
type DynamicClient struct {
profession string
driver string
client admin_client.Client
}
func (d *DynamicClient) Version(ctx context.Context, resourceId string) (string, error) {
worker, err := d.client.Get(ctx, genWorkerID(resourceId, d.profession))
if err != nil {
return "", err
}
if len(worker) == 0 {
return "", nil
}
var item entity.BasicInfo
err = worker.Scan(encoding.Json[entity.BasicInfo](&item))
if err != nil {
return "", err
}
return item.Version, nil
}
func (d *DynamicClient) Versions(ctx context.Context, matchLabels map[string]string) (map[string]string, error) {
workers, err := d.client.MatchLabels(ctx, d.profession, matchLabels)
if err != nil {
if errors.Is(err, proto.Nil) {
return nil, nil
}
return nil, err
}
versions := make(map[string]string)
for _, worker := range workers {
var item entity.BasicInfo
err = worker.Scan(encoding.Json[entity.BasicInfo](&item))
if err != nil {
return nil, err
}
versions[item.Name] = item.Version
}
return versions, nil
}
func (d *DynamicClient) Online(ctx context.Context, resources ...*gateway.DynamicRelease) error {
err := d.client.Begin(ctx)
if err != nil {
return err
}
for _, r := range resources {
id := genWorkerID(r.ID, d.profession)
worker := entity.NewWorkerItem[map[string]interface{}](&entity.BasicInfo{
ID: id,
Name: r.ID,
Description: r.Description,
Driver: d.driver,
Version: r.Version,
Matches: r.MatchLabels,
}, &r.Attr)
err = d.client.Set(ctx, id, worker)
if err != nil {
d.client.Rollback(ctx)
return err
}
}
return d.client.Commit(ctx)
}
func (d *DynamicClient) Offline(ctx context.Context, resources ...*gateway.DynamicRelease) error {
err := d.client.Begin(ctx)
if err != nil {
return err
}
for _, r := range resources {
err = d.client.Del(ctx, genWorkerID(r.ID, d.profession))
if err != nil {
d.client.Rollback(ctx)
return err
}
}
return d.client.Commit(ctx)
}