| /////////////////////////////////////////////////////////////////////////////// |
| // // |
| // Copyright (c) 2000-2019 Ericsson Telecom AB // |
| // // |
| // All rights reserved. This program and the accompanying materials // |
| // are made available under the terms of the Eclipse Public License v2.0 // |
| // which accompanies this distribution, and is available at // |
| // https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////////////////// |
| // Module: EPTF_HostAdmin_Test_Functions |
| // |
| // Purpose: |
| // This module contains function definitions for testing EPTF Base. |
| // |
| // Module Parameters: |
| // tsp_demoHost - *charstring* - remote-measurement hostname or IP address, default: 127.0.0.1 |
| // |
| // Module depends on: |
| // <EPTF_HostAdmin_Test_Definitions> |
| // <EPTF_CLL_Variable_Functions> |
| // <EPTF_CLL_HostAdmin_BaseDefinitions> |
| // <EPTF_CLL_HostAdmin_Definitions> |
| // <EPTF_CLL_Common_Definitions> |
| // |
| // Current Owner: |
| // Balazs Barcsik (ebalbar) |
| // |
| // Last Review Date: |
| // - |
| // |
| // Detailed Comments: |
| // - |
| /////////////////////////////////////////////////////////// |
| module EPTF_HostAdmin_Test_Functions { |
| //========================================================================= |
| // Import Part |
| //========================================================================= |
| import from EPTF_HostAdmin_Test_Definitions all; |
| import from EPTF_CLL_Variable_Functions all; |
| import from EPTF_CLL_HostAdmin_Definitions all; |
| import from EPTF_CLL_HostAdminServer_Definitions all; |
| import from EPTF_CLL_HostAdminServer_Functions all; |
| import from EPTF_CLL_Common_Definitions all; |
| import from EPTF_CLL_RBTScheduler_Definitions all; |
| import from EPTF_CLL_RBTScheduler_Functions all; |
| import from EPTF_CLL_Scheduler_Definitions all; |
| import from EPTF_CLL_DataSource_Definitions all; |
| import from EPTF_CLL_DataSourceClient_Functions all; |
| import from EPTF_CLL_DataSource_Functions all; |
| import from EPTF_CLL_Base_Functions all; |
| |
| //========================================================================= |
| // Module Parameters |
| //========================================================================= |
| modulepar charstring tsp_demoHost := "127.0.0.1"; |
| |
| //========================================================================= |
| // Functions |
| //========================================================================= |
| |
| function f_demo_subscribe() runs on EPTF_HostAdmin_Test_CT |
| { |
| // create subscriber variables |
| var charstring prefix := c_hostAdmin_name & "."; |
| |
| f_EPTF_Var_subscribeRemote(hostAdm, prefix & c_EPTF_HostAdmin_testerHostLoad_name, realtime, v_testerHostLoad_k); |
| f_EPTF_Var_subscribeRemote(hostAdm, prefix & c_EPTF_HostAdmin_numCPUs_name, realtime, v_numCPUs_k); |
| |
| for(var integer i:=0; i<f_EPTF_Var_getIntValue(v_numCPUs_k); i:=i+1) { |
| v_CPULoads_k[i] := -1; |
| f_EPTF_Var_subscribeRemote(hostAdm, prefix & c_EPTF_HostAdmin_CPULoads_name & "." & int2str(i), |
| realtime, v_CPULoads_k[i]); |
| f_EPTF_Var_addPostProcFn(v_CPULoads_k[i], {refers(f_postproc_CPULoads), {i}}); |
| } |
| |
| f_EPTF_Var_subscribeRemote(hostAdm, prefix & c_EPTF_HostAdmin_physicalMemory_name, realtime, v_physicalMemory_k); |
| f_EPTF_Var_subscribeRemote(hostAdm, prefix & c_EPTF_HostAdmin_freeMemory_name, realtime, v_freeMemory_k); |
| |
| f_EPTF_Var_addPostProcFn(v_testerHostLoad_k, {refers(f_postproc_testerHostLoad), {}}); |
| f_EPTF_Var_addPostProcFn(v_freeMemory_k, {refers(f_postproc_freeMemory), {}}); |
| |
| log("***** Number of CPUs on host ", tsp_demoHost, ": ", f_EPTF_Var_getIntValue(v_numCPUs_k)); |
| log("***** Physical memory: ", f_EPTF_Var_getIntValue(v_physicalMemory_k)); |
| } |
| |
| function f_postproc_testerHostLoad(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_HostAdmin_Test_CT |
| { |
| var float vl_value := f_EPTF_Var_getFloatValue(v_testerHostLoad_k); |
| if (vl_value >= 0.0) { |
| setverdict(pass); |
| } else { |
| log("Error: wrong host load value: ", vl_value, ", expected: >=0.0"); |
| setverdict(fail); |
| } |
| v_hostLoadCalled := v_hostLoadCalled + 1; |
| } |
| |
| function f_postproc_CPULoads(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_HostAdmin_Test_CT |
| { |
| var float vl_value := f_EPTF_Var_getFloatValue(v_CPULoads_k[pl_argList[0]]); |
| if (vl_value >= 0.0) { |
| setverdict(pass); |
| } else { |
| log("Error: wrong Load of CPU:", pl_argList[0], ": ", vl_value, ", expected: >=0.0"); |
| setverdict(fail); |
| } |
| v_CPUloadCalled := v_CPUloadCalled + 1; |
| } |
| |
| function f_postproc_freeMemory(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_HostAdmin_Test_CT |
| { |
| var integer vl_value := f_EPTF_Var_getIntValue(v_freeMemory_k); |
| if (vl_value >= 0) { |
| setverdict(pass); |
| } else { |
| log("Error: wrong free memory value: ", vl_value, ", expected: >=0"); |
| setverdict(fail); |
| } |
| v_freeMemoryCalled := v_freeMemoryCalled + 1; |
| |
| } |
| |
| group OverloadDetection { |
| |
| type component BurnCPU_CT { |
| private timer t_clock; |
| private timer t_cpu; |
| private var float lastEventTime := 0.0; |
| private var float deltaT := 0.02; |
| private var integer loadCyclesFor10Percent := 40000; |
| private var integer loadCycles := 0; |
| private var float targetLoad := 0.5; |
| private var default v_default := null |
| } |
| |
| type component EPTF_Scheduler_OverloadTest_CT extends EPTF_DataSourceClient_CT, EPTF_Scheduler_CT, BurnCPU_CT { |
| var float v_readLoadPeriod := 10.0; |
| var float v_overloadThreshold := 0.99; |
| } |
| |
| function f_EPTF_HostAdmin_overloadDetection_test_dataSourceHandlerLGen( |
| out charstring pl_dataVarName, |
| in charstring pl_source, |
| in charstring pl_ptcName, |
| in charstring pl_element, |
| in EPTF_DataSource_Params pl_params |
| ) runs on EPTF_Scheduler_OverloadTest_CT return integer { |
| |
| pl_dataVarName := pl_element; |
| return 0; |
| } |
| |
| function f_EPTF_HostAdmin_overloadDetection_test_setTargetLoadPostProc(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_Scheduler_OverloadTest_CT { |
| f_BurnCPU_setTargetLoad(f_EPTF_Var_getFloatValue(pl_idx)); |
| }; |
| |
| function f_EPTF_HostAdmin_overloadDetection_test_setOverLoadThresholdPostProc(in integer pl_idx, in EPTF_IntegerList pl_argList) runs on EPTF_Scheduler_OverloadTest_CT { |
| v_overloadThreshold := f_EPTF_Var_getFloatValue(pl_idx)/100.0; |
| f_EPTF_Scheduler_setMaxLoadThreshold(v_overloadThreshold); |
| }; |
| |
| public function f_EPTF_Scheduler_OverloadTest_init(in charstring pl_selfname, in integer pl_loadCyclesFor10Percent := 40000) runs on EPTF_Scheduler_OverloadTest_CT { |
| f_EPTF_Scheduler_init_CT(pl_selfname); |
| //f_EPTF_Scheduler_enableLoadMeasurement(true); |
| |
| f_BurnCPU_init_CT(pl_loadCyclesFor10Percent := pl_loadCyclesFor10Percent); |
| |
| var integer vl_eventId; |
| f_EPTF_SchedulerComp_scheduleAction( |
| pl_when := f_EPTF_SchedulerComp_snapshotTime() + 1.0, |
| pl_actionHandler := refers(f_EPTF_Scheduler_generateOverloadHandler), |
| pl_action := {}, |
| pl_eventIndex := vl_eventId |
| ); |
| |
| f_EPTF_SchedulerComp_scheduleAction( |
| pl_when := f_EPTF_SchedulerComp_snapshotTime() + 1.0, |
| pl_actionHandler := refers(f_EPTF_Scheduler_generateBackgroundEventsHandler), |
| pl_action := {}, |
| pl_eventIndex := vl_eventId |
| ); |
| |
| f_EPTF_SchedulerComp_scheduleAction( |
| pl_when := f_EPTF_SchedulerComp_snapshotTime() + 1.0, |
| pl_actionHandler := refers(f_EPTF_Scheduler_readLoadHandler), |
| pl_action := {}, |
| pl_eventIndex := vl_eventId |
| ); |
| |
| |
| f_EPTF_DataSourceClient_init_CT(f_EPTF_Base_selfName(),mtc); |
| var integer vl_idx; |
| f_EPTF_Var_newFloat("LoadInScheduler",0.0,vl_idx); |
| f_EPTF_Var_setSubsCanAdjust(vl_idx,false); |
| f_EPTF_DataSourceClient_registerData("LoadGen",f_EPTF_Base_selfName(),refers(f_EPTF_HostAdmin_overloadDetection_test_dataSourceHandlerLGen),mtc); |
| |
| f_EPTF_Var_newFloat("targetLoad",0.0,vl_idx); |
| f_EPTF_Var_addPostProcFn( |
| vl_idx, |
| { |
| funcRef := refers(f_EPTF_HostAdmin_overloadDetection_test_setTargetLoadPostProc), |
| argList := {} |
| } |
| ); |
| |
| f_EPTF_Var_newFloat("overloadThreshold",v_overloadThreshold*100.0,vl_idx); |
| f_EPTF_Var_addPostProcFn( |
| vl_idx, |
| { |
| funcRef := refers(f_EPTF_HostAdmin_overloadDetection_test_setOverLoadThresholdPostProc), |
| argList := {} |
| } |
| ); |
| |
| f_EPTF_Var_newStatusLED("overloadLED",{led_green, "ok"},vl_idx); |
| } |
| |
| private altstep as_BurnCPU_generateLoad() runs on BurnCPU_CT { |
| var float currentTime; |
| var float nextTime; |
| [] t_cpu.timeout { |
| |
| // calculate next event time: |
| currentTime := t_clock.read; |
| nextTime := lastEventTime+deltaT; |
| lastEventTime := nextTime; |
| var float vl_interval := nextTime-currentTime; |
| if (vl_interval<0.0) { |
| vl_interval := 0.0; |
| } |
| t_cpu.start(vl_interval); |
| |
| // generate load: |
| f_BurnCPU_generateLoad(); |
| |
| repeat; |
| } |
| } |
| |
| private function f_BurnCPU_generateLoad() runs on BurnCPU_CT { |
| // generate load: |
| var float vl_var; |
| for(var integer i:=0; i<loadCycles; i:=i+1) { |
| vl_var := 12.34; |
| vl_var := vl_var*vl_var; // just do something to generate CPU load |
| } |
| } |
| |
| private function f_BurnCPU_getDeltaT() runs on BurnCPU_CT return float { |
| return deltaT; |
| } |
| |
| private function f_EPTF_Scheduler_generateOverloadHandler( |
| in EPTF_ScheduledAction pl_action, |
| in integer pl_eventIndex |
| ) runs on EPTF_Scheduler_OverloadTest_CT return boolean { |
| f_BurnCPU_generateLoad(); |
| |
| var integer vl_eventId; |
| f_EPTF_SchedulerComp_scheduleAction( |
| pl_when := pl_action.when + f_BurnCPU_getDeltaT(), |
| pl_actionHandler := refers(f_EPTF_Scheduler_generateOverloadHandler), |
| pl_action := {}, |
| pl_eventIndex := vl_eventId |
| ); |
| |
| return true; |
| } |
| |
| private function f_EPTF_Scheduler_generateBackgroundEventsHandler( |
| in EPTF_ScheduledAction pl_action, |
| in integer pl_eventIndex |
| ) runs on EPTF_Scheduler_OverloadTest_CT return boolean { |
| var integer vl_eventId; |
| f_EPTF_SchedulerComp_scheduleAction( |
| pl_when := pl_action.when + 0.01, |
| pl_actionHandler := refers(f_EPTF_Scheduler_generateBackgroundEventsHandler), |
| pl_action := {}, |
| pl_eventIndex := vl_eventId |
| ); |
| |
| return true; |
| } |
| |
| private function f_EPTF_Scheduler_readLoadHandler( |
| in EPTF_ScheduledAction pl_action, |
| in integer pl_eventIndex |
| ) runs on EPTF_Scheduler_OverloadTest_CT return boolean { |
| f_EPTF_Var_adjustContent(f_EPTF_Var_getId("LoadInScheduler"),{floatVal := 100.0*f_EPTF_Scheduler_getLoad()}); |
| |
| var EPTF_StatusLED vl_led := {led_green, "ok"}; |
| if (f_EPTF_Scheduler_getLoad()>v_overloadThreshold) { |
| //overload: |
| vl_led := {led_red, "OVERLOAD!"}; |
| } |
| f_EPTF_Var_adjustContent(f_EPTF_Var_getId("overloadLED"),{statusLEDVal := vl_led}); |
| |
| //action("load: ", f_EPTF_Scheduler_getLoad(), " period: ", f_EPTF_Scheduler_getLoadMeasurementInterval()); |
| var integer vl_eventId; |
| f_EPTF_SchedulerComp_scheduleAction( |
| pl_when := pl_action.when + v_readLoadPeriod, |
| pl_actionHandler := refers(f_EPTF_Scheduler_readLoadHandler), |
| pl_action := {}, |
| pl_eventIndex := vl_eventId |
| ); |
| |
| |
| return true; |
| } |
| |
| public function f_BurnCPU_init_CT( |
| in float pl_deltaT := 0.02, |
| in integer pl_loadCyclesFor10Percent := 40000, |
| in float pl_targetLoad := 0.5, |
| in float pl_startDelay := 1.0 |
| ) runs on BurnCPU_CT { |
| deltaT := pl_deltaT; |
| loadCyclesFor10Percent := pl_loadCyclesFor10Percent; |
| targetLoad := pl_targetLoad; |
| loadCycles := float2int(int2float(loadCyclesFor10Percent)*targetLoad*10.0); |
| lastEventTime := pl_startDelay; |
| t_clock.start(1000.0); |
| t_cpu.start(lastEventTime); |
| // v_default := activate(as_BurnCPU_generateLoad()); |
| } |
| |
| // changes deltaT so that load remains the same |
| public function f_BurnCPU_setDeltaT( |
| in float pl_deltaT := 0.1 |
| ) runs on BurnCPU_CT { |
| loadCyclesFor10Percent := float2int(int2float(loadCyclesFor10Percent)*pl_deltaT/deltaT); |
| deltaT := pl_deltaT; |
| f_BurnCPU_setTargetLoad(targetLoad); |
| } |
| |
| // changes load so that deltaT remains the same |
| public function f_BurnCPU_setTargetLoad( |
| in float pl_targetLoad |
| ) runs on BurnCPU_CT { |
| targetLoad := pl_targetLoad; |
| loadCycles := float2int(int2float(loadCyclesFor10Percent)*targetLoad*10.0); |
| } |
| |
| public function f_EPTF_Scheduler_Test_overloadDetection_behaviour(in charstring pl_selfName, in float pl_desiredLoad, in integer pl_loadCyclesFor10Percent := 40000) runs on EPTF_Scheduler_OverloadTest_CT { |
| |
| |
| f_EPTF_Scheduler_OverloadTest_init(pl_selfName, pl_loadCyclesFor10Percent); |
| f_BurnCPU_setTargetLoad(pl_desiredLoad); |
| f_BurnCPU_setDeltaT(0.05); |
| v_overloadThreshold := 0.95; |
| f_EPTF_Scheduler_setMaxLoadThreshold(v_overloadThreshold); |
| f_EPTF_Scheduler_setLoadMeasurementPeriod(1.0); |
| v_readLoadPeriod := f_EPTF_Scheduler_getLoadMeasurementInterval(); |
| if (v_readLoadPeriod<0.0) { |
| v_readLoadPeriod := 1.0; |
| } |
| f_EPTF_Var_adjustContent(f_EPTF_Var_getId("targetLoad"), {floatVal := pl_desiredLoad}); |
| |
| f_EPTF_Base_wait4Shutdown(); |
| |
| |
| // activate the overload generator altstep |
| } |
| |
| |
| } // group OverloadDetection |
| |
| type component EPTF_HostAdmin_Test_Process_CPULoad_CT extends EPTF_Scheduler_OverloadTest_CT |
| { |
| } |
| |
| type component EPTF_HostAdmin_Test_Process_CPULoad_Server_CT extends EPTF_HostAdminServer_CT, EPTF_DataSource_CT{ |
| var boolean v_dsHostAdminReady := false; |
| } |
| |
| function f_EPTF_HostAdmin_Test_Process_CPULoad_Server_init_CT( |
| in charstring pl_selfName |
| ) runs on EPTF_HostAdmin_Test_Process_CPULoad_Server_CT { |
| f_EPTF_DataSource_init_CT(pl_selfName); |
| f_EPTF_DataSource_registerReadyCallback(refers(f_EPTF_HostAdmin_Test_Process_CPULoad_dataSourceReadyCallback)); |
| v_dsHostAdminReady := false; |
| f_EPTF_HostAdminServer_init_CT(pl_selfName, self); |
| } |
| |
| external function f_EPTF_HostAdmin_Test_Process_CPULoad_startThreads( |
| in integer pl_nofThread, |
| in float pl_desiredLoad |
| ); |
| |
| function f_EPTF_HostAdmin_Test_Process_CPULoad_proc_behavior( |
| in charstring pl_selfName, |
| in float pl_desiredLoad, |
| in integer pl_loadCyclesFor10Percent := 40000 |
| ) runs on EPTF_HostAdmin_Test_Process_CPULoad_CT { |
| action("*** PROC NAME *** ", pl_selfName&int2str(float2int(pl_desiredLoad))); |
| |
| var float vl_singleThreadLoad := pl_desiredLoad; |
| var integer vl_nofThread := (float2int(pl_desiredLoad) / 100); |
| |
| if (pl_desiredLoad > 100.0) { |
| vl_singleThreadLoad := vl_singleThreadLoad / int2float(vl_nofThread); |
| } |
| action("*** NOF THREAD *** ", vl_nofThread); |
| if (vl_nofThread > 1) { |
| f_EPTF_HostAdmin_Test_Process_CPULoad_startThreads(vl_nofThread-1, vl_singleThreadLoad); |
| } |
| |
| f_EPTF_Scheduler_Test_overloadDetection_behaviour(pl_selfName&int2str(float2int(pl_desiredLoad)), vl_singleThreadLoad/100.0, pl_loadCyclesFor10Percent); |
| |
| } |
| |
| function f_EPTF_HostAdmin_Test_Process_CPULoad_dataSourceReadyCallback( |
| in charstring pl_source, |
| in charstring pl_ptcName |
| ) runs on EPTF_HostAdmin_Test_Process_CPULoad_Server_CT { |
| action("*** READY RECV FOR *** ", pl_source); |
| if (pl_source == c_HostAdminServer_DataSource_sourceId) { |
| action("*** true *** ", pl_source); |
| v_dsHostAdminReady := true; |
| } |
| } |
| |
| } |