github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/integration/testutil/server.go (about) 1 // Copyright (c) 2022, R.I. Pienaar and the Choria Project contributors 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package testutil 6 7 import ( 8 "context" 9 "sync" 10 11 "github.com/choria-io/go-choria/choria" 12 "github.com/choria-io/go-choria/config" 13 "github.com/choria-io/go-choria/providers/agent/mcorpc/golang/choriautil" 14 "github.com/choria-io/go-choria/providers/agent/mcorpc/golang/discovery" 15 "github.com/choria-io/go-choria/providers/agent/mcorpc/golang/rpcutil" 16 "github.com/choria-io/go-choria/providers/data" 17 "github.com/choria-io/go-choria/providers/data/golang/choriadata" 18 "github.com/choria-io/go-choria/scout/data/scoutdata" 19 "github.com/choria-io/go-choria/server" 20 "github.com/sirupsen/logrus" 21 ) 22 23 type ServerInstanceOptions struct { 24 NoDataPlugins bool 25 Discovery bool 26 RPCUtilAgent bool 27 ChoriaUtilAgent bool 28 } 29 30 type ServerInstanceOption func(options *ServerInstanceOptions) 31 32 func ServerWithDiscovery() ServerInstanceOption { 33 return func(opts *ServerInstanceOptions) { 34 opts.Discovery = true 35 } 36 } 37 38 func ServerWithRPCUtilAgent() ServerInstanceOption { 39 return func(opts *ServerInstanceOptions) { 40 opts.RPCUtilAgent = true 41 } 42 } 43 44 func ServerWithChoriaUtilAgent() ServerInstanceOption { 45 return func(opts *ServerInstanceOptions) { 46 opts.ChoriaUtilAgent = true 47 } 48 } 49 50 func ServerWithOutDataPlugins() ServerInstanceOption { 51 return func(opts *ServerInstanceOptions) { 52 opts.NoDataPlugins = true 53 } 54 } 55 56 func StartServerInstance(ctx context.Context, wg *sync.WaitGroup, cfgFile string, log *logrus.Logger, opts ...ServerInstanceOption) (*server.Instance, error) { 57 siopt := ServerInstanceOptions{} 58 for _, opt := range opts { 59 opt(&siopt) 60 } 61 62 cfg, err := config.NewSystemConfig(cfgFile, true) 63 if err != nil { 64 return nil, err 65 } 66 67 cfg.CustomLogger = log 68 69 fw, err := choria.NewWithConfig(cfg) 70 if err != nil { 71 return nil, err 72 } 73 74 srv, err := server.NewInstance(fw) 75 if err != nil { 76 return nil, err 77 } 78 79 if !siopt.NoDataPlugins { 80 data.RegisterPlugin("scout", scoutdata.ChoriaPlugin().Creator) 81 data.RegisterPlugin("choria", choriadata.ChoriaPlugin().Creator) 82 } 83 84 wg.Add(1) 85 err = srv.Run(ctx, wg) 86 if err != nil { 87 return nil, err 88 } 89 90 // wait for connection 91 for { 92 if srv.Status().ConnectedServer != "" { 93 break 94 } 95 96 if ctx.Err() != nil { 97 break 98 } 99 } 100 101 if siopt.Discovery { 102 da, err := discovery.New(srv.AgentManager()) 103 if err != nil { 104 return nil, err 105 } 106 err = srv.AgentManager().RegisterAgent(ctx, "discovery", da, srv.Connector()) 107 if err != nil { 108 return nil, err 109 } 110 } 111 112 if siopt.RPCUtilAgent { 113 rpcutilAgent, err := rpcutil.New(srv.AgentManager()) 114 if err != nil { 115 return nil, err 116 } 117 err = srv.AgentManager().RegisterAgent(ctx, "rpcutil", rpcutilAgent, srv.Connector()) 118 if err != nil { 119 return nil, err 120 } 121 } 122 123 if siopt.ChoriaUtilAgent { 124 cua, err := choriautil.New(srv.AgentManager()) 125 if err != nil { 126 return nil, err 127 } 128 err = srv.AgentManager().RegisterAgent(ctx, "choria_util", cua, srv.Connector()) 129 if err != nil { 130 return nil, err 131 } 132 } 133 134 return srv, nil 135 }