mirror of https://github.com/apache/cloudstack.git
568 lines
21 KiB
Python
568 lines
21 KiB
Python
# -*- encoding: utf-8 -*-
|
|
#
|
|
# Copyright (c) 2012 Citrix. All rights reserved.
|
|
#
|
|
""" BVT tests for Templates ISO
|
|
"""
|
|
#Import Local Modules
|
|
from cloudstackTestCase import *
|
|
from cloudstackAPI import *
|
|
from settings import *
|
|
import remoteSSHClient
|
|
from utils import *
|
|
from base import *
|
|
import urllib
|
|
from random import random
|
|
#Import System modules
|
|
import time
|
|
|
|
|
|
services = TEST_TEMPLATE_SERVICES
|
|
|
|
class TestCreateTemplate(cloudstackTestCase):
|
|
|
|
def setUp(self):
|
|
|
|
self.apiclient = self.testClient.getApiClient()
|
|
self.dbclient = self.testClient.getDbConnection()
|
|
self.cleanup = []
|
|
return
|
|
|
|
def tearDown(self):
|
|
try:
|
|
self.dbclient.close()
|
|
#Clean up, terminate the created templates
|
|
cleanup_resources(self.apiclient, self.cleanup)
|
|
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" %e)
|
|
return
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
|
|
cls.api_client = fetch_api_client()
|
|
#create virtual machine
|
|
cls.virtual_machine = VirtualMachine.create(
|
|
cls.api_client,
|
|
services["virtual_machine"]
|
|
)
|
|
|
|
#Stop virtual machine
|
|
cmd = stopVirtualMachine.stopVirtualMachineCmd()
|
|
cmd.id = cls.virtual_machine.id
|
|
cls.api_client.stopVirtualMachine(cmd)
|
|
|
|
#Wait before server has be successfully stopped
|
|
time.sleep(30)
|
|
cmd = listVolumes.listVolumesCmd()
|
|
cmd.virtualmachineid = cls.virtual_machine.id
|
|
cmd.type = 'ROOT'
|
|
list_volume = cls.api_client.listVolumes(cmd)
|
|
cls.volume = list_volume[0]
|
|
return
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
try:
|
|
cls.api_client = fetch_api_client()
|
|
#Cleanup resources used
|
|
cls.virtual_machine.delete(cls.api_client)
|
|
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" %e)
|
|
|
|
return
|
|
|
|
def test_01_create_template(self):
|
|
"""Test create public & private template
|
|
"""
|
|
|
|
# Validate the following:
|
|
# 1. database (vm_template table) should be updated with newly created template
|
|
# 2. UI should show the newly added template
|
|
# 3. ListTemplates API should show the newly added template
|
|
|
|
#Create template from Virtual machine and Volume ID
|
|
template = Template.create(self.apiclient, self.volume, services["template_1"])
|
|
self.cleanup.append(template)
|
|
|
|
cmd = listTemplates.listTemplatesCmd()
|
|
cmd.templatefilter = services["templatefilter"]
|
|
cmd.id = template.id
|
|
list_template_response = self.apiclient.listTemplates(cmd)
|
|
|
|
#Verify template response to check whether template added successfully or not
|
|
template_response = list_template_response[0]
|
|
self.assertNotEqual(
|
|
len(list_template_response),
|
|
0,
|
|
"Check template avaliable in List Templates"
|
|
)
|
|
|
|
self.assertEqual(
|
|
template_response.displaytext,
|
|
services["template_1"]["displaytext"],
|
|
"Check display text of newly created template"
|
|
)
|
|
self.assertEqual(
|
|
template_response.name,
|
|
services["template_1"]["name"],
|
|
"Check name of newly created template"
|
|
)
|
|
self.assertEqual(
|
|
template_response.ostypeid,
|
|
services["template_1"]["ostypeid"],
|
|
"Check osTypeID of newly created template"
|
|
)
|
|
|
|
#Verify the database entry for template
|
|
self.debug(
|
|
"select name, display_text, guest_os_id from vm_template where id = %s;"
|
|
%template.id
|
|
)
|
|
|
|
qresultset = self.dbclient.execute(
|
|
"select name, display_text, guest_os_id from vm_template where id = %s;"
|
|
%template.id
|
|
)
|
|
|
|
self.assertNotEqual(
|
|
len(qresultset),
|
|
0,
|
|
"Check DB Query result set"
|
|
)
|
|
|
|
qresult = qresultset[0]
|
|
|
|
self.assertEqual(
|
|
qresult[0],
|
|
services["template_1"]["name"],
|
|
"Compare template name with database record"
|
|
)
|
|
|
|
self.assertEqual(
|
|
qresult[1],
|
|
services["template_1"]["displaytext"],
|
|
"Compare template display text with database record"
|
|
)
|
|
|
|
self.assertEqual(
|
|
qresult[2],
|
|
services["template_1"]["ostypeid"],
|
|
"Compare template osTypeID with database record"
|
|
)
|
|
return
|
|
|
|
class TestTemplates(cloudstackTestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
|
|
cls.api_client = fetch_api_client()
|
|
#create virtual machines
|
|
cls.virtual_machine = VirtualMachine.create(
|
|
cls.api_client,
|
|
services["virtual_machine"]
|
|
)
|
|
|
|
#Stop virtual machine
|
|
cmd = stopVirtualMachine.stopVirtualMachineCmd()
|
|
cmd.id = cls.virtual_machine.id
|
|
cls.api_client.stopVirtualMachine(cmd)
|
|
|
|
#Wait before server has be successfully stopped
|
|
time.sleep(30)
|
|
cmd = listVolumes.listVolumesCmd()
|
|
cmd.virtualmachineid = cls.virtual_machine.id
|
|
cmd.type = 'ROOT'
|
|
list_volume = cls.api_client.listVolumes(cmd)
|
|
cls.volume = list_volume[0]
|
|
|
|
#Create templates for Edit, Delete & update permissions testcases
|
|
cls.template_1 = Template.create(cls.api_client, cls.volume, services["template_1"])
|
|
cls.template_2 = Template.create(cls.api_client, cls.volume, services["template_2"])
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
try:
|
|
cls.api_client = fetch_api_client()
|
|
|
|
#Cleanup created resources such as templates and VMs
|
|
cls.template_2.delete(cls.api_client)
|
|
cls.virtual_machine.delete(cls.api_client)
|
|
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" %e)
|
|
|
|
return
|
|
|
|
def setUp(self):
|
|
|
|
self.apiclient = self.testClient.getApiClient()
|
|
self.dbclient = self.testClient.getDbConnection()
|
|
self.cleanup = []
|
|
return
|
|
|
|
def tearDown(self):
|
|
try:
|
|
|
|
self.dbclient.close()
|
|
#Clean up, terminate the created templates
|
|
cleanup_resources(self.apiclient, self.cleanup)
|
|
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" %e)
|
|
|
|
return
|
|
|
|
def test_02_edit_template(self):
|
|
"""Test Edit template
|
|
"""
|
|
|
|
# Validate the following:
|
|
# 1. UI should show the edited values for template
|
|
# 2. database (vm_template table) should have updated values
|
|
|
|
new_displayText = random_gen()
|
|
new_name = random_gen()
|
|
|
|
cmd = updateTemplate.updateTemplateCmd()
|
|
# Update template attributes
|
|
cmd.id = self.template_1.id
|
|
cmd.displaytext = new_displayText
|
|
cmd.name = new_name
|
|
cmd.bootable = services["bootable"]
|
|
cmd.passwordenabled = services["passwordenabled"]
|
|
cmd.ostypeid = services["ostypeid"]
|
|
|
|
self.apiclient.updateTemplate(cmd)
|
|
|
|
# Verify template response for updated attributes
|
|
cmd = listTemplates.listTemplatesCmd()
|
|
cmd.templatefilter = services["templatefilter"]
|
|
cmd.id = self.template_1.id
|
|
|
|
list_template_response = self.apiclient.listTemplates(cmd)
|
|
template_response = list_template_response[0]
|
|
|
|
self.assertNotEqual(
|
|
len(list_template_response),
|
|
0,
|
|
"Check template available in List Templates"
|
|
)
|
|
|
|
self.assertEqual(
|
|
template_response.displaytext,
|
|
new_displayText,
|
|
"Check display text of updated template"
|
|
)
|
|
self.assertEqual(
|
|
template_response.name,
|
|
new_name,
|
|
"Check name of updated template"
|
|
)
|
|
self.assertEqual(
|
|
str(template_response.passwordenabled).lower(),
|
|
str(services["passwordenabled"]).lower(),
|
|
"Check passwordenabled field of updated template"
|
|
)
|
|
self.assertEqual(
|
|
template_response.ostypeid,
|
|
services["ostypeid"],
|
|
"Check OSTypeID of updated template"
|
|
)
|
|
# Verify database entry for updated template attributes
|
|
self.debug(
|
|
"select name, display_text, bootable, enable_password, guest_os_id from vm_template where id = %s;"
|
|
%self.template_1.id
|
|
)
|
|
|
|
qresultset = self.dbclient.execute(
|
|
"select name, display_text, bootable, enable_password, guest_os_id from vm_template where id = %s;"
|
|
%self.template_1.id
|
|
)
|
|
|
|
self.assertNotEqual(
|
|
len(qresultset),
|
|
0,
|
|
"Check DB Query result set"
|
|
)
|
|
|
|
qresult = qresultset[0]
|
|
|
|
self.assertEqual(
|
|
qresult[0],
|
|
new_name,
|
|
"Compare template name with database record"
|
|
)
|
|
|
|
self.assertEqual(
|
|
qresult[1],
|
|
new_displayText,
|
|
"Compare template bootable field with database record"
|
|
)
|
|
self.assertEqual(
|
|
qresult[2],
|
|
int(services["bootable"]),
|
|
"Compare template enable_password field with database record"
|
|
)
|
|
self.assertEqual(
|
|
qresult[3],
|
|
int(services["passwordenabled"]),
|
|
"Compare template display text with database record"
|
|
)
|
|
self.assertEqual(
|
|
qresult[4],
|
|
services["ostypeid"],
|
|
"Compare template guest OS ID with database record"
|
|
)
|
|
return
|
|
|
|
def test_03_delete_template(self):
|
|
"""Test delete template
|
|
"""
|
|
|
|
# Validate the following:
|
|
# 1. UI should not show the deleted template
|
|
# 2. database (vm_template table) should not contain deleted template
|
|
|
|
self.template_1.delete(self.apiclient)
|
|
|
|
cmd = listTemplates.listTemplatesCmd()
|
|
cmd.templatefilter = services["templatefilter"]
|
|
cmd.id = self.template_1.id
|
|
list_template_response = self.apiclient.listTemplates(cmd)
|
|
|
|
# Verify template is deleted properly using ListTemplates
|
|
self.assertEqual(list_template_response, None, "Check if template exists in List Templates")
|
|
|
|
# Verify database entry is removed for deleted template
|
|
self.debug(
|
|
"select name, display_text from vm_template where id = %s;"
|
|
%self.template_1.id
|
|
)
|
|
|
|
qresultset = self.dbclient.execute(
|
|
"select name, display_text from vm_template where id = %s;"
|
|
%self.template_1.id
|
|
)
|
|
|
|
self.assertEqual(
|
|
len(qresultset),
|
|
1,
|
|
"Check DB Query result set"
|
|
)
|
|
|
|
return
|
|
|
|
def test_04_extract_template(self):
|
|
"Test for extract template"
|
|
|
|
# Validate the following
|
|
# 1. Admin should able extract and download the templates
|
|
# 2. ListTemplates should display all the public templates for all kind of users
|
|
# 3 .ListTemplates should not display the system templates
|
|
|
|
cmd = extractTemplate.extractTemplateCmd()
|
|
cmd.id = self.template_2.id
|
|
cmd.mode = services["template_2"]["mode"]
|
|
cmd.zoneid = services["template_2"]["zoneid"]
|
|
list_extract_response = self.apiclient.extractTemplate(cmd)
|
|
|
|
# Format URL to ASCII to retrieve response code
|
|
formatted_url = urllib.unquote_plus(list_extract_response.url)
|
|
url_response = urllib.urlopen(formatted_url)
|
|
response_code = url_response.getcode()
|
|
|
|
self.assertEqual(
|
|
list_extract_response.id,
|
|
self.template_2.id,
|
|
"Check ID of the extracted template"
|
|
)
|
|
self.assertEqual(
|
|
list_extract_response.extractMode,
|
|
services["template_2"]["mode"],
|
|
"Check mode of extraction"
|
|
)
|
|
self.assertEqual(
|
|
list_extract_response.zoneid,
|
|
services["template_2"]["zoneid"],
|
|
"Check zone ID of extraction"
|
|
)
|
|
self.assertEqual(
|
|
response_code,
|
|
200,
|
|
"Check for a valid response download URL"
|
|
)
|
|
return
|
|
|
|
def test_05_template_permissions(self):
|
|
"""Update & Test for template permissions"""
|
|
|
|
# Validate the following
|
|
# 1. listTemplatePermissions returns valid permissions set for template
|
|
# 2. permission changes should be reflected in vm_template table in database
|
|
|
|
cmd = updateTemplatePermissions.updateTemplatePermissionsCmd()
|
|
# Update template permissions
|
|
cmd.id = self.template_2.id
|
|
cmd.isfeatured = services["isfeatured"]
|
|
cmd.ispublic = services["ispublic"]
|
|
cmd.isextractable =services["isextractable"]
|
|
|
|
self.apiclient.updateTemplatePermissions(cmd)
|
|
|
|
cmd = listTemplates.listTemplatesCmd()
|
|
cmd.id = self.template_2.id
|
|
cmd.account = services["account"]
|
|
cmd.domainid = services["domainid"]
|
|
cmd.templatefilter = 'featured'
|
|
list_template_response = self.apiclient.listTemplates(cmd)
|
|
|
|
# Verify template response for updated permissions for normal user
|
|
template_response = list_template_response[0]
|
|
|
|
self.assertEqual(
|
|
template_response.id,
|
|
self.template_2.id,
|
|
"Check template ID"
|
|
)
|
|
self.assertEqual(
|
|
template_response.ispublic,
|
|
int(True),
|
|
"Check ispublic permission of template"
|
|
)
|
|
|
|
self.assertNotEqual(
|
|
template_response.templatetype,
|
|
'SYSTEM',
|
|
"ListTemplates should not list any system templates"
|
|
)
|
|
|
|
# Verify database entries for updated permissions
|
|
self.debug(
|
|
"select public, featured, extractable from vm_template where id = %s;"
|
|
%self.template_2.id
|
|
)
|
|
qresultset = self.dbclient.execute(
|
|
"select public, featured, extractable from vm_template where id = %s;"
|
|
%self.template_2.id
|
|
)
|
|
|
|
self.assertNotEqual(
|
|
len(qresultset),
|
|
0,
|
|
"Check DB Query result set"
|
|
)
|
|
|
|
qresult = qresultset[0]
|
|
|
|
self.assertEqual(
|
|
qresult[0],
|
|
int(services["ispublic"]),
|
|
"Compare public permission with database record"
|
|
)
|
|
|
|
self.assertEqual(
|
|
qresult[1],
|
|
int(services["isfeatured"]),
|
|
"Compare featured permission with database record"
|
|
)
|
|
self.assertEqual(
|
|
qresult[2],
|
|
int(services["isextractable"]),
|
|
"Compare extractable permission with database record"
|
|
)
|
|
return
|
|
|
|
def test_06_copy_template(self):
|
|
"""Test for copy template from one zone to another"""
|
|
|
|
# Validate the following
|
|
# 1. copy template should be successful and secondary storage should contain new copied template.
|
|
|
|
cmd = copyTemplate.copyTemplateCmd()
|
|
cmd.id = self.template_2.id
|
|
cmd.destzoneid = services["destzoneid"]
|
|
cmd.sourcezoneid = services["sourcezoneid"]
|
|
self.apiclient.copyTemplate(cmd)
|
|
|
|
# Verify template is copied to another zone using ListTemplates
|
|
cmd = listTemplates.listTemplatesCmd()
|
|
cmd.id = self.template_2.id
|
|
cmd.templatefilter = services["templatefilter"]
|
|
list_template_response = self.apiclient.listTemplates(cmd)
|
|
|
|
template_response = list_template_response[0]
|
|
self.assertNotEqual(
|
|
len(list_template_response),
|
|
0,
|
|
"Check template extracted in List Templates"
|
|
)
|
|
self.assertEqual(
|
|
template_response.id,
|
|
self.template_2.id,
|
|
"Check ID of the downloaded template"
|
|
)
|
|
self.assertEqual(
|
|
template_response.zoneid,
|
|
services["destzoneid"],
|
|
"Check zone ID of the copied template"
|
|
)
|
|
return
|
|
|
|
def test_07_list_public_templates(self):
|
|
"""Test only public templates are visible to normal user"""
|
|
|
|
# Validate the following
|
|
# 1. ListTemplates should show only 'public' templates for normal user
|
|
|
|
cmd = listTemplates.listTemplatesCmd()
|
|
cmd.templatefilter = 'featured'
|
|
cmd.account = services["account"]
|
|
cmd.domainid = services["domainid"]
|
|
|
|
list_template_response = self.apiclient.listTemplates(cmd)
|
|
|
|
self.assertNotEqual(
|
|
len(list_template_response),
|
|
0,
|
|
"Check template available in List Templates"
|
|
)
|
|
#Template response should list all 'public' templates
|
|
for k in range(len(list_template_response)):
|
|
self.assertEqual(
|
|
list_template_response[k].ispublic,
|
|
True,
|
|
"ListTemplates should list only public templates"
|
|
)
|
|
return
|
|
|
|
def test_08_list_system_templates(self):
|
|
"""Test System templates are not visible to normal user"""
|
|
|
|
# Validate the following
|
|
# 1. ListTemplates should not show 'SYSTEM' templates for normal user
|
|
|
|
cmd = listTemplates.listTemplatesCmd()
|
|
cmd.templatefilter = 'featured'
|
|
cmd.account = services["account"]
|
|
cmd.domainid = services["domainid"]
|
|
|
|
list_template_response = self.apiclient.listTemplates(cmd)
|
|
|
|
self.assertNotEqual(
|
|
len(list_template_response),
|
|
0,
|
|
"Check template available in List Templates"
|
|
)
|
|
|
|
for k in range(len(list_template_response)):
|
|
self.assertNotEqual(
|
|
list_template_response[k].templatetype,
|
|
'SYSTEM',
|
|
"ListTemplates should not list any system templates"
|
|
)
|
|
return
|