From a3b7b74dfdd3c102840be9abcd4e872bd5276d5a Mon Sep 17 00:00:00 2001
From: Rowan Powell <rp17@it-innovation.soton.ac.uk>
Date: Wed, 10 Jan 2018 14:42:21 +0000
Subject: [PATCH] Added Port and SF config measurements, refactored all line
 protocol generation into new file

---
 src/mediaServiceSim/serviceSim.py | 142 +++++-------------------------
 1 file changed, 22 insertions(+), 120 deletions(-)

diff --git a/src/mediaServiceSim/serviceSim.py b/src/mediaServiceSim/serviceSim.py
index bf35c43..576773e 100644
--- a/src/mediaServiceSim/serviceSim.py
+++ b/src/mediaServiceSim/serviceSim.py
@@ -32,7 +32,7 @@ import datetime
 import uuid
 import urllib.parse
 import urllib.request
-
+import LineProtocolGenerator as lp
 
 # DemoConfig is a configuration class used to set up the simulation
 class DemoConfig(object):
@@ -134,7 +134,7 @@ class DemoServer(object):
         ids = ['A', 'B', 'C']
         locations = ['locA', 'locB', 'locC']
         for i, id in enumerate(ids):
-            server_conf_block.append(self._generateServerConfig(id,locations[i],8,'100G','1T',self._selectDelay(len(ids))))
+            server_conf_block.append(lp._generateServerConfig(id,locations[i],8,'100G','1T', self._selectDelay(len(ids))))
         self._sendInfluxDataBlock(server_conf_block)
     def configure_VMs(self):
         print("Configuring VM nodes")
@@ -144,6 +144,14 @@ class DemoServer(object):
 
         self._sendInfluxDataBlock(VM_conf_block)
 
+    def configure_ports(self):
+        print("Configuring Servers")
+        server_conf_block = []
+        for i in range(0,10):
+            server_conf_block.append(lp._configure_port())
+        self._sendInfluxDataBlock(server_conf_block)
+
+
     def shutdown_VMs(self):
         print("Shutting down VM nodes")
         VM_conf_block = []
@@ -153,7 +161,7 @@ class DemoServer(object):
 
     def _generateVMS(self,state, amount, datablock):
         for i in range(0, amount):
-            datablock.append(self._generateVMConfig(state, 1, '100G', '1T', self._selectDelay(amount)))
+            datablock.append(lp._generateVMConfig(state, 1, '100G', '1T', self._selectDelay(amount)))
 
     def iterateService( self ):
         # The simulation will run through 'X' iterations of the simulation
@@ -187,7 +195,7 @@ class DemoServer(object):
                     if ( cReq != None ):
 
                         clientsRequesting.append( client )
-                        requestBlock.append( self._generateClientRequest(cReq) )
+                        requestBlock.append( lp._generateClientRequest(cReq, self.id, self.currentTime) )
 
 
 
@@ -202,20 +210,22 @@ class DemoServer(object):
 
                     # Generate some quality and delays based on the number of clients requesting for this iteration
                     qualitySelect = self._selectQuality( client.getQuality(), clientReqCount )
-                    delaySelect = self._selectDelay( clientReqCount )
+                    delaySelect = self._selectDelay( clientReqCount ) + self.currentTime
                     qualityDifference = client.getQuality() - qualitySelect
                     totalDifference+=qualityDifference
-                   # print('totalDifference = ' + str(totalDifference) +'\n')
+                    # print('totalDifference = ' + str(totalDifference) +'\n')
                     sumOfclientQuality+=client.getQuality()
-                    #print('sumOfclientQuality = ' + str(sumOfclientQuality) + '\n')
+                    # print('sumOfclientQuality = ' + str(sumOfclientQuality) + '\n')
                     percentageDifference=int((totalDifference*100)/sumOfclientQuality)
-                   # print('percentageOfQualityDifference = ' + str(percentageDifference) + '%')
+                    # print('percentageOfQualityDifference = ' + str(percentageDifference) + '%')
  
-                    responseBlock.append( self._generateServerResponse( client.getLastRequestID(), qualitySelect, delaySelect, cpuUsagePercentage, percentageDifference ) )
-                    SFBlock.append( self._generateMpegDashReport('https://netflix.com/scream',qualitySelect,delaySelect))
+                    responseBlock.append(lp._generateServerResponse(client.getLastRequestID(), qualitySelect,
+                                                                      delaySelect, cpuUsagePercentage,
+                                                                      percentageDifference))
+                    SFBlock.append(lp._generateMpegDashReport('https://netflix.com/scream', qualitySelect, delaySelect))
 
 
-                    networkBlock.append(self._generateNetworkReport(sumOfclientQuality,delaySelect))
+                    networkBlock.append(lp._generateNetworkReport(sumOfclientQuality, delaySelect))
                 # Iterate the service simulation
                 self.simIterations -= 1
                 self.currentTime += 1000 # advance 1 second
@@ -226,7 +236,7 @@ class DemoServer(object):
             self._sendInfluxDataBlock( responseBlock )
             self._sendInfluxDataBlock( networkBlock )
             self._sendInfluxDataBlock( SFBlock )
-            #print("Sending influx data blocks")
+            print("Sending influx data blocks")
 
         return self.simIterations
 
@@ -300,114 +310,6 @@ class DemoServer(object):
 
         return result
 
-    # Method to create a full InfluxDB request statement (based on partial statement from client)
-    def _generateClientRequest( self, cReq ):
-
-        # Tags first
-        result = 'sid="' + str(self.id) + '",' + cReq
-
-        # Fields
-        # No additional fields here yet
-
-        # Timestamp
-        result += ' ' + str( self._getNSTime() )
-
-        # Measurement
-        return 'request,' + result
-
-    # Method to create a full InfluxDB response statement
-    def _generateServerResponse( self, reqID, quality, delay, cpuUsage, qualityDifference ):
-
-        # Tags first
-        result = ' '
-
-        # Fields
-        result += 'quality=' + str( quality ) + ','
-        result += 'cpuUsage=' + str(cpuUsage) + ','
-        result += 'qualityDifference=' + str(qualityDifference) +','
-        result += 'requestID="' + str( reqID ) + '",'
-        result += 'index="' + str( uuid.uuid4() ) + '"'
-
-        # Timestamp
-        result += ' ' + str( self._getNSTime(delay) )
-
-        # Measurement
-        #print('response'+result)
-        return 'response' + result
-
-    def _generateNetworkReport(self, sum_of_client_quality, delay):
-        # Tags
-        result = ',port_id=enps03 '
-        # Fields
-        result += 'RX_BYTES_PORT_M='+str(sum_of_client_quality*32)+","
-        result += 'TX_BYTES_PORT_M='+str(sum_of_client_quality*1024)
-        # Timestamp
-        result += ' ' + str( self._getNSTime(delay) )
-
-        # Measurement
-        #print('network'+result)
-        return 'net_port_io' + result
-
-    def _generateMpegDashReport(self, resource, quality, delay):
-        # Tags
-        result = ' '
-        # Fields
-        requests = randint(10,30)
-        avg_response_time = 50+randint(0,100)+randint(0,10*quality)
-        peak_response_time = avg_response_time + randint(30,60) + randint(5,10)*quality
-        result += 'cont_nav=\"'+str(resource)+"\","
-        result += 'cont_rep='+str(quality)+','
-        result += 'requests='+str(requests)+','
-        result += 'avg_response_time='+str(avg_response_time)+','
-        result += 'peak_response_time='+str(peak_response_time)
-        # Timestamp
-        result += ' ' + str( self._getNSTime(delay) )
-
-        # Measurement
-        #print('mpegdash_service'+result)
-        return 'mpegdash_service' + result
-
-    def _generateServerConfig(self, ID, location, cpu, mem, storage, delay):
-        # metric
-        result = 'host_resource'
-        # Tags
-        result += ',slide_id='+self.quote_wrap(ID)
-        result += ',location='+self.quote_wrap(location)
-        result += ' '
-        # Fields
-        result += 'cpu='+str(cpu)
-        result += ',memory='+self.quote_wrap(mem)
-        result += ',storage=' + self.quote_wrap(storage)
-
-        #Time
-        result += ' ' + str( self._getNSTime(delay) )
-
-        print(result)
-        return result
-
-    def _generateVMConfig(self, state, cpu, mem, storage, delay):
-        # metric
-        result = 'vm_res_alloc'
-        # Tags
-        result += ',vm_state='+self.quote_wrap(state)
-        result += ' '
-        # Fields
-        result += 'cpu='+str(cpu)
-        result += ',memory='+self.quote_wrap(mem)
-        result += ',storage=' + self.quote_wrap(storage)
-
-        #Time
-        result += ' ' + str( self._getNSTime(delay) )
-
-        print(result)
-        return result
-
-    def quote_wrap(self,str):
-        return "\""+str+"\""
-    # InfluxDB likes to have time-stamps in nanoseconds
-    def _getNSTime( self, offset = 0 ):
-        # Convert to nano-seconds
-        return 1000000 * ( self.currentTime + offset )
 
     def _createDB( self ):
         self._sendInfluxQuery( 'CREATE DATABASE '+  self.influxDB )
-- 
GitLab