o Sba @sjUdZddlmZddlmZmZmZmZmZm Z m Z ddl m Z ddl mZddlmZddlmZmZmZddlmZdd lmZdd lmZdd lmZGd d d eZeedZej ej!fZ"e e#e#fe$d<eeegeefZ%Gddde&Z'ej(ej!ej)ej*ej+ej,ej-ej,ej.ej,iZ/de'deddfddZ0ddZ1ddZ2ddZ3ddZ4dd Z5d!S)"z*Represent a deployment of MongoDB servers.)sample)AnyCallableDictList NamedTupleOptionalTuple)ObjectId)common)ConfigurationError)ReadPreference _AggWritePref _ServerModeServerDescription) Selection) SERVER_TYPE)_Addressc@s>eZdZUeed<eed<eed<eed<eed<eed<dS) _TopologyTypeSingleReplicaSetNoPrimaryReplicaSetWithPrimaryShardedUnknown LoadBalancedN)__name__ __module__ __qualname__int__annotations__r!r!C/tmp/pip-target-onvjaxws/lib/python/pymongo/topology_description.pyrs  rSRV_POLLING_TOPOLOGIESc@seZdZdedeeefdeedeedee de ddfd d Z d d Z d=d dZ dedefddZdeddfddZd>ddZdeeeffddZedefddZedefddZedeefddZedeefddZedee fd d!Zedeefd"d#Zedeefd$d%Zedefd&d'Zedeefd(d)Zedeefd*d+Zedefd,d-Zedefd.d/Z d0d1Z!  d?d2e deed3ee"deefd4d5Z#e$j%fd6e&defd7d8Z'defd9d:Z(d;d<Z)dS)@TopologyDescription topology_typeserver_descriptionsreplica_set_namemax_set_versionmax_election_idtopology_settingsreturnNcCs||_||_||_||_||_||_d|_|jtjkr| |j }|s)d|_ dSt dd|Dr7d|_ dSt dd|D|_ dS)aRepresentation of a deployment of MongoDB servers. :Parameters: - `topology_type`: initial type - `server_descriptions`: dict of (address, ServerDescription) for all seeds - `replica_set_name`: replica set name or None - `max_set_version`: greatest setVersion seen from a primary, or None - `max_election_id`: greatest electionId seen from a primary, or None - `topology_settings`: a TopologySettings Ncss|]}|jduVqdSNlogical_session_timeout_minutes.0sr!r!r" ^z/TopologyDescription.__init__..cs|]}|jVqdSr-r.r0r!r!r"r3as )_topology_type_replica_set_name_server_descriptions_max_set_version_max_election_id_topology_settings_incompatible_err TOPOLOGY_TYPEr_init_incompatible_errreadable_servers_ls_timeout_minutesanymin)selfr&r'r(r)r*r+r?r!r!r"__init__2s"    zTopologyDescription.__init__cCs|jD]L}|js q|jduo|jtjk}|jduo |jtjk}|r7d|jd|jdp.d|jtjf|_ q|rQd|jd|jdpDd|jtjtj f|_ dSqdS)z>Internal compatibility check for non-load balanced topologies.Nz]Server at %s:%d requires wire version %d, but this version of PyMongo only supports up to %d.rzgServer at %s:%d reports wire version %d, but this version of PyMongo requires at least %d (MongoDB %s).) r8valuesis_server_type_knownmin_wire_versionr ZMAX_SUPPORTED_WIRE_VERSIONmax_wire_versionZMIN_SUPPORTED_WIRE_VERSIONaddressr<ZMIN_SUPPORTED_SERVER_VERSION)rCr2Zserver_too_newZserver_too_oldr!r!r"r>es>        z*TopologyDescription._init_incompatible_errcCs|jrt|jdS)zRaise ConfigurationError if any server is incompatible. A server is incompatible if its wire protocol version range does not overlap with PyMongo's. N)r<r rCr!r!r"check_compatibles z$TopologyDescription.check_compatiblerJcCs ||jvSr-)r8)rCrJr!r!r" has_servers zTopologyDescription.has_servercCs|j|}t||S)z;A copy of this description, with one server marked Unknown.)r8 to_unknownupdated_topology_description)rCrJZ unknown_sdr!r!r" reset_servers z TopologyDescription.reset_servercCsH|jtjkr tj}n|j}tdd|jD}t|||j|j|j |j S)z.) r6r=rrdictr8r%r7r9r:r;)rCr&sdsr!r!r"resets zTopologyDescription.resetcCs |jS)zRDict of (address, :class:`~pymongo.server_description.ServerDescription`).)r8copyrKr!r!r"r's z'TopologyDescription.server_descriptionscC|jS)zThe type of this topology.)r6rKr!r!r"r&z!TopologyDescription.topology_typecCs tj|jS)zUThe topology type as a human readable string. .. versionadded:: 3.4 )r=_fieldsr6rKr!r!r"topology_type_names z&TopologyDescription.topology_type_namecCrU)zThe replica set name.)r7rKr!r!r"r(rVz$TopologyDescription.replica_set_namecCrU)z1Greatest setVersion seen from a primary, or None.)r9rKr!r!r"r)rVz#TopologyDescription.max_set_versioncCrU)z1Greatest electionId seen from a primary, or None.)r:rKr!r!r"r*rVz#TopologyDescription.max_election_idcCrU)z)Minimum logical session timeout, or None.)r@rKr!r!r"r/rVz3TopologyDescription.logical_session_timeout_minutescCdd|jDS)z)List of Servers of types besides Unknown.cSg|]}|jr|qSr!rGr0r!r!r" z5TopologyDescription.known_servers..r8rFrKr!r!r" known_serversz!TopologyDescription.known_serverscCstdd|jDS)z7Whether there are any Servers of types besides Unknown.css|]}|jr|VqdSr-r[r0r!r!r"r3r4z8TopologyDescription.has_known_servers..)rAr8rFrKr!r!r"has_known_serverssz%TopologyDescription.has_known_serverscCrY)zList of readable Servers.cSrZr!)Z is_readabler0r!r!r"r\r]z8TopologyDescription.readable_servers..r^rKr!r!r"r?r`z$TopologyDescription.readable_serverscCs"|j}|rtdd|jDSdS)z3Minimum of all servers' max wire versions, or None.csr5r-)rIr0r!r!r"r3z:TopologyDescription.common_wire_version..N)r_rBrCZserversr!r!r"common_wire_versionsz'TopologyDescription.common_wire_versioncC|jjSr-)r;heartbeat_frequencyrKr!r!r"rfz'TopologyDescription.heartbeat_frequencycCrer-)r;Z_srv_max_hostsrKr!r!r" srv_max_hostsrgz!TopologyDescription.srv_max_hostscs>|sgStdd|jD|jjdfdd|jDS)Ncsr5r-Zround_trip_timer0r!r!r"r3rbz=TopologyDescription._apply_local_threshold..g@@csg|] }|jkr|qSr!rir0Zfastest thresholdr!r"r\s z>TopologyDescription._apply_local_threshold..)rBr'r;Zlocal_threshold_ms)rC selectionr!rjr"_apply_local_thresholds  z*TopologyDescription._apply_local_thresholdselectorcustom_selectorcCst|ddr|j}|r||jkrtd||j|ft|tr$|||jtj kr,gS|jtj tj fvr8|j S|rH| |}|rF|gSgSt|}|jtjkrW||}|dure|re|||j }||S)aList of servers matching the provided selector(s). :Parameters: - `selector`: a callable that takes a Selection as input and returns a Selection as output. For example, an instance of a read preference from :mod:`~pymongo.read_preferences`. - `address` (optional): A server address to select. - `custom_selector` (optional): A callable that augments server selection rules. Accepts a list of :class:`~pymongo.server_description.ServerDescription` objects and return a list of server descriptions that should be considered suitable for the desired operation. .. versionadded:: 3.4 rHrzF%s requires min wire version %d, but topology's min wire version is %dN)getattrrdrHr isinstancerZselection_hookr&r=rrrr_r'getrZfrom_topology_descriptionrZwith_server_descriptionsrm)rCrnrJroZ common_wv descriptionrlr!r!r"apply_selectors2         z"TopologyDescription.apply_selectorread_preferencecCstd|t||S)aDoes this topology have any readable servers available matching the given read preference? :Parameters: - `read_preference`: an instance of a read preference from :mod:`~pymongo.read_preferences`. Defaults to :attr:`~pymongo.read_preferences.ReadPreference.PRIMARY`. .. note:: When connected directly to a single server this method always returns ``True``. .. versionadded:: 3.4 ru)r Zvalidate_read_preferencerArt)rCrur!r!r"has_readable_server>s z'TopologyDescription.has_readable_servercCs |tjS)zDoes this topology have a writable server available? .. note:: When connected directly to a single server this method always returns ``True``. .. versionadded:: 3.4 )rvr PRIMARYrKr!r!r"has_writable_serverOs z'TopologyDescription.has_writable_servercCs0t|jddd}d|jj|jj|j|fS)NcSrUr-)rJ)sdr!r!r"[sz.TopologyDescription.__repr__..)keyz+<%s id: %s, topology_type: %s, servers: %r>)sortedr8rF __class__rr;Z _topology_idrXrcr!r!r"__repr__YszTopologyDescription.__repr__)r,N)r,r%)NN)*rrrrrrrrstrr rrDr>rLboolrMrPrSr'propertyr&rXr(r)r*r/rr_rar?rdrfrhrm_ServerSelectorrtr rwrrvrxr~r!r!r!r"r%1sz  3 /    6 r%topology_descriptionserver_descriptionr,c Cs|j}|j}|j}|j}|j}|j}|}|||<|tjkrD|dur9||jkr9t d||jf} |j | d||<t tj|||||j S|tj kro|tjtjfvrct|j jdkr]tj}n||n |tj tjfvrot|}|tjkr|tjtj fvr||nv|tjkr|tjtjfvr||nc|tjkrt|||||\}}}}nQ|tjtjtjfvrt|||\}}n>|tjkr|tjtjfvr||t |}n'|tjkrt|||||\}}}}n|tjtjtjfvrt!|||}nt |}t ||||||j S)a}Return an updated copy of a TopologyDescription. :Parameters: - `topology_description`: the current TopologyDescription - `server_description`: a new ServerDescription that resulted from a hello call Called after attempting (successfully or not) to call hello on the server at server_description.address. Does not modify topology_description. Nzeclient is configured to connect to a replica set named '%s' but this node belongs to a set named '%s')errorrE)"rJr&r(r)r* server_typer'r=rr rNr%r;rrZ StandaloneZ LoadBalancerlenZseedspopZRSGhost_SERVER_TYPE_TO_TOPOLOGY_TYPErMongosr RSPrimary_update_rs_from_primary RSSecondary RSArbiterRSOther!_update_rs_no_primary_from_memberr_check_has_primary#_update_rs_with_primary_from_member) rrrJr&set_namer)r*rrRrr!r!r"rOps               rOcCs|jtvsJ|}t|t|kr|St|D] }||vr(||q|jdkrPt|t|}|jt|}|dkrNt |t |t|}ng}|D] }||vr^t |||<qRt |j||j |j|j|jS)zReturn an updated copy of a TopologyDescription. :Parameters: - `topology_description`: the current TopologyDescription - `seedlist`: a list of new seeds new ServerDescription that resulted from a hello call r)r&r$r'setkeyslistrrhrrrBrr%r(r)r*r;)rZseedlistrRrJZ new_hostsZn_to_addr!r!r")_updated_topology_description_srv_pollings4   rc Cs&|dur|j}n||jkr||jt||||fS||f}d|jvr?d|vr<||jkr<|||j<t||||fS|j}|jdurP|dusM|j|krP|j}|D]}|j t j urk|j|jkrk|||j<nqT|j D] }||vr{t |||<qot||j D]}||qt||||fS)agUpdate topology description from a primary's hello response. Pass in a dict of ServerDescriptions, current replica set name, the ServerDescription we are processing, and the TopologyDescription's max_set_version and max_election_id if any. Returns (new topology type, new replica_set_name, new max_set_version, new max_election_id). N)r(rrJrZelection_tuplerNZ election_idZ set_versionrFrrr all_hostsrr) rRr(rr)r*Zmax_election_tupleserverZ new_addressaddrr!r!r"rsF           rcCsP|dusJ||jkr||jt|S|jr$|j|jkr$||jt|S)zRS with known primary. Process a response from a non-primary. Pass in a dict of ServerDescriptions, current replica set name, and the ServerDescription we are processing. Returns new topology type. N)r(rrJmer)rRr(rr!r!r"rEs    rcCsztj}|dur |j}n||jkr||j||fS|jD] }||vr)t|||<q|jr9|j|jkr9||j||fS)zRS without known primary. Update from a non-primary's response. Pass in a dict of ServerDescriptions, current replica set name, and the ServerDescription we are processing. Returns (new topology type, new replica_set_name). N)r=rr(rrJrrr)rRr(rr&rJr!r!r"rXs     rcCs*|D] }|jtjkrtjSqtjS)zCurrent topology type is ReplicaSetWithPrimary. Is primary still known? Pass in a dict of ServerDescriptions. Returns new topology type. )rFrrrr=rr)rRr2r!r!r"rts   rN)6__doc__randomrtypingrrrrrrr Z bson.objectidr Zpymongor Zpymongo.errorsr Zpymongo.read_preferencesr rrZpymongo.server_descriptionrZpymongo.server_selectorsrZpymongo.server_typerZpymongo.typingsrrranger=rrr$rr robjectr%rrrrrrrrrOrrrrrr!r!r!r"sH $        8  h*C