content: /*
   * 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.chukwa.inputtools.hdfsusage;
  
  import java.net.URI;
  
  import org.apache.hadoop.chukwa.inputtools.jplugin.ChukwaMetricsList;
  import org.apache.hadoop.chukwa.inputtools.jplugin.JPlugin;
  import org.apache.hadoop.chukwa.inputtools.jplugin.JPluginStatusMetricsList;
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileStatus;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class HDFSUsagePlugin implements JPlugin<HDFSUsageMetrics> {
    private FileSystem hdfs;
    private String path;
    private OrgChart chart;
    
    @Override
    public ChukwaMetricsList<HDFSUsageMetrics> getMetrics() throws Throwable {
      ChukwaMetricsList<HDFSUsageMetrics> metricsList = new ChukwaMetricsList<HDFSUsageMetrics>(getRecordType());
      FileStatus status[] = hdfs.globStatus(new Path(path));
      for(int i=0; i<status.length; i++) {
        long totalSize = hdfs.getContentSummary(status[i].getPath()).getLength();
        if(totalSize <= 0) {
          continue;
        }
        String name = status[i].getPath().getName();
        HDFSUsageMetrics usage = new HDFSUsageMetrics();
        usage.setName(name);
        usage.setSize(totalSize);
        usage.setLastModified(status[i].getModificationTime());
        metricsList.addMetrics(usage);
        
        // also contribute to manager's usage
        if(chart != null) {
          Employee employee = chart.get(name);
          if(employee != null) {
            employee = employee.getManager();
            while(employee != null) {
              HDFSUsageMetrics managerUsage = new HDFSUsageMetrics();
              managerUsage.setName(employee.getId());
              managerUsage.setSize(totalSize);
              metricsList.addMetrics(managerUsage);
              employee = employee.getManager();
            }
          }
        }
      }
      return metricsList;
    }
  
    @Override
    public void init(String[] args) throws Throwable {
      for(int i=0; i<args.length; i++) {
        if(args[i].equals("-c")) {
          String orgChartClass = args[i+1];
          chart = (OrgChart) Class.forName(orgChartClass).newInstance();
          i++;
        } else if(args[i].equals("-h")) {
          Configuration conf = new Configuration();
          hdfs = FileSystem.get(new URI(args[i+1]), conf);
          i++;
        } else if(args[i].equals("-p")) {
          path = args[i+1];
          i++;
        }
      }
      
      if(hdfs == null) {
        Configuration conf = new Configuration();
        hdfs = FileSystem.get(conf);
      }
      
      if(path == null) {
        path = "/user/*";
      }
    }
  
    @Override
    public JPluginStatusMetricsList getStatus() throws Throwable {
      JPluginStatusMetricsList list = new JPluginStatusMetricsList(this.getClass().getSimpleName());
      list.addStatus("hdfs", hdfs.getUri().toString());
      list.addStatus("path", path);
      return null;
    }
  
    @Override
    public String getRecordType() {
      return "HDFSUsage";
    }
  }
  