blob: 9b1a3ec423c18c43a738ed14781534d6606b5277 [file] [log] [blame]
peusterm43485a22016-03-14 11:18:37 +01001import time
peusterm5c6475c2016-03-13 12:54:11 +01002from emuvim.test.base import SimpleTestTopology
peusterm43485a22016-03-14 11:18:37 +01003from emuvim.dcemulator.resourcemodel import BaseResourceModel, ResourceFlavor
peusterm279565d2016-03-19 10:36:52 +01004from emuvim.dcemulator.resourcemodel.upb.simple import UpbSimpleCloudDcRM
5from emuvim.dcemulator.resourcemodel import ResourceModelRegistrar
peusterm5c6475c2016-03-13 12:54:11 +01006
7
8class testResourceModel(SimpleTestTopology):
peustermbdcf2d22016-03-25 12:14:15 +01009 """
10 Test the general resource model API and functionality.
11 """
peusterm5c6475c2016-03-13 12:54:11 +010012
13 def testBaseResourceModelApi(self):
peustermbdcf2d22016-03-25 12:14:15 +010014 """
15 Tast bare API without real resource madel.
16 :return:
17 """
peusterm43485a22016-03-14 11:18:37 +010018 r = BaseResourceModel()
19 # check if default flavors are there
peustermbdcf2d22016-03-25 12:14:15 +010020 self.assertTrue(len(r._flavors) == 5)
peusterm43485a22016-03-14 11:18:37 +010021 # check addFlavor functionality
22 f = ResourceFlavor("test", {"testmetric": 42})
23 r.addFlavour(f)
peustermbdcf2d22016-03-25 12:14:15 +010024 self.assertTrue("test" in r._flavors)
25 self.assertTrue(r._flavors.get("test").get("testmetric") == 42)
peusterm43485a22016-03-14 11:18:37 +010026 # test if allocate and free runs through
peustermbdcf2d22016-03-25 12:14:15 +010027 self.assertTrue(len(r.allocate("testc", "tiny")) == 3) # expected: 3tuple
28 self.assertTrue(r.free("testc"))
peusterm5c6475c2016-03-13 12:54:11 +010029
30 def testAddRmToDc(self):
peustermbdcf2d22016-03-25 12:14:15 +010031 """
32 Test is allocate/free is called when a RM is added to a DC.
33 :return:
34 """
peusterm5c6475c2016-03-13 12:54:11 +010035 # create network
36 self.createNet(nswitches=0, ndatacenter=1, nhosts=2, ndockers=0)
37 # setup links
38 self.net.addLink(self.dc[0], self.h[0])
39 self.net.addLink(self.h[1], self.dc[0])
40 # add resource model
41 r = BaseResourceModel()
42 self.dc[0].assignResourceModel(r)
43 # start Mininet network
44 self.startNet()
45 # check number of running nodes
peustermbdcf2d22016-03-25 12:14:15 +010046 self.assertTrue(len(self.getDockernetContainers()) == 0)
47 self.assertTrue(len(self.net.hosts) == 2)
48 self.assertTrue(len(self.net.switches) == 1)
peusterm5c6475c2016-03-13 12:54:11 +010049 # check resource model and resource model registrar
peustermbdcf2d22016-03-25 12:14:15 +010050 self.assertTrue(self.dc[0]._resource_model is not None)
51 self.assertTrue(len(self.net.rm_registrar.resource_models) == 1)
peusterm43485a22016-03-14 11:18:37 +010052
53 # check if alloc was called during startCompute
peustermbdcf2d22016-03-25 12:14:15 +010054 self.assertTrue(len(r.allocated_compute_instances) == 0)
peusterm43485a22016-03-14 11:18:37 +010055 self.dc[0].startCompute("tc1")
56 time.sleep(1)
peustermbdcf2d22016-03-25 12:14:15 +010057 self.assertTrue(len(r.allocated_compute_instances) == 1)
peusterm43485a22016-03-14 11:18:37 +010058 # check if free was called during stopCompute
59 self.dc[0].stopCompute("tc1")
peustermbdcf2d22016-03-25 12:14:15 +010060 self.assertTrue(len(r.allocated_compute_instances) == 0)
peusterm5c6475c2016-03-13 12:54:11 +010061 # check connectivity by using ping
peustermbdcf2d22016-03-25 12:14:15 +010062 self.assertTrue(self.net.ping([self.h[0], self.h[1]]) <= 0.0)
peusterm5c6475c2016-03-13 12:54:11 +010063 # stop Mininet network
64 self.stopNet()
peusterm279565d2016-03-19 10:36:52 +010065
66
67class testUpbSimpleCloudDcRM(SimpleTestTopology):
68 """
69 Test the UpbSimpleCloudDc resource model.
70 """
peustermbdcf2d22016-03-25 12:14:15 +010071
peusterm279565d2016-03-19 10:36:52 +010072 def testAllocation(self):
peustermbdcf2d22016-03-25 12:14:15 +010073 """
74 Test the allocation procedures and correct calculations.
75 :return:
76 """
peusterm279565d2016-03-19 10:36:52 +010077 # config
78 E_CPU = 1.0
79 MAX_CU = 100
80 # create dummy resource model environment
81 reg = ResourceModelRegistrar(dc_emulation_max_cpu=1.0)
82 rm = UpbSimpleCloudDcRM(max_cu=100, max_mu=100)
83 reg.register("test_dc", rm)
84
85 res = rm.allocate("c1", "tiny") # calculate allocation
peustermbdcf2d22016-03-25 12:14:15 +010086 self.assertTrue(res[0] == E_CPU / MAX_CU * 1) # validate compute result
87 self.assertTrue(res[1] < 0) # validate memory result
88 self.assertTrue(res[2] < 0) # validate disk result
peusterm279565d2016-03-19 10:36:52 +010089
90 res = rm.allocate("c2", "small") # calculate allocation
peustermbdcf2d22016-03-25 12:14:15 +010091 self.assertTrue(res[0] == E_CPU / MAX_CU * 4) # validate compute result
92 self.assertTrue(res[1] < 0) # validate memory result
93 self.assertTrue(res[2] < 0) # validate disk result
peusterm279565d2016-03-19 10:36:52 +010094
95 res = rm.allocate("c3", "medium") # calculate allocation
peustermbdcf2d22016-03-25 12:14:15 +010096 self.assertTrue(res[0] == E_CPU / MAX_CU * 8) # validate compute result
97 self.assertTrue(res[1] < 0) # validate memory result
98 self.assertTrue(res[2] < 0) # validate disk result
peusterm279565d2016-03-19 10:36:52 +010099
100 res = rm.allocate("c4", "large") # calculate allocation
peustermbdcf2d22016-03-25 12:14:15 +0100101 self.assertTrue(res[0] == E_CPU / MAX_CU * 16) # validate compute result
102 self.assertTrue(res[1] < 0) # validate memory result
103 self.assertTrue(res[2] < 0) # validate disk result
peusterm279565d2016-03-19 10:36:52 +0100104
105 res = rm.allocate("c5", "xlarge") # calculate allocation
peustermbdcf2d22016-03-25 12:14:15 +0100106 self.assertTrue(res[0] == E_CPU / MAX_CU * 32) # validate compute result
107 self.assertTrue(res[1] < 0) # validate memory result
108 self.assertTrue(res[2] < 0) # validate disk result
peusterm279565d2016-03-19 10:36:52 +0100109
110 # test over provisioning exeption
111 exception = False
112 try:
113 rm.allocate("c6", "xlarge") # calculate allocation
114 rm.allocate("c7", "xlarge") # calculate allocation
115 rm.allocate("c8", "xlarge") # calculate allocation
116 rm.allocate("c9", "xlarge") # calculate allocation
117 except Exception as e:
peustermbdcf2d22016-03-25 12:14:15 +0100118 self.assertTrue("Not enough compute" in e.message)
peusterm279565d2016-03-19 10:36:52 +0100119 exception = True
peustermbdcf2d22016-03-25 12:14:15 +0100120 self.assertTrue(exception)
peusterm279565d2016-03-19 10:36:52 +0100121
122 def testFree(self):
peustermbdcf2d22016-03-25 12:14:15 +0100123 """
124 Test the free procedure.
125 :return:
126 """
peusterm279565d2016-03-19 10:36:52 +0100127 # config
128 E_CPU = 1.0
129 MAX_CU = 100
130 # create dummy resource model environment
131 reg = ResourceModelRegistrar(dc_emulation_max_cpu=1.0)
132 rm = UpbSimpleCloudDcRM(max_cu=100, max_mu=100)
133 reg.register("test_dc", rm)
134 rm.allocate("c1", "tiny") # calculate allocation
peustermbdcf2d22016-03-25 12:14:15 +0100135 self.assertTrue(rm.dc_alloc_cu == 1)
peusterm279565d2016-03-19 10:36:52 +0100136 rm.free("c1")
peustermbdcf2d22016-03-25 12:14:15 +0100137 self.assertTrue(rm.dc_alloc_cu == 0)
138
139 def testInRealTopo(self):
140 """
141 Start a real container and check if limitations are really passed down to Dockernet.
142 :return:
143 """
144 # create network
145 self.createNet(nswitches=0, ndatacenter=1, nhosts=2, ndockers=0)
146 # setup links
147 self.net.addLink(self.dc[0], self.h[0])
148 self.net.addLink(self.h[1], self.dc[0])
149 # add resource model
150 r = UpbSimpleCloudDcRM(max_cu=100, max_mu=100)
151 self.dc[0].assignResourceModel(r)
152 # start Mininet network
153 self.startNet()
154 # check number of running nodes
155 self.assertTrue(len(self.getDockernetContainers()) == 0)
156 self.assertTrue(len(self.net.hosts) == 2)
157 self.assertTrue(len(self.net.switches) == 1)
158 # check resource model and resource model registrar
159 self.assertTrue(self.dc[0]._resource_model is not None)
160 self.assertTrue(len(self.net.rm_registrar.resource_models) == 1)
161
162 # check if alloc was called during startCompute
163 self.assertTrue(len(r.allocated_compute_instances) == 0)
164 tc1 = self.dc[0].startCompute("tc1", flavor_name="tiny")
165 time.sleep(1)
166 self.assertTrue(len(r.allocated_compute_instances) == 1)
167
168 # check if there is a real limitation set for containers cgroup
169 self.assertEqual(tc1.cpu_period/tc1.cpu_quota, 100)
170
171 # check if free was called during stopCompute
172 self.dc[0].stopCompute("tc1")
173 self.assertTrue(len(r.allocated_compute_instances) == 0)
174 # check connectivity by using ping
175 self.assertTrue(self.net.ping([self.h[0], self.h[1]]) <= 0.0)
176 # stop Mininet network
177 self.stopNet()
peusterm279565d2016-03-19 10:36:52 +0100178
179
180