% 
% Licensed to the Apache Software Foundation (ASF) under one
% or more contributor license agreements.  See the NOTICE file
% distributed with this work for additional information
% regarding copyright ownership.  The ASF licenses this file
% to you under the Apache License, Version 2.0 (the
% "License"); you may not use this file except in compliance
% with the License.  You may obtain a copy of the License at
% 
%   http://www.apache.org/licenses/LICENSE-2.0
% 
% Unless required by applicable law or agreed to in writing,
% software distributed under the License is distributed on an
% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
% KIND, either express or implied.  See the License for the
% specific language governing permissions and limitations
% under the License.
% 

    \subsection{\varResourceManager~(\varRM, also known as the \varScheduler)}    
        
    There is one \varResourceManager~per \varDUCC~cluster.
    
    The duties of the \varResourceManager~are:
    \textit{
      \input{part5/c01-RM.tex}
    }
    
    The \varResourceManager~provides essential functionality for operation of the
    \varDUCC~system.
    It is configurable and tunable.
    It is also plug-replaceable.
    
    The \varResourceManager~both publishes and receive reports.  
    The \varResourceManager~receives \varOrchestrator~publications comprising
    Jobs, Reservations, and Services as well as 
    \varAgent~publications comprising inventory and metrics. 
    The \varResourceManager~publication occurs at regular intervals, each
    representing at the time of its publication the desired allocation
    of resources. 
   
    The \varResourceManager~considers various factors to make assignments, including:
    \begin{description}
      \item supply of available nodes;
      \item memory size of each available node;
      \item demand for resource in terms of memory size and class of service comprising Jobs, Reservations and Services;
      \item the most recent previous assignments and desirability for continuity;
    \end{description}
    
    The \varOrchestrator~is the primary consumer of the \varResourceManager~publication
    which it uses to bring the cluster into compliance with the allocation assignments.
    
    The \varResourceManager~adheres to the \varIScheduler~interface. 
    Algorithms adhering to this interface are eligible for replacing
    the \varDUCC~supplied one.
    
    \subsubsection{Job Manager Converter} 
    
    The Job Manager Converter module receives \varOrchestrator~publications and
    updates its internal state with new, changed, and removed map entries
    comprising Jobs, Reservations and Services.
        
    \subsubsection{Node Stability}
    
    The Node Status module evaluates the health of the nodes within the cluster
    for consideration during resource scheduling.  Any node deemed unhealthy is
    removed from the collection of available resources until such time as it
    is once again deemed healthy.
      
    \subsubsection{Node Status} 
        
    The Node Status module receives \varAgent~publications and
    updates its internal state with new, changed, and removed node status entries.
     
    \subsubsection{Resource Manager} 
    
    The \varResourceManager~performs the following:
    
    \begin{description}
      \item receive resource availability reports from \varAgents;
      \item receive resource need requests the \varOrchestrator;
      \item employ a scheduling algorithm at discrete time intervals to:
      \begin{description}
        \item consider the resource supply;
        \item consider the most recent allocation set;
        \item consider new, changed and removed resource demands;
        \item assign a resource to a request;
        \item remove a resource from a request;
        \item publish current allocation set;
      \end{description} 
    \end{description}     
        
    \subsubsection{\varScheduler} 
    
    The \varScheduler~runs at discrete time intervals.
    It assembles information about available nodes in the cluster.
    Each node, based upon its memory size is partitioned into zero or more \varShares.
    Each request (Job, Reservation and Service) is assessed as to the number of
    \varShares~required based upon user-specified memory size. 
    In addition, each request is assessed with respect to the user-specified class-of-service.

    The \varScheduler~considers the most recent previous allocations along with changes
    to supply and demand.  It then produces a new allocation set which the 
    \varResourceManager~publishes as directions to the \varOrchestrator.
    