2020-07-13 09:33:09 +00:00
|
|
|
import tempfile
|
|
|
|
|
|
|
|
from django.shortcuts import reverse
|
2015-02-27 08:53:51 +00:00
|
|
|
from django.test import TestCase
|
|
|
|
|
2020-07-13 09:33:09 +00:00
|
|
|
from computes.models import Compute
|
|
|
|
|
|
|
|
from .models import Instance
|
|
|
|
|
|
|
|
|
|
|
|
class InstancesTestCase(TestCase):
|
|
|
|
def setUp(self):
|
|
|
|
self.client.login(username='admin', password='admin')
|
|
|
|
Compute(
|
|
|
|
name='local',
|
|
|
|
hostname='localhost',
|
|
|
|
login='',
|
|
|
|
password='',
|
|
|
|
details='local',
|
|
|
|
type=4,
|
|
|
|
).save()
|
|
|
|
|
|
|
|
def test_index(self):
|
|
|
|
response = self.client.get(reverse('instances:index'))
|
|
|
|
# with open('index.html', 'wb') as f:
|
|
|
|
# f.write(response.content)
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
def test_create_select_type(self):
|
|
|
|
response = self.client.get(reverse('instances:create_instance_select_type', args=[1]))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
def test_instance(self):
|
|
|
|
compute = Compute.objects.get(pk=1)
|
|
|
|
|
|
|
|
# create volume
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('create_volume', args=[compute.id, 'default']),
|
|
|
|
{
|
|
|
|
'name': 'test',
|
|
|
|
'format': 'qcow2',
|
|
|
|
'size': '1',
|
|
|
|
'meta_prealloc': False,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
self.assertRedirects(response, reverse('storage', args=[compute.id, 'default']))
|
|
|
|
|
|
|
|
# create instance
|
|
|
|
response = self.client.get(reverse('instances:create_instance', args=[compute.id, 'x86_64', 'q35']))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:create_instance', args=[compute.id, 'x86_64', 'q35']),
|
|
|
|
{
|
|
|
|
'name': 'test',
|
|
|
|
'firmware': 'BIOS',
|
|
|
|
'vcpu': 1,
|
|
|
|
'vcpu_mode': 'host-model',
|
|
|
|
'memory': 512,
|
|
|
|
'device0': 'disk',
|
|
|
|
'bus0': 'virtio',
|
|
|
|
'images': 'test.qcow2',
|
|
|
|
'storage-control': 'default',
|
|
|
|
'image-control': 'test.qcow2',
|
|
|
|
'networks': 'default',
|
|
|
|
'network-control': 'default',
|
|
|
|
'cache_mode': 'directsync',
|
|
|
|
'nwfilter': '',
|
|
|
|
'graphics': 'spice',
|
|
|
|
'video': 'vga',
|
|
|
|
'listener_addr': '0.0.0.0',
|
|
|
|
'console_pass': '',
|
|
|
|
'qemu_ga': False,
|
|
|
|
'virtio': True,
|
|
|
|
'create': True,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
instance: Instance = Instance.objects.get(pk=1)
|
|
|
|
self.assertEqual(instance.name, 'test')
|
|
|
|
|
|
|
|
# get instance page
|
|
|
|
response = self.client.get(reverse('instances:instance', args=[instance.id]))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# resize cpu
|
|
|
|
self.assertEqual(instance.vcpu, 1)
|
|
|
|
self.assertEqual(instance.cur_vcpu, 1)
|
|
|
|
|
|
|
|
response = self.client.post(reverse('instances:resizevm_cpu', args=[instance.id]), {'vcpu': 4, 'cur_vcpu': 2})
|
|
|
|
self.assertRedirects(response, reverse('instances:instance', args=[instance.id]) + '#resize')
|
|
|
|
|
|
|
|
# reset cached properties
|
|
|
|
del instance.vcpu
|
|
|
|
del instance.cur_vcpu
|
|
|
|
self.assertEqual(instance.vcpu, 4)
|
|
|
|
self.assertEqual(instance.cur_vcpu, 2)
|
|
|
|
|
|
|
|
# resize memory
|
|
|
|
self.assertEqual(instance.memory, 512)
|
|
|
|
self.assertEqual(instance.cur_memory, 512)
|
|
|
|
|
|
|
|
response = self.client.post(reverse('instances:resize_memory', args=[instance.id]), {
|
|
|
|
'memory': 2048,
|
|
|
|
'cur_memory': 1024
|
|
|
|
})
|
|
|
|
self.assertRedirects(response, reverse('instances:instance', args=[instance.id]) + '#resize')
|
|
|
|
|
|
|
|
del instance.memory
|
|
|
|
del instance.cur_memory
|
|
|
|
self.assertEqual(instance.memory, 2048)
|
|
|
|
self.assertEqual(instance.cur_memory, 1024)
|
|
|
|
|
|
|
|
# resize disk
|
|
|
|
self.assertEqual(instance.disks[0]['size'], 1024**3)
|
|
|
|
|
|
|
|
response = self.client.post(reverse('instances:resize_disk', args=[instance.id]), {
|
|
|
|
'disk_size_vda': '2.0 GB',
|
|
|
|
})
|
|
|
|
self.assertRedirects(response, reverse('instances:instance', args=[instance.id]) + '#resize')
|
|
|
|
|
|
|
|
del instance.disks
|
|
|
|
self.assertEqual(instance.disks[0]['size'], 2 * 1024**3)
|
|
|
|
|
|
|
|
# add new volume
|
|
|
|
self.assertEqual(len(instance.disks), 1)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:add_new_vol', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'storage': 'default',
|
|
|
|
'name': 'test2',
|
|
|
|
'size': 1,
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.disks
|
|
|
|
self.assertEqual(len(instance.disks), 2)
|
|
|
|
|
|
|
|
# delete volume from instance
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:delete_vol', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'storage': 'default',
|
|
|
|
'dev': 'vdb',
|
|
|
|
'name': 'test2.qcow2',
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.disks
|
|
|
|
self.assertEqual(len(instance.disks), 1)
|
|
|
|
|
|
|
|
# detach volume
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:detach_vol', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'dev': 'vda',
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.disks
|
|
|
|
self.assertEqual(len(instance.disks), 0)
|
|
|
|
|
|
|
|
# add existing volume
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:add_existing_vol', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'selected_storage': 'default',
|
|
|
|
'vols': 'test.qcow2',
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.disks
|
|
|
|
self.assertEqual(len(instance.disks), 1)
|
|
|
|
|
|
|
|
# edit volume
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:edit_volume', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'vol_path': '/var/lib/libvirt/images/test.qcow2',
|
|
|
|
# 'vol_shareable': False,
|
|
|
|
# 'vol_readonly': False,
|
|
|
|
'vol_bus': 'virtio',
|
|
|
|
'vol_bus_old': 'virtio',
|
|
|
|
'vol_format': 'qcow2',
|
|
|
|
'dev': 'vda',
|
|
|
|
'edit_volume': True
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
# add media device
|
|
|
|
self.assertEqual(len(instance.media), 1)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:add_cdrom', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'bus': 'sata',
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.media
|
|
|
|
self.assertEqual(len(instance.media), 2)
|
|
|
|
|
|
|
|
# create dummy iso
|
|
|
|
# with tempfile.NamedTemporaryFile() as f:
|
|
|
|
# f.write(b'\x00' * 1024**2)
|
|
|
|
|
|
|
|
# response = self.client.post(
|
|
|
|
# reverse('storage', args=[instance.compute.id, 'default']),
|
|
|
|
# {
|
|
|
|
# 'iso_upload': True,
|
|
|
|
# 'file': f
|
|
|
|
# },
|
|
|
|
# )
|
|
|
|
|
|
|
|
# remove media device
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:detach_cdrom', args=[instance.id, 'sda']),
|
|
|
|
{},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.media
|
|
|
|
self.assertEqual(len(instance.media), 1)
|
|
|
|
|
|
|
|
# snapshots
|
|
|
|
self.assertEqual(len(instance.snapshots), 0)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:snapshot', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'name': 'test',
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.snapshots
|
|
|
|
self.assertEqual(len(instance.snapshots), 1)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:revert_snapshot', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'name': 'test',
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:delete_snapshot', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'name': 'test',
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.snapshots
|
|
|
|
self.assertEqual(len(instance.snapshots), 0)
|
|
|
|
|
|
|
|
# autostart
|
|
|
|
self.assertEqual(instance.autostart, 0)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:set_autostart', args=[instance.id]),
|
|
|
|
{},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.autostart
|
|
|
|
self.assertEqual(instance.autostart, 1)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:unset_autostart', args=[instance.id]),
|
|
|
|
{},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.autostart
|
|
|
|
self.assertEqual(instance.autostart, 0)
|
|
|
|
|
|
|
|
# bootmenu
|
|
|
|
self.assertEqual(instance.bootmenu, True)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:unset_bootmenu', args=[instance.id]),
|
|
|
|
{},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.bootmenu
|
|
|
|
self.assertEqual(instance.bootmenu, False)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:set_bootmenu', args=[instance.id]),
|
|
|
|
{},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.bootmenu
|
|
|
|
self.assertEqual(instance.bootmenu, True)
|
|
|
|
|
|
|
|
# guest agent
|
|
|
|
|
|
|
|
self.assertEqual(instance.guest_agent, False)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:set_guest_agent', args=[instance.id]),
|
|
|
|
{'guest_agent': True},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.guest_agent
|
|
|
|
self.assertEqual(instance.guest_agent, True)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:set_guest_agent', args=[instance.id]),
|
|
|
|
{'guest_agent': False},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.guest_agent
|
|
|
|
self.assertEqual(instance.guest_agent, False)
|
|
|
|
|
|
|
|
# video model
|
|
|
|
self.assertEqual(instance.video_model, 'vga')
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:set_video_model', args=[instance.id]),
|
|
|
|
{'video_model': 'virtio'},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.video_model
|
|
|
|
self.assertEqual(instance.video_model, 'virtio')
|
|
|
|
|
|
|
|
# console
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:update_console', args=[instance.id]),
|
|
|
|
{
|
|
|
|
'type': 'spice',
|
|
|
|
'listen_on': '0.0.0.0',
|
|
|
|
'password': '',
|
|
|
|
'keymap': 'auto'
|
|
|
|
},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
# poweron
|
|
|
|
self.assertEqual(instance.status, 5)
|
|
|
|
|
|
|
|
response = self.client.get(reverse('instances:poweron', args=[instance.id]), HTTP_REFERER=reverse('index'))
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.status
|
|
|
|
|
|
|
|
self.assertEqual(instance.status, 1)
|
|
|
|
|
|
|
|
# status
|
|
|
|
response = self.client.get(reverse('instances:status', args=[instance.id]))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# stats
|
|
|
|
response = self.client.get(reverse('instances:stats', args=[instance.id]))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# guess_mac_address
|
|
|
|
response = self.client.get(reverse('instances:guess_mac_address', args=[instance.name]))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# random_mac_address
|
|
|
|
response = self.client.get(reverse('instances:random_mac_address'))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# random_mac_address
|
|
|
|
response = self.client.get(reverse('instances:guess_clone_name'))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# guess_mac_address
|
|
|
|
response = self.client.get(reverse('instances:check_instance', args=[instance.name]))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# sshkeys
|
|
|
|
response = self.client.get(reverse('instances:sshkeys', args=[instance.name]))
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
|
|
# suspend
|
|
|
|
response = self.client.get(reverse('instances:suspend', args=[instance.id]), HTTP_REFERER=reverse('index'))
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.status
|
|
|
|
self.assertEqual(instance.status, 3)
|
|
|
|
|
|
|
|
# resume
|
|
|
|
response = self.client.get(reverse('instances:resume', args=[instance.id]), HTTP_REFERER=reverse('index'))
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.status
|
|
|
|
self.assertEqual(instance.status, 1)
|
|
|
|
|
|
|
|
# poweroff
|
|
|
|
response = self.client.get(reverse('instances:poweroff', args=[instance.id]), HTTP_REFERER=reverse('index'))
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
# as no OS is installed ACPI won't work
|
|
|
|
del instance.status
|
|
|
|
self.assertEqual(instance.status, 1)
|
|
|
|
|
|
|
|
# powercycle
|
|
|
|
response = self.client.get(reverse('instances:powercycle', args=[instance.id]), HTTP_REFERER=reverse('index'))
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
self.assertEqual(instance.status, 1)
|
|
|
|
|
|
|
|
# force_off
|
|
|
|
response = self.client.get(reverse('instances:force_off', args=[instance.id]), HTTP_REFERER=reverse('index'))
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
del instance.status
|
|
|
|
self.assertEqual(instance.status, 5)
|
|
|
|
|
|
|
|
# delete started instance with disks
|
|
|
|
instance.proxy.start()
|
|
|
|
del instance.status
|
|
|
|
self.assertEqual(instance.status, 1)
|
|
|
|
|
|
|
|
response = self.client.post(
|
|
|
|
reverse('instances:destroy', args=[instance.id]),
|
|
|
|
{'delete_disk': True},
|
|
|
|
HTTP_REFERER=reverse('index'),
|
|
|
|
)
|
|
|
|
self.assertRedirects(response, reverse('instances', args=[compute.id]))
|
|
|
|
|
|
|
|
# # create volume
|
|
|
|
# response = self.client.post(
|
|
|
|
# reverse('create_volume', args=[compute.id, 'default']),
|
|
|
|
# {
|
|
|
|
# 'name': 'test3',
|
|
|
|
# 'format': 'qcow2',
|
|
|
|
# 'size': '1',
|
|
|
|
# 'meta_prealloc': False,
|
|
|
|
# },
|
|
|
|
# )
|
|
|
|
# self.assertRedirects(response, reverse('storage', args=[compute.id, 'default']))
|
|
|
|
|
|
|
|
# # delete volume
|
|
|
|
# response = self.client.post(
|
|
|
|
# reverse('instances:delete_vol', args=[instance.id]),
|
|
|
|
# {
|
|
|
|
# 'storage': 'default',
|
|
|
|
# 'dev': 'vdb',
|
|
|
|
# 'name': 'test3.qcow2',
|
|
|
|
# },
|
|
|
|
# HTTP_REFERER=reverse('index'),
|
|
|
|
# )
|
|
|
|
# self.assertEqual(response.status_code, 302)
|