1
# Copyright 2012 Nebula, Inc.
3
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4
# not use this file except in compliance with the License. You may obtain
5
# a copy of the License at
7
# http://www.apache.org/licenses/LICENSE-2.0
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
# License for the specific language governing permissions and limitations
18
from novaclient.v1_1 import aggregates
19
from novaclient.v1_1 import availability_zones
20
from novaclient.v1_1 import certs
21
from novaclient.v1_1 import flavor_access
22
from novaclient.v1_1 import flavors
23
from novaclient.v1_1 import floating_ips
24
from novaclient.v1_1 import hosts
25
from novaclient.v1_1 import hypervisors
26
from novaclient.v1_1 import keypairs
27
from novaclient.v1_1 import quotas
28
from novaclient.v1_1 import security_group_rules as rules
29
from novaclient.v1_1 import security_groups as sec_groups
30
from novaclient.v1_1 import servers
31
from novaclient.v1_1 import services
32
from novaclient.v1_1 import usage
33
from novaclient.v1_1 import volume_snapshots as vol_snaps
34
from novaclient.v1_1 import volume_types
35
from novaclient.v1_1 import volumes
37
from openstack_dashboard.api import base
38
from openstack_dashboard.api import nova
39
from openstack_dashboard.usage import quotas as usage_quotas
41
from openstack_dashboard.test.test_data import utils
47
"OS-EXT-SRV-ATTR:instance_name": "instance-00000005",
48
"OS-EXT-SRV-ATTR:host": "instance-host",
49
"OS-EXT-STS:task_state": null,
60
"href": "%(host)s/v1.1/%(tenant_id)s/servers/%(server_id)s",
64
"href": "%(host)s/%(tenant_id)s/servers/%(server_id)s",
72
"href": "%(host)s/%(tenant_id)s/images/%(image_id)s",
77
"OS-EXT-STS:vm_state": "active",
79
"id": "%(flavor_id)s",
82
"href": "%(host)s/%(tenant_id)s/flavors/%(flavor_id)s",
87
"id": "%(server_id)s",
88
"user_id": "%(user_id)s",
89
"OS-DCF:diskConfig": "MANUAL",
93
"OS-EXT-STS:power_state": 1,
95
"status": "%(status)s",
96
"updated": "2012-02-28T19:51:27Z",
97
"hostId": "c461ea283faa0ab5d777073c93b126c68139e4e45934d4fc37e403c2",
98
"key_name": "%(key_name)s",
100
"created": "2012-02-28T19:51:17Z",
101
"tenant_id": "%(tenant_id)s",
102
"metadata": {"someMetaLabel": "someMetaData",
103
"some<b>html</b>label": "<!--",
112
"total_memory_mb_usage": 64246.89777777778,
113
"total_vcpus_usage": 125.48222222222223,
114
"total_hours": 125.48222222222223,
115
"total_local_gb_usage": 0,
116
"tenant_id": "%(tenant_id)s",
117
"stop": "2012-01-31 23:59:59",
118
"start": "2012-01-01 00:00:00",
121
"memory_mb": %(flavor_ram)s,
123
"started_at": "2012-01-26 20:38:21",
125
"name": "%(instance_name)s",
126
"tenant_id": "%(tenant_id)s",
128
"hours": 122.87361111111112,
129
"vcpus": %(flavor_vcpus)s,
130
"flavor": "%(flavor_name)s",
131
"local_gb": %(flavor_disk)s
134
"memory_mb": %(flavor_ram)s,
136
"started_at": "2012-01-31 20:54:15",
138
"name": "%(instance_name)s",
139
"tenant_id": "%(tenant_id)s",
141
"hours": 2.608611111111111,
142
"vcpus": %(flavor_vcpus)s,
143
"flavor": "%(flavor_name)s",
144
"local_gb": %(flavor_disk)s
152
TEST.servers = utils.TestDataContainer()
153
TEST.flavors = utils.TestDataContainer()
154
TEST.flavor_access = utils.TestDataContainer()
155
TEST.keypairs = utils.TestDataContainer()
156
TEST.security_groups = utils.TestDataContainer()
157
TEST.security_groups_uuid = utils.TestDataContainer()
158
TEST.security_group_rules = utils.TestDataContainer()
159
TEST.security_group_rules_uuid = utils.TestDataContainer()
160
TEST.volumes = utils.TestDataContainer()
161
TEST.quotas = utils.TestDataContainer()
162
TEST.quota_usages = utils.TestDataContainer()
163
TEST.disabled_quotas = utils.TestDataContainer()
164
TEST.floating_ips = utils.TestDataContainer()
165
TEST.floating_ips_uuid = utils.TestDataContainer()
166
TEST.usages = utils.TestDataContainer()
167
TEST.certs = utils.TestDataContainer()
168
TEST.volume_snapshots = utils.TestDataContainer()
169
TEST.volume_types = utils.TestDataContainer()
170
TEST.availability_zones = utils.TestDataContainer()
171
TEST.hypervisors = utils.TestDataContainer()
172
TEST.services = utils.TestDataContainer()
173
TEST.aggregates = utils.TestDataContainer()
174
TEST.hosts = utils.TestDataContainer()
176
# Data return by novaclient.
177
# It is used if API layer does data conversion.
178
TEST.api_floating_ips = utils.TestDataContainer()
179
TEST.api_floating_ips_uuid = utils.TestDataContainer()
182
volume = volumes.Volume(volumes.VolumeManager(None),
183
dict(id="41023e92-8008-4c8b-8059-7f2293ff3775",
187
display_name='Volume name',
188
created_at='2012-04-01 10:30:00',
191
nameless_volume = volumes.Volume(volumes.VolumeManager(None),
192
dict(id="3b189ac8-9166-ac7f-90c9-16c8bf9e01ac",
197
display_description='',
199
created_at='2010-11-21 18:34:25',
200
volume_type='vol_type_1',
201
attachments=[{"id": "1", "server_id": '1',
202
"device": "/dev/hda"}]))
203
attached_volume = volumes.Volume(volumes.VolumeManager(None),
204
dict(id="8cba67c1-2741-6c79-5ab6-9c2bf8c96ab0",
208
display_name='My Volume',
209
display_description='',
211
created_at='2011-05-01 11:54:33',
212
volume_type='vol_type_2',
213
attachments=[{"id": "2", "server_id": '1',
214
"device": "/dev/hdk"}]))
215
TEST.volumes.add(volume)
216
TEST.volumes.add(nameless_volume)
217
TEST.volumes.add(attached_volume)
219
vol_type1 = volume_types.VolumeType(volume_types.VolumeTypeManager(None),
221
'name': 'vol_type_1'})
222
vol_type2 = volume_types.VolumeType(volume_types.VolumeTypeManager(None),
224
'name': 'vol_type_2'})
225
TEST.volume_types.add(vol_type1, vol_type2)
228
flavor_1 = flavors.Flavor(flavors.FlavorManager(None),
229
{'id': "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
236
'os-flavor-access:is_public': True,
237
'OS-FLV-EXT-DATA:ephemeral': 0})
238
flavor_2 = flavors.Flavor(flavors.FlavorManager(None),
239
{'id': "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
240
'name': 'm1.massive',
245
'extra_specs': {'Trusted': True, 'foo': 'bar'},
246
'os-flavor-access:is_public': True,
247
'OS-FLV-EXT-DATA:ephemeral': 2048})
248
flavor_3 = flavors.Flavor(flavors.FlavorManager(None),
249
{'id': "dddddddd-dddd-dddd-dddd-dddddddddddd",
256
'os-flavor-access:is_public': False,
257
'OS-FLV-EXT-DATA:ephemeral': 2048})
258
TEST.flavors.add(flavor_1, flavor_2, flavor_3)
260
flavor_access_manager = flavor_access.FlavorAccessManager(None)
261
flavor_access_1 = flavor_access.FlavorAccess(flavor_access_manager,
263
"flavor_id": "dddddddd-dddd-dddd-dddd-dddddddddddd"})
264
flavor_access_2 = flavor_access.FlavorAccess(flavor_access_manager,
266
"flavor_id": "dddddddd-dddd-dddd-dddd-dddddddddddd"})
267
TEST.flavor_access.add(flavor_access_1, flavor_access_2)
270
keypair = keypairs.Keypair(keypairs.KeypairManager(None),
271
dict(name='keyName'))
272
TEST.keypairs.add(keypair)
274
# Security Groups and Rules
275
def generate_security_groups(is_uuid=False):
278
global current_int_id
280
return str(uuid.uuid4())
282
get_id.current_int_id += 1
283
return get_id.current_int_id
285
get_id.current_int_id = 0
287
sg_manager = sec_groups.SecurityGroupManager(None)
288
rule_manager = rules.SecurityGroupRuleManager(None)
290
sec_group_1 = sec_groups.SecurityGroup(sg_manager,
292
"tenant_id": TEST.tenant.id,
293
"id": get_id(is_uuid),
295
"description": u"default"})
296
sec_group_2 = sec_groups.SecurityGroup(sg_manager,
298
"tenant_id": TEST.tenant.id,
299
"id": get_id(is_uuid),
300
"name": u"other_group",
301
"description": u"NotDefault."})
302
sec_group_3 = sec_groups.SecurityGroup(sg_manager,
304
"tenant_id": TEST.tenant.id,
305
"id": get_id(is_uuid),
306
"name": u"another_group",
307
"description": u"NotDefault."})
309
rule = {'id': get_id(is_uuid),
311
'ip_protocol': u"tcp",
314
'parent_group_id': sec_group_1.id,
315
'ip_range': {'cidr': u"0.0.0.0/32"}}
317
icmp_rule = {'id': get_id(is_uuid),
319
'ip_protocol': u"icmp",
322
'parent_group_id': sec_group_1.id,
323
'ip_range': {'cidr': u"0.0.0.0/32"}}
325
group_rule = {'id': 3,
327
'ip_protocol': u"tcp",
330
'parent_group_id': sec_group_1.id,
331
'source_group_id': sec_group_1.id}
333
rule_obj = rules.SecurityGroupRule(rule_manager, rule)
334
rule_obj2 = rules.SecurityGroupRule(rule_manager, icmp_rule)
335
rule_obj3 = rules.SecurityGroupRule(rule_manager, group_rule)
337
sec_group_1.rules = [rule_obj]
338
sec_group_2.rules = [rule_obj]
340
return {"rules": [rule_obj, rule_obj2, rule_obj3],
341
"groups": [sec_group_1, sec_group_2, sec_group_3]}
343
sg_data = generate_security_groups()
344
TEST.security_group_rules.add(*sg_data["rules"])
345
TEST.security_groups.add(*sg_data["groups"])
347
sg_uuid_data = generate_security_groups(is_uuid=True)
348
TEST.security_group_rules_uuid.add(*sg_uuid_data["rules"])
349
TEST.security_groups_uuid.add(*sg_uuid_data["groups"])
352
quota_data = dict(metadata_items='1',
353
injected_file_content_bytes='1',
362
security_groups='10',
363
security_group_rules='20')
364
quota = quotas.QuotaSet(quotas.QuotaSetManager(None), quota_data)
365
TEST.quotas.nova = base.QuotaSet(quota)
366
TEST.quotas.add(base.QuotaSet(quota))
368
# nova quotas disabled when neutron is enabled
369
disabled_quotas_nova = ['floating_ips', 'fixed_ips',
370
'security_groups', 'security_group_rules']
371
TEST.disabled_quotas.add(disabled_quotas_nova)
374
quota_usage_data = {'gigabytes': {'used': 0,
376
'instances': {'used': 0,
382
'floating_ips': {'used': 0,
384
'volumes': {'used': 0,
386
quota_usage = usage_quotas.QuotaUsage()
387
for k, v in quota_usage_data.items():
388
quota_usage.add_quota(base.Quota(k, v['quota']))
389
quota_usage.tally(k, v['used'])
391
TEST.quota_usages.add(quota_usage)
394
limits = {"absolute": {"maxImageMeta": 128,
396
"maxPersonalitySize": 10240,
397
"maxSecurityGroupRules": 20,
398
"maxSecurityGroups": 10,
399
"maxServerMeta": 128,
401
"maxTotalFloatingIps": 10,
402
"maxTotalInstances": 10,
403
"maxTotalKeypairs": 100,
404
"maxTotalRAMSize": 10000,
406
"totalInstancesUsed": 0,
407
"totalKeyPairsUsed": 0,
409
"totalSecurityGroupsUsed": 0}}
413
tenant3 = TEST.tenants.list()[2]
415
vals = {"host": "http://nova.example.com:8774",
418
"tenant_id": TEST.tenants.first().id,
419
"user_id": TEST.user.id,
421
"flavor_id": flavor_1.id,
422
"image_id": TEST.images.first().id,
423
"key_name": keypair.name}
424
server_1 = servers.Server(servers.ServerManager(None),
425
json.loads(SERVER_DATA % vals)['server'])
426
vals.update({"name": "server_2",
429
server_2 = servers.Server(servers.ServerManager(None),
430
json.loads(SERVER_DATA % vals)['server'])
431
vals.update({"name": u'\u4e91\u89c4\u5219',
433
"tenant_id": tenant3.id,
435
server_3 = servers.Server(servers.ServerManager(None),
436
json.loads(SERVER_DATA % vals)['server'])
437
TEST.servers.add(server_1, server_2, server_3)
440
console = {u'console': {u'url': u'http://example.com:6080/vnc_auto.html',
442
TEST.servers.vnc_console_data = console
444
console = {u'console': {u'url': u'http://example.com:6080/spice_auto.html',
446
TEST.servers.spice_console_data = console
448
console = {u'console': {u'url': u'http://example.com:6080/rdp_auto.html',
450
TEST.servers.rdp_console_data = console
453
def generate_fip(conf):
454
return floating_ips.FloatingIP(floating_ips.FloatingIPManager(None),
458
'fixed_ip': '10.0.0.4',
459
'instance_id': server_1.id,
467
TEST.api_floating_ips.add(generate_fip(fip_1), generate_fip(fip_2))
469
TEST.floating_ips.add(nova.FloatingIp(generate_fip(fip_1)),
470
nova.FloatingIp(generate_fip(fip_2)))
472
# Floating IP with UUID id (for Floating IP with Neutron Proxy)
473
fip_3 = {'id': str(uuid.uuid4()),
474
'fixed_ip': '10.0.0.4',
475
'instance_id': server_1.id,
478
fip_4 = {'id': str(uuid.uuid4()),
483
TEST.api_floating_ips_uuid.add(generate_fip(fip_3), generate_fip(fip_4))
485
TEST.floating_ips_uuid.add(nova.FloatingIp(generate_fip(fip_3)),
486
nova.FloatingIp(generate_fip(fip_4)))
489
usage_vals = {"tenant_id": TEST.tenant.id,
490
"instance_name": server_1.name,
491
"flavor_name": flavor_1.name,
492
"flavor_vcpus": flavor_1.vcpus,
493
"flavor_disk": flavor_1.disk,
494
"flavor_ram": flavor_1.ram}
495
usage_obj = usage.Usage(usage.UsageManager(None),
496
json.loads(USAGE_DATA % usage_vals))
497
TEST.usages.add(usage_obj)
499
usage_2_vals = {"tenant_id": tenant3.id,
500
"instance_name": server_3.name,
501
"flavor_name": flavor_1.name,
502
"flavor_vcpus": flavor_1.vcpus,
503
"flavor_disk": flavor_1.disk,
504
"flavor_ram": flavor_1.ram}
505
usage_obj_2 = usage.Usage(usage.UsageManager(None),
506
json.loads(USAGE_DATA % usage_2_vals))
507
TEST.usages.add(usage_obj_2)
509
volume_snapshot = vol_snaps.Snapshot(vol_snaps.SnapshotManager(None),
510
{'id': '40f3fabf-3613-4f5e-90e5-6c9a08333fc3',
511
'display_name': 'test snapshot',
512
'display_description': 'vol snap!',
514
'status': 'available',
515
'volume_id': '41023e92-8008-4c8b-8059-7f2293ff3775'})
516
volume_snapshot2 = vol_snaps.Snapshot(vol_snaps.SnapshotManager(None),
517
{'id': 'a374cbb8-3f99-4c3f-a2ef-3edbec842e31',
519
'display_description': 'vol snap 2!',
521
'status': 'available',
522
'volume_id': '3b189ac8-9166-ac7f-90c9-16c8bf9e01ac'})
523
TEST.volume_snapshots.add(volume_snapshot)
524
TEST.volume_snapshots.add(volume_snapshot2)
526
cert_data = {'private_key': 'private',
527
'data': 'certificate_data'}
528
certificate = certs.Certificate(certs.CertificateManager(None), cert_data)
529
TEST.certs.add(certificate)
532
TEST.availability_zones.add(
533
availability_zones.AvailabilityZone(
534
availability_zones.AvailabilityZoneManager(None),
537
'zoneState': {'available': True},
551
hypervisor_1 = hypervisors.Hypervisor(hypervisors.HypervisorManager(None),
553
"service": {"host": "devstack001", "id": 3},
555
"hypervisor_type": "QEMU",
557
"hypervisor_hostname": "devstack001",
558
"memory_mb_used": 1500,
560
"current_workload": 0,
562
"cpu_info": '{"vendor": "Intel", "model": "core2duo",'
563
'"arch": "x86_64", "features": ["lahf_lm"'
564
', "rdtscp"], "topology": {"cores": 1, "t'
565
'hreads": 1, "sockets": 1}}',
568
"hypervisor_version": 1002000,
569
"disk_available_least": 6,
576
hypervisor_2 = hypervisors.Hypervisor(hypervisors.HypervisorManager(None),
578
"service": {"host": "devstack002", "id": 4},
580
"hypervisor_type": "QEMU",
582
"hypervisor_hostname": "devstack002",
583
"memory_mb_used": 1500,
585
"current_workload": 0,
587
"cpu_info": '{"vendor": "Intel", "model": "core2duo",'
588
'"arch": "x86_64", "features": ["lahf_lm"'
589
', "rdtscp"], "topology": {"cores": 1, "t'
590
'hreads": 1, "sockets": 1}}',
593
"hypervisor_version": 1002000,
594
"disk_available_least": 6,
600
hypervisor_3 = hypervisors.Hypervisor(hypervisors.HypervisorManager(None),
602
"service": {"host": "instance-host", "id": 5},
604
"hypervisor_type": "QEMU",
606
"hypervisor_hostname": "devstack003",
607
"memory_mb_used": 1500,
609
"current_workload": 0,
611
"cpu_info": '{"vendor": "Intel", "model": "core2duo",'
612
'"arch": "x86_64", "features": ["lahf_lm"'
613
', "rdtscp"], "topology": {"cores": 1, "t'
614
'hreads": 1, "sockets": 1}}',
617
"hypervisor_version": 1002000,
618
"disk_available_least": 6,
624
TEST.hypervisors.add(hypervisor_1)
625
TEST.hypervisors.add(hypervisor_2)
626
TEST.hypervisors.add(hypervisor_3)
628
TEST.hypervisors.stats = {
629
"hypervisor_statistics": {
634
"current_workload": 0,
637
"free_disk_gb": 12548,
638
"disk_available_least": 12556,
640
"free_ram_mb": 428014,
641
"memory_mb_used": 55296
646
service_1 = services.Service(services.ServiceManager(None),
649
"binary": "nova-conductor",
652
"updated_at": "2013-07-08T05:21:00.000000",
653
"host": "devstack001",
654
"disabled_reason": None
658
service_2 = services.Service(services.ServiceManager(None),
661
"binary": "nova-compute",
664
"updated_at": "2013-07-08T05:20:51.000000",
665
"host": "devstack001",
666
"disabled_reason": None
669
TEST.services.add(service_1)
670
TEST.services.add(service_2)
673
aggregate_1 = aggregates.Aggregate(aggregates.AggregateManager(None),
676
"availability_zone": "testing",
678
"created_at": "2013-07-04T13:34:38.000000",
680
"hosts": ["foo", "bar"],
690
aggregate_2 = aggregates.Aggregate(aggregates.AggregateManager(None),
693
"availability_zone": "testing",
695
"created_at": "2013-07-04T13:34:38.000000",
697
"hosts": ["foo", "bar"],
707
TEST.aggregates.add(aggregate_1)
708
TEST.aggregates.add(aggregate_2)
710
host1 = hosts.Host(hosts.HostManager(None),
712
"host_name": "devstack001",
713
"service": "compute",
718
host2 = hosts.Host(hosts.HostManager(None),
720
"host_name": "devstack002",
721
"service": "nova-conductor",
726
host3 = hosts.Host(hosts.HostManager(None),
728
"host_name": "devstack003",
729
"service": "compute",
733
TEST.hosts.add(host1)
734
TEST.hosts.add(host2)
735
TEST.hosts.add(host3)