public void run(int numberOfExternalNodes)
      throws IOException, InterruptedException, ExecutionException {

    List<NodePojo> internalNodeList = null;
    List<String> fullNodeList = new ArrayList<String>();

    for (int i = 0; i < maxIterations; i++) {
      if (i == 0 || i % updateNodeListEveryNIterations == 0) {
        internalNodeList = hbaseService.getFullNodeList();

        for (NodePojo node : internalNodeList) {
          fullNodeList.add(node.getIpAddress());
        }
        for (int j = 0; j < numberOfExternalNodes; j++) {
          fullNodeList.add("127.42.42." + j);
        }
      }
      for (NodePojo node : internalNodeList) {
        produceCpuEvents(node);
        produceMemEvents(node);
        produceSwapEvents(node);
        produceDfEvents(node);
        produceEtcEvents(node);
        produceNewFlowEvents(node, fullNodeList);
      }
      symTime += 5000;
      Thread.sleep(sleepBetweenIterations);
    }
  }
  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(), symTime, TopLevelConst.CPU_LINE_CHART_DATA, samples));
  }
  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(), symTime, "swap", samples));
  }
  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(), symTime, TopLevelConst.MEMORY_LINE_CHART_DATA, samples));
  }
  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(symTime))
              + " hosts";

      listener.publishEvent(new EventPojo(node.getIpAddress(), symTime, "/etc/hosts", meta, file));
    }
  }
  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(15) + 5), 10000);
      netFlowGenerator.put(node.getIpAddress(), gen);
    }

    for (int i = 0; i < 5; i++) {
      listener.publishEvent(
          new EventPojo(
              node.getIpAddress(),
              symTime,
              TopLevelConst.NET_FLOW_LINE_CHART_DATA,
              gen.nextValue()));
    }
  }
  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(), symTime, "drives", samples));
  }