Skip to content
Snippets Groups Projects
ClusterInformationLogic.cs 3.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • Vaclav Svaton's avatar
    Vaclav Svaton committed
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using HaaSMiddleware.BusinessLogicTier.Logic.JobManagement.Exceptions;
    using HaaSMiddleware.DataAccessTier.UnitOfWork;
    using HaaSMiddleware.DomainObjects.ClusterInformation;
    using HaaSMiddleware.DomainObjects.UserAndLimitationManagement;
    using HaaSMiddleware.HpcConnectionFramework;
    using log4net;
    
    namespace HaaSMiddleware.BusinessLogicTier.Logic.ClusterInformation {
    	internal class ClusterInformationLogic : IClusterInformationLogic {
    		private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    		private readonly IUnitOfWork unitOfWork;
    
    		internal ClusterInformationLogic(IUnitOfWork unitOfWork) {
    			this.unitOfWork = unitOfWork;
    		}
    
    		public IList<Cluster> ListAvailableClusters() {
    			return unitOfWork.ClusterRepository.GetAll().ToList();
    		}
    
    		public ClusterNodeUsage GetCurrentClusterNodeUsage(long clusterNodeId, AdaptorUser loggedUser) {
    			ClusterNodeType nodeType = GetClusterNodeTypeById(clusterNodeId);
    			IRexScheduler scheduler = SchedulerFactory.GetInstance(nodeType.Cluster.SchedulerType).CreateScheduler(nodeType.Cluster);
    			return scheduler.GetCurrentClusterNodeUsage(nodeType);
    		}
    
    		public ClusterAuthenticationCredentials GetNextAvailableUserCredentials(long clusterId) {
    			// Get credentials for cluster
    			Cluster cluster = unitOfWork.ClusterRepository.GetById(clusterId);
    			if (cluster == null) {
    				log.Error("Requested cluster with Id=" + clusterId + " does not exist in the system.");
    				throw new RequestedObjectDoesNotExistException("Requested cluster with Id=" + clusterId + " does not exist in the system.");
    			}
    			List<ClusterAuthenticationCredentials> credentials =
    				(from account in cluster.AuthenticationCredentials where account != cluster.ServiceAccountCredentials orderby account.Id ascending select account).ToList();
    			
    			long lastUsedId = ClusterUserCache.GetLastUserId(cluster);
    			if (lastUsedId == 0)
    			{	// No user has been used from this cluster
    				// return first usable account
    				ClusterUserCache.SetLastUserId(cluster, credentials[0].Id);
    				log.DebugFormat("Using initial cluster account: {0}", credentials[0].Username);
    				return credentials[0];
    			}
    			else
    			{
    				// Return first user with Id higher than the last one
    				ClusterAuthenticationCredentials creds = (from account in credentials where account.Id > lastUsedId select account).FirstOrDefault();
    				if (creds == null)
    				{ 
    					// No credentials with Id higher than last used found
    					// use first usable account
    					creds = credentials[0];
    				}
    				ClusterUserCache.SetLastUserId(cluster, creds.Id);
    				log.DebugFormat("Using cluster account: {0}", creds.Username);
    				return creds;
    			}
    			
    		}
    
    		public ClusterNodeType GetClusterNodeTypeById(long clusterNodeTypeId) {
    			ClusterNodeType nodeType = unitOfWork.ClusterNodeTypeRepository.GetById(clusterNodeTypeId);
    			if (nodeType == null) {
    				log.Error("Requested cluster node type with Id=" + clusterNodeTypeId + " does not exist in the system.");
    				throw new RequestedObjectDoesNotExistException("Requested cluster node type with Id=" + clusterNodeTypeId + " does not exist in the system.");
    			}
    			return nodeType;
    		}
    
    		public IList<ClusterNodeType> ListClusterNodeTypes() {
    			return unitOfWork.ClusterNodeTypeRepository.GetAll();
    		}
    	}
    }