001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hdfs.client;
019
020import java.io.IOException;
021import java.net.URI;
022
023import org.apache.hadoop.classification.InterfaceAudience;
024import org.apache.hadoop.classification.InterfaceStability;
025import org.apache.hadoop.conf.Configuration;
026import org.apache.hadoop.fs.FileSystem;
027import org.apache.hadoop.fs.Path;
028import org.apache.hadoop.hdfs.DistributedFileSystem;
029import org.apache.hadoop.hdfs.protocol.HdfsConstants;
030import org.apache.hadoop.hdfs.tools.DFSAdmin;
031
032/**
033 * The public API for performing administrative functions on HDFS. Those writing
034 * applications against HDFS should prefer this interface to directly accessing
035 * functionality in DistributedFileSystem or DFSClient.
036 * 
037 * Note that this is distinct from the similarly-named {@link DFSAdmin}, which
038 * is a class that provides the functionality for the CLI `hdfs dfsadmin ...'
039 * commands.
040 */
041@InterfaceAudience.Public
042@InterfaceStability.Evolving
043public class HdfsAdmin {
044  
045  private DistributedFileSystem dfs;
046  
047  /**
048   * Create a new HdfsAdmin client.
049   * 
050   * @param uri the unique URI of the HDFS file system to administer
051   * @param conf configuration
052   * @throws IOException in the event the file system could not be created
053   */
054  public HdfsAdmin(URI uri, Configuration conf) throws IOException {
055    FileSystem fs = FileSystem.get(uri, conf);
056    if (!(fs instanceof DistributedFileSystem)) {
057      throw new IllegalArgumentException("'" + uri + "' is not an HDFS URI.");
058    } else {
059      dfs = (DistributedFileSystem)fs;
060    }
061  }
062  
063  /**
064   * Set the namespace quota (count of files, directories, and sym links) for a
065   * directory.
066   * 
067   * @param src the path to set the quota for
068   * @param quota the value to set for the quota
069   * @throws IOException in the event of error
070   */
071  public void setQuota(Path src, long quota) throws IOException {
072    dfs.setQuota(src, quota, HdfsConstants.QUOTA_DONT_SET);
073  }
074  
075  /**
076   * Clear the namespace quota (count of files, directories and sym links) for a
077   * directory.
078   * 
079   * @param src the path to clear the quota of
080   * @throws IOException in the event of error
081   */
082  public void clearQuota(Path src) throws IOException {
083    dfs.setQuota(src, HdfsConstants.QUOTA_RESET, HdfsConstants.QUOTA_DONT_SET);
084  }
085  
086  /**
087   * Set the disk space quota (size of files) for a directory. Note that
088   * directories and sym links do not occupy disk space.
089   * 
090   * @param src the path to set the space quota of
091   * @param spaceQuota the value to set for the space quota
092   * @throws IOException in the event of error
093   */
094  public void setSpaceQuota(Path src, long spaceQuota) throws IOException {
095    dfs.setQuota(src, HdfsConstants.QUOTA_DONT_SET, spaceQuota);
096  }
097  
098  /**
099   * Clear the disk space quota (size of files) for a directory. Note that
100   * directories and sym links do not occupy disk space.
101   * 
102   * @param src the path to clear the space quota of
103   * @throws IOException in the event of error
104   */
105  public void clearSpaceQuota(Path src) throws IOException {
106    dfs.setQuota(src, HdfsConstants.QUOTA_DONT_SET, HdfsConstants.QUOTA_RESET);
107  }
108}