/**
 * 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.hdfs.server.blockmanagement;

public class BlockPlacementStatusDefault implements BlockPlacementStatus {

  private int requiredRacks = 0;
  private int currentRacks = 0;
  
  public BlockPlacementStatusDefault(int currentRacks, int requiredRacks){
    this.requiredRacks = requiredRacks;
    this.currentRacks = currentRacks;
  }
  
  @Override
  public boolean isPlacementPolicySatisfied() {
    return requiredRacks <= currentRacks;
  }

  @Override
  public String getErrorDescription() {
    if (isPlacementPolicySatisfied()) {
      return null;
    }
    return "Block should be additionally replicated on " + 
        (requiredRacks - currentRacks) + " more rack(s).";
  }

}
