// IsMaster returns a boolean that represents whether the given // machine's peer address is the primary mongo host for the replicaset func IsMaster(session *mgo.Session, obj WithAddresses) (bool, error) { addrs := obj.Addresses() masterHostPort, err := replicaset.MasterHostPort(session) // If the replica set has not been configured, then we // can have only one master and the caller must // be that master. if err == replicaset.ErrMasterNotConfigured { return true, nil } if err != nil { return false, err } masterAddr, _, err := net.SplitHostPort(masterHostPort) if err != nil { return false, err } for _, addr := range addrs { if addr.Value == masterAddr { return true, nil } } return false, nil }
func (c *mongoConn) IsMaster() (bool, error) { hostPort, err := replicaset.MasterHostPort(c.session) if err != nil { logger.Errorf("replicaset.MasterHostPort returned error: %v", err) return false, err } logger.Errorf("replicaset.MasterHostPort(%s) returned %s", c.localHostPort, hostPort) logger.Errorf("-> %s IsMaster: %v", c.localHostPort, hostPort == c.localHostPort) return hostPort == c.localHostPort, nil }
// 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 }