Loading proto/load_generator.proto +3 −2 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ message Parameters { message Status { Parameters parameters = 1; uint64 num_generated = 2; bool infinite_loop = 3; bool running = 4; uint64 num_released = 3; bool infinite_loop = 4; bool running = 5; } src/load_generator/load_gen/RequestGenerator.py +25 −11 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # 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 common.proto.context_pb2 import Empty, IsolationLevelEnum, TopologyId from common.tools.grpc.Tools import grpc_message_to_json Loading Loading @@ -54,6 +54,7 @@ class RequestGenerator: self._parameters = parameters self._lock = threading.Lock() self._num_generated = 0 self._num_released = 0 self._available_device_endpoints : Dict[str, Set[str]] = dict() self._used_device_endpoints : Dict[str, Dict[str, str]] = dict() self._endpoint_ids_to_types : Dict[Tuple[str, str], str] = dict() Loading @@ -65,6 +66,9 @@ class RequestGenerator: @property def num_generated(self): return self._num_generated @property def num_released(self): return self._num_released @property def infinite_loop(self): return self._parameters.num_requests == 0 Loading Loading @@ -192,23 +196,18 @@ class RequestGenerator: if not self.infinite_loop and (self._num_generated >= self._parameters.num_requests): LOGGER.info('Generation Done!') return True, None, None # completed self._num_generated += 1 num_request = self._num_generated #request_uuid = str(uuid.uuid4()) request_uuid = 'svc_{:d}'.format(num_request) # choose request type request_uuid = str(uuid.uuid4()) request_type = random.choice(self._parameters.request_types) if request_type in { 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}: 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 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) Loading Loading @@ -237,6 +236,10 @@ class RequestGenerator: self._release_device_endpoint(src_device_uuid, src_endpoint_uuid) return None with self._lock: self._num_generated += 1 num_request = self._num_generated # compose endpoints dst_device_uuid,dst_endpoint_uuid = dst endpoint_ids = [ Loading Loading @@ -383,7 +386,7 @@ class RequestGenerator: return json_service_l2nm_planned( 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 src = self._use_device_endpoint(request_uuid, request_type) if src is None: Loading @@ -404,6 +407,10 @@ class RequestGenerator: self._release_device_endpoint(src_device_uuid, src_endpoint_uuid) return None with self._lock: self._num_generated += 1 num_request = self._num_generated # compose endpoints dst_device_uuid,dst_endpoint_uuid = dst endpoint_ids = [ Loading Loading @@ -505,8 +512,15 @@ class RequestGenerator: device_uuid = endpoint_id['device_id']['device_uuid']['uuid'] endpoint_uuid = endpoint_id['endpoint_uuid']['uuid'] self._release_device_endpoint(device_uuid, endpoint_uuid) with self._lock: self._num_released += 1 elif 'slice_id' in json_request: for endpoint_id in json_request['slice_endpoint_ids']: device_uuid = endpoint_id['device_id']['device_uuid']['uuid'] endpoint_uuid = endpoint_id['endpoint_uuid']['uuid'] self._release_device_endpoint(device_uuid, endpoint_uuid) with self._lock: self._num_released += 1 src/load_generator/load_gen/RequestScheduler.py +3 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,9 @@ class RequestScheduler: @property 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 def infinite_loop(self): return self._generator.infinite_loop Loading src/load_generator/service/LoadGeneratorServiceServicerImpl.py +1 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ class LoadGeneratorServiceServicerImpl(LoadGeneratorServiceServicer): status = Status() status.num_generated = self._scheduler.num_generated status.num_released = self._scheduler.num_released status.infinite_loop = self._scheduler.infinite_loop status.running = self._scheduler.running Loading src/webui/service/load_gen/forms.py +1 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ DEFAULT_E2E_LATENCY_MS = '5.0..100.00' class LoadGenForm(FlaskForm): num_requests = IntegerField('Num Requests', default=100, validators=[DataRequired(), NumberRange(min=0)]) 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_l3nm = BooleanField('Service L3NM', default=False) Loading Loading
proto/load_generator.proto +3 −2 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ message Parameters { message Status { Parameters parameters = 1; uint64 num_generated = 2; bool infinite_loop = 3; bool running = 4; uint64 num_released = 3; bool infinite_loop = 4; bool running = 5; }
src/load_generator/load_gen/RequestGenerator.py +25 −11 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # 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 common.proto.context_pb2 import Empty, IsolationLevelEnum, TopologyId from common.tools.grpc.Tools import grpc_message_to_json Loading Loading @@ -54,6 +54,7 @@ class RequestGenerator: self._parameters = parameters self._lock = threading.Lock() self._num_generated = 0 self._num_released = 0 self._available_device_endpoints : Dict[str, Set[str]] = dict() self._used_device_endpoints : Dict[str, Dict[str, str]] = dict() self._endpoint_ids_to_types : Dict[Tuple[str, str], str] = dict() Loading @@ -65,6 +66,9 @@ class RequestGenerator: @property def num_generated(self): return self._num_generated @property def num_released(self): return self._num_released @property def infinite_loop(self): return self._parameters.num_requests == 0 Loading Loading @@ -192,23 +196,18 @@ class RequestGenerator: if not self.infinite_loop and (self._num_generated >= self._parameters.num_requests): LOGGER.info('Generation Done!') return True, None, None # completed self._num_generated += 1 num_request = self._num_generated #request_uuid = str(uuid.uuid4()) request_uuid = 'svc_{:d}'.format(num_request) # choose request type request_uuid = str(uuid.uuid4()) request_type = random.choice(self._parameters.request_types) if request_type in { 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}: 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 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) Loading Loading @@ -237,6 +236,10 @@ class RequestGenerator: self._release_device_endpoint(src_device_uuid, src_endpoint_uuid) return None with self._lock: self._num_generated += 1 num_request = self._num_generated # compose endpoints dst_device_uuid,dst_endpoint_uuid = dst endpoint_ids = [ Loading Loading @@ -383,7 +386,7 @@ class RequestGenerator: return json_service_l2nm_planned( 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 src = self._use_device_endpoint(request_uuid, request_type) if src is None: Loading @@ -404,6 +407,10 @@ class RequestGenerator: self._release_device_endpoint(src_device_uuid, src_endpoint_uuid) return None with self._lock: self._num_generated += 1 num_request = self._num_generated # compose endpoints dst_device_uuid,dst_endpoint_uuid = dst endpoint_ids = [ Loading Loading @@ -505,8 +512,15 @@ class RequestGenerator: device_uuid = endpoint_id['device_id']['device_uuid']['uuid'] endpoint_uuid = endpoint_id['endpoint_uuid']['uuid'] self._release_device_endpoint(device_uuid, endpoint_uuid) with self._lock: self._num_released += 1 elif 'slice_id' in json_request: for endpoint_id in json_request['slice_endpoint_ids']: device_uuid = endpoint_id['device_id']['device_uuid']['uuid'] endpoint_uuid = endpoint_id['endpoint_uuid']['uuid'] self._release_device_endpoint(device_uuid, endpoint_uuid) with self._lock: self._num_released += 1
src/load_generator/load_gen/RequestScheduler.py +3 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,9 @@ class RequestScheduler: @property 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 def infinite_loop(self): return self._generator.infinite_loop Loading
src/load_generator/service/LoadGeneratorServiceServicerImpl.py +1 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ class LoadGeneratorServiceServicerImpl(LoadGeneratorServiceServicer): status = Status() status.num_generated = self._scheduler.num_generated status.num_released = self._scheduler.num_released status.infinite_loop = self._scheduler.infinite_loop status.running = self._scheduler.running Loading
src/webui/service/load_gen/forms.py +1 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ DEFAULT_E2E_LATENCY_MS = '5.0..100.00' class LoadGenForm(FlaskForm): num_requests = IntegerField('Num Requests', default=100, validators=[DataRequired(), NumberRange(min=0)]) 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_l3nm = BooleanField('Service L3NM', default=False) Loading