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()