예제 #1
0
 /// <summary>
 /// On refresh event handler
 /// </summary>
 /// <param name="status">Status</param>
 protected override void OnRefresh(AsyncStatus status)
 {
     try
     {
         base.OnRefresh(status);
         RefreshTopology(_dto);
         RefreshNodeTree();
     }
     catch (AggregateException exc)
     {
         if (exc.InnerExceptions.Count > 0)
         {
             var msg     = exc.InnerExceptions.Select(x => x.Message).Aggregate((x, y) => x + " , " + y);
             var message = string.Format(Constants.VMDirConnectFailure, msg);
             MMCDlgHelper.ShowMessage(message);
         }
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
     }
     catch (Exception exc)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
         MMCDlgHelper.ShowException(exc);
     }
 }
예제 #2
0
 private void GetDomainFunctionalLevel()
 {
     try
     {
         var domainFucntionalLevel = string.Empty;
         var serverNode            = _formView.ScopeNode as ServerNode;
         if (serverNode != null)
         {
             var dto = serverNode.Hosts.FirstOrDefault(x => x.NodeType == NodeType.Infrastructure && x.Active);
             if (dto != null)
             {
                 if (serverNode.ServerDto != null)
                 {
                     var serverDto = new ServerDto {
                         Server = dto.Name, Upn = serverNode.ServerDto.Upn, Password = serverNode.ServerDto.Password, DomainName = serverNode.ServerDto.DomainName
                     };
                     domainFucntionalLevel = PscHighAvailabilityAppEnvironment.Instance.Service.GetDomainFunctionalLevel(serverDto);
                 }
             }
         }
         txtDomainFunctionalLevel.Text = domainFucntionalLevel;
     }
     catch (Exception exc)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
         MiscUtilsService.ShowError(exc);
     }
 }
예제 #3
0
        /// <summary>
        /// Sets the management node to legacy mode
        /// </summary>
        /// <param name="legacy">True if legacy mode needs to be set false otherwise</param>
        /// <param name="serverDto">Management node details</param>
        public void SetLegacyMode(bool legacy, ServerDto serverDto)
        {
            try
            {
                using (Client client = new Client(serverDto.Server, serverDto.Upn, serverDto.Password))
                {
                    if (legacy)
                    {
                        var message = string.Format("CdcDisableClientAffinity API call for Server: {0} ", serverDto.Server);
                        _logger.Log(message, LogLevel.Info);

                        client.CdcDisableClientAffinity();

                        message = string.Format("CdcDisableClientAffinity API call for Server: {0} complete", serverDto.Server);
                        _logger.Log(message, LogLevel.Info);
                    }
                    else
                    {
                        var message = string.Format("CdcEnableClientAffinity API call for Server: {0} ", serverDto.Server);
                        _logger.Log(message, LogLevel.Info);

                        client.CdcEnableClientAffinity();

                        message = string.Format("CdcEnableClientAffinity API call for Server: {0} complete", serverDto.Server);
                        _logger.Log(message, LogLevel.Info);
                    }
                }
            }
            catch (Exception exc)
            {
                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                _logger.LogException(exc, custom);
                throw;
            }
        }
예제 #4
0
        /// <summary>
        /// Gets the domain functional level for the server
        /// </summary>
        /// <param name="serverDto">Server details</param>
        /// <returns>Domain functional level</returns>
        public string GetDomainFunctionalLevel(ServerDto serverDto)
        {
            var dfl = string.Empty;

            try
            {
                var message = string.Format("Method: GetDomainFunctionalLevel - LdapSearchHelper.Search API call for Server: {0} complete", serverDto.Server);
                _logger.Log(message, LogLevel.Info);

                var helper   = new LdapSearchHelper(serverDto.Server, serverDto.Upn, serverDto.Password);
                var searchDN = "DC=" + serverDto.DomainName.Replace(".", ", DC=");
                Action <ILdapMessage, List <ILdapEntry> > action = delegate(ILdapMessage searchRequest, List <ILdapEntry> values)
                {
                    dfl = GetDomainFunctionalLevel(searchRequest, values);
                };
                helper.Search(searchDN, LdapScope.SCOPE_BASE, "(objectClass=*)", new[] { "+" }, true, action);

                message = string.Format("Method: GetDomainFunctionalLevel - CdcGetDCStatus API call for Server: {0} complete", serverDto.Server);
                _logger.Log(message, LogLevel.Info);
            }
            catch (Exception exc)
            {
                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                _logger.LogException(exc, custom);
            }
            return(dfl);
        }
예제 #5
0
파일: RootNode.cs 프로젝트: wfu8/lightwave
 /// <summary>
 /// Login into an already added server
 /// </summary>
 /// <param name="node">Server node</param>
 /// <returns>True on success false otherwise</returns>
 public bool Login(ServerNode node)
 {
     try
     {
         _loginUI = new Login(node.ServerDto);
         if (this.SnapIn.Console.ShowDialog(_loginUI) == DialogResult.OK)
         {
             node.ServerDto = _loginUI.Server;
             node.AddLogoutActions();
             _loginUI.Close();
             node.Load(_loginUI.ManagementDto);
             return(true);
         }
     }
     catch (AggregateException exc)
     {
         if (exc.InnerExceptions.Count > 0)
         {
             var msg = exc.InnerExceptions.Select(x => x.Message).Aggregate((x, y) => x + " , " + y);
             MMCDlgHelper.ShowMessage(msg);
         }
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
     }
     catch (Exception exp)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exp);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exp, custom);
         node.AddLoginActions();
         MMCDlgHelper.ShowException(exp);
     }
     return(false);
 }
예제 #6
0
        private async Task OnOkClick()
        {
            try
            {
                btnOK.Enabled = false;
                if (IsValid())
                {
                    if (Server == null)
                    {
                        Server = new ServerDto();
                    }
                    Server.Server   = txtDirectoryServer.Text;
                    Server.Upn      = txtBindUPN.Text;
                    Server.Password = txtPassword.Text;
                    var parts = Server.Upn.Split('@');
                    Server.UserName   = parts[0];
                    Server.DomainName = parts[1];
                    var task = new Task(Connect);
                    task.Start();
                    if (task == await Task.WhenAny(task, Task.Delay(Constants.TopologyTimeout * Constants.MilliSecsMultiplier)))
                    {
                        await task;
                    }

                    if (ManagementDto != null)
                    {
                        this.DialogResult = DialogResult.OK;
                    }
                    else
                    {
                        MiscUtilsService.ShowError(Constants.LoginError, "Error", MessageBoxButtons.OK);
                        btnOK.Enabled = true;
                    }
                }
                else
                {
                    btnOK.Enabled = true;
                }
            }
            catch (AggregateException exc)
            {
                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
                if (exc.InnerExceptions.Count > 0)
                {
                    var msg = exc.InnerExceptions.Select(x => x.Message).Aggregate((x, y) => x + " , " + y);
                    MMCDlgHelper.ShowError(msg);
                }
            }
            catch (Exception exp)
            {
                var custom = new CustomExceptionExtractor().GetCustomMessage(exp);
                PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exp, custom);
                MiscUtilsService.ShowError(exp);
            }
        }
예제 #7
0
 /// <summary>
 /// Checked exception handling
 /// </summary>
 /// <param name="fn">Action</param>
 public static void CheckedExec(System.Action fn)
 {
     try
     {
         fn();
     }
     catch (Exception exp)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exp);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exp, custom);
         ShowError(exp);
     }
 }
예제 #8
0
 private void btnRefresh_Click(object sender, EventArgs e)
 {
     try
     {
         RefreshView();
     }
     catch (Exception exc)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
         MiscUtilsService.ShowError(exc);
     }
 }
예제 #9
0
 public void RefreshDataSource()
 {
     try
     {
         RefreshView();
     }
     catch (Exception exc)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
         MiscUtilsService.ShowError(exc);
     }
 }
예제 #10
0
 /// <summary>
 /// On delete event handler
 /// </summary>
 /// <param name="status">Status</param>
 protected override void OnDelete(SyncStatus status)
 {
     try
     {
         base.OnDelete(status);
         StopBackgroundRefresh();
         RemoveServer();
     }
     catch (Exception exc)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
         MMCDlgHelper.ShowException(exc);
     }
 }
예제 #11
0
 void timer_Tick(object sender, EventArgs e)
 {
     try
     {
         RefreshView();
     }
     catch (Exception exc)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
         MiscUtilsService.ShowError(exc);
         _timer.Enabled         = false;
         chkAutoRefresh.Checked = false;
     }
 }
예제 #12
0
        void _timer_Tick(object sender, System.EventArgs e)
        {
            if (Hosts != null && Hosts.Count > 0)
            {
                var infras = Hosts.Where(x => x.NodeType == VMPSCHighAvailability.Common.NodeType.Infrastructure).ToList();
                if (infras != null)
                {
                    foreach (var host in infras)
                    {
                        Task.Run(() =>
                        {
                            try
                            {
                                UpdateInfraNode(host, ServerDto);
                            }
                            catch (Exception exc)
                            {
                                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                                PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
                            }
                        }
                                 );
                    }
                }

                var mgmts = Hosts.Where(x => x.NodeType == VMPSCHighAvailability.Common.NodeType.Management);

                if (mgmts != null)
                {
                    foreach (var host in mgmts)
                    {
                        Task.Run(() =>
                        {
                            try
                            {
                                UpdateManagementNode(host, ServerDto);
                            }
                            catch (Exception exc)
                            {
                                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                                PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
                            }
                        }
                                 );
                    }
                }
            }
        }
예제 #13
0
        /// <summary>
        /// Checks connectivity of the server
        /// </summary>
        /// <param name="serverDto">Server with credentials i.e. UPN and password</param>
        /// <returns>True on success false otherwise</returns>
        public ManagementDto Connect(ServerDto serverDto)
        {
            var dto = new ManagementDto {
                Name = serverDto.Server
            };

            try
            {
                var message = string.Format("Method: Connect - new Client API call for Server: {0}", serverDto.Server);
                _logger.Log(message, LogLevel.Info);

                using (Client client = new Client(serverDto.Server, serverDto.Upn, serverDto.Password))
                {
                    message = string.Format("Method: Connect - new Client API call for Server: {0} complete", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);

                    message = string.Format("Method: Connect - VmAfdGetSiteName API call for Server: {0}", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);

                    dto.Sitename = client.VmAfdGetSiteName();

                    message = string.Format("Method: Connect - VmAfdGetSiteName API call for Server: {0} Sitename: {1}", serverDto.Server, dto.Sitename);
                    _logger.Log(message, LogLevel.Info);

                    message = string.Format("Method: Connect - CdcGetDCName API call for Server: {0}", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);

                    var domainController = client.CdcGetDCName(serverDto.DomainName, dto.Sitename, 0);

                    message = string.Format("Method: Connect - CdcGetDCName API call for Server: {0} complete", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);

                    dto.DomainController = new InfrastructureDto
                    {
                        Name = domainController.pszDCName
                    };
                }
            }
            catch (Exception exc)
            {
                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                _logger.LogException(exc, custom);
                dto = null;
            }
            return(dto);
        }
예제 #14
0
        /// <summary>
        /// Gets the infrastructure nodes.
        /// </summary>
        /// <returns>The infrastructure nodes.</returns>
        /// <param name="serverDto">Server dto.</param>
        /// <param name="dcName">Dc name.</param>
        private List <NodeDto> GetInfrastructureNodes(ServerDto serverDto, string dcName)
        {
            var message = "GetInfrastructureNodes method for Server: " + serverDto.Server;

            _logger.Log(message, LogLevel.Info);

            var nodes = new List <NodeDto>();

            // Get Infrastructure nodes
            try
            {
                message = "VmDirGetDCInfos API call for Server: " + serverDto.Server;
                _logger.Log(message, LogLevel.Info);
                var entries = vmdirClient.Client.VmDirGetDCInfos(dcName, serverDto.UserName, serverDto.Password);

                message = string.Format("VmDirGetDCInfos API Server: {0} complete. Entries retrieved: {1}", serverDto.Server, entries.Count.ToString());
                _logger.Log(message, LogLevel.Info);

                foreach (vmdirClient.VmDirDCInfo entry in entries)
                {
                    var infraNode = new InfrastructureDto()
                    {
                        Name     = entry.pszDCName,
                        Sitename = entry.pszSiteName,
                        Partners = entry.partners,
                        NodeType = NodeType.Infrastructure,
                        Ip       = Network.GetIpAddress(entry.pszDCName)
                    };
                    nodes.Add(infraNode);
                }
            }
            catch (Exception exc)
            {
                message = "VmDirGetDCInfos API returned error for Server: " + serverDto.Server;
                _logger.Log(message, LogLevel.Error);
                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                _logger.LogException(exc, custom);
            }
            return(nodes);
        }
예제 #15
0
 private void ChangeMode()
 {
     try
     {
         var node      = _formView.ScopeNode as ManagementNode;
         var serverDto = new ServerDto {
             Server = node.DisplayName, Upn = node.ServerDto.Upn, Password = node.ServerDto.Password
         };
         PscHighAvailabilityAppEnvironment.Instance.Service.SetLegacyMode(!legacyMode, serverDto);
         _dto.Legacy = !legacyMode;
         btnHA.Text  = _dto.Legacy ? Constants.EnableDefaultHA : Constants.EnableLegacy;
         legacyMode  = _dto.Legacy;
         var state = _dto.Legacy ? CDC_DC_STATE.CDC_DC_STATE_LEGACY : CDC_DC_STATE.CDC_DC_STATE_NO_DC_LIST;
         _dto.State = CdcDcStateHelper.GetStateDescription(state);
     }
     catch (Exception exc)
     {
         var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
         PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
         MiscUtilsService.ShowError(exc);
     }
     UpdateState();
 }
예제 #16
0
        /// <summary>
        /// Action event handler
        /// </summary>
        /// <param name="action">Action</param>
        /// <param name="status">Status</param>
        protected override void OnAction(Microsoft.ManagementConsole.Action action, AsyncStatus status)
        {
            try
            {
                base.OnAction(action, status);

                switch ((ServerNodeAction)(int)action.Tag)
                {
                case ServerNodeAction.Login:
                    Login();
                    break;

                case ServerNodeAction.Logout:
                    Logout();
                    break;
                }
            }
            catch (Exception exc)
            {
                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                PscHighAvailabilityAppEnvironment.Instance.Logger.LogException(exc, custom);
                MMCDlgHelper.ShowException(exc);
            }
        }
예제 #17
0
        /// <summary>
        /// Gets the management node details.
        /// </summary>
        /// <returns>The management node details.</returns>
        /// <param name="serverDto">Server dto.</param>
        public ManagementDto GetManagementNodeDetails(ServerDto serverDto)
        {
            var dto = new ManagementDto()
            {
                State = new StateDescriptionDto(), Name = serverDto.Server, Domain = serverDto.DomainName
            };

            using (Client client = new Client(serverDto.Server, serverDto.Upn, serverDto.Password))
            {
                var message = string.Format("Method: GetManagementNodeDetails - CdcGetCurrentState API call for Server: {0}", serverDto.Server);
                _logger.Log(message, LogLevel.Info);

                try
                {
                    var state = client.CdcGetCurrentState();
                    dto.Legacy = (state == CDC_DC_STATE.CDC_DC_STATE_LEGACY);
                    dto.State  = CdcDcStateHelper.GetStateDescription(state);
                    message    = string.Format("Method: GetManagementNodeDetails - CdcGetCurrentState API call for Server: {0} complete", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);
                }
                catch (Exception exc)
                {
                    message = string.Format("Method: GetManagementNodeDetails - CdcGetCurrentState API call for Server: {0} failed", serverDto.Server);
                    _logger.Log(message, LogLevel.Error);
                    var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                    _logger.LogException(exc, custom);
                }

                try
                {
                    message = string.Format("Method: GetManagementNodeDetails - VmAfdGetSiteName API call for Server: {0}", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);

                    dto.Sitename = client.VmAfdGetSiteName();

                    message = string.Format("Method: GetManagementNodeDetails - VmAfdGetSiteName API call for Server: {0} complete", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);
                }
                catch (Exception exc)
                {
                    message = string.Format("Method: GetManagementNodeDetails - VmAfdGetSiteName API call for Server: {0} failed", serverDto.Server);
                    _logger.Log(message, LogLevel.Error);
                    var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                    _logger.LogException(exc, custom);
                }
                dto.Active = true;
                dto.Ip     = Network.GetIpAddress(dto.Name);

                message = string.Format("Method: GetManagementNodeDetails - CdcGetDCName API call for Server: {0}", serverDto.Server);
                _logger.Log(message, LogLevel.Info);

                try
                {
                    var dcInfo = client.CdcGetDCName(serverDto.DomainName, dto.Sitename, 0);

                    message = string.Format("Method: GetManagementNodeDetails - CdcGetDCName API call for Server: {0} complete", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);

                    dto.DomainController = new InfrastructureDto
                    {
                        Name     = dcInfo.pszDCName,
                        NodeType = NodeType.Infrastructure,
                        Domain   = dcInfo.pszDomainName,
                        Ip       = Network.GetIpAddress(dcInfo.pszDCName)
                    };
                }
                catch (Exception exc)
                {
                    message = string.Format("Method: GetManagementNodeDetails - CdcGetDCName API call for Server: {0} failed", serverDto.Server);
                    _logger.Log(message, LogLevel.Error);
                    var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                    _logger.LogException(exc, custom);
                    dto.DomainController = new InfrastructureDto
                    {
                        Name     = string.Empty,
                        NodeType = NodeType.Infrastructure,
                        Domain   = string.Empty
                    };
                }
                dto.DomainControllers = new List <InfrastructureDto>();

                try
                {
                    message = string.Format("Method: GetManagementNodeDetails - CdcEnumDCEntries API call for Server: {0}", serverDto.Server);
                    _logger.Log(message, LogLevel.Info);
                    IList <string> entries = client.CdcEnumDCEntries();
                    message = string.Format("Method: GetManagementNodeDetails - CdcEnumDCEntries API call for Server: {0} complete. DCs returned: {1}", serverDto.Server, entries.Count());
                    _logger.Log(message, LogLevel.Info);
                    foreach (var entry in entries)
                    {
                        CDC_DC_STATUS_INFO     info;
                        VMAFD_HEARTBEAT_STATUS hbStatus;

                        try
                        {
                            message = string.Format("Method: GetManagementNodeDetails - CdcGetDCStatus API call for Server: {0}", serverDto.Server);
                            _logger.Log(message, LogLevel.Info);

                            client.CdcGetDCStatus(entry, string.Empty, out info, out hbStatus);
                            message = string.Format("Method: GetManagementNodeDetails - CdcGetDCStatus API call for Server: {0} complete", serverDto.Server);
                            _logger.Log(message, LogLevel.Info);

                            var infraDto = new InfrastructureDto()
                            {
                                Name     = entry,
                                Active   = info.bIsAlive == 1,
                                Sitename = info.pszSiteName,
                                LastPing = DateTimeConverter.FromUnixToDateTime(info.dwLastPing),
                                Services = new List <ServiceDto>(),
                                Ip       = Network.GetIpAddress(entry)
                            };

                            if (hbStatus.info != null)
                            {
                                foreach (var serviceInfo in hbStatus.info)
                                {
                                    var service = new ServiceDto
                                    {
                                        ServiceName   = ServiceHelper.GetServiceName(serviceInfo.pszServiceName),
                                        Description   = ServiceHelper.GetServiceDescription(serviceInfo.pszServiceName),
                                        Alive         = serviceInfo.bIsAlive == 1,
                                        LastHeartbeat = DateTimeConverter.FromUnixToDateTime(serviceInfo.dwLastHeartbeat),
                                        Port          = serviceInfo.dwPort,
                                    };
                                    infraDto.Services.Add(service);
                                }
                            }
                            dto.DomainControllers.Add(infraDto);
                        }
                        catch (Exception exc)
                        {
                            message = string.Format("Method: GetManagementNodeDetails - CdcGetDCStatus API call for Server: {0} failed", serverDto.Server);
                            _logger.Log(message, LogLevel.Error);
                            var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                            _logger.LogException(exc, custom);
                            dto.DomainController = new InfrastructureDto
                            {
                                Name     = string.Empty,
                                NodeType = NodeType.Infrastructure,
                                Domain   = string.Empty
                            };
                        }
                    }
                }
                catch (Exception exc)
                {
                    message = string.Format("Method: GetManagementNodeDetails - CdcEnumDCEntries API call for Server: {0} failed", serverDto.Server);
                    _logger.Log(message, LogLevel.Error);
                    var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                    _logger.LogException(exc, custom);
                    dto.DomainController = new InfrastructureDto
                    {
                        Name     = string.Empty,
                        NodeType = NodeType.Infrastructure,
                        Domain   = string.Empty
                    };
                }
            }
            return(dto);
        }
예제 #18
0
        /// <summary>
        /// Gets the management nodes.
        /// </summary>
        /// <returns>The management nodes.</returns>
        /// <param name="serverDto">Server dto.</param>
        /// <param name="dcName">Dc name.</param>
        /// <param name="siteName">Site name.</param>
        private List <NodeDto> GetManagementNodes(ServerDto serverDto, string dcName, string site)
        {
            var message = "GetManagementNodes method for Server: " + serverDto.Server;

            _logger.Log(message, LogLevel.Info);

            var nodes = new ConcurrentBag <NodeDto>();

            try
            {
                message = "VmDirGetComputers method for Server: " + serverDto.Server;
                _logger.Log(message, LogLevel.Info);

                // Get Management nodes
                var mgmtNodes = vmdirClient.Client.VmDirGetComputers(dcName, serverDto.UserName, serverDto.Password);

                message = string.Format("VmDirGetComputers method for Server: {0} VC nodes:  {1}", serverDto.Server, mgmtNodes.Count);
                _logger.Log(message, LogLevel.Info);

                if (mgmtNodes != null && mgmtNodes.Count > 0)
                {
                    var tasks = new Task[mgmtNodes.Count];
                    var index = 0;
                    // Update management nodes with site name
                    foreach (var mgmt in mgmtNodes)
                    {
                        tasks[index++] = Task.Factory.StartNew(() =>
                        {
                            var siteName = string.Empty;
                            var s        = new ServerDto
                            {
                                Server   = mgmt,
                                Upn      = serverDto.Upn,
                                Password = serverDto.Password,
                                UserName = serverDto.UserName
                            };

                            try
                            {
                                message = string.Format("VmAfdGetSiteName API call for Server: {0} ", s.Server);
                                _logger.Log(message, LogLevel.Info);

                                using (Client client = new Client(s.Server, s.Upn, s.Password))
                                {
                                    siteName = client.VmAfdGetSiteName();
                                }
                                message = string.Format("VmAfdGetSiteName API call for Server: {0} succeeded.", s.Server);
                                _logger.Log(message, LogLevel.Info);

                                var mgmtNode = new ManagementDto()
                                {
                                    Name     = mgmt,
                                    Sitename = siteName,
                                    NodeType = NodeType.Management,
                                    Ip       = Network.GetIpAddress(mgmt)
                                };
                                nodes.Add(mgmtNode);
                            }
                            catch (Exception exc)
                            {
                                message = string.Format("VmAfdGetSiteName returned error for Server: {0} ", s.Server);
                                _logger.Log(message, LogLevel.Info);
                                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                                _logger.LogException(exc, custom);
                            }
                        });
                    }
                    Task.WaitAll(tasks);
                }
            }
            catch (Exception exc)
            {
                var custom = new CustomExceptionExtractor().GetCustomMessage(exc);
                _logger.LogException(exc, custom);
            }
            return(nodes.ToList());
        }