From 52a51fef2e82879944eee89e59434cb463c3a303 Mon Sep 17 00:00:00 2001
From: Rowan Powell <rp17@it-innovation.soton.ac.uk>
Date: Fri, 12 Jan 2018 13:59:36 +0000
Subject: [PATCH] New sim as per michael spec

---
 src/mediaServiceSim/LineProtocolGenerator.py  | 214 +++++++++++-------
 .../LineProtocolGenerator.cpython-36.pyc      | Bin 4053 -> 6021 bytes
 src/mediaServiceSim/serviceSim.py             |  13 +-
 3 files changed, 142 insertions(+), 85 deletions(-)

diff --git a/src/mediaServiceSim/LineProtocolGenerator.py b/src/mediaServiceSim/LineProtocolGenerator.py
index da8ba0d..1f55222 100644
--- a/src/mediaServiceSim/LineProtocolGenerator.py
+++ b/src/mediaServiceSim/LineProtocolGenerator.py
@@ -4,6 +4,95 @@
 import uuid
 from random import random, randint
 
+
+# Reports TX and RX, scaling on requested quality
+def generate_network_report(recieved_bytes, sent_bytes, time):
+    # Measurement
+    result = 'net_port_io'
+    # Tags
+    result += ',port_id=enps03 '
+    # Fields
+    result += 'RX_BYTES_PORT_M=' + str(recieved_bytes) + ","
+    result += 'TX_BYTES_PORT_M=' + str(sent_bytes)
+    # Timestamp
+    result += ' ' + str(_getNSTime(time))
+
+    # Measurement
+    # print('network'+result)
+    return result
+
+
+# Formats VM config
+def generate_vm_config(state, cpu, mem, storage, time):
+    # metric
+    result = 'vm_res_alloc'
+    # Tags
+    result += ',vm_state=' + quote_wrap(state)
+    result += ' '
+    # Fields
+    result += 'cpu=' + str(cpu)
+    result += ',memory=' + quote_wrap(mem)
+    result += ',storage=' + quote_wrap(storage)
+
+    # Time
+    result += ' ' + str(_getNSTime(time))
+
+    print(result)
+    return result
+
+
+# Reports cpu usage, scaling on requests
+def generate_cpu_report(loc, sfc, sfc_i, sf_package, sf_i, cpu_useage, cpu_usage_system, time):
+    result = 'vm_host_cpu_usage'
+    # Tag
+    result += ',location='+quote_wrap(loc)
+    result += ',sfc='+quote_wrap(sfc)
+    result += ',sfc_i='+quote_wrap(sfc_i)
+    result += ',sf_package='+quote_wrap(sf_package)
+    result += ',sf_i='+quote_wrap(sf_i)
+    result += ' '
+    # field
+    result += 'cpu_usage='+str(cpu_useage)
+    result += ',cpu_usage_system='+str(cpu_usage_system)
+    result += ' '
+    # Time
+    result += str(_getNSTime(time))
+    print(result)
+    return result
+
+
+# Reports response times, scaling on number of requests
+def generate_mpegdash_report(resource, requests, avg_response_time, peak_response_time, time):
+    # Measurement
+    result = 'mpegdash_service '
+    # Tags
+    # None
+    # Fields
+    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(_getNSTime(time))
+    # print(result)
+    return result
+
+
+# Influx needs strings to be quoted, this provides a utility interface to do this
+def quote_wrap(str):
+    return "\"" + str + "\""
+
+
+# InfluxDB likes to have time-stamps in nanoseconds
+def _getNSTime(time):
+    # Convert to nano-seconds
+    return 1000000 * time
+
+# DEPRICATED
+# ____________________________________________________________________________
+
+# DEPRICATED: old structure, not part of new spec
 def _generateClientRequest(cReq, id, time):
     # Tags first
     result = 'sid="' + str(id) + '",' + cReq
@@ -19,6 +108,7 @@ def _generateClientRequest(cReq, id, time):
 
 
 # Method to create a full InfluxDB response statement
+# DEPRECATED: old structure, not part of new spec
 def _generateServerResponse(reqID, quality, time, cpuUsage, qualityDifference):
     # Tags first
     result = ' '
@@ -38,42 +128,8 @@ def _generateServerResponse(reqID, quality, time, cpuUsage, qualityDifference):
     return 'response' + result
 
 
-def _generateNetworkReport(sum_of_client_quality, time):
-    # Measurement
-    result = 'net_port_io'
-    # 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(_getNSTime(time))
-
-    # Measurement
-    # print('network'+result)
-    return result
-
-
-def _generateMpegDashReport(resource, quality, time):
-    # Measurement
-    result = 'mpegdash_service '
-    # Tags
-    #None
-    # 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(_getNSTime(time))
-    #print(result)
-    return result
-
 
+# Formats server config
 def _generateServerConfig(ID, location, cpu, mem, storage, time):
     # metric
     result = 'host_resource'
@@ -93,24 +149,8 @@ def _generateServerConfig(ID, location, cpu, mem, storage, time):
     return result
 
 
-def _generateVMConfig(state, cpu, mem, storage, time):
-    # metric
-    result = 'vm_res_alloc'
-    # Tags
-    result += ',vm_state=' + quote_wrap(state)
-    result += ' '
-    # Fields
-    result += 'cpu=' + str(cpu)
-    result += ',memory=' + quote_wrap(mem)
-    result += ',storage=' + quote_wrap(storage)
-
-    # Time
-    result += ' ' + str(_getNSTime(time))
-
-    print(result)
-    return result
-
 
+# Format port config
 def _configure_port(port_id, state, rate, time):
     # metric
     result = 'net_port_config '
@@ -126,6 +166,8 @@ def _configure_port(port_id, state, rate, time):
     print(result)
     return result
 
+
+# Format service function config
 def _configure_service_function(state, max_connected_clients):
     # measurement
     result = 'mpegdash_service_config'
@@ -137,33 +179,15 @@ def _configure_service_function(state, max_connected_clients):
 
     return result
 
-# Simulating telegraf reporting
-def generate_CPU_report(requests, time):
-    # Measurement
-    result = 'cpu'
-    # meta tag
-    # We are simulating the summed CPUs, individual CPUs would have cpu=cpuNumber instead
-    result += ',cpu="cpu-total"'
-    result += ' '
-    # field
-    system = randint(0, min(100, requests*5))
-    steal = randint(0, 100-system)
-    idle = 100-(system+steal)
-    result += 'usage_steal='+str(steal/100)
-    result += ',usage_system='+str(system/100)
-    result += ',usage_idle='+str(idle/100)
-    result += ' '
-    # Time
-    result += str(_getNSTime(time))
-    print(result)
-    return result
 
-def generate_mem_report(total_mem, time):
+
+# Reports memory usage, scaling on requests
+def generate_mem_report(requests, total_mem, time):
     # Measurement
     result = 'mem'
     result += ' '
     # field
-    used = randint(30, 80)
+    used = randint(0, min(100,5*requests))
     available = 100-used
     result += 'available_percent='+str(available)
     result += ',used_percent='+str(used)
@@ -174,6 +198,8 @@ def generate_mem_report(total_mem, time):
     print(result)
     return result
 
+
+# Formats compute node config
 def generate_compute_node_config(slice_id, location, node_id, cpus, mem, storage, time):
     # Measurement
     result = 'compute_node_config'
@@ -193,6 +219,8 @@ def generate_compute_node_config(slice_id, location, node_id, cpus, mem, storage
     print(result)
     return result
 
+
+# Formats network resource config
 def generate_network_resource_config(slice_id, network_id, bandwidth, time):
     # Measurement
     result = 'network_resource_config'
@@ -209,6 +237,8 @@ def generate_network_resource_config(slice_id, network_id, bandwidth, time):
     print(result)
     return result
 
+
+# Formats network interface config
 def generate_network_interface_config(slice_id, comp_node_id, port_id, rx_constraint, tx_constraint, time):
     # Measurement
     result = 'network_interface_config'
@@ -228,15 +258,37 @@ def generate_network_interface_config(slice_id, comp_node_id, port_id, rx_constr
     return result
 
 
+# Format SF instance config
+def generate_sf_instance_surrogate_config(loc, sfc, sfc_i, sf_package, sf_i, cpus, mem, storage, time):
+    # Measurement
+    result = 'sf_instance_surrogate_config'
+    # Meta Tag
+    result += ',location'+quote_wrap(loc)
+    result += ',sfc'+quote_wrap(sfc)
+    result += ',sfc_i'+quote_wrap(sfc_i)
+    result += ',sf_package'+quote_wrap(sf_package)
+    result += ',sf_i'+quote_wrap(sf_i)
+    result += ' '
+    # field
+    result += 'cpus='+str(cpus)
+    result += ',memory='+str(mem)
+    result += ',storage='+str(storage)
+    result += ' '
+    # Time
+    result += str(_getNSTime(time))
+    print(result)
+    return result
 
 
+# Formats context container as part of other line protocol generators
+def service_function_measurement(measurement, service_function_context):
+    result = measurement
+    result += ',sfc'+quote_wrap(service_function_context.sfc)
+    result += ',sfc_i'+quote_wrap(service_function_context.sfc_i)
+    result += ',sf_package'+quote_wrap(service_function_context.sf_package)
+    result += ',sf_i'+quote_wrap(service_function_context.sf_i)
+
+    return result
 
-# Influx needs strings to be quoted, this provides a utility interface to do this
-def quote_wrap(str):
-    return "\"" + str + "\""
 
 
-# InfluxDB likes to have time-stamps in nanoseconds
-def _getNSTime(time):
-    # Convert to nano-seconds
-    return 1000000 * time
diff --git a/src/mediaServiceSim/__pycache__/LineProtocolGenerator.cpython-36.pyc b/src/mediaServiceSim/__pycache__/LineProtocolGenerator.cpython-36.pyc
index e393358e419e0611903d1c5e4bcb264fabfcb884..b8bb4785ef85f853c379898f7b6b17715734a63b 100644
GIT binary patch
literal 6021
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

literal 4053
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
U%iHnxy`I-cyNCNt-1R*7e_-Bj@c;k-

diff --git a/src/mediaServiceSim/serviceSim.py b/src/mediaServiceSim/serviceSim.py
index 8ad5baa..2cdc993 100644
--- a/src/mediaServiceSim/serviceSim.py
+++ b/src/mediaServiceSim/serviceSim.py
@@ -102,8 +102,9 @@ class DemoClient(object):
         # Return the _partial_ InfluxDB statement (server will complete the rest)
         return result
 
+
 # Used to tell influx to launch or teardown a database (DB name overwritten by telegraf)
-class DatabaseManager():
+class DatabaseManager:
     def __init__(self, influx_url, db_name):
         self.influx_url = influx_url
         self.influx_db = db_name
@@ -126,8 +127,9 @@ class DatabaseManager():
         req = urllib.request.Request(self.influx_url + '/query ', query)
         urllib.request.urlopen(req)
 
+
 # Used to allocate clients to servers
-class ClientManager():
+class ClientManager:
     def __init__(self, servers):
         self.servers = servers
     def generate_new_clients(self, amount):
@@ -138,8 +140,9 @@ class ClientManager():
                     server.assign_client(DemoClient())
                     assigned_count += 1
 
+
 # Simulates nodes not connected directly to clients (e.g. telegraf)
-class Node():
+class Node:
     def __init__(self, influxurl, influxdb, input_cpu):
         self.influx_url = influxurl
         self.influx_db = influxdb
@@ -159,6 +162,8 @@ class Node():
         req = urllib.request.Request(self.influx_url + '/write?db=' + self.influx_db, data, header)
         urllib.request.urlopen(req)
 
+# Container for common SF tags, used as part of generating SF usage reports
+
 
 # DemoServer is the class that simulates the behaviour of the MPEG-DASH server
 class DemoServer(object):
@@ -203,7 +208,7 @@ class DemoServer(object):
             server_conf_block.append(lp._configure_port())
         self._sendInfluxDataBlock(server_conf_block)
 
-    def shutdown_VMs(self):
+    def shutdown_VM(self):
         print("Shutting down VM nodes")
         VM_conf_block = []
         self._generateVMS('stopping', 10, VM_conf_block)
-- 
GitLab