blob: 4fc6655aa627b2bc791290d01df2882d4028e55f [file] [log] [blame]
/*
* 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);
}
}