public override IList <TopologyVersion> GetTopologyVersions(IList <string> partitionFqdns)
 {
     if (partitionFqdns == null)
     {
         throw new ArgumentNullException("partitionFqdns");
     }
     ExTraceGlobals.TopologyProviderTracer.Information <int>((long)this.GetHashCode(), "GetTopologyVersions. Partitions {0}", partitionFqdns.Count);
     TopologyVersion[] array = new TopologyVersion[partitionFqdns.Count];
     LdapTopologyProvider.MiniTopology miniTopology = null;
     for (int i = 0; i < partitionFqdns.Count; i++)
     {
         TopologyProvider.EnforceNonEmptyPartition(partitionFqdns[i]);
         int version = 1;
         if (this.topologies.TryGetValue(partitionFqdns[i], out miniTopology))
         {
             version = miniTopology.Version;
         }
         array[i] = new TopologyVersion(partitionFqdns[i], version);
     }
     if (ExTraceGlobals.TopologyProviderTracer.IsTraceEnabled(TraceType.InfoTrace))
     {
         ExTraceGlobals.TopologyProviderTracer.Information <string>((long)this.GetHashCode(), "GetTopologyVersions. Partitions {0}", string.Join(",", (object[])array));
     }
     return(array);
 }
        protected override IList <ADServerInfo> InternalGetServersForRole(string partitionFqdn, IList <string> currentlyUsedServers, ADServerRole role, int serversRequested, bool forestWideAffinityRequested = false)
        {
            LdapTopologyProvider.MiniTopology miniTopology = new LdapTopologyProvider.MiniTopology(partitionFqdn);
            miniTopology = this.topologies.GetOrAdd(partitionFqdn, miniTopology);
            if (ExTraceGlobals.TopologyProviderTracer.IsTraceEnabled(TraceType.DebugTrace))
            {
                ExTraceGlobals.TopologyProviderTracer.TraceDebug((long)this.GetHashCode(), "PartitionFqdn {0}. GetServersForRole {1}, {2} current: [{3}], need {4} servers", new object[]
                {
                    partitionFqdn,
                    role,
                    currentlyUsedServers.Count,
                    string.Join(",", currentlyUsedServers ?? Enumerable.Empty <string>()),
                    serversRequested
                });
            }
            ADServerInfo adserverInfo = null;

            if (miniTopology.DCInfo == null)
            {
                adserverInfo = this.GetDirectoryServer(partitionFqdn, ADRole.DomainController);
                miniTopology.SetServerInfo(adserverInfo, ADServerRole.DomainController);
                miniTopology.IncrementTopologyVersion();
                adserverInfo = null;
            }
            switch (role)
            {
            case ADServerRole.GlobalCatalog:
                adserverInfo = miniTopology.GCInfo;
                if (adserverInfo == null)
                {
                    adserverInfo = this.GetDirectoryServer(partitionFqdn, ADRole.GlobalCatalog);
                    miniTopology.SetServerInfo(adserverInfo, role);
                    miniTopology.IncrementTopologyVersion();
                }
                break;

            case ADServerRole.DomainController:
            case ADServerRole.ConfigurationDomainController:
                adserverInfo = ((ADServerRole.DomainController == role) ? miniTopology.DCInfo : miniTopology.CDCInfo);
                if (adserverInfo == null)
                {
                    adserverInfo = this.GetDirectoryServer(partitionFqdn, ADRole.DomainController);
                    miniTopology.SetServerInfo(adserverInfo, role);
                    miniTopology.IncrementTopologyVersion();
                }
                break;
            }
            ExTraceGlobals.TopologyProviderTracer.TraceDebug <string, string>((long)this.GetHashCode(), "PartitionFqdn {0}. GetServerForRole returning 1 server {1}", partitionFqdn, adserverInfo.FqdnPlusPort);
            ADProviderPerf.AddDCInstance(adserverInfo.Fqdn);
            ADServerInfo adserverInfo2 = (ADServerInfo)adserverInfo.Clone();

            adserverInfo2.Mapping = (adserverInfo2.Fqdn.Equals((currentlyUsedServers == null || currentlyUsedServers.Count == 0) ? string.Empty : currentlyUsedServers[0], StringComparison.OrdinalIgnoreCase) ? 0 : -1);
            return(new List <ADServerInfo>
            {
                adserverInfo2
            });
        }
 public override void SetConfigDC(string partitionFqdn, string serverName, int port)
 {
     base.SetConfigDC(partitionFqdn, serverName, port);
     ExTraceGlobals.TopologyProviderTracer.TraceDebug <string, string, int>((long)this.GetHashCode(), "PartitionFqdn {0} setting Config DC to {1}:{2}", partitionFqdn, serverName, port);
     LdapTopologyProvider.MiniTopology miniTopology = new LdapTopologyProvider.MiniTopology(partitionFqdn);
     miniTopology = this.topologies.GetOrAdd(partitionFqdn, miniTopology);
     miniTopology.SetServerInfo(new ADServerInfo(serverName, partitionFqdn, port, null, 100, AuthType.Kerberos, true), ADServerRole.ConfigurationDomainController);
     miniTopology.IncrementTopologyVersion();
     ADProviderPerf.AddDCInstance(serverName);
 }
        public override void ReportServerDown(string partitionFqdn, string serverName, ADServerRole role)
        {
            if (string.IsNullOrEmpty(serverName))
            {
                ExTraceGlobals.TopologyProviderTracer.TraceWarning <string>((long)this.GetHashCode(), "PartitionFqdn {0}. ServerName is null or empty", partitionFqdn);
                return;
            }
            ArgumentValidator.ThrowIfNullOrEmpty("partitionFqdn", partitionFqdn);
            ArgumentValidator.ThrowIfNullOrEmpty("serverName", serverName);
            ExTraceGlobals.TopologyProviderTracer.TraceWarning <string, string, ADServerRole>((long)this.GetHashCode(), "PartitionFqdn {0}. {1} is down for role {2}. If this server is part of topology we will bump topology version.", partitionFqdn, serverName, role);
            LdapTopologyProvider.MiniTopology miniTopology = null;
            if (!this.topologies.TryGetValue(partitionFqdn, out miniTopology))
            {
                ExTraceGlobals.TopologyProviderTracer.TraceWarning <string>((long)this.GetHashCode(), "PartitionFqdn {0} NOT FOUND.", partitionFqdn);
                return;
            }
            ADServerInfo dcinfo       = miniTopology.DCInfo;
            ADServerInfo cdcinfo      = miniTopology.CDCInfo;
            ADServerInfo gcinfo       = miniTopology.GCInfo;
            ADServerRole adserverRole = ADServerRole.None;

            if (dcinfo != null && serverName.Equals(dcinfo.Fqdn, StringComparison.OrdinalIgnoreCase))
            {
                miniTopology.ResetServerInfoForRole(ADServerRole.DomainController);
                adserverRole |= ADServerRole.DomainController;
            }
            if (cdcinfo != null && serverName.Equals(cdcinfo.Fqdn, StringComparison.OrdinalIgnoreCase))
            {
                miniTopology.ResetServerInfoForRole(ADServerRole.ConfigurationDomainController);
                adserverRole |= ADServerRole.ConfigurationDomainController;
            }
            if (gcinfo != null && gcinfo.Fqdn.Equals(serverName, StringComparison.OrdinalIgnoreCase))
            {
                miniTopology.ResetServerInfoForRole(ADServerRole.GlobalCatalog);
                adserverRole |= ADServerRole.GlobalCatalog;
            }
            if (adserverRole != ADServerRole.None)
            {
                miniTopology.IncrementTopologyVersion();
            }
            ExTraceGlobals.TopologyProviderTracer.TraceDebug <string, ADServerRole, int>((long)this.GetHashCode(), "PartitionFqdn {0}. Role(s) {1} were reported as down. Topology version change {2}.", partitionFqdn, adserverRole, miniTopology.Version);
        }