diff --git a/src/mediaServiceSim/serviceSim.py b/src/mediaServiceSim/serviceSim.py index bf35c43f5e97be426b12ba1204b83af6d57c5fb9..576773e7f3c47f18e30d308fc7f0b7c10c73423e 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 )