performance-docs/doc/source/test_plans/kubernetes_dns_performance/code/test_kubedns.py

134 lines
2.9 KiB
Python

import os
import random
import shlex
import socket
import string
import subprocess
import threading
import time
import jinja2
LIST_SVC_SUCCESS = []
LIST_SVC_FAILED = []
RESULTS_FAILED = []
INTERVAL = 1 # in seconds
SERVICES = 1000 # amount of services
REQUESTS = 1000 # amount of requests
def render(tpl_path, context):
path, filename = os.path.split(tpl_path)
return jinja2.Environment(
loader=jinja2.FileSystemLoader(path or './')
).get_template(filename).render(context)
def id_generator(size=8, chars=string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def create_svc():
service_name = "test-service-{}".format(id_generator())
file_name = "{}.yaml".format(service_name)
# Create YAML file for new service
template = render("template.yaml", {"name": service_name})
f = open(file_name, "w")
f.write(template)
f.close()
cmd = "kubectl create -f {}".format(file_name)
args = shlex.split(cmd)
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
(out, err) = proc.communicate()
# Delete YAML file
os.remove(file_name)
if not err:
print out
LIST_SVC_SUCCESS.append(service_name)
return True
print err
LIST_SVC_FAILED.append(service_name)
return False
def delete_svc(service_name):
cmd = "kubectl delete service {}".format(service_name)
args = shlex.split(cmd)
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
(out, err) = proc.communicate()
if not err:
print out
return True
print err
return False
def request_to_host(service_name):
host = "{}.default.svc.cluster.local".format(service_name)
try:
print socket.gethostbyname(host)
except socket.gaierror:
return False
return True
def multi_requests():
for i in range(0, REQUESTS):
num_service = random.randint(0, len(LIST_SVC_SUCCESS) - 1)
service_name = LIST_SVC_SUCCESS[num_service]
if not request_to_host(service_name):
RESULTS_FAILED.append(service_name)
time.sleep(INTERVAL)
def clean_up():
for svc in LIST_SVC_SUCCESS:
delete_svc(svc)
def test_case(threads=50):
query = []
del RESULTS_FAILED[:]
for i in range(0, threads):
query.append(threading.Thread(target=multi_requests, args=()))
for t in query:
t.start()
for t in query:
t.join()
return len(RESULTS_FAILED)
if __name__ == "__main__":
# Create services
for i in range(0, SERVICES):
success = create_svc()
# Run test case
for i in range(1, 21):
print "{} rps".format(i * 50)
result = test_case(i * 50)
print "Wasn't resolve {} host(s)".format(result)
with open("result.txt", "a") as f:
f.write("{} rps - wasn't resolve {} host(s)\n".format(
i * 50, result))
# Delete created service
clean_up()