def get_executions(actor_ids): ex_ids = {} for a in actor_ids: ex_ids[a] = [] url = '{}/actors/{}/executions'.format(base, a) rsp = requests.get(url, headers=headers) result = basic_response_checks(rsp) for ex in result['executions']: ex_ids[a].append(ex['id']) return ex_ids
def remove_actors(actor_ids): for aid in actor_ids: url = '{}/actors/{}'.format(base, aid) rsp = requests.delete(url, headers=headers) print(f"Send actor id {aid} sent delete request...") try: result = basic_response_checks(rsp) print(f"actor id {aid} successfully deleted.") except Exception as e: print( f"got exception in request to delete actor {aid}; exception: {e}" )
def get_actors(): """ Helper script that can return that actor_ids associated with this test suite. :return: """ aids = [] url = '{}/actors'.format(base) rsp = requests.get(url, headers=headers) result = basic_response_checks(rsp) for actor in result: if 'abaco_load_test_' in actor.get('name'): aids.append(actor.get('id')) return aids
def check_for_ready(actor_ids): """ Check for READY status of each actor in the actor_ids list. :param actor_ids: :return: """ for aid in actor_ids: # check for workers to be ready idx = 0 ready = False while not ready and idx < 60: url = '{}/actors/{}/workers'.format(base, aid) rsp = requests.get(url, headers=headers) result = basic_response_checks(rsp) for worker in result: if not worker['status'] == 'READY': idx = idx + 1 time.sleep(2) continue ready = True if not ready: print("ERROR - workers for actor {} never entered READY status.") raise Exception() # now check that the actor itself is ready - ready = False idx = 0 while not ready and idx < 10: url = '{}/actors/{}'.format(base, aid) rsp = requests.get(url, headers=headers) result = basic_response_checks(rsp) if result['status'] == 'READY': ready = True break idx = idx + 1 time.sleep(1) if not ready: print("ERROR - actor {} never entered READY status.") raise Exception() print(f"workers and actor ready for actor {aid}")
def send_messages(actor_ids, num_messages_per_actor): execution_ids = {} for idx, aid in enumerate(actor_ids): execution_ids[aid] = [] url = '{}/actors/{}/messages'.format(base, aid) for j in range(num_messages_per_actor): rsp = requests.post(url, data={'message': 'test_{}_{}'.format(idx, j)}, headers=headers) result = basic_response_checks(rsp) ex_id = result['executionId'] print("Send actor id {} message {}_{}; execution id: {}".format( aid, idx, j, ex_id)) execution_ids[aid].append(ex_id) return execution_ids
def send_one_message(actor_ids): execution_ids = {} for idx, aid in enumerate(actor_ids): print("sending one primer message to actor: {}".format(aid)) execution_ids[aid] = [] url = '{}/actors/{}/messages'.format(base, aid) rsp = requests.post(url, data={'message': 'test1_{}'.format(idx)}, headers=headers) result = basic_response_checks(rsp) ex_id = result['executionId'] print("Send actor id {} message {}; execution id: {}".format( aid, idx, ex_id)) execution_ids[aid].append(ex_id) print("All primer messages sent.") return execution_ids
def check_for_complete(actor_ids): done_actors = [] count = 0 while not len(done_actors) == len(actor_ids): count = count + 1 messages = [] for idx, aid in enumerate(actor_ids): if aid in done_actors: continue url = f'{base}/actors/{aid}/executions' try: rsp = requests.get(url, headers=headers) result = basic_response_checks(rsp) except Exception as e: print( f"got exception trying to check executions for actor {aid}, exception: {e}" ) continue tot_done = 0 tot = 0 for e in result['executions']: tot = tot + 1 if e['status'] == 'COMPLETE': tot_done = tot_done + 1 if tot == tot_done: done_actors.append(aid) else: messages.append(f"{tot_done}/{tot} for actor {aid}.") if count % 100 == 0: print( f"{len(done_actors)}/{len(actor_ids)} actors completed executions." ) for m in messages: print(m) # sleep more at the beginning - if len(done_actors) / len(actor_ids) < 0.5: time.sleep(4) elif len(done_actors) / len(actor_ids) < 0.75: time.sleep(3) elif len(done_actors) / len(actor_ids) < 0.9: time.sleep(2) else: time.sleep(1) print("All executions complete.")
def start_workers(aid, num_workers): data = {'num': num_workers} rsp = requests.post(f'{base}/actors/{aid}/workers', data=data, headers=headers) result = basic_response_checks(rsp)
def register_actor(idx): IMAGE = os.environ.get('IMAGE', 'abacosamples/test') data = {'image': IMAGE, 'name': 'abaco_load_test_{}'.format(idx)} rsp = requests.post('{}/actors'.format(base), data=data, headers=headers) result = basic_response_checks(rsp) return result['id']