Skip to content
Snippets Groups Projects
Commit e669847a authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Merge branch 'feat/loadgen-add-num-released' into 'develop'

Added status field num_released in Load Generator and WebUI

See merge request !94
parents 9a4e1f5d a95e7b4f
No related branches found
No related tags found
2 merge requests!142Release TeraFlowSDN 2.1,!94Added status field num_released in Load Generator and WebUI
...@@ -64,6 +64,7 @@ message Parameters { ...@@ -64,6 +64,7 @@ message Parameters {
message Status { message Status {
Parameters parameters = 1; Parameters parameters = 1;
uint64 num_generated = 2; uint64 num_generated = 2;
bool infinite_loop = 3; uint64 num_released = 3;
bool running = 4; bool infinite_loop = 4;
bool running = 5;
} }
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging, json, random, re, threading import logging, json, random, re, threading, uuid
from typing import Dict, Optional, Set, Tuple from typing import Dict, Optional, Set, Tuple
from common.proto.context_pb2 import Empty, IsolationLevelEnum, TopologyId from common.proto.context_pb2 import Empty, IsolationLevelEnum, TopologyId
from common.tools.grpc.Tools import grpc_message_to_json from common.tools.grpc.Tools import grpc_message_to_json
...@@ -54,6 +54,7 @@ class RequestGenerator: ...@@ -54,6 +54,7 @@ class RequestGenerator:
self._parameters = parameters self._parameters = parameters
self._lock = threading.Lock() self._lock = threading.Lock()
self._num_generated = 0 self._num_generated = 0
self._num_released = 0
self._available_device_endpoints : Dict[str, Set[str]] = dict() self._available_device_endpoints : Dict[str, Set[str]] = dict()
self._used_device_endpoints : Dict[str, Dict[str, str]] = dict() self._used_device_endpoints : Dict[str, Dict[str, str]] = dict()
self._endpoint_ids_to_types : Dict[Tuple[str, str], str] = dict() self._endpoint_ids_to_types : Dict[Tuple[str, str], str] = dict()
...@@ -65,6 +66,9 @@ class RequestGenerator: ...@@ -65,6 +66,9 @@ class RequestGenerator:
@property @property
def num_generated(self): return self._num_generated def num_generated(self): return self._num_generated
@property
def num_released(self): return self._num_released
@property @property
def infinite_loop(self): return self._parameters.num_requests == 0 def infinite_loop(self): return self._parameters.num_requests == 0
...@@ -192,23 +196,18 @@ class RequestGenerator: ...@@ -192,23 +196,18 @@ class RequestGenerator:
if not self.infinite_loop and (self._num_generated >= self._parameters.num_requests): if not self.infinite_loop and (self._num_generated >= self._parameters.num_requests):
LOGGER.info('Generation Done!') LOGGER.info('Generation Done!')
return True, None, None # completed return True, None, None # completed
self._num_generated += 1
num_request = self._num_generated
#request_uuid = str(uuid.uuid4()) request_uuid = str(uuid.uuid4())
request_uuid = 'svc_{:d}'.format(num_request)
# choose request type
request_type = random.choice(self._parameters.request_types) request_type = random.choice(self._parameters.request_types)
if request_type in { if request_type in {
RequestType.SERVICE_L2NM, RequestType.SERVICE_L3NM, RequestType.SERVICE_TAPI, RequestType.SERVICE_MW RequestType.SERVICE_L2NM, RequestType.SERVICE_L3NM, RequestType.SERVICE_TAPI, RequestType.SERVICE_MW
}: }:
return False, self._compose_service(num_request, request_uuid, request_type), request_type return False, self._compose_service(request_uuid, request_type), request_type
elif request_type in {RequestType.SLICE_L2NM, RequestType.SLICE_L3NM}: elif request_type in {RequestType.SLICE_L2NM, RequestType.SLICE_L3NM}:
return False, self._compose_slice(num_request, request_uuid, request_type), request_type return False, self._compose_slice(request_uuid, request_type), request_type
def _compose_service(self, num_request : int, request_uuid : str, request_type : str) -> Optional[Dict]: def _compose_service(self, request_uuid : str, request_type : str) -> Optional[Dict]:
# choose source endpoint # choose source endpoint
src_endpoint_types = set(ENDPOINT_COMPATIBILITY.keys()) if request_type in {RequestType.SERVICE_TAPI} else None src_endpoint_types = set(ENDPOINT_COMPATIBILITY.keys()) if request_type in {RequestType.SERVICE_TAPI} else None
src = self._use_device_endpoint(request_uuid, request_type, endpoint_types=src_endpoint_types) src = self._use_device_endpoint(request_uuid, request_type, endpoint_types=src_endpoint_types)
...@@ -237,6 +236,10 @@ class RequestGenerator: ...@@ -237,6 +236,10 @@ class RequestGenerator:
self._release_device_endpoint(src_device_uuid, src_endpoint_uuid) self._release_device_endpoint(src_device_uuid, src_endpoint_uuid)
return None return None
with self._lock:
self._num_generated += 1
num_request = self._num_generated
# compose endpoints # compose endpoints
dst_device_uuid,dst_endpoint_uuid = dst dst_device_uuid,dst_endpoint_uuid = dst
endpoint_ids = [ endpoint_ids = [
...@@ -383,7 +386,7 @@ class RequestGenerator: ...@@ -383,7 +386,7 @@ class RequestGenerator:
return json_service_l2nm_planned( return json_service_l2nm_planned(
request_uuid, endpoint_ids=endpoint_ids, constraints=[], config_rules=config_rules) request_uuid, endpoint_ids=endpoint_ids, constraints=[], config_rules=config_rules)
def _compose_slice(self, num_request : int, request_uuid : str, request_type : str) -> Optional[Dict]: def _compose_slice(self, request_uuid : str, request_type : str) -> Optional[Dict]:
# choose source endpoint # choose source endpoint
src = self._use_device_endpoint(request_uuid, request_type) src = self._use_device_endpoint(request_uuid, request_type)
if src is None: if src is None:
...@@ -404,6 +407,10 @@ class RequestGenerator: ...@@ -404,6 +407,10 @@ class RequestGenerator:
self._release_device_endpoint(src_device_uuid, src_endpoint_uuid) self._release_device_endpoint(src_device_uuid, src_endpoint_uuid)
return None return None
with self._lock:
self._num_generated += 1
num_request = self._num_generated
# compose endpoints # compose endpoints
dst_device_uuid,dst_endpoint_uuid = dst dst_device_uuid,dst_endpoint_uuid = dst
endpoint_ids = [ endpoint_ids = [
...@@ -505,8 +512,15 @@ class RequestGenerator: ...@@ -505,8 +512,15 @@ class RequestGenerator:
device_uuid = endpoint_id['device_id']['device_uuid']['uuid'] device_uuid = endpoint_id['device_id']['device_uuid']['uuid']
endpoint_uuid = endpoint_id['endpoint_uuid']['uuid'] endpoint_uuid = endpoint_id['endpoint_uuid']['uuid']
self._release_device_endpoint(device_uuid, endpoint_uuid) self._release_device_endpoint(device_uuid, endpoint_uuid)
with self._lock:
self._num_released += 1
elif 'slice_id' in json_request: elif 'slice_id' in json_request:
for endpoint_id in json_request['slice_endpoint_ids']: for endpoint_id in json_request['slice_endpoint_ids']:
device_uuid = endpoint_id['device_id']['device_uuid']['uuid'] device_uuid = endpoint_id['device_id']['device_uuid']['uuid']
endpoint_uuid = endpoint_id['endpoint_uuid']['uuid'] endpoint_uuid = endpoint_id['endpoint_uuid']['uuid']
self._release_device_endpoint(device_uuid, endpoint_uuid) self._release_device_endpoint(device_uuid, endpoint_uuid)
with self._lock:
self._num_released += 1
...@@ -57,6 +57,9 @@ class RequestScheduler: ...@@ -57,6 +57,9 @@ class RequestScheduler:
@property @property
def num_generated(self): return min(self._generator.num_generated, self._parameters.num_requests) def num_generated(self): return min(self._generator.num_generated, self._parameters.num_requests)
@property
def num_released(self): return min(self._generator.num_released, self._parameters.num_requests)
@property @property
def infinite_loop(self): return self._generator.infinite_loop def infinite_loop(self): return self._generator.infinite_loop
......
...@@ -73,6 +73,7 @@ class LoadGeneratorServiceServicerImpl(LoadGeneratorServiceServicer): ...@@ -73,6 +73,7 @@ class LoadGeneratorServiceServicerImpl(LoadGeneratorServiceServicer):
status = Status() status = Status()
status.num_generated = self._scheduler.num_generated status.num_generated = self._scheduler.num_generated
status.num_released = self._scheduler.num_released
status.infinite_loop = self._scheduler.infinite_loop status.infinite_loop = self._scheduler.infinite_loop
status.running = self._scheduler.running status.running = self._scheduler.running
......
...@@ -24,6 +24,7 @@ DEFAULT_E2E_LATENCY_MS = '5.0..100.00' ...@@ -24,6 +24,7 @@ DEFAULT_E2E_LATENCY_MS = '5.0..100.00'
class LoadGenForm(FlaskForm): class LoadGenForm(FlaskForm):
num_requests = IntegerField('Num Requests', default=100, validators=[DataRequired(), NumberRange(min=0)]) num_requests = IntegerField('Num Requests', default=100, validators=[DataRequired(), NumberRange(min=0)])
num_generated = IntegerField('Num Generated', default=0, render_kw={'readonly': True}) num_generated = IntegerField('Num Generated', default=0, render_kw={'readonly': True})
num_released = IntegerField('Num Released', default=0, render_kw={'readonly': True})
request_type_service_l2nm = BooleanField('Service L2NM', default=False) request_type_service_l2nm = BooleanField('Service L2NM', default=False)
request_type_service_l3nm = BooleanField('Service L3NM', default=False) request_type_service_l3nm = BooleanField('Service L3NM', default=False)
......
...@@ -80,6 +80,7 @@ def home(): ...@@ -80,6 +80,7 @@ def home():
set_properties(form.request_type_slice_l2nm , _request_type_slice_l2nm , disabled=status.running) set_properties(form.request_type_slice_l2nm , _request_type_slice_l2nm , disabled=status.running)
set_properties(form.request_type_slice_l3nm , _request_type_slice_l3nm , disabled=status.running) set_properties(form.request_type_slice_l3nm , _request_type_slice_l3nm , disabled=status.running)
set_properties(form.num_generated , status.num_generated , disabled=True) set_properties(form.num_generated , status.num_generated , disabled=True)
set_properties(form.num_released , status.num_released , disabled=True)
set_properties(form.infinite_loop , status.infinite_loop , disabled=True) set_properties(form.infinite_loop , status.infinite_loop , disabled=True)
set_properties(form.running , status.running , disabled=True) set_properties(form.running , status.running , disabled=True)
......
...@@ -53,6 +53,21 @@ ...@@ -53,6 +53,21 @@
</div> </div>
<br /> <br />
<div class="row mb-3">
{{ form.num_released.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form.num_released.errors %}
{{ form.num_released(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form.num_released.errors %}<span>{{ error }}</span>{% endfor %}
</div>
{% else %}
{{ form.num_released(class="form-control") }}
{% endif %}
</div>
</div>
<br />
<div class="row mb-3"> <div class="row mb-3">
<div class="col-sm-2 col-form-label">Service Types:</div> <div class="col-sm-2 col-form-label">Service Types:</div>
<div class="col-sm-10"> <div class="col-sm-10">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment