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

import java.util.Map;

import javax.security.auth.Subject;

import org.apache.storm.Config;
import org.apache.storm.blobstore.ClientBlobStore;
import org.apache.storm.hdfs.blobstore.HdfsBlobStore;
import org.apache.storm.hdfs.blobstore.HdfsClientBlobStore;
import org.apache.storm.utils.Utils;

@SuppressWarnings("checkstyle:AbbreviationAsWordInName")
public class ListHDFS {
    
    public static void main(String[] args) throws Exception {
        if (args.length < 1) {
            System.out.println("Need at least 1 argument (hdfs_blobstore_path), but have " + Integer.toString(args.length));
            System.out.println("listHDFS <hdfs_blobstore_path> <hdfs_principal> <keytab>");
            System.out.println("Lists blobs in HdfsBlobStore");
            System.out.println("Example: listHDFS "
                    + "'hdfs://some-hdfs-namenode:8080/srv/storm/my-storm-blobstore' "
                    + "'stormUser/my-nimbus-host.example.com@STORM.EXAMPLE.COM' '/srv/my-keytab/stormUser.kt'");
            System.exit(1);
        }
        
        Map<String, Object> hdfsConf = Utils.readStormConfig();
        String hdfsBlobstorePath = args[0];
        
        hdfsConf.put(Config.BLOBSTORE_DIR, hdfsBlobstorePath);
        hdfsConf.put(Config.STORM_PRINCIPAL_TO_LOCAL_PLUGIN, "org.apache.storm.security.auth.DefaultPrincipalToLocal");
        if (args.length >= 2) {
            System.out.println("SETTING HDFS PRINCIPAL!");
            hdfsConf.put(Config.BLOBSTORE_HDFS_PRINCIPAL, args[1]);
        }
        if (args.length >= 3) {
            System.out.println("SETTING HDFS KEYTAB!");
            hdfsConf.put(Config.BLOBSTORE_HDFS_KEYTAB, args[2]);
        }
        
        /* CREATE THE BLOBSTORES */
        HdfsBlobStore hdfsBlobStore = new HdfsBlobStore();
        hdfsBlobStore.prepare(hdfsConf, null, null, null);
        
        /* LOOK AT HDFS BLOBSTORE */
        System.out.println("Listing HDFS blobstore keys.");
        MigratorMain.listBlobStoreKeys(hdfsBlobStore, null);
        System.out.println("Done Listing HDFS blobstore keys.");
        
        hdfsBlobStore.shutdown();
    }
}
