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 InstallationRequestTemplate
|
||||
from requests import OSwLRequestTemplate
|
||||
|
||||
|
||||
class Settings(object):
|
||||
def __init__(self):
|
||||
self.config_file = "ammo.txt"
|
||||
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.max_clusters_count = 10
|
||||
self.max_cluster_size = 100
|
||||
|
@ -111,7 +112,7 @@ def usage(message=None):
|
|||
sys.exit(2)
|
||||
|
||||
|
||||
def save_bullets(bullets, file):
|
||||
def save_bullets(bullets, _file):
|
||||
data_to_save = ''
|
||||
|
||||
for bullet in bullets:
|
||||
|
@ -120,19 +121,14 @@ def save_bullets(bullets, file):
|
|||
url=bullet['url'])
|
||||
data_to_save += '{body}\r\n\n'.format(body=bullet['body'])
|
||||
|
||||
with open(file, 'w+') as _file:
|
||||
_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))
|
||||
_file.write(data_to_save)
|
||||
|
||||
|
||||
def main(args):
|
||||
settings = parse_args(args, Settings())
|
||||
req_template = None
|
||||
bullets = []
|
||||
for type in settings.bullets_types:
|
||||
|
||||
if type == "installation":
|
||||
req_template = InstallationRequestTemplate(
|
||||
max_clusters_count=settings.max_clusters_count,
|
||||
|
@ -140,18 +136,26 @@ def main(args):
|
|||
elif type == "action-log":
|
||||
req_template = ActionLogRequestTemplate(
|
||||
max_logs_count=settings.max_logs_count)
|
||||
for _ in xrange(settings.bullets_count):
|
||||
bullet_url = req_template.url
|
||||
bullet_headers = ['[Host: {0}]'.format(settings.host_address)]
|
||||
bullet_headers.extend(req_template.headers)
|
||||
bullet_body = req_template.get_request_body()
|
||||
bullet = {
|
||||
'url': bullet_url,
|
||||
'headers': bullet_headers,
|
||||
'body': bullet_body
|
||||
}
|
||||
bullets.append(bullet)
|
||||
save_bullets(bullets, settings.config_file)
|
||||
elif type == "oswl-stat":
|
||||
req_template = OSwLRequestTemplate()
|
||||
#_file = open(settings.config_file, 'a')
|
||||
with open(settings.config_file, 'a') as _file:
|
||||
for _ in xrange(settings.bullets_count):
|
||||
bullets = []
|
||||
bullet_url = req_template.url
|
||||
bullet_headers = ['[Host: {0}]'.format(settings.host_address)]
|
||||
bullet_headers.extend(req_template.headers)
|
||||
bullet_body = req_template.get_request_body()
|
||||
bullet = {
|
||||
'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__':
|
||||
|
|
|
@ -16,6 +16,8 @@ import datetime
|
|||
import json
|
||||
import random
|
||||
|
||||
from bisect import bisect
|
||||
|
||||
|
||||
class BaseRequestTemplate(object):
|
||||
|
||||
|
@ -212,3 +214,269 @@ class ActionLogRequestTemplate(BaseRequestTemplate):
|
|||
data['action_logs'].append(action_log)
|
||||
|
||||
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