mirror of
https://github.com/APIParkLab/APIPark.git
synced 2026-06-14 20:41:15 +08:00
108 lines
2.6 KiB
Go
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)
|
|
}
|