public static Resource[] GetAllResources(bool updateThem = false) { var resourceLoadTimer = System.Diagnostics.Stopwatch.StartNew(); var resourceBase = Discovery.GetResourceBase(); Resource[] resources = new Resource[0]; try { resources = resourceBase.GetAllResources(); if (updateThem) { //foreach (var resource in resources) PFX.Parallel.ForEach(resources, (resource) => { //var updateStarted = DateTime.Now; var controller = Discovery.GetControllerFarm(resource); try { var nodesStateInfo = controller.GetNodesState(resource.ResourceName); foreach (var nodeState in nodesStateInfo) { var node = resource.Nodes.Single(n => n.NodeName == nodeState.NodeName); node.CoresAvailable = nodeState.CoresAvailable; node.SubmissionsAvailable = (int)Math.Max(0, nodeState.TasksSubmissionLimit - nodeState.TasksSubmitted); } string[] availableNodeNames = nodesStateInfo.Where(n => n.State == ControllerFarmService.NodeState.Available).Select(n => n.NodeName).ToArray(); //resource.Nodes = resource.Nodes.Where(n => availableNodeNames.Contains(n.NodeName)).ToArray(); controller.Close(); } catch (Exception e) { controller.Abort(); Log.Warn(String.Format("Exception while updating resource '{0}' state: {1}", resource.ResourceName, e)); resource.Nodes = new ResourceNode[0]; // should not count any nodes as 'will be available sometime' /* * foreach (var node in resource.Nodes) * { * node.CoresAvailable = 0; * node.SubmissionsAvailable = 0; * } */ } finally { //var updateFinished = DateTime.Now; //resourceUpdateTime += updateFinished - updateStarted; } }); resourceLoadTimer.Stop(); Log.Info(String.Format( "Resources loaded and updated in {0} seconds", resourceLoadTimer.Elapsed.TotalSeconds )); } resourceBase.Close(); } catch (Exception e) { resourceBase.Abort(); if (resourceLoadTimer.IsRunning) { resourceLoadTimer.Stop(); } Log.Error("Exception on getting all resources from ResourceBase: " + e.ToString()); throw; } if (updateThem) { resources = resources.Where(r => r.Nodes.Any()).ToArray(); Log.Info("Available resources: " + String.Join(", ", resources.Select(r => r.ResourceName + "(" + String.Join(", ", r.Nodes.Select(n => n.NodeName)) + ")"))); } return(resources); }