func NewMemberInfoFromToken(token *XLRegMsg_Token) ( m *xcl.MemberInfo, err error) { var ( ck, sk *rsa.PublicKey ctor xt.ConnectorI ctors []xt.ConnectorI farEnd xt.EndPointI nodeID *xi.NodeID peer *xn.Peer ) if token == nil { err = NilToken } else { nodeID, err = xi.New(token.GetID()) if err == nil { ck, err = xc.RSAPubKeyFromWire(token.GetCommsKey()) if err == nil { sk, err = xc.RSAPubKeyFromWire(token.GetSigKey()) if err == nil { attrs := token.GetAttrs() myEnds := token.GetMyEnds() for i := 0; i < len(myEnds); i++ { myEnd := myEnds[i] farEnd, err = xt.NewTcpEndPoint(myEnd) if err != nil { break } ctor, err = xt.NewTcpConnector(farEnd) if err != nil { break } ctors = append(ctors, ctor) } if err == nil { peer, err = xn.NewPeer(token.GetName(), nodeID, ck, sk, nil, ctors) if err == nil { m = &xcl.MemberInfo{ Attrs: attrs, Peer: peer, } } } } //if err == nil { // m, err = NewMemberInfo(token.GetName(), nodeID, // ck, sk, token.GetAttrs(), token.GetMyEnds()) //} } } } return }
func (s *XLSuite) makeAMemberInfo(c *C, rng *xr.PRNG) *xcl.MemberInfo { attrs := uint64(rng.Int63()) peer, err := xn.NewPeer( rng.NextFileName(8), s.makeANodeID(c, rng), &s.makeAnRSAKey(c).PublicKey, &s.makeAnRSAKey(c).PublicKey, nil, // overlays nil) // XXX CONNECTORS c.Assert(err, IsNil) return &xcl.MemberInfo{ Attrs: attrs, Peer: peer, } } // GEEP
// Given contact information for a registry and the name of a cluster, // the client joins the cluster, collects information on the other members, // and terminates when it has info on the entire membership. func NewMemberMaker( node *xn.Node, attrs uint64, regName string, regID *xi.NodeID, regEnd xt.EndPointI, regCK, regSK *rsa.PublicKey, clusterName string, clusterAttrs uint64, clusterID *xi.NodeID, size, epCount uint32, endPoints []xt.EndPointI) ( mm *MemberMaker, err error) { var ( cm *xcl.ClusterMember isAdmin = (attrs & xcl.ATTR_ADMIN) != 0 regPeer *xn.Peer ) // sanity checks on parameter list if node == nil { err = MissingNode } else { if regName == "" || regID == nil || regEnd == nil || regCK == nil { err = MissingServerInfo } if err == nil { // DEBUG fmt.Printf("NemMemberMaker: regEnd is %s\n", regEnd.String()) // END if (attrs & xcl.ATTR_SOLO) == uint64(0) { if clusterName == "" { err = MissingClusterNameOrID if err == nil && size < uint32(1) { // err = ClusterMustHaveTwo err = ClusterMustHaveMember } } if err == nil { // if the client is an admin client epCount applies // to the cluster if epCount < uint32(1) { epCount = uint32(1) } if !isAdmin { // XXX There is some confusion here: we don't require // that all members have the same number of endpoints actualEPCount := uint32(len(endPoints)) if actualEPCount == 0 { err = MemberMustHaveEndPoint } else if epCount > actualEPCount { epCount = actualEPCount } for i := 0; i < int(epCount); i++ { _, err = node.AddEndPoint(endPoints[i]) } } } } } } if err == nil { var ctor xt.ConnectorI var ctors []xt.ConnectorI ctor, err = xt.NewTcpConnector(regEnd) if err == nil { ctors = append(ctors, ctor) regPeer, err = xn.NewPeer(regName, regID, regCK, regSK, nil, ctors) if err == nil { _, err = node.AddPeer(regPeer) } } } if err == nil { cm = &xcl.ClusterMember{ // Attrs gets negotiated ClusterName: clusterName, ClusterAttrs: clusterAttrs, ClusterID: clusterID, ClusterMaxSize: size, EPCount: epCount, // Members added on the fly Members: make([]*xcl.MemberInfo, size), Node: *node, } mm = &MemberMaker{ ProposedAttrs: attrs, DoneCh: make(chan error, 1), RegPeer: regPeer, ClusterMember: *cm, } } return }