def stop_jmeter_instance(jmeter_instance):
    hostname = jmeter_instance['load_generator__hostname']
    load_generator_id = jmeter_instance['load_generator_id']
    pid = jmeter_instance['pid']
    jmeter_dir = jmeter_instance['jmeter_dir']
    ssh_key = SSHKey.objects.get(default=True).path
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname, username="******", key_filename=ssh_key)
    logger.info('Killing remote Jmeter instance. hostname: {}; pid: {}'.format(
        hostname, pid))
    command = 'kill -TERM -P {0}'.format(str(pid))
    stdin, stdout, stderr = ssh.exec_command(command)
    check_pattern = re.compile('/tmp/jmeter')
    if check_pattern.match(jmeter_dir) is not None:
        logger.info(
            'Removing remote Jmeter instance directory: {} from remote host: {}'.
            format(jmeter_dir, hostname))
        cmds = ['rm -rf {}'.format(jmeter_dir)]
        stdin, stdout, stderr = ssh.exec_command(' ; '.join(cmds))
    JmeterInstance.objects.filter(
        load_generator_id=load_generator_id, pid=pid).delete()
    ActivityLog(action="stop_jmeter_instance",
                load_generator_id=load_generator_id, data={"pid": pid}).save()
    ssh.close()
def start_jris_on_load_generator(
        load_generator, threads_per_host, test_running_id, project_id,
        jmeter_dir, java_args, data_pool_index, running_test_jris, additional_args):
    logger.debug("Initial data pool index for load generator: {}".format(
        data_pool_index))
    hostname = load_generator['hostname']
    load_generator_id = LoadGenerator.objects.get(hostname=hostname).id
    possible_jris_on_host = load_generator['possible_jris_on_host']
    ssh_key = SSHKey.objects.get(default=True).path
    logger.info("Uploading jmeter to remote host: {}".format(hostname))
    # TODO: return to /tmp
    p = subprocess.Popen(
        [
            "rsync", "-avH", jmeter_dir, "-e", "ssh", "-i", ssh_key,
            "root@{}:/tmp/".format(hostname), "--delete"
        ],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE)
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname, username="******", key_filename=ssh_key)
    # create an array of used ports
    cmd1 = 'netstat -tulpn | grep LISTEN'
    stdin, stdout, stderr = ssh.exec_command(cmd1)
    used_ports = []
    netstat_output = str(stdout.readlines())
    ports = re.findall('\d+\.\d+\.\d+\.\d+\:(\d+)', netstat_output)
    ports_ipv6 = re.findall('\:\:\:(\d+)', netstat_output)
    p.wait()
    for port in ports:
        used_ports.append(int(port))
    for port in ports_ipv6:
        used_ports.append(int(port))
    ssh.close()
    # Starting Jmeter remote instances on free port
    for i in range(1, possible_jris_on_host + 1):
        port = int(random.randint(10000, 20000))
        while port in used_ports:
            port = int(random.randint(10000, 20000))
        logger.info(port)
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname, username="******", key_filename=ssh_key)
        logger.info(
            'Starting jmeter instance on remote host: {}'.format(hostname))
        data_pool_index += 1
        run_jmeter_server_cmd = 'nohup java {0} -Duser.dir={5}/bin/ -jar "{1}/bin/ApacheJMeter.jar" -Jserver.rmi.ssl.disable=true "-Djava.rmi.server.hostname={2}" -Dserver_port={3} -s -j jmeter-server.log -Jpoll={4} {6} > /dev/null 2>&1 '.\
            format(java_args, jmeter_dir, hostname, str(port), str(
                data_pool_index), jmeter_dir, additional_args)
        logger.info('nohup java {0} -jar "{1}/bin/ApacheJMeter.jar" -Jserver.rmi.ssl.disable=true "-Djava.rmi.server.hostname={2}" -Duser.dir={5}/bin/ -Dserver_port={3} -s -Jpoll={4} {6} > /dev/null 2>&1 '.
                    format(java_args, jmeter_dir, hostname, str(port), str(data_pool_index), jmeter_dir, additional_args))
        command = 'echo $$; exec ' + run_jmeter_server_cmd
        cmds = ['cd {0}/bin/'.format(jmeter_dir), command]
        stdin, stdout, stderr = ssh.exec_command(' ; '.join(cmds))
        pid = int(stdout.readline())
        running_test_jris.append({'hostname': hostname, 'pid': pid})
        ActivityLog(action="start_jmeter_instance", load_generator_id=load_generator_id, data={
                    "pid": pid, "port": port, "java_args": java_args}).save()
        jmeter_instance = JmeterInstance(
            test_running_id=test_running_id,
            load_generator_id=load_generator_id,
            pid=pid,
            port=port,
            jmeter_dir=jmeter_dir,
            project_id=project_id,
            threads_number=threads_per_host,
            java_args=java_args, )

        jmeter_instance.save()
        logger.info(
            'New jmeter instance was added to database, pid: {}, port: {}'.
            format(pid, port))
        ssh.close()