/**
 * 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.
 */

package org.apache.hadoop.yarn.server.resourcemanager.scheduler;

import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.util.resource.Resources;

/**
 * Resource limits for queues/applications, this means max overall (please note
 * that, it's not "extra") resource you can get.
 */
public class ResourceLimits {
  private volatile Resource limit;

  // This is special limit that goes with the RESERVE_CONT_LOOK_ALL_NODES
  // config. This limit indicates how much we need to unreserve to allocate
  // another container.
  private volatile Resource amountNeededUnreserve;

  // How much resource you can use for next allocation, if this isn't enough for
  // next container allocation, you may need to consider unreserve some
  // containers.
  private volatile Resource headroom;

  // How much resource should be reserved for high-priority blocked queues
  private Resource blockedHeadroom;

  private boolean allowPreempt = false;

  public ResourceLimits(Resource limit) {
    this(limit, Resources.none());
  }

  public ResourceLimits(Resource limit, Resource amountNeededUnreserve) {
    this.amountNeededUnreserve = amountNeededUnreserve;
    this.headroom = limit;
    this.limit = limit;
  }

  public Resource getLimit() {
    return limit;
  }

  public Resource getHeadroom() {
    return headroom;
  }

  public void setHeadroom(Resource headroom) {
    this.headroom = headroom;
  }

  public Resource getAmountNeededUnreserve() {
    return amountNeededUnreserve;
  }

  public void setLimit(Resource limit) {
    this.limit = limit;
  }

  public void setAmountNeededUnreserve(Resource amountNeededUnreserve) {
    this.amountNeededUnreserve = amountNeededUnreserve;
  }

  public boolean isAllowPreemption() {
    return allowPreempt;
  }

  public void setIsAllowPreemption(boolean allowPreempt) {
   this.allowPreempt = allowPreempt;
  }

  public void addBlockedHeadroom(Resource resource) {
    if (blockedHeadroom == null) {
      blockedHeadroom = Resource.newInstance(0, 0);
    }
    Resources.addTo(blockedHeadroom, resource);
  }

  public Resource getBlockedHeadroom() {
    if (blockedHeadroom == null) {
      return Resources.none();
    }
    return blockedHeadroom;
  }

  public Resource getNetLimit() {
    if (blockedHeadroom != null) {
      return Resources.subtract(limit, blockedHeadroom);
    }
    return limit;
  }
}
