/* * 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); } }