From 541f3f00c9aaa027ed10b78aa5a6eaa127d74ef3 Mon Sep 17 00:00:00 2001
From: Nikolay Stanchev <ns17@it-innovation.soton.ac.uk>
Date: Thu, 29 Mar 2018 10:52:40 +0100
Subject: [PATCH] Refactored states transitions - endpoint configuration [issue
 #61]

---
 clmctest/monitoring/StreamingSim.py    | 48 ++++++++++++++++++++++----
 clmctest/monitoring/conftest.py        |  3 --
 clmctest/monitoring/test_simresults.py | 12 +++----
 3 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/clmctest/monitoring/StreamingSim.py b/clmctest/monitoring/StreamingSim.py
index 85ae10b..91159bd 100644
--- a/clmctest/monitoring/StreamingSim.py
+++ b/clmctest/monitoring/StreamingSim.py
@@ -73,16 +73,28 @@ class Sim(object):
                          'segment_size': 2, 'video_bit_rate': 80, 'packet_size': 1500}
                         ]
 
-        # Simulate configuration of the ipendpoints
+        # Simulate configuration of the ip endpoints
         # endpoint state->mu, sigma, secs normal distribution
-        config_delay_dist = {"placing": [10, 0.68], "booting": [10, 0.68], "connecting": [10, 0.68], "unplaced": [10, 0.68]}
+        config_delay_dist = {"unplaced": [1, 0.68], "placing": [10, 0.68], "placed": [1, 0.68], "booting": [10, 0.68],  "booted": [2, 0.68],
+                             "connecting": [10, 0.68], "connected": [8, 0.68]}
 
         # Simulation configuration of the media component (MC) state changes
         # "MC state", [average (sec), stddev]
-        mc_config_delay_dist = { "stopped":[1, 0.68], "starting": [5, 0.68], "running":[1, 0.68], "stopping": [2, 0.68]}
+        mc_config_delay_dist = { "stopped":[1, 0.68], "starting": [5, 0.68], "running": [1, 0.68], "stopping": [2, 0.68]}
 
         print("\nSimulation started. Generating data...")
 
+        # Move endpoints from state unplaced to state placing
+        max_delay = 0
+        for ip_endpoint in ip_endpoints:
+            agent_url = urllib.parse.urlparse(ip_endpoint["agent_url"])
+            agent_db_client = InfluxDBClient(host=agent_url.hostname, port=agent_url.port, database=self.influx_db_name, timeout=10)
+            delay_time = self._changeVMState(agent_db_client, sim_time, ip_endpoint, config_delay_dist['unplaced'][0],
+                                             config_delay_dist['unplaced'][0] * config_delay_dist['unplaced'][1], 0.7,
+                                             'unplaced', 'placing')
+            max_delay = max(delay_time, max_delay)
+        sim_time += max_delay
+
         # Place endpoints
         max_delay = 0
         for ip_endpoint in ip_endpoints:
@@ -94,6 +106,17 @@ class Sim(object):
             max_delay = max(delay_time, max_delay)
         sim_time += max_delay
 
+        # Move endpoints from state placed to state booting
+        max_delay = 0
+        for ip_endpoint in ip_endpoints:
+            agent_url = urllib.parse.urlparse(ip_endpoint["agent_url"])
+            agent_db_client = InfluxDBClient(host=agent_url.hostname, port=agent_url.port, database=self.influx_db_name, timeout=10)
+            delay_time = self._changeVMState(agent_db_client, sim_time, ip_endpoint, config_delay_dist['placed'][0],
+                                             config_delay_dist['placed'][0] * config_delay_dist['placed'][1], 0.7,
+                                             'placed', 'booting')
+            max_delay = max(delay_time, max_delay)
+        sim_time += max_delay
+
         # Boot endpoints
         max_delay = 0
         for ip_endpoint in ip_endpoints:
@@ -131,6 +154,17 @@ class Sim(object):
 
         sim_time += max_delay
 
+        # Move endpoints from state booted to state connecting
+        max_delay = 0
+        for ip_endpoint in ip_endpoints:
+            agent_url = urllib.parse.urlparse(ip_endpoint["agent_url"])
+            agent_db_client = InfluxDBClient(host=agent_url.hostname, port=agent_url.port, database=self.influx_db_name, timeout=10)
+            delay_time = self._changeVMState(agent_db_client, sim_time, ip_endpoint, config_delay_dist['booted'][0],
+                                             config_delay_dist['booted'][0] * config_delay_dist['booted'][1], 0.7,
+                                             'booted', 'connecting')
+            max_delay = max(delay_time, max_delay)
+        sim_time += max_delay
+
         # Connect endpoints
         max_delay = 0
         for ip_endpoint in ip_endpoints:
@@ -221,9 +255,9 @@ class Sim(object):
         for ip_endpoint in ip_endpoints:
             agent_url = urllib.parse.urlparse(ip_endpoint["agent_url"])
             agent_db_client = InfluxDBClient(host=agent_url.hostname, port=agent_url.port, database=self.influx_db_name, timeout=10)
-            delay_time = self._changeVMState(agent_db_client, sim_time, ip_endpoint, config_delay_dist['placing'][0],
-                                             config_delay_dist['unplaced'][0] * config_delay_dist['unplaced'][1], 0.25,
-                                             'placed', 'unplaced')
+            delay_time = self._changeVMState(agent_db_client, sim_time, ip_endpoint, config_delay_dist['connected'][0],
+                                             config_delay_dist['connected'][0] * config_delay_dist['connected'][1], 0.25,
+                                             'connected', 'unplaced')
             max_delay = max(delay_time, max_delay)
         sim_time += max_delay
 
@@ -388,7 +422,7 @@ if __name__ == "__main__":
         elif opt in ('-t','--time'):
             simTime = arg
 
-    if ( genOpt == True ):
+    if genOpt == True:
         print( "Running simulation to generate data" )
         print( "Time period for this simulation: " + str(simTime) + " seconds" )
     else:
diff --git a/clmctest/monitoring/conftest.py b/clmctest/monitoring/conftest.py
index d5aa1e0..97eaf82 100644
--- a/clmctest/monitoring/conftest.py
+++ b/clmctest/monitoring/conftest.py
@@ -45,9 +45,6 @@ def simulator( streaming_sim_config ):
 
     simulator = Sim( influx_url, influx_db_name, agent1_url, agent2_url )
 
-    dbs = simulator.db_client.get_list_database()
-    dbs = [db.get("name") for db in dbs]
-
     simulator.reset()
 
     return simulator
\ No newline at end of file
diff --git a/clmctest/monitoring/test_simresults.py b/clmctest/monitoring/test_simresults.py
index 7fb5872..45fc0cf 100644
--- a/clmctest/monitoring/test_simresults.py
+++ b/clmctest/monitoring/test_simresults.py
@@ -8,7 +8,7 @@ class TestSimulation(object):
     """
     A testing class used to group all the tests related to the simulation data
     """
-    @pytest.fixture(scope='class')
+    @pytest.fixture(scope='class', autouse=True)
     def run_simulator( self, simulator ):
         simulator.run( 3600 )
       
@@ -26,11 +26,11 @@ class TestSimulation(object):
          {"time": "1970-01-01T00:00:00Z", "count_RX_BYTES_PORT_M": 7200, "count_TX_BYTES_PORT_M": 7200}),
 
         ('SELECT count(*) FROM "CLMCMetrics"."autogen"."endpoint_config" WHERE ipendpoint=\'adaptive_streaming_I1_apache1\'',
-         {"time": "1970-01-01T00:00:00Z", "count_unplaced": 4, "count_avg_unplaced": 4, "count_placing": 4, "count_avg_placing": 4, "count_placed": 4, "count_avg_placed": 4, "count_booting": 4, "count_avg_booting": 4, "count_booted": 4,
-          "count_avg_booted": 4, "count_connecting": 4, "count_avg_connecting": 4, "count_connected": 4, "count_avg_connected": 4, "count_cpus": 4, "count_memory": 4, "count_storage": 4}),
+         {"time": "1970-01-01T00:00:00Z", "count_unplaced": 7, "count_avg_unplaced": 7, "count_placing": 7, "count_avg_placing": 7, "count_placed": 7, "count_avg_placed": 7, "count_booting": 7, "count_avg_booting": 7, "count_booted": 7,
+          "count_avg_booted": 7, "count_connecting": 7, "count_avg_connecting": 7, "count_connected": 7, "count_avg_connected": 7, "count_cpus": 7, "count_memory": 7, "count_storage": 7}),
         ('SELECT count(*) FROM "CLMCMetrics"."autogen"."endpoint_config" WHERE ipendpoint=\'adaptive_streaming_I1_apache2\'',
-         {"time": "1970-01-01T00:00:00Z", "count_unplaced": 4, "count_avg_unplaced": 4, "count_placing": 4, "count_avg_placing": 4, "count_placed": 4, "count_avg_placed": 4, "count_booting": 4, "count_avg_booting": 4, "count_booted": 4,
-          "count_avg_booted": 4, "count_connecting": 4, "count_avg_connecting": 4, "count_connected": 4, "count_avg_connected": 4, "count_cpus": 4, "count_memory": 4, "count_storage": 4}),
+         {"time": "1970-01-01T00:00:00Z", "count_unplaced": 7, "count_avg_unplaced": 7, "count_placing": 7, "count_avg_placing": 7, "count_placed": 7, "count_avg_placed": 7, "count_booting": 7, "count_avg_booting": 7, "count_booted": 7,
+          "count_avg_booted": 7, "count_connecting": 7, "count_avg_connecting": 7, "count_connected": 7, "count_avg_connected": 7, "count_cpus": 7, "count_memory": 7, "count_storage": 7}),
 
         ('SELECT count(*) FROM "CLMCMetrics"."autogen"."mpegdash_service_config" WHERE ipendpoint=\'adaptive_streaming_I1_apache1\'',
 
@@ -38,7 +38,7 @@ class TestSimulation(object):
         ('SELECT count(*) FROM "CLMCMetrics"."autogen"."mpegdash_service_config" WHERE ipendpoint=\'adaptive_streaming_I1_apache2\'',
          {"time" : "1970-01-01T00:00:00Z", "count_avg_running" : 3604, "count_avg_starting" : 3604, "count_avg_stopped" : 3604, "count_avg_stopping" : 3604, "count_running" : 3604, "count_starting" : 3604, "count_stopped" : 3604, "count_stopping" : 3604}),
     ])
-    def test_simulation( self, run_simulator, influx_db, query, expected_result ):
+    def test_simulation( self, influx_db, query, expected_result ):
         """
         This is the entry point of the test. This method will be found and executed when the module is ran using pytest
 
-- 
GitLab