| @@ -4,6 +4,7 @@ import ( | |||||
| c "gitlink.org.cn/cloudream/common/utils/config" | c "gitlink.org.cn/cloudream/common/utils/config" | ||||
| "gitlink.org.cn/cloudream/common/utils/ipfs" | "gitlink.org.cn/cloudream/common/utils/ipfs" | ||||
| log "gitlink.org.cn/cloudream/common/utils/logger" | log "gitlink.org.cn/cloudream/common/utils/logger" | ||||
| dbcfg "gitlink.org.cn/cloudream/db/config" | |||||
| racfg "gitlink.org.cn/cloudream/rabbitmq/config" | racfg "gitlink.org.cn/cloudream/rabbitmq/config" | ||||
| ) | ) | ||||
| @@ -15,6 +16,7 @@ type Config struct { | |||||
| Logger log.Config `json:"logger"` | Logger log.Config `json:"logger"` | ||||
| RabbitMQ racfg.Config `json:"rabbitMQ"` | RabbitMQ racfg.Config `json:"rabbitMQ"` | ||||
| IPFS ipfs.Config `json:"ipfs"` | IPFS ipfs.Config `json:"ipfs"` | ||||
| DB dbcfg.Config `json:"db"` | |||||
| } | } | ||||
| var cfg Config | var cfg Config | ||||
| @@ -3,13 +3,18 @@ package event | |||||
| import ( | import ( | ||||
| "gitlink.org.cn/cloudream/agent/internal/config" | "gitlink.org.cn/cloudream/agent/internal/config" | ||||
| "gitlink.org.cn/cloudream/common/consts" | "gitlink.org.cn/cloudream/common/consts" | ||||
| agtevt "gitlink.org.cn/cloudream/rabbitmq/message/agent/event" | |||||
| scmsg "gitlink.org.cn/cloudream/rabbitmq/message/scanner" | scmsg "gitlink.org.cn/cloudream/rabbitmq/message/scanner" | ||||
| sctsk "gitlink.org.cn/cloudream/rabbitmq/message/scanner/event" | |||||
| scevt "gitlink.org.cn/cloudream/rabbitmq/message/scanner/event" | |||||
| ) | ) | ||||
| type CheckState struct { | type CheckState struct { | ||||
| } | } | ||||
| func NewCheckState() *CheckState { | |||||
| return &CheckState{} | |||||
| } | |||||
| func (t *CheckState) TryMerge(other Event) bool { | func (t *CheckState) TryMerge(other Event) bool { | ||||
| _, ok := other.(*CheckState) | _, ok := other.(*CheckState) | ||||
| return ok | return ok | ||||
| @@ -23,5 +28,9 @@ func (t *CheckState) Execute(execCtx ExecuteContext) { | |||||
| } | } | ||||
| // 紧急任务 | // 紧急任务 | ||||
| execCtx.Args.Scanner.PostEvent(scmsg.NewPostEventBody(sctsk.NewUpdateAgentState(config.Cfg().ID, ipfsStatus), true, true)) | |||||
| execCtx.Args.Scanner.PostEvent(scmsg.NewPostEventBody(scevt.NewUpdateAgentState(config.Cfg().ID, ipfsStatus), true, true)) | |||||
| } | |||||
| func init() { | |||||
| Register(func(val agtevt.CheckState) Event { return NewCheckState() }) | |||||
| } | } | ||||
| @@ -1,7 +1,11 @@ | |||||
| package event | package event | ||||
| import ( | import ( | ||||
| "fmt" | |||||
| "reflect" | |||||
| event "gitlink.org.cn/cloudream/common/pkg/event" | event "gitlink.org.cn/cloudream/common/pkg/event" | ||||
| "gitlink.org.cn/cloudream/common/pkg/typedispatcher" | |||||
| "gitlink.org.cn/cloudream/common/utils/ipfs" | "gitlink.org.cn/cloudream/common/utils/ipfs" | ||||
| mydb "gitlink.org.cn/cloudream/db" | mydb "gitlink.org.cn/cloudream/db" | ||||
| sccli "gitlink.org.cn/cloudream/rabbitmq/client/scanner" | sccli "gitlink.org.cn/cloudream/rabbitmq/client/scanner" | ||||
| @@ -18,3 +22,28 @@ type Executor = event.Executor[ExecuteArgs] | |||||
| type ExecuteContext = event.ExecuteContext[ExecuteArgs] | type ExecuteContext = event.ExecuteContext[ExecuteArgs] | ||||
| type Event = event.Event[ExecuteArgs] | type Event = event.Event[ExecuteArgs] | ||||
| type ExecuteOption = event.ExecuteOption | |||||
| func NewExecutor(scanner *sccli.ScannerClient, db *mydb.DB, ipfs *ipfs.IPFS) Executor { | |||||
| return event.NewExecutor(ExecuteArgs{ | |||||
| Scanner: scanner, | |||||
| DB: db, | |||||
| IPFS: ipfs, | |||||
| }) | |||||
| } | |||||
| var msgDispatcher typedispatcher.TypeDispatcher[Event] | |||||
| func FromMessage(msg any) (Event, error) { | |||||
| event, ok := msgDispatcher.Dispatch(msg) | |||||
| if !ok { | |||||
| return nil, fmt.Errorf("unknow event message type: %s", reflect.TypeOf(msg).Name()) | |||||
| } | |||||
| return event, nil | |||||
| } | |||||
| func Register[T any](converter func(msg T) Event) { | |||||
| typedispatcher.Add(msgDispatcher, converter) | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| package cmd | |||||
| import ( | |||||
| "gitlink.org.cn/cloudream/agent/internal/event" | |||||
| "gitlink.org.cn/cloudream/common/utils/logger" | |||||
| agtmsg "gitlink.org.cn/cloudream/rabbitmq/message/agent" | |||||
| agtevt "gitlink.org.cn/cloudream/rabbitmq/message/agent/event" | |||||
| ) | |||||
| func (svc *Service) PostEvent(msg *agtmsg.PostEvent) { | |||||
| evtMsg, err := agtevt.MapToMessage(msg.Body.Event.(map[string]any)) | |||||
| if err != nil { | |||||
| logger.Warnf("convert map to event message failed, err: %s", err.Error()) | |||||
| return | |||||
| } | |||||
| evt, err := event.FromMessage(evtMsg) | |||||
| if err != nil { | |||||
| logger.Warnf("create event from event message failed, err: %s", err.Error()) | |||||
| return | |||||
| } | |||||
| svc.eventExecutor.Post(evt, event.ExecuteOption{ | |||||
| IsEmergency: msg.Body.IsEmergency, | |||||
| DontMerge: msg.Body.DontMerge, | |||||
| }) | |||||
| } | |||||
| @@ -1,13 +1,18 @@ | |||||
| package cmd | package cmd | ||||
| import "gitlink.org.cn/cloudream/common/utils/ipfs" | |||||
| import ( | |||||
| "gitlink.org.cn/cloudream/agent/internal/event" | |||||
| "gitlink.org.cn/cloudream/common/utils/ipfs" | |||||
| ) | |||||
| type Service struct { | type Service struct { | ||||
| ipfs *ipfs.IPFS | |||||
| ipfs *ipfs.IPFS | |||||
| eventExecutor *event.Executor | |||||
| } | } | ||||
| func NewService(ipfs *ipfs.IPFS) *Service { | |||||
| func NewService(ipfs *ipfs.IPFS, eventExecutor *event.Executor) *Service { | |||||
| return &Service{ | return &Service{ | ||||
| ipfs: ipfs, | |||||
| ipfs: ipfs, | |||||
| eventExecutor: eventExecutor, | |||||
| } | } | ||||
| } | } | ||||
| @@ -7,8 +7,10 @@ import ( | |||||
| "sync" | "sync" | ||||
| "gitlink.org.cn/cloudream/agent/internal/config" | "gitlink.org.cn/cloudream/agent/internal/config" | ||||
| "gitlink.org.cn/cloudream/agent/internal/event" | |||||
| "gitlink.org.cn/cloudream/common/utils/ipfs" | "gitlink.org.cn/cloudream/common/utils/ipfs" | ||||
| log "gitlink.org.cn/cloudream/common/utils/logger" | log "gitlink.org.cn/cloudream/common/utils/logger" | ||||
| "gitlink.org.cn/cloudream/db" | |||||
| agentserver "gitlink.org.cn/cloudream/proto" | agentserver "gitlink.org.cn/cloudream/proto" | ||||
| "google.golang.org/grpc" | "google.golang.org/grpc" | ||||
| @@ -17,6 +19,7 @@ import ( | |||||
| cmdsvc "gitlink.org.cn/cloudream/agent/internal/services/cmd" | cmdsvc "gitlink.org.cn/cloudream/agent/internal/services/cmd" | ||||
| grpcsvc "gitlink.org.cn/cloudream/agent/internal/services/grpc" | grpcsvc "gitlink.org.cn/cloudream/agent/internal/services/grpc" | ||||
| sccli "gitlink.org.cn/cloudream/rabbitmq/client/scanner" | |||||
| ) | ) | ||||
| // TODO 此数据是否在运行时会发生变化? | // TODO 此数据是否在运行时会发生变化? | ||||
| @@ -38,6 +41,16 @@ func main() { | |||||
| os.Exit(1) | os.Exit(1) | ||||
| } | } | ||||
| scanner, err := sccli.NewScannerClient(&config.Cfg().RabbitMQ) | |||||
| if err != nil { | |||||
| log.Fatalf("new scanner client failed, err: %s", err.Error()) | |||||
| } | |||||
| db, err := db.NewDB(&config.Cfg().DB) | |||||
| if err != nil { | |||||
| log.Fatalf("new db failed, err: %s", err.Error()) | |||||
| } | |||||
| ipfs, err := ipfs.NewIPFS(&config.Cfg().IPFS) | ipfs, err := ipfs.NewIPFS(&config.Cfg().IPFS) | ||||
| if err != nil { | if err != nil { | ||||
| log.Fatalf("new ipfs failed, err: %s", err.Error()) | log.Fatalf("new ipfs failed, err: %s", err.Error()) | ||||
| @@ -45,11 +58,14 @@ func main() { | |||||
| //处置协调端、客户端命令(可多建几个) | //处置协调端、客户端命令(可多建几个) | ||||
| wg := sync.WaitGroup{} | wg := sync.WaitGroup{} | ||||
| wg.Add(2) | |||||
| wg.Add(4) | |||||
| eventExecutor := event.NewExecutor(scanner, db, ipfs) | |||||
| go serveEventExecutor(&eventExecutor, &wg) | |||||
| // 启动命令服务器 | // 启动命令服务器 | ||||
| // TODO 需要设计AgentID持久化机制 | // TODO 需要设计AgentID持久化机制 | ||||
| agtSvr, err := rasvr.NewAgentServer(cmdsvc.NewService(ipfs), config.Cfg().ID, &config.Cfg().RabbitMQ) | |||||
| agtSvr, err := rasvr.NewAgentServer(cmdsvc.NewService(ipfs, &eventExecutor), config.Cfg().ID, &config.Cfg().RabbitMQ) | |||||
| if err != nil { | if err != nil { | ||||
| log.Fatalf("new agent server failed, err: %s", err.Error()) | log.Fatalf("new agent server failed, err: %s", err.Error()) | ||||
| } | } | ||||
| @@ -69,7 +85,7 @@ func main() { | |||||
| s := grpc.NewServer() | s := grpc.NewServer() | ||||
| agentserver.RegisterFileTransportServer(s, grpcsvc.NewService(ipfs)) | agentserver.RegisterFileTransportServer(s, grpcsvc.NewService(ipfs)) | ||||
| s.Serve(lis) | |||||
| go serveGRPC(s, lis, &wg) | |||||
| wg.Wait() | wg.Wait() | ||||
| } | } | ||||
| @@ -87,3 +103,31 @@ func serveAgentServer(server *rasvr.AgentServer, wg *sync.WaitGroup) { | |||||
| wg.Done() | wg.Done() | ||||
| } | } | ||||
| func serveEventExecutor(executor *event.Executor, wg *sync.WaitGroup) { | |||||
| log.Info("start serving event executor") | |||||
| err := executor.Execute() | |||||
| if err != nil { | |||||
| log.Errorf("event executor stopped with error: %s", err.Error()) | |||||
| } | |||||
| log.Info("event executor stopped") | |||||
| wg.Done() | |||||
| } | |||||
| func serveGRPC(s *grpc.Server, lis net.Listener, wg *sync.WaitGroup) { | |||||
| log.Info("start serving grpc") | |||||
| err := s.Serve(lis) | |||||
| if err != nil { | |||||
| log.Errorf("grpc stopped with error: %s", err.Error()) | |||||
| } | |||||
| log.Info("grpc stopped") | |||||
| wg.Done() | |||||
| } | |||||