From 19fcae0d71c470f6d81e5d7b6b73a4c1bbf79608 Mon Sep 17 00:00:00 2001 From: "Richard T. Carback III" <rick.carback@gmail.com> Date: Wed, 20 Apr 2022 22:29:08 +0000 Subject: [PATCH] Rework the parameters setup to fall under a single api params object --- api/client.go | 37 +++++++---------- cmd/fileTransfer.go | 10 +++-- cmd/group.go | 5 ++- cmd/root.go | 87 ++++++++++++++++++--------------------- cmd/single.go | 5 ++- cmix/client.go | 2 +- cmix/health/tracker.go | 5 ++- cmix/interface.go | 5 ++- cmix/message/services.go | 4 ++ e2e/critical.go | 2 +- e2e/manager.go | 2 +- e2e/params.go | 14 ++----- e2e/sendE2E.go | 10 ++--- e2e/sendUnsafe.go | 3 +- fileTransfer/sendE2e.go | 4 +- groupChat/sendRequests.go | 5 ++- 16 files changed, 97 insertions(+), 103 deletions(-) diff --git a/api/client.go b/api/client.go index 9f4b68968..0c775b99e 100644 --- a/api/client.go +++ b/api/client.go @@ -192,7 +192,7 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, // OpenClient session, but don't connect to the network or log in func OpenClient(storageDir string, password []byte, - parameters e2e.Params) (*Client, error) { + parameters Params) (*Client, error) { jww.INFO.Printf("OpenClient()") rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, @@ -222,7 +222,7 @@ func OpenClient(storageDir string, password []byte, comms: nil, network: nil, followerServices: newServices(), - parameters: parameters, + parameters: parameters.E2E, clientErrorChannel: make(chan interfaces.ClientError, 1000), events: event.NewEventManager(), backup: &backup.Backup{}, @@ -282,7 +282,7 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password, // Login initializes a client object from existing storage. func Login(storageDir string, password []byte, - authCallbacks auth.Callbacks, parameters e2e.Params) (*Client, error) { + authCallbacks auth.Callbacks, parameters Params) (*Client, error) { jww.INFO.Printf("Login()") c, err := OpenClient(storageDir, password, parameters) @@ -328,7 +328,7 @@ func Login(storageDir string, password []byte, } } - c.network, err = cmix.NewClient(parameters.Network, c.comms, c.storage, + c.network, err = cmix.NewClient(parameters.CMix, c.comms, c.storage, c.storage.GetNDF(), c.rng, c.events) if err != nil { return nil, err @@ -364,7 +364,7 @@ func Login(storageDir string, password []byte, // procedures and is generally unsafe. func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, newBaseNdf string, authCallbacks auth.Callbacks, - parameters e2e.Params) (*Client, error) { + params Params) (*Client, error) { jww.INFO.Printf("LoginWithNewBaseNDF_UNSAFE()") def, err := parseNDF(newBaseNdf) @@ -372,7 +372,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, return nil, err } - c, err := OpenClient(storageDir, password, parameters) + c, err := OpenClient(storageDir, password, params) if err != nil { return nil, err } @@ -396,7 +396,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, "able to register or track network.") } - c.network, err = cmix.NewClient(parameters.Network, c.comms, c.storage, + c.network, err = cmix.NewClient(params.CMix, c.comms, c.storage, c.storage.GetNDF(), c.rng, c.events) if err != nil { return nil, err @@ -412,9 +412,8 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, // FIXME: The callbacks need to be set, so I suppose we would need to // either set them via a special type or add them // to the login call? - authParams := auth.GetDefaultParams() c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, authParams, authCallbacks, c.backup.TriggerBackup) + c.events, params.Auth, authCallbacks, c.backup.TriggerBackup) if err != nil { return nil, err } @@ -432,7 +431,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, // some specific deployment procedures and is generally unsafe. func LoginWithProtoClient(storageDir string, password []byte, protoClientJSON []byte, newBaseNdf string, authCallbacks auth.Callbacks, - parameters e2e.Params) (*Client, error) { + params Params) (*Client, error) { jww.INFO.Printf("LoginWithProtoClient()") def, err := parseNDF(newBaseNdf) @@ -446,7 +445,7 @@ func LoginWithProtoClient(storageDir string, password []byte, return nil, err } - c, err := OpenClient(storageDir, password, parameters) + c, err := OpenClient(storageDir, password, params) if err != nil { return nil, err } @@ -463,7 +462,7 @@ func LoginWithProtoClient(storageDir string, password []byte, return nil, err } - c.network, err = cmix.NewClient(parameters.Network, c.comms, c.storage, + c.network, err = cmix.NewClient(params.CMix, c.comms, c.storage, c.storage.GetNDF(), c.rng, c.events) if err != nil { return nil, err @@ -479,9 +478,8 @@ func LoginWithProtoClient(storageDir string, password []byte, // FIXME: The callbacks need to be set, so I suppose we would need to // either set them via a special type or add them // to the login call? - authParams := auth.GetDefaultParams() c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, authParams, authCallbacks, c.backup.TriggerBackup) + c.events, params.Auth, authCallbacks, c.backup.TriggerBackup) if err != nil { return nil, err } @@ -650,12 +648,6 @@ func (c *Client) HasRunningProcessies() bool { return !c.followerServices.stoppable.IsStopped() } -// Returns the health tracker for registration and polling -func (c *Client) GetHealth() interfaces.HealthTracker { - jww.INFO.Printf("GetHealth()") - return c.GetHealth() -} - // RegisterRoundEventsCb registers a callback for round // events. func (c *Client) GetRoundEvents() interfaces.RoundEvents { @@ -755,7 +747,7 @@ func (c *Client) InitializeBackup(backupPass string, // healthy. func (c *Client) GetNodeRegistrationStatus() (int, int, error) { // Return an error if the network is not healthy - if !c.GetHealth().IsHealthy() { + if !c.GetNetworkInterface().IsHealthy() { return 0, 0, errors.New("Cannot get number of nodes " + "registrations when network is not healthy") } @@ -946,9 +938,8 @@ func checkVersionAndSetupStorage(def *ndf.NetworkDefinition, } // create new E2E - rekeyParams := rekey.GetDefaultParams() err = e2e.Init(storageSess.GetKV(), protoUser.ReceptionID, - protoUser.E2eDhPrivateKey, e2eGrp, rekeyParams) + protoUser.E2eDhPrivateKey, e2eGrp, rekey.GetDefaultParams()) if err != nil { return nil, err } diff --git a/cmd/fileTransfer.go b/cmd/fileTransfer.go index 3241d67ca..78442b9af 100644 --- a/cmd/fileTransfer.go +++ b/cmd/fileTransfer.go @@ -9,6 +9,9 @@ package cmd import ( "fmt" + "io/ioutil" + "time" + "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" @@ -19,8 +22,6 @@ import ( "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "gitlab.com/xx_network/primitives/utils" - "io/ioutil" - "time" ) const callbackPeriod = 25 * time.Millisecond @@ -53,7 +54,10 @@ var ftCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetHealth().AddChannel(connected) + client.GetNetworkInterface().AddHealthCallback( + func(isconnected bool) { + connected <- isconnected + }) waitUntilConnected(connected) // After connection, wait until registered with at least 85% of nodes diff --git a/cmd/group.go b/cmd/group.go index ded3a3f56..df0c3902b 100644 --- a/cmd/group.go +++ b/cmd/group.go @@ -47,7 +47,10 @@ var groupCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetHealth().AddChannel(connected) + client.GetNetworkInterface().AddHealthCallback( + func(isconnected bool) { + connected <- isconnected + }) waitUntilConnected(connected) // After connection, make sure we have registered with at least 85% of diff --git a/cmd/root.go b/cmd/root.go index 569fda287..7bcfff2ac 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -27,7 +27,6 @@ import ( "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/e2e" "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "github.com/spf13/cobra" @@ -221,7 +220,10 @@ var rootCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetHealth().AddChannel(connected) + client.GetNetworkInterface().AddHealthCallback( + func(isconnected bool) { + connected <- isconnected + }) waitUntilConnected(connected) // err = client.RegisterForNotifications("dJwuGGX3KUyKldWK5PgQH8:APA91bFjuvimRc4LqOyMDiy124aLedifA8DhldtaB_b76ggphnFYQWJc_fq0hzQ-Jk4iYp2wPpkwlpE1fsOjs7XWBexWcNZoU-zgMiM0Mso9vTN53RhbXUferCbAiEylucEOacy9pniN") @@ -328,12 +330,9 @@ var rootCmd = &cobra.Command{ mt := catalog.MessageType(catalog.XxMessage) payload := []byte(msgBody) recipient := recipientID - paramsE2E := e2e.GetDefaultParams() + params := initParams() wg := &sync.WaitGroup{} sendCnt := int(viper.GetUint("sendCount")) - if viper.GetBool("splitSends") { - paramsE2E.CMIX.ExcludedRounds = excludedRounds.NewSet() - } wg.Add(sendCnt) go func() { sendDelay := time.Duration(viper.GetUint("sendDelay")) @@ -346,16 +345,16 @@ var rootCmd = &cobra.Command{ var roundIDs []id.Round var roundTimeout time.Duration if unsafe { - paramsE2E.CMIX.DebugTag = "cmd.Unsafe" + params.E2E.CMIXParams.DebugTag = "cmd.Unsafe" roundIDs, _, err = client.SendUnsafe( mt, recipient, payload, - paramsE2E) - roundTimeout = paramsE2E.CMIX.Timeout + params.E2E) + roundTimeout = params.Network.Timeout } else { - paramsE2E.CMIX.DebugTag = "cmd.E2E" + params.E2E.CMIXParams.DebugTag = "cmd.E2E" roundIDs, _, _, err = client.SendE2E(mt, - recipient, payload, paramsE2E) - roundTimeout = paramsE2E.CMIX.Timeout + recipient, payload, params.E2E) + roundTimeout = params.E2E.CMIXParams.Timeout } if err != nil { jww.FATAL.Panicf("%+v", err) @@ -553,30 +552,38 @@ func createClient() *api.Client { } } - netParams := e2e.GetDefaultParams() - sessParams := session.GetDefaultParams() - sessParams.MinKeys = uint16(viper.GetUint("e2eMinKeys")) - sessParams.MaxKeys = uint16(viper.GetUint("e2eMaxKeys")) - sessParams.NumRekeys = uint16(viper.GetUint("e2eNumReKeys")) - sessParams.RekeyThreshold = viper.GetFloat64("e2eRekeyThreshold") - netParams.Network.Pickup.ForceHistoricalRounds = viper.GetBool( + params := initParams() + + client, err := api.OpenClient(storeDir, pass, params) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + return client +} + +func initParams() api.Params { + p := api.GetDefaultParams() + p.Session.MinKeys = uint16(viper.GetUint("e2eMinKeys")) + p.Session.MaxKeys = uint16(viper.GetUint("e2eMaxKeys")) + p.Session.NumRekeys = uint16(viper.GetUint("e2eNumReKeys")) + p.Session.RekeyThreshold = viper.GetFloat64("e2eRekeyThreshold") + p.CMix.Pickup.ForceHistoricalRounds = viper.GetBool( "forceHistoricalRounds") - netParams.Network.FastPolling = !viper.GetBool("slowPolling") - netParams.Network.Pickup.ForceMessagePickupRetry = viper.GetBool( + p.CMix.FastPolling = !viper.GetBool("slowPolling") + p.CMix.Pickup.ForceMessagePickupRetry = viper.GetBool( "forceMessagePickupRetry") - if netParams.Network.Pickup.ForceMessagePickupRetry { + if p.CMix.Pickup.ForceMessagePickupRetry { period := 3 * time.Second jww.INFO.Printf("Setting Uncheck Round Period to %v", period) - netParams.Network.Pickup.UncheckRoundPeriod = period + p.CMix.Pickup.UncheckRoundPeriod = period } - netParams.Network.VerboseRoundTracking = viper.GetBool( + p.CMix.VerboseRoundTracking = viper.GetBool( "verboseRoundTracking") - - client, err := api.OpenClient(storeDir, pass, netParams) - if err != nil { - jww.FATAL.Panicf("%+v", err) + if viper.GetBool("splitSends") { + p.Network.ExcludedRounds = excludedRounds.NewSet() } - return client + + return p } func initClient() *api.Client { @@ -585,29 +592,13 @@ func initClient() *api.Client { pass := parsePassword(viper.GetString("password")) storeDir := viper.GetString("session") jww.DEBUG.Printf("sessionDur: %v", storeDir) - netParams := e2e.GetDefaultParams() - sessParams := session.GetDefaultParams() - sessParams.MinKeys = uint16(viper.GetUint("e2eMinKeys")) - sessParams.MaxKeys = uint16(viper.GetUint("e2eMaxKeys")) - sessParams.NumRekeys = uint16(viper.GetUint("e2eNumReKeys")) - sessParams.RekeyThreshold = viper.GetFloat64("e2eRekeyThreshold") - netParams.Network.Pickup.ForceHistoricalRounds = viper.GetBool( - "forceHistoricalRounds") - netParams.Network.FastPolling = !viper.GetBool("slowPolling") - netParams.Network.Pickup.ForceMessagePickupRetry = viper.GetBool( - "forceMessagePickupRetry") - if netParams.Network.Pickup.ForceMessagePickupRetry { - period := 3 * time.Second - jww.INFO.Printf("Setting Uncheck Round Period to %v", period) - netParams.Network.Pickup.UncheckRoundPeriod = period - } - netParams.Network.VerboseRoundTracking = viper.GetBool( - "verboseRoundTracking") + + params := initParams() // load the client authCbs := makeAuthCallbacks(nil, viper.GetBool("unsafe-channel-creation")) - client, err := api.Login(storeDir, pass, authCbs, netParams) + client, err := api.Login(storeDir, pass, authCbs, params) authCbs.client = client if err != nil { jww.FATAL.Panicf("%+v", err) diff --git a/cmd/single.go b/cmd/single.go index 3c72ec96b..ce698a01a 100644 --- a/cmd/single.go +++ b/cmd/single.go @@ -48,7 +48,10 @@ var singleCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetHealth().AddChannel(connected) + client.GetNetworkInterface().AddHealthCallback( + func(isconnected bool) { + connected <- isconnected + }) waitUntilConnected(connected) // get the tag diff --git a/cmix/client.go b/cmix/client.go index 1dd7cff35..116d3cbc1 100644 --- a/cmix/client.go +++ b/cmix/client.go @@ -185,7 +185,7 @@ func NewClient(params Params, comms *commClient.Comms, session storage.Session, session.GetKV(), c.Monitor, c.instance.GetRoundEvents(), critSender) // Report health events - c.Monitor.AddHealthCallback(func(isHealthy bool) { + c.AddHealthCallback(func(isHealthy bool) { c.events.Report(5, "health", "IsHealthy", strconv.FormatBool(isHealthy)) }) diff --git a/cmix/health/tracker.go b/cmix/health/tracker.go index 20566459b..3f2a932e9 100644 --- a/cmix/health/tracker.go +++ b/cmix/health/tracker.go @@ -12,11 +12,12 @@ package health import ( "errors" + "sync" + "time" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/comms/network" - "sync" - "time" ) type Monitor interface { diff --git a/cmix/interface.go b/cmix/interface.go index f6788924f..a5e540c23 100644 --- a/cmix/interface.go +++ b/cmix/interface.go @@ -1,18 +1,19 @@ package cmix import ( + "time" + "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/cmix/identity" "gitlab.com/elixxir/client/cmix/message" "gitlab.com/elixxir/client/cmix/nodes" + "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" - "time" ) type Client interface { diff --git a/cmix/message/services.go b/cmix/message/services.go index c28ac6167..ed11ce56b 100644 --- a/cmix/message/services.go +++ b/cmix/message/services.go @@ -125,6 +125,10 @@ func (sm *ServicesManager) AddService(clientID *id.ID, newService Service, defaultList: nil, } + if _, exists := sm.tmap[*clientID]; !exists { + sm.tmap[*clientID] = make(map[sih.Preimage]service) + } + if newService.Tag == sih.Default { if !bytes.Equal(newService.Identifier, clientID[:]) { jww.FATAL.Panicf("Cannot accept a malformed 'Default' " + diff --git a/e2e/critical.go b/e2e/critical.go index 8fbcf39e8..f6ef89124 100644 --- a/e2e/critical.go +++ b/e2e/critical.go @@ -128,7 +128,7 @@ func (c *critical) evaluate(stop *stoppable.Single) { go func(mt catalog.MessageType, recipient *id.ID, payload []byte, params Params) { - params.CMIX.Stop = stop + params.Stop = stop jww.INFO.Printf("Resending critical raw message to %s "+ "(msgDigest: %s)", recipient, format.DigestContents(payload)) diff --git a/e2e/manager.go b/e2e/manager.go index 38756fc16..7565deb40 100644 --- a/e2e/manager.go +++ b/e2e/manager.go @@ -162,7 +162,7 @@ func (m *manager) StartProcesses() (stoppable.Stoppable, error) { cmixParams cmix.CMIXParams) ( []id.Round, e2e.MessageID, time.Time, error) { par := GetDefaultParams() - par.CMIX = cmixParams + par.CMIXParams = cmixParams return m.SendE2E(mt, recipient, payload, par) } rekeyStopper, err := rekey.Start(m.Switchboard, m.Ratchet, diff --git a/e2e/params.go b/e2e/params.go index 52dd2d7b5..23052727f 100644 --- a/e2e/params.go +++ b/e2e/params.go @@ -22,17 +22,11 @@ type Params struct { // Delay between attempting to get kets KeyGeRetryDelay time.Duration - //Underlying cmix tags. - // Note: if critical is true, an alternative critical messages - // system within e2e will be used which preserves privacy - CMIX cmix.CMIXParams - - // cMix network params - Network cmix.Params - //Authorizes the message to use a key reserved for rekeying. Do not use //unless sending a rekey Rekey bool + + cmix.CMIXParams } func GetDefaultParams() Params { @@ -43,8 +37,8 @@ func GetDefaultParams() Params { KeyGetRetryCount: 10, KeyGeRetryDelay: 500 * time.Millisecond, - CMIX: cmix.GetDefaultCMIXParams(), - Rekey: false, + Rekey: false, + CMIXParams: cmix.GetDefaultCMIXParams(), } } func (e Params) Marshal() ([]byte, error) { diff --git a/e2e/sendE2E.go b/e2e/sendE2E.go index 0dcd4acdc..e2f6ddeeb 100644 --- a/e2e/sendE2E.go +++ b/e2e/sendE2E.go @@ -27,12 +27,12 @@ func (m *manager) SendE2E(mt catalog.MessageType, recipient *id.ID, "sendE2E when network is not healthy") } - handleCritical := params.CMIX.Critical + handleCritical := params.Critical if handleCritical { m.crit.AddProcessing(mt, recipient, payload, params) // set critical to false so the network layer doesnt // make the messages critical as well - params.CMIX.Critical = false + params.Critical = false } rnds, msgID, t, err := m.sendE2E(mt, recipient, payload, params) @@ -85,7 +85,7 @@ func (m *manager) sendE2E(mt catalog.MessageType, recipient *id.ID, cmixParams cmix.CMIXParams) ( []id.Round, e2e.MessageID, time.Time, error) { par := GetDefaultParams() - par.CMIX = cmixParams + par.CMIXParams = cmixParams return m.SendE2E(mt, recipient, payload, par) } rekey.CheckKeyExchanges(m.net.GetInstance(), m.grp, rekeySendFunc, @@ -102,7 +102,7 @@ func (m *manager) sendE2E(mt catalog.MessageType, recipient *id.ID, // FIXME: remove this wait, it is weird. Why is it // here? we cant remember. key, err := waitForKey(keyGetter, params.KeyGetRetryCount, - params.KeyGeRetryDelay, params.CMIX.Stop, recipient, + params.KeyGeRetryDelay, params.Stop, recipient, format.DigestContents(p), i) if err != nil { err = errors.WithMessagef(err, @@ -133,7 +133,7 @@ func (m *manager) sendE2E(mt catalog.MessageType, recipient *id.ID, var err error roundIds[i], _, err = m.net.Send(recipient, key.Fingerprint(), s, contentsEnc, mac, - params.CMIX) + params.CMIXParams) if err != nil { errCh <- err } diff --git a/e2e/sendUnsafe.go b/e2e/sendUnsafe.go index db59de2d6..9ad2b48ad 100644 --- a/e2e/sendUnsafe.go +++ b/e2e/sendUnsafe.go @@ -64,7 +64,8 @@ func (m *manager) sendUnsafe(mt catalog.MessageType, recipient *id.ID, var err error roundIds[i], _, err = m.net.Send(recipient, fp, - srvc, payload, unencryptedMAC, params.CMIX) + srvc, payload, unencryptedMAC, + params.CMIXParams) if err != nil { errCh <- err } diff --git a/fileTransfer/sendE2e.go b/fileTransfer/sendE2e.go index 647f3d905..2f737bcaf 100644 --- a/fileTransfer/sendE2e.go +++ b/fileTransfer/sendE2e.go @@ -65,7 +65,7 @@ func (m *manager) sendNewFileTransferMessage(recipient *id.ID, fileName, params := e2e.GetDefaultParams() params.ServiceTag = catalog.Silent params.LastServiceTag = catalog.Silent - params.CMIX.DebugTag = initialMessageDebugTag + params.DebugTag = initialMessageDebugTag _, _, _, err = m.e2e.SendE2E( catalog.NewFileTransfer, recipient, payload, params) @@ -85,7 +85,7 @@ func (m *manager) sendEndFileTransferMessage(recipient *id.ID) { if healthy { params := e2e.GetDefaultParams() params.LastServiceTag = catalog.EndFT - params.CMIX.DebugTag = lastMessageDebugTag + params.DebugTag = lastMessageDebugTag _, _, _, err := m.e2e.SendE2E( catalog.EndFileTransfer, recipient, nil, params) diff --git a/groupChat/sendRequests.go b/groupChat/sendRequests.go index 3bc201d41..dba1231cd 100644 --- a/groupChat/sendRequests.go +++ b/groupChat/sendRequests.go @@ -8,6 +8,8 @@ package groupChat import ( + "strings" + "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" @@ -16,7 +18,6 @@ import ( gs "gitlab.com/elixxir/client/groupChat/groupStore" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" - "strings" ) // Error messages. @@ -116,7 +117,7 @@ func (m Manager) sendRequests(g gs.Group) ([]id.Round, RequestStatus, error) { func (m Manager) sendRequest(memberID *id.ID, request []byte) ([]id.Round, error) { p := e2e.GetDefaultParams() p.LastServiceTag = catalog.GroupRq - p.CMIX.DebugTag = "group.Request" + p.DebugTag = "group.Request" rounds, _, _, err := m.e2e.SendE2E(catalog.GroupCreationRequest, memberID, request, p) if err != nil { -- GitLab