Added script for measuring impact of delay on OSM
[osm/vim-emu.git] / examples / performance_measurements / osm_component_increasing_delay.py
1 #!/usr/bin/env python2
2 # Copyright (c) 2019 Erik Schilling
3 # ALL RIGHTS RESERVED.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 import csv
17 import signal
18 import time
19
20 from emuvim.api.openstack.openstack_api_endpoint import OpenstackApiEndpoint
21 from emuvim.api.osm.kafka import Kafka
22 from emuvim.api.osm.lcm import LCM
23 from emuvim.api.osm.mongo import Mongo
24 from emuvim.api.osm.mysql import Mysql
25 from emuvim.api.osm.nbi import NBI
26 from emuvim.api.osm.ro import RO
27 from emuvim.api.osm.zookeeper import Zookeeper
28 from emuvim.dcemulator.net import DCNetwork
29 from mininet.link import TCLink
30 from mininet.log import setLogLevel
31
32 setLogLevel('debug')
33
34 MAX_MS_DELAY = 250
35 STEP = 10
36
37
38 class TimeoutException(Exception):
39 pass
40
41
42 def timeout_handler(signum, frame):
43 raise TimeoutException
44
45
46 signal.signal(signal.SIGALRM, timeout_handler)
47
48 with open('osm_component_increasing_delay_%d.csv' % time.time(), 'w') as csvfile:
49 fieldnames = ['delay', 'startup', 'deployment', 'deletion', 'failed', 'other',
50 'zookeeper', 'kafka', 'mongo', 'nbi', 'ro_db', 'ro', 'lcm',
51 'rtt_ro_db_ms', 'rtt_db_ro_ms']
52 writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
53 writer.writeheader()
54
55 for delay in range(0, MAX_MS_DELAY + 1, STEP):
56 start = time.time()
57 net = DCNetwork(monitor=False, enable_learning=True)
58 api = None
59 try:
60 signal.alarm(60 * 15)
61 dc1 = net.addDatacenter("dc1")
62 api = OpenstackApiEndpoint("0.0.0.0", 6001)
63 api.connect_datacenter(dc1)
64 api.connect_dc_network(net)
65
66 s1 = net.addSwitch('s1')
67
68 zookeeper_ip = '10.0.0.96'
69 kafka_ip = '10.0.0.97'
70 mongo_ip = '10.0.0.98'
71 nbi_ip = '10.0.0.99'
72 ro_db_ip = '10.0.0.100'
73 ro_ip = '10.0.0.101'
74 lcm_ip = '10.0.0.102'
75
76 d1 = net.addDocker('d1', dimage='ubuntu:trusty')
77
78 VERSION = 'releasefive-daily'
79
80 zookeeper = Zookeeper(net, zookeeper_ip)
81 kafka = Kafka(net, kafka_ip, zookeeper_ip)
82 mongo = Mongo(net, mongo_ip)
83 nbi = NBI(net, nbi_ip, mongo_ip, kafka_ip)
84 ro_db = Mysql(net, ro_db_ip)
85 ro = RO(net, ro_ip, ro_db_ip, version=VERSION)
86 lcm = LCM(net, lcm_ip, ro_ip, mongo_ip, kafka_ip)
87
88 net.addLink(d1, s1)
89 delay_string = '%dms' % delay
90 net.addLink(zookeeper.instance, s1, cls=TCLink, delay=delay_string)
91 net.addLink(kafka.instance, s1, cls=TCLink, delay=delay_string)
92 net.addLink(mongo.instance, s1, cls=TCLink, delay=delay_string)
93 net.addLink(nbi.instance, s1, cls=TCLink, delay=delay_string)
94 net.addLink(ro_db.instance, s1, cls=TCLink, delay=delay_string)
95 net.addLink(ro.instance, s1, cls=TCLink, delay=delay_string)
96 net.addLink(lcm.instance, s1, cls=TCLink, delay=delay_string)
97
98 net.start()
99 api.start()
100
101 other_end = time.time()
102 zookeeper.start()
103 zookeeper_started = time.time()
104 kafka.start()
105 kafka_started = time.time()
106 mongo.start()
107 mongo_started = time.time()
108 nbi.start()
109 nbi_started = time.time()
110 ro_db.start()
111 ro_db_started = time.time()
112 ro.start()
113 ro_started = time.time()
114 lcm.start()
115 lcm_started = time.time()
116
117 vim_id = nbi.register_emulated_api('vim-emu1', api)
118 nbi.onboard_vnfd('../vnfs/ping_vnf')
119 nbi.onboard_vnfd('../vnfs/pong_vnf')
120 nsd_id = nbi.onboard_nsd('../services/pingpong_ns')
121
122 start_done = time.time()
123 signal.alarm(0)
124
125 result = net.pingFull(hosts=[ro.instance, ro_db.instance])
126 rtt_ro_db = result[0][2][3]
127 rtt_db_ro = result[1][2][3]
128
129 deploy_start = time.time()
130
131 ns_id = nbi.ns_create('pingpong-test-%d' % delay, nsd_id, vim_id)
132
133 _, num_failed = nbi.ns_wait_until_all_in_status('running', 'failed')
134
135 deployment_done = time.time()
136
137 nbi.ns_delete(ns_id)
138
139 nbi.ns_wait_until_all_in_status('terminated')
140
141 ns_delete_done = time.time()
142
143 writer.writerow({
144 'delay': delay,
145 'other': other_end - start,
146 'zookeeper': zookeeper_started - other_end,
147 'kafka': kafka_started - zookeeper_started,
148 'mongo': mongo_started - kafka_started,
149 'nbi': nbi_started - mongo_started,
150 'ro_db': ro_db_started - nbi_started,
151 'ro': ro_started - ro_db_started,
152 'lcm': lcm_started - ro_started,
153 'startup': start_done - start,
154 'deployment': deployment_done - deploy_start,
155 'deletion': ns_delete_done - deployment_done,
156 'failed': num_failed,
157 'rtt_ro_db_ms': rtt_ro_db,
158 'rtt_db_ro_ms': rtt_db_ro,
159 })
160 csvfile.flush()
161 except Exception as e:
162 print('caught: %s' % e)
163 writer.writerow({
164 'delay': delay,
165 'other': None,
166 'zookeeper': None,
167 'kafka': None,
168 'mongo': None,
169 'nbi': None,
170 'ro_db': None,
171 'ro': None,
172 'lcm': None,
173 'startup': None,
174 'deployment': None,
175 'deletion': None,
176 'failed': None,
177 'rtt_ro_db_ms': None,
178 'rtt_db_ro_ms': None,
179 })
180 csvfile.flush()
181 finally:
182 net.stop()
183 api.stop()