package com.cloudera.sa.node360.symulator; import com.cloudera.sa.node360.constant.TopLevelConst; import com.cloudera.sa.node360.model.EventPojo; import com.cloudera.sa.node360.model.NetFlowPojo; import com.cloudera.sa.node360.model.NodePojo; import com.cloudera.sa.node360.model.SamplePojo; import com.cloudera.sa.node360.nodepuller.listener.EventListener; import com.cloudera.sa.node360.nodepuller.listener.SystemOutListener; import com.cloudera.sa.node360.service.HBaseService; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ExecutionException; /** * Created by ted.malaska on 6/4/15. */ public class NodeDataSymulator { EventListener listener; HBaseService hbaseService; final long sleepBetweenIterations; final int dividSleepTime; final long maxIterations; final int updateNodeListEveryNIterations; final int updateEtcFileEveryNRequest; boolean isRunning = false; public NodeDataSymulator(EventListener listener, HBaseService hbaseService, long sleepBetweenIterations, long maxIterations, int updateNodeListEveryNIterations, int updateEtcFileEveryNRequest) { this.listener = listener; this.hbaseService = hbaseService; this.sleepBetweenIterations = sleepBetweenIterations; dividSleepTime = (int)(sleepBetweenIterations/100); this.maxIterations = maxIterations; this.updateNodeListEveryNIterations = updateNodeListEveryNIterations; this.updateEtcFileEveryNRequest = updateEtcFileEveryNRequest; } public void run(final int numberOfExternalNodes) throws IOException, InterruptedException, ExecutionException { isRunning = true; Runnable symRunnable = new Runnable() { @Override public void run() { try { List<NodePojo> internalNodeList = null; List<String> fullNodeList = new ArrayList<String>(); int modNumber = 0; for (int i = 0; i < maxIterations*dividSleepTime; i++) { if (i == 0 || i % updateNodeListEveryNIterations == 0) { internalNodeList = hbaseService.getFullNodeList(); for (NodePojo node : internalNodeList) { fullNodeList.add(node.getIpAddress()); } } for (int n = 0; n < internalNodeList.size(); n++) { if (n % dividSleepTime == modNumber) { NodePojo node = internalNodeList.get(n); produceCpuEvents(node); produceMemEvents(node); produceSwapEvents(node); produceDfEvents(node); produceEtcEvents(node); produceNewFlowEvents(node, fullNodeList); } } modNumber++; if (modNumber >= dividSleepTime) { modNumber = 0; } Thread.sleep(sleepBetweenIterations/dividSleepTime); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } isRunning = false; } }; Thread thread = new Thread(symRunnable); thread.start(); } public boolean isRunning() { return isRunning; } long netFlowCounter = 0; long netFlowOddBallInterval = 5000; HashMap<String, NetFlowPrettyRandomGenerator> netFlowGenerator = new HashMap<String, NetFlowPrettyRandomGenerator>(); public void produceNewFlowEvents(NodePojo node, List<String> fullNodeList) throws ExecutionException, InterruptedException, IOException { NetFlowPrettyRandomGenerator gen = netFlowGenerator.get(node.getIpAddress()); if (gen == null) { gen = new NetFlowPrettyRandomGenerator(node.getIpAddress(), fullNodeList, r.nextInt(12)+ 5, 10000); netFlowGenerator.put(node.getIpAddress(), gen); } int numberOfNetFlows = r.nextInt(5); for (int i = 0; i < numberOfNetFlows; i++) { final NetFlowPojo netFlowPojo = gen.nextValue(); listener.publishEvent(new EventPojo(node.getIpAddress(), System.currentTimeMillis(), TopLevelConst.NET_FLOW_LINE_CHART_DATA, netFlowPojo)); if (netFlowCounter++ >= netFlowOddBallInterval) { netFlowCounter = 0; System.out.println("Oddball sent: " + netFlowCounter); NetFlowPojo netFlowPojoOddBal = new NetFlowPojo("TCP", node.getIpAddress(), 4242, "127.42." + r.nextInt(127) + "." + r.nextInt(127), 4242, r.nextInt(10000), r.nextInt(10000)); listener.publishEvent(new EventPojo(node.getIpAddress(), System.currentTimeMillis(), TopLevelConst.NET_FLOW_LINE_CHART_DATA, netFlowPojoOddBal)); } } } HashMap<String, ChartPrettyRandomGenerator> cpuUserGenerator = new HashMap<String, ChartPrettyRandomGenerator>(); HashMap<String, ChartPrettyRandomGenerator> cpuSysGenerator = new HashMap<String, ChartPrettyRandomGenerator>(); public void produceCpuEvents(NodePojo node) throws ExecutionException, InterruptedException, IOException { ChartPrettyRandomGenerator genUser = cpuUserGenerator.get(node.getIpAddress()); if (genUser == null) { genUser = new ChartPrettyRandomGenerator(true, 80, 20); cpuUserGenerator.put(node.getIpAddress(), genUser); } ChartPrettyRandomGenerator genSys = cpuSysGenerator.get(node.getIpAddress()); if (genSys == null) { genSys = new ChartPrettyRandomGenerator(true, 80, 20); cpuSysGenerator.put(node.getIpAddress(), genSys); } List<SamplePojo> samples = new ArrayList<SamplePojo>(); long userCpu = Long.parseLong(genUser.getNextValue()); long systemCpu = Long.parseLong(genSys.getNextValue()); long idleCpu; if (userCpu + systemCpu > 100) { systemCpu = 100 - userCpu; idleCpu = 0; } else { idleCpu = 100 - (userCpu + systemCpu); } samples.add(new SamplePojo("User", Long.toString(userCpu))); samples.add(new SamplePojo("Sys", Long.toString(systemCpu))); samples.add(new SamplePojo("Idle", Long.toString(idleCpu))); listener.publishEvent(new EventPojo(node.getIpAddress(), System.currentTimeMillis(), TopLevelConst.CPU_LINE_CHART_DATA, samples)); } HashMap<String, ChartPrettyRandomGenerator> memGenerator = new HashMap<String, ChartPrettyRandomGenerator>(); public void produceMemEvents(NodePojo node) throws ExecutionException, InterruptedException, IOException { ChartPrettyRandomGenerator gen = memGenerator.get(node.getIpAddress()); if (gen == null) { gen = new ChartPrettyRandomGenerator(true, 128000000, 1000000); memGenerator.put(node.getIpAddress(), gen); } List<SamplePojo> samples = new ArrayList<SamplePojo>(); samples.add(new SamplePojo("Used", gen.getNextValue(), "128000000")); listener.publishEvent(new EventPojo(node.getIpAddress(), System.currentTimeMillis(), TopLevelConst.MEMORY_LINE_CHART_DATA, samples)); } HashMap<String, ChartPrettyRandomGenerator> swapGenerator = new HashMap<String, ChartPrettyRandomGenerator>(); public void produceSwapEvents(NodePojo node) throws ExecutionException, InterruptedException, IOException { ChartPrettyRandomGenerator gen = swapGenerator.get(node.getIpAddress()); if (gen == null) { gen = new ChartPrettyRandomGenerator(true, 12800000, 1000); swapGenerator.put(node.getIpAddress(), gen); } List<SamplePojo> samples = new ArrayList<SamplePojo>(); samples.add(new SamplePojo("Swap", gen.getNextValue(), "12800000")); listener.publishEvent(new EventPojo(node.getIpAddress(), System.currentTimeMillis(), "swap", samples)); } HashMap<String, List<ChartPrettyRandomGenerator>> dfGenerator = new HashMap<String, List<ChartPrettyRandomGenerator>>(); public void produceDfEvents(NodePojo node) throws ExecutionException, InterruptedException, IOException { List<ChartPrettyRandomGenerator> listOfGen = dfGenerator.get(node.getIpAddress()); if (listOfGen == null) { listOfGen = new ArrayList<ChartPrettyRandomGenerator>(); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 1000000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 100000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 1000000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 100000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 1000000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 100000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 1000000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 100000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 1000000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 100000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 1000000)); listOfGen.add(new ChartPrettyRandomGenerator(true, 128000000, 100000)); dfGenerator.put(node.getIpAddress(), listOfGen); } List<SamplePojo> samples = new ArrayList<SamplePojo>(); int counter = 0; samples.add(new SamplePojo("/dev/sda1", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda2", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda3", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda4", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda5", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda6", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda7", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda8", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda9", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda10", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda11", listOfGen.get(counter++).getNextValue(), "128000000")); samples.add(new SamplePojo("/dev/sda12", listOfGen.get(counter++).getNextValue(), "128000000")); listener.publishEvent(new EventPojo(node.getIpAddress(), System.currentTimeMillis(), "drives", samples)); } SimpleDateFormat lsDateFormat = new SimpleDateFormat("MMM d HH:mm"); int etcCounter = 0; Random r = new Random(); public void produceEtcEvents(NodePojo node) throws ExecutionException, InterruptedException, IOException { if (etcCounter++ > updateEtcFileEveryNRequest) { etcCounter = 0; List<SamplePojo> samples = new ArrayList<SamplePojo>(); String addedLine1 = ""; if (r.nextBoolean()) { addedLine1 = "172.17.70.42\tbda1node02-adm.sjc.cloudera.com bda1node04-adm\n"; } String addedLine2 = ""; if (r.nextBoolean()) { addedLine2 = "172.17.70.42\tbda1node02-adm.sjc.cloudera.com bda1node05-adm\n"; } String file = "#### DO NOT REMOVE THESE LINES ####\n" + "#### %INITIALIZED FOR BDA% ####\n" + "# Do not remove the following line, or various programs\n" + "# that require network functionality will fail.\n" + "::1 localhost6.localdomain6 localhost6\n" + "\n" + "127." + r.nextInt(100) + "." + r.nextInt(100) + "." + r.nextInt(100) + "\tbda1node01-adm.sjc.cloudera.com bda1node01-adm\n" + addedLine1 + "127.17.70.12\tbda1node02-adm.sjc.cloudera.com bda1node02-adm\n" + addedLine2 + "127.17.70.13\tbda1node03-adm.sjc.cloudera.com bda1node03-adm\n"; System.out.println("Pushed File for " + node.getIpAddress()); String meta = "-rw-r--r-- 1 root root " + file.length() + " " + lsDateFormat.format(new Date(System.currentTimeMillis())) + " hosts"; listener.publishEvent(new EventPojo(node.getIpAddress(), System.currentTimeMillis(), "/etc/hosts", meta, file)); } } }