Add request for OSWL collector

Change-Id: Icff7e97423b0893dc447d7fda4ac3a4ed6174faa
Implements: blueprint anonymous-statistics-performance-testing
This commit is contained in:
asledzinskiy 2015-02-02 09:59:18 +02:00
parent 23f661b2a4
commit 049b37e0ae
2 changed files with 293 additions and 21 deletions

View File

@ -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__':

View File

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