add nick
[laas.git] / src / resource_inventory / tests / test_managers.py
1 ##############################################################################
2 # Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 from django.test import TestCase
11 from django.contrib.auth.models import User
12
13 from resource.inventory_manager import InventoryManager
14 from resource.resource_manager import ResourceManager, HostNameValidator
15 from account.models import Lab
16 from resource.models import (
17     Host,
18     Vlan,
19     Interface,
20     ResourceBundle,
21     GenericHost,
22     GenericResourceBundle,
23     CpuProfile,
24     RamProfile,
25     DiskProfile,
26     HostProfile,
27     InterfaceProfile
28 )
29
30
31 class InventoryManagerTestCase(TestCase):
32
33     def test_singleton(self):
34         instance = InventoryManager.getInstance()
35         self.assertTrue(isinstance(instance, InventoryManager))
36         self.assertTrue(instance is InventoryManager.getInstance())
37
38     def setUp(self):
39         # setup
40         # create lab and give it resources
41         user = User.objects.create(username="username")
42         self.lab = Lab.objects.create(
43             lab_user=user,
44             name='test lab',
45             contact_email='someone@email.com',
46             contact_phone='dont call me'
47         )
48
49         # create hostProfile
50         hostProfile = HostProfile.objects.create(
51             host_type=0,
52             name='Test profile',
53             description='a test profile'
54         )
55         InterfaceProfile.objects.create(
56             speed=1000,
57             name='eno3',
58             host=hostProfile
59         )
60         DiskProfile.objects.create(
61             size=1000,
62             media_type="SSD",
63             name='/dev/sda',
64             host=hostProfile
65         )
66         CpuProfile.objects.create(
67             cores=96,
68             architecture="x86_64",
69             cpus=2,
70             host=hostProfile
71         )
72         RamProfile.objects.create(
73             amount=256,
74             channels=4,
75             host=hostProfile
76         )
77
78         # create GenericResourceBundle
79         genericBundle = GenericResourceBundle.objects.create()
80
81         self.gHost1 = GenericHost.objects.create(
82             bundle=genericBundle,
83             name='generic host 1',
84             profile=hostProfile
85         )
86         self.gHost2 = GenericHost.objects.create(
87             bundle=genericBundle,
88             name='generic host 2',
89             profile=hostProfile
90         )
91
92         # actual resource bundle
93         bundle = ResourceBundle.objects.create(template=genericBundle)
94
95         self.host1 = Host.objects.create(
96             template=self.gHost1,
97             booked=True,
98             name='host1',
99             bundle=bundle,
100             profile=hostProfile,
101             lab=self.lab
102         )
103
104         self.host2 = Host.objects.create(
105             template=self.gHost2,
106             booked=True,
107             name='host2',
108             bundle=bundle,
109             profile=hostProfile,
110             lab=self.lab
111         )
112
113         vlan1 = Vlan.objects.create(vlan_id=300, tagged=False)
114         vlan2 = Vlan.objects.create(vlan_id=300, tagged=False)
115
116         Interface.objects.create(
117             mac_address='00:11:22:33:44:55',
118             bus_address='some bus address',
119             switch_name='switch1',
120             port_name='port10',
121             config=vlan1,
122             host=self.host1
123         )
124         Interface.objects.create(
125             mac_address='00:11:22:33:44:56',
126             bus_address='some bus address',
127             switch_name='switch1',
128             port_name='port12',
129             config=vlan2,
130             host=self.host2
131         )
132
133     def test_acquire_host(self):
134         host = InventoryManager.getInstance().acquireHost(self.gHost1, self.lab.name)
135         self.assertNotEquals(host, None)
136         self.assertTrue(host.booked)
137         self.assertEqual(host.template, self.gHost1)
138
139     def test_release_host(self):
140         host = InventoryManager.getInstance().acquireHost(self.gHost1, self.lab.name)
141         self.assertTrue(host.booked)
142         InventoryManager.getInstance().releaseHost(host)
143         self.assertFalse(host.booked)
144
145
146 class ResourceManagerTestCase(TestCase):
147     def test_singleton(self):
148         instance = ResourceManager.getInstance()
149         self.assertTrue(isinstance(instance, ResourceManager))
150         self.assertTrue(instance is ResourceManager.getInstance())
151
152     def setUp(self):
153         # setup
154         # create lab and give it resources
155         user = User.objects.create(username="username")
156         self.lab = Lab.objects.create(
157             lab_user=user,
158             name='test lab',
159             contact_email='someone@email.com',
160             contact_phone='dont call me'
161         )
162
163         # create hostProfile
164         hostProfile = HostProfile.objects.create(
165             host_type=0,
166             name='Test profile',
167             description='a test profile'
168         )
169         InterfaceProfile.objects.create(
170             speed=1000,
171             name='eno3',
172             host=hostProfile
173         )
174         DiskProfile.objects.create(
175             size=1000,
176             media_type="SSD",
177             name='/dev/sda',
178             host=hostProfile
179         )
180         CpuProfile.objects.create(
181             cores=96,
182             architecture="x86_64",
183             cpus=2,
184             host=hostProfile
185         )
186         RamProfile.objects.create(
187             amount=256,
188             channels=4,
189             host=hostProfile
190         )
191
192         # create GenericResourceBundle
193         genericBundle = GenericResourceBundle.objects.create()
194
195         self.gHost1 = GenericHost.objects.create(
196             bundle=genericBundle,
197             name='generic host 1',
198             profile=hostProfile
199         )
200         self.gHost2 = GenericHost.objects.create(
201             bundle=genericBundle,
202             name='generic host 2',
203             profile=hostProfile
204         )
205
206         # actual resource bundle
207         bundle = ResourceBundle.objects.create(template=genericBundle)
208
209         self.host1 = Host.objects.create(
210             template=self.gHost1,
211             booked=True,
212             name='host1',
213             bundle=bundle,
214             profile=hostProfile,
215             lab=self.lab
216         )
217
218         self.host2 = Host.objects.create(
219             template=self.gHost2,
220             booked=True,
221             name='host2',
222             bundle=bundle,
223             profile=hostProfile,
224             lab=self.lab
225         )
226
227         vlan1 = Vlan.objects.create(vlan_id=300, tagged=False)
228         vlan2 = Vlan.objects.create(vlan_id=300, tagged=False)
229
230         Interface.objects.create(
231             mac_address='00:11:22:33:44:55',
232             bus_address='some bus address',
233             switch_name='switch1',
234             port_name='port10',
235             config=vlan1,
236             host=self.host1
237         )
238         Interface.objects.create(
239             mac_address='00:11:22:33:44:56',
240             bus_address='some bus address',
241             switch_name='switch1',
242             port_name='port12',
243             config=vlan2,
244             host=self.host2
245         )
246
247     def test_convert_bundle(self):
248         ResourceManager.getInstance().convertResoureBundle(self.genericBundle, self.lab.name)
249         # verify bundle configuration
250
251
252 class HostNameValidatorTestCase(TestCase):
253
254     def test_valid_hostnames(self):
255         self.assertTrue(HostNameValidator.is_valid_hostname("localhost"))
256         self.assertTrue(HostNameValidator.is_valid_hostname("Localhost"))
257         self.assertTrue(HostNameValidator.is_valid_hostname("localHost"))
258         self.assertTrue(HostNameValidator.is_valid_hostname("LOCALHOST"))
259         self.assertTrue(HostNameValidator.is_valid_hostname("f"))
260         self.assertTrue(HostNameValidator.is_valid_hostname("abc123doreyme"))
261         self.assertTrue(HostNameValidator.is_valid_hostname("F9999999"))
262         self.assertTrue(HostNameValidator.is_valid_hostname("my-host"))
263         self.assertTrue(HostNameValidator.is_valid_hostname("My-Host"))
264         self.assertTrue(HostNameValidator.is_valid_hostname("MY-HOST"))
265         self.assertTrue(HostNameValidator.is_valid_hostname("a-long-name-for-my-host"))
266
267     def test_invalid_hostnames(self):
268         self.assertFalse(HostNameValidator.is_valid_hostname("-long-name-for-my-host"))
269         self.assertFalse(HostNameValidator.is_valid_hostname("546"))
270         self.assertFalse(HostNameValidator.is_valid_hostname("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))
271
272     def test_invalid_chars(self):
273         self.assertFalse(HostNameValidator.is_valid_hostname("contains!char"))
274         self.assertFalse(HostNameValidator.is_valid_hostname("contains@char"))
275         self.assertFalse(HostNameValidator.is_valid_hostname("contains#char"))
276         self.assertFalse(HostNameValidator.is_valid_hostname("contains$char"))
277         self.assertFalse(HostNameValidator.is_valid_hostname("contains%char"))
278         self.assertFalse(HostNameValidator.is_valid_hostname("contains^char"))
279         self.assertFalse(HostNameValidator.is_valid_hostname("contains&char"))
280         self.assertFalse(HostNameValidator.is_valid_hostname("contains*char"))
281         self.assertFalse(HostNameValidator.is_valid_hostname("contains(char"))
282         self.assertFalse(HostNameValidator.is_valid_hostname("contains)char"))
283         self.assertFalse(HostNameValidator.is_valid_hostname("contains_char"))
284         self.assertFalse(HostNameValidator.is_valid_hostname("contains=char"))
285         self.assertFalse(HostNameValidator.is_valid_hostname("contains+char"))
286         self.assertFalse(HostNameValidator.is_valid_hostname("contains|char"))
287         self.assertFalse(HostNameValidator.is_valid_hostname("contains\\char"))
288         self.assertFalse(HostNameValidator.is_valid_hostname("contains[char"))
289         self.assertFalse(HostNameValidator.is_valid_hostname("contains]char"))
290         self.assertFalse(HostNameValidator.is_valid_hostname("contains;char"))
291         self.assertFalse(HostNameValidator.is_valid_hostname("contains:char"))
292         self.assertFalse(HostNameValidator.is_valid_hostname("contains'char"))
293         self.assertFalse(HostNameValidator.is_valid_hostname('contains"char'))
294         self.assertFalse(HostNameValidator.is_valid_hostname("contains'char"))
295         self.assertFalse(HostNameValidator.is_valid_hostname("contains<char"))
296         self.assertFalse(HostNameValidator.is_valid_hostname("contains>char"))
297         self.assertFalse(HostNameValidator.is_valid_hostname("contains,char"))
298         self.assertFalse(HostNameValidator.is_valid_hostname("contains?char"))
299         self.assertFalse(HostNameValidator.is_valid_hostname("contains/char"))
300         self.assertFalse(HostNameValidator.is_valid_hostname("contains`char"))
301         self.assertFalse(HostNameValidator.is_valid_hostname("contains~char"))