func printReplicasetMembers(session *mgo.Session) error { members, err := replicaset.CurrentMembers(session) if err != nil { return fmt.Errorf("cannot get replica set members: %v", err) } statusResult, err := replicaset.CurrentStatus(session) if err != nil { return fmt.Errorf("cannot get replica set status: %v", err) } statuses := make(map[int]*replicaset.MemberStatus) for i, status := range statusResult.Members { statuses[status.Id] = &statusResult.Members[i] } for _, m := range members { votes := 1 if m.Votes != nil { votes = *m.Votes } status := statuses[m.Id] if status == nil { fmt.Printf("id %3v has no replica set status\n", m.Id) } fmt.Printf("id %3v; machine id %5q; address %50s; votes %v; healthy %v; state %v\n", m.Id, m.Tags["juju-machine-id"], m.Address, votes, status.Healthy, status.State) } return nil }
func changeVotes(c *gc.C, insts []*gitjujutesting.MgoInstance, voteId int) { c.Logf("changing voting id to %v", voteId) addrs := make([]string, len(insts)) for i, inst := range insts { addrs[i] = inst.Addr() } dialInfo := gitjujutesting.MgoDialInfo(coretesting.Certs, addrs...) session, err := mgo.DialWithInfo(dialInfo) c.Assert(err, jc.ErrorIsNil) defer session.Close() members, err := replicaset.CurrentMembers(session) c.Assert(err, jc.ErrorIsNil) c.Assert(members, gc.HasLen, len(insts)) for i := range members { member := &members[i] if member.Id == voteId { member.Priority = nil } else { member.Priority = newFloat64(0.1) } } c.Logf("new member set: %#v", members) err = replicaset.Set(session, members) c.Assert(err, jc.ErrorIsNil) c.Logf("successfully changed replica set members") }
// SetUpgradeMongoMode writes a value in the state server to be picked up // by api servers to know that there is an upgrade ready to happen. func (st *State) SetUpgradeMongoMode(v mongo.Version) (UpgradeMongoParams, error) { currentInfo, err := st.ControllerInfo() if err != nil { return UpgradeMongoParams{}, errors.Annotate(err, "could not obtain current controller information") } result := UpgradeMongoParams{} machines := []*Machine{} for _, mID := range currentInfo.VotingMachineIds { m, err := st.Machine(mID) if err != nil { return UpgradeMongoParams{}, errors.Annotate(err, "cannot change all the replicas") } isMaster, err := mongo.IsMaster(st.session, m) if err != nil { return UpgradeMongoParams{}, errors.Annotatef(err, "cannot determine if machine %q is master", mID) } paddr, err := m.PublicAddress() if err != nil { return UpgradeMongoParams{}, errors.Annotatef(err, "cannot obtain public address for machine: %v", m) } tag := m.Tag() mtag := tag.(names.MachineTag) member := HAMember{ Tag: mtag.Id(), PublicAddress: paddr, Series: m.Series(), } if isMaster { result.Master = member } else { result.Members = append(result.Members, member) } machines = append(machines, m) } rsMembers, err := replicaset.CurrentMembers(st.session) if err != nil { return UpgradeMongoParams{}, errors.Annotate(err, "cannot obtain current replicaset members") } masterRs, err := replicaset.MasterHostPort(st.session) if err != nil { return UpgradeMongoParams{}, errors.Annotate(err, "cannot determine master on replicaset members") } for _, m := range rsMembers { if m.Address != masterRs { result.RsMembers = append(result.RsMembers, m) } } for _, m := range machines { if err := m.SetStopMongoUntilVersion(v); err != nil { return UpgradeMongoParams{}, errors.Annotate(err, "cannot trigger replica shutdown") } } return result, nil }
func (s mongoSessionShim) CurrentMembers() ([]replicaset.Member, error) { return replicaset.CurrentMembers(s.session) }