org.apache.ranger.policyengine.RangerPluginPerfTester.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.ranger.policyengine.RangerPluginPerfTester.java

Source

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

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
import org.apache.ranger.plugin.policyevaluator.RangerPolicyEvaluator;
import org.apache.ranger.plugin.service.RangerBasePlugin;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.File;

public class RangerPluginPerfTester {

    static RangerBasePlugin plugin = null;

    private static String serviceType;
    private static String serviceName;
    private static String appId;
    private static String rangerHostName;
    private static int socketReadTimeout = 30 * 1000;
    private static int pollingInterval = 30 * 1000;
    private static String policyCacheDir;
    private static boolean useCachedPolicyEvaluator = false;

    private static Options options = new Options();

    public static void main(String[] args) {

        if (!parseArguments(args)) {
            System.err.println("Exiting.. ");
            System.exit(-1);
        }

        System.out.println("Arguments:");
        System.out.println("\t\tservice-type:\t\t\t" + serviceType);
        System.out.println("\t\tservice-name:\t\t\t" + serviceName);
        System.out.println("\t\tapp-id:\t\t\t\t" + appId);
        System.out.println("\t\tranger-host:\t\t\t" + rangerHostName);
        System.out.println("\t\tsocket-read-timeout:\t\t" + socketReadTimeout);
        System.out.println("\t\tpolling-interval:\t\t" + pollingInterval);
        System.out.println("\t\tpolicy-cache-dir:\t\t" + policyCacheDir);
        System.out.println("\t\tuse-cached-policy-evaluator:\t" + useCachedPolicyEvaluator);
        System.out.println("\n\n");

        Path filePath = buildConfigurationFile();

        if (filePath != null) {
            RangerConfiguration rangerConfig = RangerConfiguration.getInstance();
            rangerConfig.addResource(filePath);

            plugin = new RangerBasePlugin(serviceType, appId);

            Runtime runtime = Runtime.getRuntime();
            runtime.gc();

            long totalMemory = runtime.totalMemory();
            long freeMemory = runtime.freeMemory();

            System.out.println("Initial Memory Statistics:");
            System.out.println("\t\tMaximum Memory available for the process:\t" + runtime.maxMemory());
            System.out.println("\t\tInitial In-Use memory:\t\t\t\t" + (totalMemory - freeMemory));
            System.out.println("\t\tInitial Free memory:\t\t\t\t" + freeMemory);

            System.out.println("\n\n");

            plugin.init();

            while (true) {

                runtime.gc();

                freeMemory = runtime.freeMemory();
                totalMemory = runtime.totalMemory();

                System.out.println("Memory Statistics:");
                System.out.println("\t\tCurrently In-Use memory:\t" + (totalMemory - freeMemory));
                System.out.println("\t\tCurrently Free memory:\t\t" + freeMemory);

                System.out.println("\n\n");

                try {
                    Thread.sleep(60 * 1000);
                } catch (InterruptedException e) {

                    System.err.println("Main thread interrupted..., exiting...");
                    break;
                }
            }
        } else {
            System.err.println("Failed to build configuration file");
        }
    }

    static Path buildConfigurationFile() {

        Path ret = null;

        String propertyPrefix = "ranger.plugin." + serviceType;
        String policyEvaluatorType = useCachedPolicyEvaluator ? RangerPolicyEvaluator.EVALUATOR_TYPE_CACHED
                : RangerPolicyEvaluator.EVALUATOR_TYPE_OPTIMIZED;

        try {

            File file = File.createTempFile("ranger-plugin-test-site", ".xml");
            file.deleteOnExit();

            String filePathStr = file.getAbsolutePath();

            Path filePath = new Path(filePathStr);

            FileSystem fs = filePath.getFileSystem(new Configuration());

            FSDataOutputStream outStream = fs.create(filePath, true);

            OutputStreamWriter writer = new OutputStreamWriter(outStream);

            writer.write("<configuration>\n" + "        <property>\n" + "                <name>" + propertyPrefix
                    + ".policy.pollIntervalMs</name>\n" + "                <value>" + pollingInterval + "</value>\n"
                    + "        </property>\n" + "        <property>\n" + "                <name>" + propertyPrefix
                    + ".policy.cache.dir</name>\n" + "                <value>" + policyCacheDir + "</value>\n"
                    + "        </property>\n" + "        <property>\n" + "                <name>" + propertyPrefix
                    + ".policy.rest.url</name>\n" + "                <value>" + rangerHostName + ":6080"
                    + "</value>\n" + "        </property>\n" + "        <property>\n" + "                <name>"
                    + propertyPrefix + ".policy.source.impl</name>\n"
                    + "                <value>org.apache.ranger.admin.client.RangerAdminRESTClient</value>\n"
                    + "        </property>\n" + "        <property>\n" + "                <name>" + propertyPrefix
                    + ".policy.rest.client.read.timeoutMs</name>\n" + "                <value>" + socketReadTimeout
                    + "</value>\n" + "        </property>\n" + "        <property>\n" + "                <name>"
                    + propertyPrefix + ".policyengine.option.evaluator.type</name>\n" + "                <value>"
                    + policyEvaluatorType + "</value>\n" + "        </property>\n" + "        <property>\n"
                    + "                <name>" + propertyPrefix + ".service.name</name>\n"
                    + "                <value>" + serviceName + "</value>\n" + "        </property>\n" +

                    "        <property>\n" + "                <name>xasecure.audit.is.enabled</name>\n"
                    + "                <value>false</value>\n" + "        </property>\n" + "</configuration>\n");

            writer.close();
            ret = filePath;

        } catch (IOException exception) {
            //Ignore
        }

        return ret;

    }

    static boolean parseArguments(final String[] args) {

        boolean ret = false;

        options.addOption("h", "help", false, "show help.");
        options.addOption("s", "service-type", true, "Service-Type");
        options.addOption("n", "service-name", true, "Ranger service-name ");
        options.addOption("a", "app-id", true, "Application-Id");
        options.addOption("r", "ranger-host", true, "Ranger host-name");
        options.addOption("t", "socket-read-timeout", true, "Read timeout on socket in milliseconds");
        options.addOption("p", "polling-interval", true, "Polling Interval in milliseconds");
        options.addOption("c", "policy-cache-dir", true, "Policy-Cache directory ");
        options.addOption("e", "policy-evaluator-type", true, "Policy-Evaluator-Type (Cached/Other");

        DefaultParser commandLineParser = new DefaultParser();

        try {
            CommandLine commandLine = commandLineParser.parse(options, args);

            if (commandLine.hasOption("h")) {
                showUsage();
                return false;
            }

            serviceType = commandLine.getOptionValue("s");
            serviceName = commandLine.getOptionValue("n");
            appId = commandLine.getOptionValue("a");
            rangerHostName = commandLine.getOptionValue("r");
            policyCacheDir = commandLine.getOptionValue("c");

            try {
                String pollingIntervalStr = commandLine.getOptionValue("p");
                pollingInterval = Integer.parseInt(pollingIntervalStr);
            } catch (NumberFormatException exception) {
                // Ignore
            }

            String useCachedPolicyEvaluatorStr = commandLine.getOptionValue("e");
            if (StringUtils.equalsIgnoreCase(useCachedPolicyEvaluatorStr, "cache")) {
                useCachedPolicyEvaluator = true;
            }

            try {
                String socketReadTimeoutStr = commandLine.getOptionValue("t");
                socketReadTimeout = Integer.parseInt(socketReadTimeoutStr);
            } catch (NumberFormatException exception) {
                // Ignore
            }

            ret = true;

        } catch (ParseException exception) {
            System.err.println("Failed to parse arguments:" + exception);
        }

        return ret;
    }

    static void showUsage() {
        HelpFormatter formater = new HelpFormatter();
        formater.printHelp("plugin-tester", options);
    }

}