(topology_description, server_description)
return TopologyDescription(topology_type,
                               sds,
                               set_name,
                               max_set_version,
                               max_election_id,
                               topology_description._topology_settings)
Return an updated copy of a TopologyDescription.

    :Parameters:
      - `topology_description`: the current TopologyDescription
      - `server_description`: a new ServerDescription that resulted from
        an ismaster call

    Called after attempting (successfully or not) to call ismaster on the
    server at server_description.address. Does not modify topology_description.
Return an updated copy of a TopologyDescription.
Return an updated copy of a TopologyDescription .
def updated_topology_description(topology_description, server_description):
    """Return an updated copy of a TopologyDescription.

    :Parameters:
      - `topology_description`: the current TopologyDescription
      - `server_description`: a new ServerDescription that resulted from
        an ismaster call

    Called after attempting (successfully or not) to call ismaster on the
    server at server_description.address. Does not modify topology_description.
    """
    address = server_description.address

    # These values will be updated, if necessary, to form the new
    # TopologyDescription.
    topology_type = topology_description.topology_type
    set_name = topology_description.replica_set_name
    max_set_version = topology_description.max_set_version
    max_election_id = topology_description.max_election_id
    server_type = server_description.server_type

    # Don't mutate the original dict of server descriptions; copy it.
    sds = topology_description.server_descriptions()

    # Replace this server's description with the new one.
    sds[address] = server_description

    if topology_type == TOPOLOGY_TYPE.Single:
        # Single type never changes.
        return TopologyDescription(
            TOPOLOGY_TYPE.Single,
            sds,
            set_name,
            max_set_version,
            max_election_id,
            topology_description._topology_settings)

    if topology_type == TOPOLOGY_TYPE.Unknown:
        if server_type == SERVER_TYPE.Standalone:
            sds.pop(address)

        elif server_type not in (SERVER_TYPE.Unknown, SERVER_TYPE.RSGhost):
            topology_type = _SERVER_TYPE_TO_TOPOLOGY_TYPE[server_type]

    if topology_type == TOPOLOGY_TYPE.Sharded:
        if server_type not in (SERVER_TYPE.Mongos, SERVER_TYPE.Unknown):
            sds.pop(address)

    elif topology_type == TOPOLOGY_TYPE.ReplicaSetNoPrimary:
        if server_type in (SERVER_TYPE.Standalone, SERVER_TYPE.Mongos):
            sds.pop(address)

        elif server_type == SERVER_TYPE.RSPrimary:
            (topology_type,
             set_name,
             max_set_version,
             max_election_id) = _update_rs_from_primary(sds,
                                                        set_name,
                                                        server_description,
                                                        max_set_version,
                                                        max_election_id)

        elif server_type in (
                SERVER_TYPE.RSSecondary,
                SERVER_TYPE.RSArbiter,
                SERVER_TYPE.RSOther):
            topology_type, set_name = _update_rs_no_primary_from_member(
                sds, set_name, server_description)

    elif topology_type == TOPOLOGY_TYPE.ReplicaSetWithPrimary:
        if server_type in (SERVER_TYPE.Standalone, SERVER_TYPE.Mongos):
            sds.pop(address)
            topology_type = _check_has_primary(sds)

        elif server_type == SERVER_TYPE.RSPrimary:
            (topology_type,
             set_name,
             max_set_version,
             max_election_id) = _update_rs_from_primary(sds,
                                                        set_name,
                                                        server_description,
                                                        max_set_version,
                                                        max_election_id)

        elif server_type in (
                SERVER_TYPE.RSSecondary,
                SERVER_TYPE.RSArbiter,
                SERVER_TYPE.RSOther):
            topology_type = _update_rs_with_primary_from_member(
                sds, set_name, server_description)

        else:
            # Server type is Unknown or RSGhost: did we just lose the primary?
            topology_type = _check_has_primary(sds)

    # Return updated copy.
    return TopologyDescription(topology_type,
                               sds,
                               set_name,
                               max_set_version,
                               max_election_id,
                               topology_description._topology_settings)
def updated_topology_description ( topology_description , server_description ) : address = server_description . address # These values will be updated, if necessary, to form the new # TopologyDescription. topology_type = topology_description . topology_type set_name = topology_description . replica_set_name max_set_version = topology_description . max_set_version max_election_id = topology_description . max_election_id server_type = server_description . server_type # Don't mutate the original dict of server descriptions; copy it. sds = topology_description . server_descriptions ( ) # Replace this server's description with the new one. sds [ address ] = server_description if topology_type == TOPOLOGY_TYPE . Single : # Single type never changes. return TopologyDescription ( TOPOLOGY_TYPE . Single , sds , set_name , max_set_version , max_election_id , topology_description . _topology_settings ) if topology_type == TOPOLOGY_TYPE . Unknown : if server_type == SERVER_TYPE . Standalone : sds . pop ( address ) elif server_type not in ( SERVER_TYPE . Unknown , SERVER_TYPE . RSGhost ) : topology_type = _SERVER_TYPE_TO_TOPOLOGY_TYPE [ server_type ] if topology_type == TOPOLOGY_TYPE . Sharded : if server_type not in ( SERVER_TYPE . Mongos , SERVER_TYPE . Unknown ) : sds . pop ( address ) elif topology_type == TOPOLOGY_TYPE . ReplicaSetNoPrimary : if server_type in ( SERVER_TYPE . Standalone , SERVER_TYPE . Mongos ) : sds . pop ( address ) elif server_type == SERVER_TYPE . RSPrimary : ( topology_type , set_name , max_set_version , max_election_id ) = _update_rs_from_primary ( sds , set_name , server_description , max_set_version , max_election_id ) elif server_type in ( SERVER_TYPE . RSSecondary , SERVER_TYPE . RSArbiter , SERVER_TYPE . RSOther ) : topology_type , set_name = _update_rs_no_primary_from_member ( sds , set_name , server_description ) elif topology_type == TOPOLOGY_TYPE . ReplicaSetWithPrimary : if server_type in ( SERVER_TYPE . Standalone , SERVER_TYPE . Mongos ) : sds . pop ( address ) topology_type = _check_has_primary ( sds ) elif server_type == SERVER_TYPE . RSPrimary : ( topology_type , set_name , max_set_version , max_election_id ) = _update_rs_from_primary ( sds , set_name , server_description , max_set_version , max_election_id ) elif server_type in ( SERVER_TYPE . RSSecondary , SERVER_TYPE . RSArbiter , SERVER_TYPE . RSOther ) : topology_type = _update_rs_with_primary_from_member ( sds , set_name , server_description ) else : # Server type is Unknown or RSGhost: did we just lose the primary? topology_type = _check_has_primary ( sds ) # Return updated copy. return TopologyDescription ( topology_type , sds , set_name , max_set_version , max_election_id , topology_description . _topology_settings )