Add request for OSWL collector
Change-Id: Icff7e97423b0893dc447d7fda4ac3a4ed6174faa Implements: blueprint anonymous-statistics-performance-testing
This commit is contained in:
parent
23f661b2a4
commit
049b37e0ae
|
@ -19,13 +19,14 @@ import sys
|
||||||
|
|
||||||
from requests import ActionLogRequestTemplate
|
from requests import ActionLogRequestTemplate
|
||||||
from requests import InstallationRequestTemplate
|
from requests import InstallationRequestTemplate
|
||||||
|
from requests import OSwLRequestTemplate
|
||||||
|
|
||||||
|
|
||||||
class Settings(object):
|
class Settings(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.config_file = "ammo.txt"
|
self.config_file = "ammo.txt"
|
||||||
self.bullets_count = 5
|
self.bullets_count = 5
|
||||||
self.bullets_types = ['installation', 'action-log']
|
self.bullets_types = ['installation', 'action-log', 'oswl-stat']
|
||||||
self.host_address = '127.0.0.1'
|
self.host_address = '127.0.0.1'
|
||||||
self.max_clusters_count = 10
|
self.max_clusters_count = 10
|
||||||
self.max_cluster_size = 100
|
self.max_cluster_size = 100
|
||||||
|
@ -111,7 +112,7 @@ def usage(message=None):
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
|
|
||||||
def save_bullets(bullets, file):
|
def save_bullets(bullets, _file):
|
||||||
data_to_save = ''
|
data_to_save = ''
|
||||||
|
|
||||||
for bullet in bullets:
|
for bullet in bullets:
|
||||||
|
@ -120,19 +121,14 @@ def save_bullets(bullets, file):
|
||||||
url=bullet['url'])
|
url=bullet['url'])
|
||||||
data_to_save += '{body}\r\n\n'.format(body=bullet['body'])
|
data_to_save += '{body}\r\n\n'.format(body=bullet['body'])
|
||||||
|
|
||||||
with open(file, 'w+') as _file:
|
_file.write(data_to_save)
|
||||||
_file.write(data_to_save)
|
|
||||||
|
|
||||||
file_size = os.stat(file).st_size / 1024
|
|
||||||
print("\n\tBullets were saved to '{0}' ({1}K) file\n".format(file,
|
|
||||||
file_size))
|
|
||||||
|
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
settings = parse_args(args, Settings())
|
settings = parse_args(args, Settings())
|
||||||
req_template = None
|
req_template = None
|
||||||
bullets = []
|
|
||||||
for type in settings.bullets_types:
|
for type in settings.bullets_types:
|
||||||
|
|
||||||
if type == "installation":
|
if type == "installation":
|
||||||
req_template = InstallationRequestTemplate(
|
req_template = InstallationRequestTemplate(
|
||||||
max_clusters_count=settings.max_clusters_count,
|
max_clusters_count=settings.max_clusters_count,
|
||||||
|
@ -140,18 +136,26 @@ def main(args):
|
||||||
elif type == "action-log":
|
elif type == "action-log":
|
||||||
req_template = ActionLogRequestTemplate(
|
req_template = ActionLogRequestTemplate(
|
||||||
max_logs_count=settings.max_logs_count)
|
max_logs_count=settings.max_logs_count)
|
||||||
for _ in xrange(settings.bullets_count):
|
elif type == "oswl-stat":
|
||||||
bullet_url = req_template.url
|
req_template = OSwLRequestTemplate()
|
||||||
bullet_headers = ['[Host: {0}]'.format(settings.host_address)]
|
#_file = open(settings.config_file, 'a')
|
||||||
bullet_headers.extend(req_template.headers)
|
with open(settings.config_file, 'a') as _file:
|
||||||
bullet_body = req_template.get_request_body()
|
for _ in xrange(settings.bullets_count):
|
||||||
bullet = {
|
bullets = []
|
||||||
'url': bullet_url,
|
bullet_url = req_template.url
|
||||||
'headers': bullet_headers,
|
bullet_headers = ['[Host: {0}]'.format(settings.host_address)]
|
||||||
'body': bullet_body
|
bullet_headers.extend(req_template.headers)
|
||||||
}
|
bullet_body = req_template.get_request_body()
|
||||||
bullets.append(bullet)
|
bullet = {
|
||||||
save_bullets(bullets, settings.config_file)
|
'url': bullet_url,
|
||||||
|
'headers': bullet_headers,
|
||||||
|
'body': bullet_body
|
||||||
|
}
|
||||||
|
bullets.append(bullet)
|
||||||
|
save_bullets(bullets, _file)
|
||||||
|
file_size = os.stat(settings.config_file).st_size / 1024
|
||||||
|
print("\n\tBullets were saved to '{0}' ({1}K) file\n".format(
|
||||||
|
settings.config_file, file_size))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -16,6 +16,8 @@ import datetime
|
||||||
import json
|
import json
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
from bisect import bisect
|
||||||
|
|
||||||
|
|
||||||
class BaseRequestTemplate(object):
|
class BaseRequestTemplate(object):
|
||||||
|
|
||||||
|
@ -212,3 +214,269 @@ class ActionLogRequestTemplate(BaseRequestTemplate):
|
||||||
data['action_logs'].append(action_log)
|
data['action_logs'].append(action_log)
|
||||||
|
|
||||||
return json.dumps(data)
|
return json.dumps(data)
|
||||||
|
|
||||||
|
|
||||||
|
class OSwLRequestTemplate(BaseRequestTemplate):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
BaseRequestTemplate.__init__(self)
|
||||||
|
self.url = "/api/v1/oswl_stats/"
|
||||||
|
self.resources = ['vm', 'tenant', 'volume',
|
||||||
|
'keystone_user', 'flavor', 'image']
|
||||||
|
|
||||||
|
def current_vm(self):
|
||||||
|
return {"status": "ACTIVE", "tenant_id": self.random_sha,
|
||||||
|
"created_at": str(datetime.datetime.now()),
|
||||||
|
"image_id": self.random_sha, "flavor_id": self.random_sha,
|
||||||
|
"power_state": 1, "time": "15:56:12.146313",
|
||||||
|
"host_id": self.random_sha, "id": self.random_sha}
|
||||||
|
|
||||||
|
def modified_vm(self):
|
||||||
|
return {"status": "ACTIVE", "power_state": 1,
|
||||||
|
"time": "20:56:12.146313", "id": self.random_sha}
|
||||||
|
|
||||||
|
def current_image(self):
|
||||||
|
return {"created_at": str(datetime.datetime.now()), "minDisk": 0,
|
||||||
|
"updated_at": str(datetime.datetime.now()),
|
||||||
|
"sizeBytes": 14024704, "minRam": 64, "id": self.random_sha}
|
||||||
|
|
||||||
|
def modified_image(self):
|
||||||
|
return {"minDisk": 0, "updated_at": str(datetime.datetime.now()),
|
||||||
|
"time": "19:50:12.146313", "id": self.random_sha}
|
||||||
|
|
||||||
|
def current_volume(self):
|
||||||
|
return {"status": "available", "attachments": [],
|
||||||
|
"availability_zone": "nova", "bootable_flag": "true",
|
||||||
|
"tenant_id": self.random_sha, "encrypted_flag": 'false',
|
||||||
|
"volume_type": "None",
|
||||||
|
"host": "node-3.test.domain.local#DEFAULT",
|
||||||
|
"time": "14:13:06.001065", "snapshot_id": 'null',
|
||||||
|
"id": self.random_sha, "size": 1}
|
||||||
|
|
||||||
|
def modified_volume(self):
|
||||||
|
return {"status": "available", "attachments": [],
|
||||||
|
"time": "18:13:06.001065", "id": self.random_sha}
|
||||||
|
|
||||||
|
def current_tenant(self):
|
||||||
|
return {"enabled_flag": 'true', "id": self.random_sha}
|
||||||
|
|
||||||
|
def current_user(self):
|
||||||
|
return {"enabled_flag": 'true', "tenant_id": self.random_sha,
|
||||||
|
"id": self.random_sha}
|
||||||
|
|
||||||
|
def current_flavor(self):
|
||||||
|
return {"ram": 512, "ephemeral": 0, "vcpus": 1, "swap": "",
|
||||||
|
"disk": 1, "id": self.random_sha}
|
||||||
|
|
||||||
|
def added(self):
|
||||||
|
return {"id": self.random_sha, "time": "15:51:11.690102"}
|
||||||
|
|
||||||
|
def weighted_choice(self, choices):
|
||||||
|
"""Converts SqlAlchemy object to dict serializable to json
|
||||||
|
:param choices: list of tuples with probability and choice value
|
||||||
|
:return: choice value
|
||||||
|
"""
|
||||||
|
values, weights = zip(*choices)
|
||||||
|
total = 0
|
||||||
|
cum_weights = []
|
||||||
|
for w in weights:
|
||||||
|
total += w
|
||||||
|
cum_weights.append(total)
|
||||||
|
x = random.random() * total
|
||||||
|
i = bisect(cum_weights, x)
|
||||||
|
return values[i]
|
||||||
|
|
||||||
|
def real_data(self):
|
||||||
|
return {
|
||||||
|
"1": {
|
||||||
|
"vm": {"current": [self.current_vm()], "removed": [],
|
||||||
|
"added": [self.added()], "modified": [self.modified_vm()]},
|
||||||
|
"image": {"current": [self.current_image()], "removed": [],
|
||||||
|
"added": [self.added()],
|
||||||
|
"modified": [self.modified_image()]},
|
||||||
|
"volume": {"current": [self.current_volume()], "removed": [],
|
||||||
|
"added": [self.added()],
|
||||||
|
"modified": [self.modified_volume()]},
|
||||||
|
"tenant": {"current": [self.current_tenant()], "removed": [],
|
||||||
|
"added": [self.added()],
|
||||||
|
"modified": [self.current_tenant()]},
|
||||||
|
"keystone_user": {"current": [self.current_user()], "removed": [],
|
||||||
|
"added": [self.added()],
|
||||||
|
"modified": [self.current_user()]},
|
||||||
|
"flavor": {"current": [self.current_flavor()], "removed": [],
|
||||||
|
"added": [self.added()], "modified": []}
|
||||||
|
},
|
||||||
|
"3": {
|
||||||
|
"vm": {"current": [self.current_vm() for i in range(5)],
|
||||||
|
"removed": [self.current_vm() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(5)],
|
||||||
|
"modified": [self.modified_vm() for i in range(5)]},
|
||||||
|
"image": {"current": [self.current_image() for i in range(3)],
|
||||||
|
"removed": [self.current_image() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(3)],
|
||||||
|
"modified": [self.modified_image() for i in range(3)]},
|
||||||
|
"volume": {"current": [self.current_volume() for i in range(2)],
|
||||||
|
"removed": [],
|
||||||
|
"added": [self.added() for i in range(2)],
|
||||||
|
"modified": [self.modified_volume()
|
||||||
|
for i in range(2)]},
|
||||||
|
"tenant": {"current": [self.current_tenant() for i in range(9)],
|
||||||
|
"removed": [self.current_tenant() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(9)],
|
||||||
|
"modified": [self.current_tenant() for i in range(6)]},
|
||||||
|
"keystone_user": {"current": [self.current_user()
|
||||||
|
for i in range(8)],
|
||||||
|
"removed": [self.current_user()
|
||||||
|
for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(8)],
|
||||||
|
"modified": [self.current_user()
|
||||||
|
for i in range(4)]},
|
||||||
|
"flavor": {"current": [self.current_flavor() for i in range(8)],
|
||||||
|
"removed": [self.current_flavor()
|
||||||
|
for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(8)],
|
||||||
|
"modified": []}
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"vm": {"current": [self.current_vm() for i in range(10)],
|
||||||
|
"removed": [self.current_vm() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": [self.modified_vm() for i in range(10)]},
|
||||||
|
"image": {"current": [self.current_image() for i in range(5)],
|
||||||
|
"removed": [self.current_image() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(5)],
|
||||||
|
"modified": [self.modified_image() for i in range(3)]},
|
||||||
|
"volume": {"current": [self.current_volume() for i in range(3)],
|
||||||
|
"removed": [],
|
||||||
|
"added": [self.added() for i in range(3)],
|
||||||
|
"modified": [self.modified_volume()
|
||||||
|
for i in range(2)]},
|
||||||
|
"tenant": {"current": [self.current_tenant() for i in range(9)],
|
||||||
|
"removed": [self.current_tenant() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(9)],
|
||||||
|
"modified": [self.current_tenant() for i in range(6)]},
|
||||||
|
"keystone_user": {"current": [self.current_user()
|
||||||
|
for i in range(8)],
|
||||||
|
"removed": [self.current_user()
|
||||||
|
for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(8)],
|
||||||
|
"modified": [self.current_user()
|
||||||
|
for i in range(4)]},
|
||||||
|
"flavor": {"current": [self.current_flavor() for i in range(8)],
|
||||||
|
"removed": [self.current_flavor() for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(8)],
|
||||||
|
"modified": []}
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"vm": {"current": [self.current_vm() for i in range(50)],
|
||||||
|
"removed": [self.current_vm() for i in range(10)],
|
||||||
|
"added": [self.added() for i in range(50)],
|
||||||
|
"modified": [self.modified_vm() for i in range(50)]},
|
||||||
|
"image": {"current": [self.current_image() for i in range(7)],
|
||||||
|
"removed": [self.current_image() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(7)],
|
||||||
|
"modified": [self.modified_image() for i in range(5)]},
|
||||||
|
"volume": {"current": [self.current_volume() for i in range(10)],
|
||||||
|
"removed": [],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": [self.modified_volume()
|
||||||
|
for i in range(10)]},
|
||||||
|
"tenant": {"current": [self.current_tenant() for i in range(9)],
|
||||||
|
"removed": [self.current_tenant() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(9)],
|
||||||
|
"modified": [self.current_tenant() for i in range(6)]},
|
||||||
|
"keystone_user": {"current": [self.current_user()
|
||||||
|
for i in range(8)],
|
||||||
|
"removed": [self.current_user()
|
||||||
|
for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(8)],
|
||||||
|
"modified": [self.current_user()
|
||||||
|
for i in range(5)]},
|
||||||
|
"flavor": {"current": [self.current_flavor() for i in range(10)],
|
||||||
|
"removed": [self.current_flavor() for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": []}
|
||||||
|
},
|
||||||
|
"20": {
|
||||||
|
"vm": {"current": [self.current_vm() for i in range(100)],
|
||||||
|
"removed": [self.current_vm() for i in range(10)],
|
||||||
|
"added": [self.added() for i in range(100)],
|
||||||
|
"modified": [self.modified_vm() for i in range(75)]},
|
||||||
|
"image": {"current": [self.current_image() for i in range(10)],
|
||||||
|
"removed": [self.current_image() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": [self.modified_image() for i in range(5)]},
|
||||||
|
"volume": {"current": [self.current_volume() for i in range(10)],
|
||||||
|
"removed": [],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": [self.modified_volume()
|
||||||
|
for i in range(10)]},
|
||||||
|
"tenant": {"current": [self.current_tenant() for i in range(9)],
|
||||||
|
"removed": [self.current_tenant() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(9)],
|
||||||
|
"modified": [self.current_tenant() for i in range(9)]},
|
||||||
|
"keystone_user": {"current": [self.current_user()
|
||||||
|
for i in range(8)],
|
||||||
|
"removed": [self.current_user()
|
||||||
|
for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(8)],
|
||||||
|
"modified": [self.current_user()
|
||||||
|
for i in range(6)]},
|
||||||
|
"flavor": {"current": [self.current_flavor() for i in range(10)],
|
||||||
|
"removed": [self.current_flavor() for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": []}
|
||||||
|
},
|
||||||
|
"50": {
|
||||||
|
"vm": {"current": [self.current_vm() for i in range(250)],
|
||||||
|
"removed": [self.current_vm() for i in range(20)],
|
||||||
|
"added": [self.added() for i in range(250)],
|
||||||
|
"modified": [self.modified_vm() for i in range(125)]},
|
||||||
|
"image": {"current": [self.current_image() for i in range(10)],
|
||||||
|
"removed": [self.current_image() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": [self.modified_image() for i in range(5)]},
|
||||||
|
"volume": {"current": [self.current_volume() for i in range(10)],
|
||||||
|
"removed": [],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": [self.modified_volume()
|
||||||
|
for i in range(10)]},
|
||||||
|
"tenant": {"current": [self.current_tenant() for i in range(9)],
|
||||||
|
"removed": [self.current_tenant() for i in range(1)],
|
||||||
|
"added": [self.added() for i in range(9)],
|
||||||
|
"modified": [self.current_tenant() for i in range(9)]},
|
||||||
|
"keystone_user": {"current": [self.current_user()
|
||||||
|
for i in range(8)],
|
||||||
|
"removed": [self.current_user()
|
||||||
|
for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(8)],
|
||||||
|
"modified": [self.current_user()
|
||||||
|
for i in range(8)]},
|
||||||
|
"flavor": {"current": [self.current_flavor() for i in range(10)],
|
||||||
|
"removed": [self.current_flavor() for i in range(2)],
|
||||||
|
"added": [self.added() for i in range(10)],
|
||||||
|
"modified": []}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_request_body(self):
|
||||||
|
master_node_uid = self.random_sha
|
||||||
|
data = {'oswl_stats': []}
|
||||||
|
choice = self.weighted_choice([("1", 5), ("3", 10), ("5", 15),
|
||||||
|
("10", 20), ("20", 40), ("50", 10)])
|
||||||
|
|
||||||
|
for type in ['vm', 'image', 'volume', 'tenant', 'keystone_user',
|
||||||
|
'flavor']:
|
||||||
|
oswl_stat = {
|
||||||
|
'master_node_uid': master_node_uid,
|
||||||
|
"id": random.randint(1, 100),
|
||||||
|
"cluster_id": random.randint(1, 999),
|
||||||
|
'created_date': str(datetime.datetime.now()),
|
||||||
|
'updated_time': str(datetime.datetime.now()),
|
||||||
|
'resource_type': type,
|
||||||
|
'resource_checksum': self.random_sha,
|
||||||
|
'resource_data': self.real_data()[choice][type]
|
||||||
|
}
|
||||||
|
data['oswl_stats'].append(oswl_stat)
|
||||||
|
|
||||||
|
return json.dumps(data)
|
||||||
|
|
Loading…
Reference in New Issue