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

import java.util.Map;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.hdfs.protocol.RollingUpgradeInfo;

/**
 * This is the JMX management interface for namenode information.
 * End users shouldn't be implementing these interfaces, and instead
 * access this information through the JMX APIs.
 */
@InterfaceAudience.Private
@InterfaceStability.Stable
public interface NameNodeMXBean {

  /**
   * Gets the version of Hadoop.
   * 
   * @return the version
   */
  public String getVersion();

  /**
   * Get the version of software running on the Namenode
   * @return a string representing the version
   */
  public String getSoftwareVersion();

  /**
   * Gets the used space by data nodes.
   * 
   * @return the used space by data nodes
   */
  public long getUsed();
  
  /**
   * Gets total non-used raw bytes.
   * 
   * @return total non-used raw bytes
   */
  public long getFree();
  
  /**
   * Gets total raw bytes including non-dfs used space.
   * 
   * @return the total raw bytes including non-dfs used space
   */
  public long getTotal();
  
  
  /**
   * Gets the safemode status
   * 
   * @return the safemode status
   * 
   */
  public String getSafemode();
  
  /**
   * Checks if upgrade is finalized.
   * 
   * @return true, if upgrade is finalized
   */
  public boolean isUpgradeFinalized();

  /**
   * Gets the RollingUpgrade information.
   *
   * @return Rolling upgrade information if an upgrade is in progress. Else
   * (e.g. if there is no upgrade or the upgrade is finalized), returns null.
   */
  public RollingUpgradeInfo.Bean getRollingUpgradeStatus();

  /**
   * Gets total used space by data nodes for non DFS purposes such as storing
   * temporary files on the local file system
   * 
   * @return the non dfs space of the cluster
   */
  public long getNonDfsUsedSpace();
  
  /**
   * Gets the total used space by data nodes as percentage of total capacity
   * 
   * @return the percentage of used space on the cluster.
   */
  public float getPercentUsed();
  
  /**
   * Gets the total remaining space by data nodes as percentage of total 
   * capacity
   * 
   * @return the percentage of the remaining space on the cluster
   */
  public float getPercentRemaining();

  /**
   * Returns the amount of cache used by the datanode (in bytes).
   */
  public long getCacheUsed();

  /**
   * Returns the total cache capacity of the datanode (in bytes).
   */
  public long getCacheCapacity();
  
  /**
   * Get the total space used by the block pools of this namenode
   */
  public long getBlockPoolUsedSpace();
  
  /**
   * Get the total space used by the block pool as percentage of total capacity
   */
  public float getPercentBlockPoolUsed();
    
  /**
   * Gets the total numbers of blocks on the cluster.
   * 
   * @return the total number of blocks of the cluster
   */
  public long getTotalBlocks();
  
  /**
   * Gets the total number of files on the cluster
   *
   * @return the total number of files on the cluster
   * @deprecated Use
   * {@link org.apache.hadoop.hdfs.server.namenode.metrics.FSNamesystemMBean#getFilesTotal()} instead.
   */
  @Deprecated
  public long getTotalFiles();
  
  /**
   * Gets the total number of missing blocks on the cluster
   * 
   * @return the total number of missing blocks on the cluster
   */
  public long getNumberOfMissingBlocks();
  
  /**
   * Gets the total number of missing blocks on the cluster with
   * replication factor 1
   *
   * @return the total number of missing blocks on the cluster with
   * replication factor 1
   */
  public long getNumberOfMissingBlocksWithReplicationFactorOne();

  /**
   * Gets the total number of snapshottable dirs in the system.
   *
   * @return the total number of snapshottable dirs in the system
   */
  public long getNumberOfSnapshottableDirs();

  /**
   * Gets the number of threads.
   * 
   * @return the number of threads
   */
  public int getThreads();

  /**
   * Gets the live node information of the cluster.
   * 
   * @return the live node information
   */
  public String getLiveNodes();
  
  /**
   * Gets the dead node information of the cluster.
   * 
   * @return the dead node information
   */
  public String getDeadNodes();
  
  /**
   * Gets the decommissioning node information of the cluster.
   * 
   * @return the decommissioning node information
   */
  public String getDecomNodes();

  /**
   * Gets the information on nodes entering maintenance.
   *
   * @return the information on nodes entering maintenance
   */
  String getEnteringMaintenanceNodes();

  /**
   * Gets the cluster id.
   * 
   * @return the cluster id
   */
  public String getClusterId();
  
  /**
   * Gets the block pool id.
   * 
   * @return the block pool id
   */
  public String getBlockPoolId();

  /**
   * Get status information about the directories storing image and edits logs
   * of the NN.
   * 
   * @return the name dir status information, as a JSON string.
   */
  public String getNameDirStatuses();

  /**
   * Get Max, Median, Min and Standard Deviation of DataNodes usage.
   *
   * @return the DataNode usage information, as a JSON string.
   */
  public String getNodeUsage();

  /**
   * Get status information about the journals of the NN.
   *
   * @return the name journal status information, as a JSON string.
   */
  public String getNameJournalStatus();
  
  /**
   * Get information about the transaction ID, including the last applied 
   * transaction ID and the most recent checkpoint's transaction ID
   */
  public String getJournalTransactionInfo();

  /**
   * Gets the NN start time
   * @deprecated Use
   * {@link #getNNStartedTimeInMillis()} instead.
   * @return the NN start time
   */
  @Deprecated
  public String getNNStarted();

  /**
   * Gets the NN start time in milliseconds.
   * @return the NN start time in msec
   */
  long getNNStartedTimeInMillis();

  /**
   * Get the compilation information which contains date, user and branch
   *
   * @return the compilation information, as a JSON string.
   */
  public String getCompileInfo();

  /**
   * Get the list of corrupt files
   *
   * @return the list of corrupt files, as a JSON string.
   */
  public String getCorruptFiles();

  /**
   * Get the number of distinct versions of live datanodes
   * 
   * @return the number of distinct versions of live datanodes
   */
  public int getDistinctVersionCount();

  /**
   * Get the number of live datanodes for each distinct versions
   * 
   * @return the number of live datanodes for each distinct versions
   */
  public Map<String, Integer> getDistinctVersions();
  
  /**
   * Get namenode directory size.
   */
  String getNameDirSize();

}
