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  }