mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge pull request #1949 from shwetaag/cruds2
Automated Cloudstack bugs 9277 9276 9275 9274 9273 9179 9178 9177
This commit is contained in:
commit
7df67c2ef6
267
test/integration/component/maint/test_escalations_instances.py
Normal file
267
test/integration/component/maint/test_escalations_instances.py
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
#Import Local Modules
|
||||||
|
from marvin.cloudstackTestCase import cloudstackTestCase
|
||||||
|
from marvin.lib.utils import (cleanup_resources,
|
||||||
|
validateList,
|
||||||
|
get_hypervisor_type)
|
||||||
|
from marvin.lib.base import (Account,
|
||||||
|
VirtualMachine,
|
||||||
|
ServiceOffering,
|
||||||
|
Volume,
|
||||||
|
DiskOffering,
|
||||||
|
Template,
|
||||||
|
Configurations)
|
||||||
|
from marvin.lib.common import (get_domain,
|
||||||
|
get_zone,
|
||||||
|
get_template)
|
||||||
|
from nose.plugins.attrib import attr
|
||||||
|
from marvin.codes import PASS
|
||||||
|
from marvin.sshClient import SshClient
|
||||||
|
import time
|
||||||
|
|
||||||
|
class TestInstance(cloudstackTestCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
try:
|
||||||
|
cls._cleanup = []
|
||||||
|
cls.testClient = super(TestInstance, cls).getClsTestClient()
|
||||||
|
cls.api_client = cls.testClient.getApiClient()
|
||||||
|
cls.services = cls.testClient.getParsedTestDataConfig()
|
||||||
|
# Get Domain, Zone, Template
|
||||||
|
cls.domain = get_domain(cls.api_client)
|
||||||
|
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
||||||
|
cls.template = get_template(
|
||||||
|
cls.api_client,
|
||||||
|
cls.zone.id,
|
||||||
|
cls.services["ostype"]
|
||||||
|
)
|
||||||
|
if cls.zone.localstorageenabled:
|
||||||
|
cls.storagetype = 'local'
|
||||||
|
cls.services["service_offerings"]["tiny"]["storagetype"] = 'local'
|
||||||
|
cls.services["disk_offering"]["storagetype"] = 'local'
|
||||||
|
else:
|
||||||
|
cls.storagetype = 'shared'
|
||||||
|
cls.services["service_offerings"]["tiny"]["storagetype"] = 'shared'
|
||||||
|
cls.services["disk_offering"]["storagetype"] = 'shared'
|
||||||
|
|
||||||
|
cls.services['mode'] = cls.zone.networktype
|
||||||
|
cls.services["virtual_machine"]["hypervisor"] = cls.testClient.getHypervisorInfo()
|
||||||
|
cls.services["virtual_machine"]["zoneid"] = cls.zone.id
|
||||||
|
cls.services["virtual_machine"]["template"] = cls.template.id
|
||||||
|
cls.services["custom_volume"]["zoneid"] = cls.zone.id
|
||||||
|
# Creating Disk offering, Service Offering and Account
|
||||||
|
cls.disk_offering = DiskOffering.create(
|
||||||
|
cls.api_client,
|
||||||
|
cls.services["disk_offering"]
|
||||||
|
)
|
||||||
|
cls.service_offering = ServiceOffering.create(
|
||||||
|
cls.api_client,
|
||||||
|
cls.services["service_offerings"]["small"]
|
||||||
|
)
|
||||||
|
cls.account = Account.create(
|
||||||
|
cls.api_client,
|
||||||
|
cls.services["account"],
|
||||||
|
domainid=cls.domain.id
|
||||||
|
)
|
||||||
|
# Getting authentication for user in newly created Account
|
||||||
|
cls.user = cls.account.user[0]
|
||||||
|
cls.userapiclient = cls.testClient.getUserApiClient(cls.user.username, cls.domain.name)
|
||||||
|
cls._cleanup.append(cls.disk_offering)
|
||||||
|
cls._cleanup.append(cls.service_offering)
|
||||||
|
cls._cleanup.append(cls.account)
|
||||||
|
cls.mgtSvrDetails = cls.config.__dict__["mgtSvr"][0].__dict__
|
||||||
|
except Exception as e:
|
||||||
|
cls.tearDownClass()
|
||||||
|
raise Exception("Warning: Exception in setup : %s" % e)
|
||||||
|
return
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
|
||||||
|
self.apiClient = self.testClient.getApiClient()
|
||||||
|
self.cleanup = []
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
#Clean up, terminate the created volumes
|
||||||
|
cleanup_resources(self.apiClient, self.cleanup)
|
||||||
|
return
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
try:
|
||||||
|
cleanup_resources(cls.api_client, cls._cleanup)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||||
|
|
||||||
|
def RestartServers(self):
|
||||||
|
""" Restart management server and usage server """
|
||||||
|
|
||||||
|
sshClient = SshClient(
|
||||||
|
self.mgtSvrDetails["mgtSvrIp"],
|
||||||
|
22,
|
||||||
|
self.mgtSvrDetails["user"],
|
||||||
|
self.mgtSvrDetails["passwd"]
|
||||||
|
)
|
||||||
|
command = "service cloudstack-management restart"
|
||||||
|
sshClient.execute(command)
|
||||||
|
return
|
||||||
|
|
||||||
|
def updateConfigurAndRestart(self,name, value):
|
||||||
|
Configurations.update(self.apiClient,
|
||||||
|
name,value )
|
||||||
|
self.RestartServers()
|
||||||
|
time.sleep(self.services["sleep"])
|
||||||
|
|
||||||
|
@attr(tags=["advanced"], required_hardware="true")
|
||||||
|
def test1_attach_volume(self):
|
||||||
|
"""
|
||||||
|
@desc: Unable to attach 7th Disk to windows server 2012R2 instance. Add a valid windows server 2012 URL to execute this test case
|
||||||
|
Step1: Set global config vmware.root.disk.controller to 'osdefault'
|
||||||
|
Step2: Deploy a Windows 2012 R2 instance.
|
||||||
|
Step3: Attach 6 disks to the VM.
|
||||||
|
Step4: Try attaching a 7th disk to the VM
|
||||||
|
Verify that step4 succeeds without any exception
|
||||||
|
"""
|
||||||
|
self.hypervisor = str(get_hypervisor_type(self.api_client)).lower()
|
||||||
|
if self.hypervisor != "vmware":
|
||||||
|
self.skipTest("This test can be run only on vmware")
|
||||||
|
self.updateConfigurAndRestart("vmware.root.disk.controller","osdefault")
|
||||||
|
|
||||||
|
self.services["Windows Server 2012"]["url"]="http://10.147.28.7/templates/Windows2012/WindowsServer2012R2.ova.gz",
|
||||||
|
template = Template.register(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["Windows Server 2012"],
|
||||||
|
zoneid=self.zone.id,
|
||||||
|
account=self.account.name,
|
||||||
|
domainid=self.account.domainid
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(template,"Failed to register Windows server 2012 R2 template")
|
||||||
|
self.debug(
|
||||||
|
"Registered a template with format {} and id {}".format(
|
||||||
|
self.services["Windows Server 2012"]["format"],template.id)
|
||||||
|
)
|
||||||
|
template.download(self.userapiclient)
|
||||||
|
self.cleanup.append(template)
|
||||||
|
|
||||||
|
# Creating a big service offering for windows VM launch
|
||||||
|
big_service_offering = ServiceOffering.create(
|
||||||
|
self.apiClient,
|
||||||
|
self.services["service_offerings"]["big"]
|
||||||
|
)
|
||||||
|
self.cleanup.append(big_service_offering)
|
||||||
|
vm = VirtualMachine.create(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["virtual_machine"],
|
||||||
|
accountid=self.account.name,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
serviceofferingid=big_service_offering.id,
|
||||||
|
templateid=template.id,
|
||||||
|
zoneid=self.zone.id
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(vm,"Failed to deploy virtual machine")
|
||||||
|
self.cleanup.append(vm)
|
||||||
|
response = VirtualMachine.list(self.userapiclient,id=vm.id)
|
||||||
|
status = validateList(response)
|
||||||
|
self.assertEqual(status[0],PASS,"list vm response returned invalid list")
|
||||||
|
|
||||||
|
for i in range(0,7):
|
||||||
|
self.services["volume"]["diskname"]=i
|
||||||
|
disk = Volume.create(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["volume"],
|
||||||
|
zoneid=self.zone.id,
|
||||||
|
diskofferingid=self.disk_offering.id
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(disk,"Failed to create custom volume")
|
||||||
|
self.cleanup.append(disk)
|
||||||
|
try:
|
||||||
|
vm.attach_volume(self.userapiclient,disk)
|
||||||
|
list_volumes = Volume.list(
|
||||||
|
self.userapiclient,
|
||||||
|
listall=self.services["listall"],
|
||||||
|
id=disk.id
|
||||||
|
)
|
||||||
|
|
||||||
|
attached_volume = list_volumes[0]
|
||||||
|
self.assertEqual(
|
||||||
|
disk.id,
|
||||||
|
attached_volume.id,
|
||||||
|
"list volume response does not match with the volume created and attached to vm"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
self.fail("Failed to attach {} data disk to Windows server 2012 R2 vm ".format(i))
|
||||||
|
return
|
||||||
|
@attr(tags=["advanced"], required_hardware="true")
|
||||||
|
def test_Scale_VM(self):
|
||||||
|
"""
|
||||||
|
@desc:
|
||||||
|
1. Enable dynamic scaling in Global settings
|
||||||
|
2. Register an CentOS 7 tempplate(with tools) and tick dynamic scaling
|
||||||
|
3. Deploy VM with this template
|
||||||
|
4.Start the VM and try to change service offering
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.hypervisor = str(get_hypervisor_type(self.api_client)).lower()
|
||||||
|
if self.hypervisor != "xenserver":
|
||||||
|
self.skipTest("This test can be run only on xenserver")
|
||||||
|
self.updateConfigurAndRestart("enable.dynamic.scale.vm","true")
|
||||||
|
template = Template.register(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["CentOS7template"],
|
||||||
|
zoneid=self.zone.id,
|
||||||
|
account=self.account.name,
|
||||||
|
domainid=self.account.domainid
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(template,"Failed to register CentOS 7 template")
|
||||||
|
self.debug(
|
||||||
|
"Registered a template with format {} and id {}".format(
|
||||||
|
self.services["CentOS7template"]["format"],template.id)
|
||||||
|
)
|
||||||
|
template.download(self.userapiclient)
|
||||||
|
self.cleanup.append(template)
|
||||||
|
vm = VirtualMachine.create(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["virtual_machine"],
|
||||||
|
accountid=self.account.name,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
serviceofferingid=self.service_offering.id,
|
||||||
|
templateid=template.id,
|
||||||
|
zoneid=self.zone.id
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(vm,"Failed to deploy virtual machine")
|
||||||
|
self.cleanup.append(vm)
|
||||||
|
response = VirtualMachine.list(self.userapiclient,id=vm.id)
|
||||||
|
status = validateList(response)
|
||||||
|
self.assertEqual(status[0],PASS,"list vm response returned invalid list")
|
||||||
|
self.assertEqual(status[1].state,"Running", "vm is not running")
|
||||||
|
|
||||||
|
service_offering = ServiceOffering.create(
|
||||||
|
self.apiClient,
|
||||||
|
self.services["service_offerings"]["big"]
|
||||||
|
)
|
||||||
|
time.sleep(self.services["sleep"])
|
||||||
|
vm.scale(self.userapiclient,service_offering.id)
|
||||||
|
scaleresponse = VirtualMachine.list(self.userapiclient,id=vm.id)
|
||||||
|
scalestatus = validateList(scaleresponse)
|
||||||
|
self.assertEqual(scalestatus[0],PASS,"list vm response returned invalid list")
|
||||||
|
self.assertEqual(scalestatus[1].serviceofferingname,service_offering.name, " service offering is not same")
|
||||||
|
self.assertEqual(scalestatus[1].serviceofferingid,service_offering.id, " service offering ids are not same")
|
||||||
|
|
||||||
|
|
||||||
|
return
|
||||||
@ -42,7 +42,7 @@ from marvin.codes import PASS
|
|||||||
from marvin.sshClient import SshClient
|
from marvin.sshClient import SshClient
|
||||||
from nose.plugins.attrib import attr
|
from nose.plugins.attrib import attr
|
||||||
import time
|
import time
|
||||||
|
from marvin.cloudstackException import CloudstackAPIException
|
||||||
|
|
||||||
class TestListInstances(cloudstackTestCase):
|
class TestListInstances(cloudstackTestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -2068,6 +2068,95 @@ class TestListInstances(cloudstackTestCase):
|
|||||||
"VM NIC is not same as expected"
|
"VM NIC is not same as expected"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@attr(tags=["advanced", "basic"], required_hardware="true")
|
||||||
|
def test_14_Create_vm_with_same_sshkey(self):
|
||||||
|
"""
|
||||||
|
@Desc: Test to verify API call Register ssh key pair fails when uses same public key for differnet key name
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
# Listing all the SSH Key pairs
|
||||||
|
list_keypairs_before = SSHKeyPair.list(
|
||||||
|
self.userapiclient
|
||||||
|
)
|
||||||
|
list_keypairs_before_size = 0
|
||||||
|
if list_keypairs_before is not None:
|
||||||
|
list_keypairs_before_size = len(list_keypairs_before)
|
||||||
|
|
||||||
|
# Registering first Key pair
|
||||||
|
new_keypair1 = SSHKeyPair.register(
|
||||||
|
self.userapiclient,
|
||||||
|
name="keypair1",
|
||||||
|
publickey="ssh-rsa: e6:9a:1e:b5:98:75:88:5d:56:bc:92:7b:43:48:05:b2")
|
||||||
|
self.assertIsNotNone(
|
||||||
|
new_keypair1,
|
||||||
|
"New Key pair generation failed"
|
||||||
|
)
|
||||||
|
self.assertEquals(
|
||||||
|
"keypair1",
|
||||||
|
new_keypair1.name,
|
||||||
|
"Key Pair not created with given name"
|
||||||
|
)
|
||||||
|
# Listing all the SSH Key pairs again
|
||||||
|
list_keypairs_after = SSHKeyPair.list(
|
||||||
|
self.userapiclient
|
||||||
|
)
|
||||||
|
status = validateList(list_keypairs_after)
|
||||||
|
self.assertEquals(
|
||||||
|
PASS,
|
||||||
|
status[0],
|
||||||
|
"Listing of Key pairs failed"
|
||||||
|
)
|
||||||
|
# Verifying that list size is increased by 1
|
||||||
|
self.assertEquals(
|
||||||
|
list_keypairs_before_size + 1,
|
||||||
|
len(list_keypairs_after),
|
||||||
|
"List count is not matching"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Deploying a VM with keypair 1
|
||||||
|
first_vm_created = VirtualMachine.create(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["virtual_machine"],
|
||||||
|
accountid=self.account.name,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
serviceofferingid=self.service_offering.id,
|
||||||
|
keypair=new_keypair1.name
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(
|
||||||
|
first_vm_created,
|
||||||
|
"VM creation failed"
|
||||||
|
)
|
||||||
|
# Listing all the VMs for a user again
|
||||||
|
list_vms_after = VirtualMachine.list(
|
||||||
|
self.userapiclient,id=first_vm_created.id,
|
||||||
|
listall=True,
|
||||||
|
)
|
||||||
|
status = validateList(list_vms_after)
|
||||||
|
self.assertEquals(
|
||||||
|
PASS,
|
||||||
|
status[0],
|
||||||
|
"VM creation failed"
|
||||||
|
)
|
||||||
|
vm = list_vms_after[0]
|
||||||
|
self.assertEqual(
|
||||||
|
vm.state,
|
||||||
|
"Running",
|
||||||
|
"VM state should be running after deployment")
|
||||||
|
self.assertEqual(vm.keypair , new_keypair1.name , "VM keypair name is not keypair1")
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
# Registering second key pair using same public key
|
||||||
|
new_keypair2 = SSHKeyPair.register(
|
||||||
|
self.userapiclient,
|
||||||
|
name="keypair2",
|
||||||
|
publickey="ssh-rsa: e6:9a:1e:b5:98:75:88:5d:56:bc:92:7b:43:48:05:b2")
|
||||||
|
self.fail("SSH Key creation passed using same public key ")
|
||||||
|
except CloudstackAPIException as e:
|
||||||
|
self.assertRaises("Exception Raised : %s" % e)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
class TestInstances(cloudstackTestCase):
|
class TestInstances(cloudstackTestCase):
|
||||||
|
|||||||
@ -267,4 +267,67 @@ class TestVMware(cloudstackTestCase):
|
|||||||
self.assertEqual(attachedIsoName, "vmware-tools.iso", "vmware-tools.iso not attached")
|
self.assertEqual(attachedIsoName, "vmware-tools.iso", "vmware-tools.iso not attached")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@attr(tags=["advanced", "basic"], required_hardware="true")
|
||||||
|
def test3_attach_ISO_in_RHEL7OSVM(self):
|
||||||
|
"""
|
||||||
|
@desc:Incorrect guest os mapping in vmware for Rhel7. Add a valid RHEL7 URL to execute this test case
|
||||||
|
Step1 :Register an RHEL 7 template
|
||||||
|
Step2 :Launch a VM
|
||||||
|
Step3: Try to attach VMware Tools ISO
|
||||||
|
Step4: Verify VMware tools ISO attached correctly
|
||||||
|
"""
|
||||||
|
self.hypervisor = str(get_hypervisor_type(self.api_client)).lower()
|
||||||
|
if self.hypervisor != "vmware":
|
||||||
|
self.skipTest("This test can be run only on vmware")
|
||||||
|
self.services["Rhel7template"]["url"]="http://10.147.28.7/templates/rhel71.ova",
|
||||||
|
template = Template.register(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["Rhel7template"],
|
||||||
|
zoneid=self.zone.id,
|
||||||
|
account=self.account.name,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
hypervisor=self.hypervisor
|
||||||
|
)
|
||||||
|
self.debug(
|
||||||
|
"Registered a template with format {} and id {}".format(
|
||||||
|
self.services["Rhel7template"]["format"],template.id)
|
||||||
|
)
|
||||||
|
template.download(self.userapiclient)
|
||||||
|
self.cleanup.append(template)
|
||||||
|
vm = VirtualMachine.create(
|
||||||
|
self.userapiclient,
|
||||||
|
self.services["virtual_machine"],
|
||||||
|
accountid=self.account.name,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
serviceofferingid=self.service_offering.id,
|
||||||
|
templateid=template.id,
|
||||||
|
zoneid=self.zone.id
|
||||||
|
)
|
||||||
|
self.cleanup.append(vm)
|
||||||
|
response = VirtualMachine.list(self.userapiclient,id=vm.id)
|
||||||
|
status = validateList(response)
|
||||||
|
self.assertEqual(status[0],PASS,"list vm response returned invalid list")
|
||||||
|
list_default_iso_response = list_isos(
|
||||||
|
self.api_client,
|
||||||
|
name="vmware-tools.iso",
|
||||||
|
account="system",
|
||||||
|
isready="true"
|
||||||
|
)
|
||||||
|
status = validateList(list_default_iso_response)
|
||||||
|
self.assertEquals(
|
||||||
|
PASS,
|
||||||
|
status[0],
|
||||||
|
"ISO list is empty")
|
||||||
|
self.debug(
|
||||||
|
"Registered a ISO with name {}".format(list_default_iso_response[0].name))
|
||||||
|
try:
|
||||||
|
vm.attach_iso(self.userapiclient,list_default_iso_response[0])
|
||||||
|
except CloudstackAPIException as e:
|
||||||
|
self.fail("Attached ISO failed : %s" % e)
|
||||||
|
response = VirtualMachine.list(self.userapiclient, id=vm.id)
|
||||||
|
status = validateList(response)
|
||||||
|
self.assertEqual(status[0], PASS,"list vm response returned invalid list")
|
||||||
|
attachedIsoName=response[0].isoname;
|
||||||
|
self.assertEqual(attachedIsoName, "vmware-tools.iso", "vmware-tools.iso not attached")
|
||||||
|
return
|
||||||
|
|
||||||
|
|||||||
@ -45,7 +45,7 @@ from marvin.lib.common import (get_zone,
|
|||||||
|
|
||||||
from marvin.lib.utils import cleanup_resources
|
from marvin.lib.utils import cleanup_resources
|
||||||
import random
|
import random
|
||||||
|
import time
|
||||||
|
|
||||||
class Services:
|
class Services:
|
||||||
"""Test Resource creation Services
|
"""Test Resource creation Services
|
||||||
@ -626,13 +626,15 @@ class TestTemplates(cloudstackTestCase):
|
|||||||
return
|
return
|
||||||
|
|
||||||
@attr(tags=["advanced", "basic", "sg", "eip", "advancedns"], required_hardware="false")
|
@attr(tags=["advanced", "basic", "sg", "eip", "advancedns"], required_hardware="false")
|
||||||
def test_04_public_template_use_in_project(self):
|
def test_04_public_private_template_use_in_project(self):
|
||||||
"""Test Templates creation in projects
|
"""Test Templates creation in projects
|
||||||
"""
|
"""
|
||||||
# 1. Create a project
|
# 1. Create a project
|
||||||
# 2. Verify Public templates can be used without any restriction
|
# 2. Verify Public templates can be used without any restriction
|
||||||
# 3. Verify that template created in project can be used in project
|
# 3. Verify that private template created in project belongs to this project
|
||||||
# without any restrictions
|
# Verify that list template api wth project id list this template
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.debug("Deploying VM for with public template: %s" %
|
self.debug("Deploying VM for with public template: %s" %
|
||||||
@ -682,6 +684,11 @@ class TestTemplates(cloudstackTestCase):
|
|||||||
True,
|
True,
|
||||||
"Check Template is in ready state or not"
|
"Check Template is in ready state or not"
|
||||||
)
|
)
|
||||||
|
# Verify list template with project id is listing this template
|
||||||
|
templatelist = Template.list(self.apiclient,projectid=self.project.id,id=template_1.id,templatefilter="all")
|
||||||
|
self.assertEqual(templatelist[0].id,template_1.id,"template created does not belong to the project")
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.fail("Exception occured: %s" % e)
|
self.fail("Exception occured: %s" % e)
|
||||||
return
|
return
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
from nose.plugins.attrib import attr
|
from nose.plugins.attrib import attr
|
||||||
from marvin.cloudstackTestCase import cloudstackTestCase, unittest
|
from marvin.cloudstackTestCase import cloudstackTestCase, unittest
|
||||||
from marvin.cloudstackAPI import deleteVolume
|
from marvin.cloudstackAPI import deleteVolume
|
||||||
from marvin.lib.utils import (cleanup_resources)
|
from marvin.lib.utils import (cleanup_resources, validateList)
|
||||||
from marvin.lib.base import (Project,
|
from marvin.lib.base import (Project,
|
||||||
VirtualMachine,
|
VirtualMachine,
|
||||||
Account,
|
Account,
|
||||||
@ -35,14 +35,17 @@ from marvin.lib.base import (Project,
|
|||||||
DiskOffering,
|
DiskOffering,
|
||||||
LoadBalancerRule,
|
LoadBalancerRule,
|
||||||
Template,
|
Template,
|
||||||
Iso)
|
Iso,
|
||||||
|
VmSnapshot)
|
||||||
from marvin.lib.common import (get_domain,
|
from marvin.lib.common import (get_domain,
|
||||||
get_zone,
|
get_zone,
|
||||||
get_template,
|
get_template,
|
||||||
list_volumes,
|
list_volumes,
|
||||||
get_builtin_template_info,
|
get_builtin_template_info,
|
||||||
find_storage_pool_type)
|
find_storage_pool_type
|
||||||
|
)
|
||||||
import time
|
import time
|
||||||
|
from marvin.codes import PASS
|
||||||
|
|
||||||
class Services:
|
class Services:
|
||||||
"""Test Snapshots Services
|
"""Test Snapshots Services
|
||||||
@ -67,8 +70,8 @@ class Services:
|
|||||||
"name": "Tiny Instance",
|
"name": "Tiny Instance",
|
||||||
"displaytext": "Tiny Instance",
|
"displaytext": "Tiny Instance",
|
||||||
"cpunumber": 1,
|
"cpunumber": 1,
|
||||||
"cpuspeed": 100, # in MHz
|
"cpuspeed": 256, # in MHz
|
||||||
"memory": 128, # In MBs
|
"memory": 256, # In MBs
|
||||||
},
|
},
|
||||||
"disk_offering": {
|
"disk_offering": {
|
||||||
"displaytext": "Small",
|
"displaytext": "Small",
|
||||||
@ -142,14 +145,14 @@ class TestVmUsage(cloudstackTestCase):
|
|||||||
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
||||||
cls.services['mode'] = cls.zone.networktype
|
cls.services['mode'] = cls.zone.networktype
|
||||||
|
|
||||||
template = get_template(
|
cls.template = get_template(
|
||||||
cls.api_client,
|
cls.api_client,
|
||||||
cls.zone.id,
|
cls.zone.id,
|
||||||
cls.services["ostype"]
|
cls.services["ostype"]
|
||||||
)
|
)
|
||||||
cls.services["server"]["zoneid"] = cls.zone.id
|
cls.services["server"]["zoneid"] = cls.zone.id
|
||||||
|
|
||||||
cls.services["template"] = template.id
|
cls.services["template"] = cls.template.id
|
||||||
|
|
||||||
# Create Account, VMs etc
|
# Create Account, VMs etc
|
||||||
cls.account = Account.create(
|
cls.account = Account.create(
|
||||||
@ -171,13 +174,7 @@ class TestVmUsage(cloudstackTestCase):
|
|||||||
cls.api_client,
|
cls.api_client,
|
||||||
cls.services["service_offering"]
|
cls.services["service_offering"]
|
||||||
)
|
)
|
||||||
cls.virtual_machine = VirtualMachine.create(
|
|
||||||
cls.api_client,
|
|
||||||
cls.services["server"],
|
|
||||||
templateid=template.id,
|
|
||||||
serviceofferingid=cls.service_offering.id,
|
|
||||||
projectid=cls.project.id
|
|
||||||
)
|
|
||||||
cls._cleanup = [
|
cls._cleanup = [
|
||||||
cls.project,
|
cls.project,
|
||||||
cls.service_offering,
|
cls.service_offering,
|
||||||
@ -213,6 +210,7 @@ class TestVmUsage(cloudstackTestCase):
|
|||||||
"""Test Create/Destroy VM and verify usage calculation
|
"""Test Create/Destroy VM and verify usage calculation
|
||||||
"""
|
"""
|
||||||
# Validate the following
|
# Validate the following
|
||||||
|
# Validate 'listProjects' return tags 'vmstopped' or 'vmrunning' when their value is zero
|
||||||
# 1. Create a VM. Verify usage_events table contains VM .create,
|
# 1. Create a VM. Verify usage_events table contains VM .create,
|
||||||
# VM.start , Network.offering.assign , Volume.create events
|
# VM.start , Network.offering.assign , Volume.create events
|
||||||
# 2. Stop the VM. Verify usage_events table contains
|
# 2. Stop the VM. Verify usage_events table contains
|
||||||
@ -221,10 +219,38 @@ class TestVmUsage(cloudstackTestCase):
|
|||||||
# VM.Destroy and volume .delete Event for the created account
|
# VM.Destroy and volume .delete Event for the created account
|
||||||
# 4. Delete the account
|
# 4. Delete the account
|
||||||
|
|
||||||
|
projectlist=Project.list(self.apiclient,account=self.account.name,
|
||||||
|
domainid=self.account.domainid,id=self.project.id)
|
||||||
|
self.assertEqual(hasattr(projectlist[0],"vmrunning"), True ,
|
||||||
|
"vmrunningattribute is not returned in list project api ")
|
||||||
|
self.assertEqual(projectlist[0].vmrunning,0,"vmrunning value is not returned")
|
||||||
|
self.assertEqual(hasattr(projectlist[0], "vmrunning"), True,
|
||||||
|
"vmrunningattribute is not returned in list project api ")
|
||||||
|
self.assertEqual(projectlist[0].vmstopped,0,"vmstopped value is not returned")
|
||||||
|
|
||||||
|
self.virtual_machine = VirtualMachine.create(
|
||||||
|
self.apiclient,
|
||||||
|
self.services["server"],
|
||||||
|
templateid=self.template.id,
|
||||||
|
serviceofferingid=self.service_offering.id,
|
||||||
|
projectid=self.project.id
|
||||||
|
)
|
||||||
|
|
||||||
|
projectlist=Project.list(self.apiclient,account=self.account.name,
|
||||||
|
domainid=self.account.domainid,id=self.project.id)
|
||||||
|
|
||||||
|
self.assertEqual(projectlist[0].vmrunning,1,"vmrunning value is not returned")
|
||||||
|
self.assertEqual(projectlist[0].vmstopped,0,"vmstopped value is not returned")
|
||||||
try:
|
try:
|
||||||
self.debug("Stopping the VM: %s" % self.virtual_machine.id)
|
self.debug("Stopping the VM: %s" % self.virtual_machine.id)
|
||||||
# Stop the VM
|
# Stop the VM
|
||||||
self.virtual_machine.stop(self.apiclient)
|
self.virtual_machine.stop(self.apiclient)
|
||||||
|
projectlist=Project.list(self.apiclient,account=self.account.name,
|
||||||
|
domainid=self.account.domainid,id=self.project.id)
|
||||||
|
|
||||||
|
self.assertEqual(projectlist[0].vmrunning,0,"vmrunning value is not returned")
|
||||||
|
self.assertEqual(projectlist[0].vmstopped,1,"vmstopped value is not returned")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.fail("Failed to stop VM: %s" % e)
|
self.fail("Failed to stop VM: %s" % e)
|
||||||
|
|
||||||
@ -308,6 +334,8 @@ class TestVmUsage(cloudstackTestCase):
|
|||||||
"Check VM.STOP in events table"
|
"Check VM.STOP in events table"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
qresult.count('NETWORK.OFFERING.REMOVE'),
|
qresult.count('NETWORK.OFFERING.REMOVE'),
|
||||||
1,
|
1,
|
||||||
@ -1819,3 +1847,183 @@ class TestVpnUsage(cloudstackTestCase):
|
|||||||
"Check VPN.USER.ADD in events table"
|
"Check VPN.USER.ADD in events table"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
class TestVMSnapshotUsage(cloudstackTestCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
cls.testClient = super(TestVMSnapshotUsage, cls).getClsTestClient()
|
||||||
|
cls.api_client = cls.testClient.getApiClient()
|
||||||
|
cls.hypervisor = cls.testClient.getHypervisorInfo()
|
||||||
|
cls.snapshotSupported = True
|
||||||
|
cls._cleanup = []
|
||||||
|
if cls.hypervisor.lower() in ['hyperv', 'lxc', 'kvm','baremetal']:
|
||||||
|
cls.snapshotSupported = False
|
||||||
|
return
|
||||||
|
cls.services = Services().services
|
||||||
|
# Get Zone, Domain and templates
|
||||||
|
cls.domain = get_domain(cls.api_client)
|
||||||
|
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
||||||
|
cls.services['mode'] = cls.zone.networktype
|
||||||
|
cls.hypervisor = cls.testClient.getHypervisorInfo()
|
||||||
|
template = get_template(
|
||||||
|
cls.api_client,
|
||||||
|
cls.zone.id,
|
||||||
|
cls.services["ostype"]
|
||||||
|
)
|
||||||
|
cls.services["server"]["zoneid"] = cls.zone.id
|
||||||
|
|
||||||
|
cls.services["template"] = template.id
|
||||||
|
|
||||||
|
# Create Account, VMs etc
|
||||||
|
cls.account = Account.create(
|
||||||
|
cls.api_client,
|
||||||
|
cls.services["account"],
|
||||||
|
domainid=cls.domain.id
|
||||||
|
)
|
||||||
|
|
||||||
|
cls.services["account"] = cls.account.name
|
||||||
|
|
||||||
|
cls.project = Project.create(
|
||||||
|
cls.api_client,
|
||||||
|
cls.services["project"],
|
||||||
|
account=cls.account.name,
|
||||||
|
domainid=cls.account.domainid
|
||||||
|
)
|
||||||
|
|
||||||
|
cls.service_offering = ServiceOffering.create(
|
||||||
|
cls.api_client,
|
||||||
|
cls.services["service_offering"]
|
||||||
|
)
|
||||||
|
cls.virtual_machine = VirtualMachine.create(
|
||||||
|
cls.api_client,
|
||||||
|
cls.services["server"],
|
||||||
|
templateid=template.id,
|
||||||
|
serviceofferingid=cls.service_offering.id,
|
||||||
|
projectid=cls.project.id
|
||||||
|
)
|
||||||
|
cls._cleanup = [
|
||||||
|
cls.project,
|
||||||
|
cls.service_offering,
|
||||||
|
cls.account,
|
||||||
|
]
|
||||||
|
return
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
try:
|
||||||
|
#Cleanup resources used
|
||||||
|
cleanup_resources(cls.api_client, cls._cleanup)
|
||||||
|
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 = []
|
||||||
|
if not self.snapshotSupported:
|
||||||
|
self.skipTest("Snapshots are not supported on %s" % self.hypervisor)
|
||||||
|
return
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
try:
|
||||||
|
#Clean up, terminate the created instance and snapshots
|
||||||
|
cleanup_resources(self.apiclient, self.cleanup)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
@attr(tags=["advanced", "basic"])
|
||||||
|
def test_01_vmsnapshot_usage(self):
|
||||||
|
"""Test Create/Delete a manual snap shot and verify
|
||||||
|
correct usage is recorded
|
||||||
|
"""
|
||||||
|
# Validate the following
|
||||||
|
# 1. Create vmsnapshot of the VM for this account. vm.Snapshot.create
|
||||||
|
# event is there for the created account in cloud.usage_event table
|
||||||
|
# 2. Destroy the snapshot after some time. vm.Snapshot.delete event is
|
||||||
|
# generated for the destroyed Snapshot
|
||||||
|
# 3. Delete the account
|
||||||
|
|
||||||
|
vmsnapshot=VmSnapshot.create(self.apiclient,self.virtual_machine.id,snapshotmemory="true")
|
||||||
|
vmsnap = VmSnapshot.list(
|
||||||
|
self.apiclient,
|
||||||
|
projectid=self.project.id,
|
||||||
|
type='ROOT',
|
||||||
|
listall=True
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
isinstance(vmsnap, list),
|
||||||
|
True,
|
||||||
|
"Check if list volumes return a valid data"
|
||||||
|
)
|
||||||
|
self.assertEqual(vmsnapshot.projectid, self.project.id, "check if list vmsnapshot api returns projectid")
|
||||||
|
self.assertEqual(vmsnapshot.project, self.project.name,"check if list vmsnapshot returns project name")
|
||||||
|
|
||||||
|
# Delete snapshot Rule
|
||||||
|
self.debug("Deleting vmsnapshot: %s" % vmsnapshot.id)
|
||||||
|
VmSnapshot.deleteVMSnapshot(self.apiclient,vmsnapshot.id)
|
||||||
|
|
||||||
|
|
||||||
|
# Fetch project account ID from project UUID
|
||||||
|
self.debug(
|
||||||
|
"select project_account_id from projects where uuid = '%s';" \
|
||||||
|
% self.project.id)
|
||||||
|
|
||||||
|
qresultset = self.dbclient.execute(
|
||||||
|
"select project_account_id from projects where uuid = '%s';" \
|
||||||
|
% self.project.id
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
isinstance(qresultset, list),
|
||||||
|
True,
|
||||||
|
"Check DB query result set for valid data"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertNotEqual(
|
||||||
|
len(qresultset),
|
||||||
|
0,
|
||||||
|
"Check DB Query result set"
|
||||||
|
)
|
||||||
|
qresult = qresultset[0]
|
||||||
|
|
||||||
|
account_id = qresult[0]
|
||||||
|
self.debug("select type from usage_event where account_id = '%s';" \
|
||||||
|
% account_id)
|
||||||
|
|
||||||
|
qresultset = self.dbclient.execute(
|
||||||
|
"select type from usage_event where account_id = '%s';" \
|
||||||
|
% account_id
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
isinstance(qresultset, list),
|
||||||
|
True,
|
||||||
|
"Check if database query returns a valid data"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertNotEqual(
|
||||||
|
len(qresultset),
|
||||||
|
0,
|
||||||
|
"Check DB Query result set"
|
||||||
|
)
|
||||||
|
|
||||||
|
qresult = str(qresultset)
|
||||||
|
self.debug("Query Result: %s" % qresult)
|
||||||
|
|
||||||
|
# Check for VM.SNAPSHOT.CREATE, VM.SNAPSHOT.DELETE events in cloud.usage_event
|
||||||
|
# table
|
||||||
|
self.assertEqual(
|
||||||
|
qresult.count('VMSNAPSHOT.CREATE'),
|
||||||
|
1,
|
||||||
|
"Check VM.SNAPSHOT.CREATE event in events table"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
qresult.count('VMSNAPSHOT.DELETE'),
|
||||||
|
1,
|
||||||
|
"Check VM.SNAPSHOT.DELETE in events table"
|
||||||
|
)
|
||||||
|
return
|
||||||
@ -20,7 +20,7 @@
|
|||||||
from nose.plugins.attrib import attr
|
from nose.plugins.attrib import attr
|
||||||
from marvin.cloudstackTestCase import cloudstackTestCase, unittest
|
from marvin.cloudstackTestCase import cloudstackTestCase, unittest
|
||||||
from marvin.cloudstackAPI import deleteVolume
|
from marvin.cloudstackAPI import deleteVolume
|
||||||
from marvin.lib.utils import (cleanup_resources)
|
from marvin.lib.utils import (cleanup_resources,get_hypervisor_type)
|
||||||
from marvin.lib.base import (Account,
|
from marvin.lib.base import (Account,
|
||||||
ServiceOffering,
|
ServiceOffering,
|
||||||
NATRule,
|
NATRule,
|
||||||
@ -491,6 +491,7 @@ class TestVolumeUsage(cloudstackTestCase):
|
|||||||
cls.api_client = cls.testClient.getApiClient()
|
cls.api_client = cls.testClient.getApiClient()
|
||||||
|
|
||||||
cls.services = Services().services
|
cls.services = Services().services
|
||||||
|
cls.testdata = cls.testClient.getParsedTestDataConfig()
|
||||||
# Get Zone, Domain and templates
|
# Get Zone, Domain and templates
|
||||||
cls.domain = get_domain(cls.api_client)
|
cls.domain = get_domain(cls.api_client)
|
||||||
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
||||||
@ -573,9 +574,8 @@ class TestVolumeUsage(cloudstackTestCase):
|
|||||||
"basic",
|
"basic",
|
||||||
"sg",
|
"sg",
|
||||||
"eip",
|
"eip",
|
||||||
"advancedns",
|
"advancedns"],
|
||||||
"simulator"],
|
required_hardware="true")
|
||||||
required_hardware="false")
|
|
||||||
def test_01_volume_usage(self):
|
def test_01_volume_usage(self):
|
||||||
"""Test Create/delete a volume and verify correct usage is recorded
|
"""Test Create/delete a volume and verify correct usage is recorded
|
||||||
"""
|
"""
|
||||||
@ -586,6 +586,11 @@ class TestVolumeUsage(cloudstackTestCase):
|
|||||||
# 3. Detach the data disk from this VM
|
# 3. Detach the data disk from this VM
|
||||||
# 4. Destroy the Data disk. Volume.delete event is generated for data
|
# 4. Destroy the Data disk. Volume.delete event is generated for data
|
||||||
# disk of the destroyed VM
|
# disk of the destroyed VM
|
||||||
|
# Upload a volume
|
||||||
|
# Verify Volume.upload event in usage table
|
||||||
|
# attach the uploaded volume to a VM
|
||||||
|
# Verify Volume.create Event is there for the attached volume
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Stop VM
|
# Stop VM
|
||||||
@ -674,6 +679,127 @@ class TestVolumeUsage(cloudstackTestCase):
|
|||||||
1,
|
1,
|
||||||
"Check VOLUME.DELETE in events table"
|
"Check VOLUME.DELETE in events table"
|
||||||
)
|
)
|
||||||
|
self.hypervisor = str(get_hypervisor_type(self.apiclient)).lower()
|
||||||
|
if self.hypervisor == "vmware":
|
||||||
|
self.testdata["coreos_volume"][
|
||||||
|
"url"] = self.testdata["coreos_volume"]["urlvmware"]
|
||||||
|
self.testdata["coreos_volume"]["format"] = "OVA"
|
||||||
|
elif self.hypervisor == "xenserver":
|
||||||
|
self.testdata["coreos_volume"][
|
||||||
|
"url"] = self.testdata["coreos_volume"]["urlxen"]
|
||||||
|
self.testdata["coreos_volume"]["format"] = "VHD"
|
||||||
|
elif self.hypervisor == "kvm":
|
||||||
|
self.testdata["coreos_volume"][
|
||||||
|
"url"] = self.testdata["coreos_volume"]["urlkvm"]
|
||||||
|
self.testdata["coreos_volume"]["format"] = "QCOW2"
|
||||||
|
elif self.hypervisor == "hyperv":
|
||||||
|
self.testdata["coreos_volume"][
|
||||||
|
"url"] = self.testdata["coreos_volume"]["urlxen"]
|
||||||
|
self.testdata["coreos_volume"]["format"] = "VHD"
|
||||||
|
|
||||||
|
volume_uploaded = Volume.upload(
|
||||||
|
self.apiclient,
|
||||||
|
self.testdata["coreos_volume"],
|
||||||
|
self.zone.id,
|
||||||
|
account=self.account.name,
|
||||||
|
domainid=self.account.domainid)
|
||||||
|
self.assertIsNotNone(volume_uploaded, "Volume creation failed")
|
||||||
|
volume_uploaded.wait_for_upload(self.apiclient)
|
||||||
|
# Fetch volume ID from volume_uuid
|
||||||
|
self.debug("select id from volumes where uuid = '%s';"
|
||||||
|
% volume_uploaded.id)
|
||||||
|
|
||||||
|
qresultset = self.dbclient.execute(
|
||||||
|
"select id from volumes where uuid = '%s';"
|
||||||
|
% volume_uploaded.id
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
isinstance(qresultset, list),
|
||||||
|
True,
|
||||||
|
"Check DB query result set for valid data"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertNotEqual(
|
||||||
|
len(qresultset),
|
||||||
|
0,
|
||||||
|
"Check DB Query result set"
|
||||||
|
)
|
||||||
|
qresult = qresultset[0]
|
||||||
|
|
||||||
|
volume_id = qresult[0]
|
||||||
|
|
||||||
|
self.debug("select type from usage_event where volume_id = '%s';"
|
||||||
|
% volume_id)
|
||||||
|
|
||||||
|
qresultset = self.dbclient.execute(
|
||||||
|
"select type from usage_event where resource_id = '%s';"
|
||||||
|
% volume_id
|
||||||
|
)
|
||||||
|
self.assertNotEqual(
|
||||||
|
len(qresultset),
|
||||||
|
0,
|
||||||
|
"Check DB Query result set"
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
isinstance(qresultset, list),
|
||||||
|
True,
|
||||||
|
"Check DB query result set for valid data"
|
||||||
|
)
|
||||||
|
|
||||||
|
qresult = str(qresultset)
|
||||||
|
self.debug("Query result: %s" % qresult)
|
||||||
|
# Check VOLUME.UPLOAD event in cloud.usage_event table
|
||||||
|
self.assertEqual(
|
||||||
|
qresult.count('VOLUME.UPLOAD'),
|
||||||
|
1,
|
||||||
|
"Check VOLUME.UPLOAD event in events table"
|
||||||
|
)
|
||||||
|
self.virtual_machine.start(self.apiclient)
|
||||||
|
vms = VirtualMachine.list(
|
||||||
|
self.apiclient,
|
||||||
|
id=self.virtual_machine.id,
|
||||||
|
listall=True
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
isinstance(vms, list),
|
||||||
|
True,
|
||||||
|
"List VMs should return the valid list"
|
||||||
|
)
|
||||||
|
vm = vms[0]
|
||||||
|
self.assertEqual(
|
||||||
|
vm.state,
|
||||||
|
"Running",
|
||||||
|
"VM state should be running after deployment"
|
||||||
|
)
|
||||||
|
self.virtual_machine.attach_volume(self.apiclient,volume_uploaded)
|
||||||
|
self.debug("select type from usage_event where offering_id = 6 and volume_id = '%s';"
|
||||||
|
% volume_id)
|
||||||
|
|
||||||
|
qresultset = self.dbclient.execute(
|
||||||
|
"select type from usage_event where offering_id = 6 and resource_id = '%s';"
|
||||||
|
% volume_id
|
||||||
|
)
|
||||||
|
self.assertNotEqual(
|
||||||
|
len(qresultset),
|
||||||
|
0,
|
||||||
|
"Check DB Query result set"
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
isinstance(qresultset, list),
|
||||||
|
True,
|
||||||
|
"Check DB query result set for valid data"
|
||||||
|
)
|
||||||
|
|
||||||
|
qresult = str(qresultset)
|
||||||
|
self.debug("Query result: %s" % qresult)
|
||||||
|
# Check VOLUME.CREATE event in cloud.usage_event table
|
||||||
|
self.assertEqual(
|
||||||
|
qresult.count('VOLUME.CREATE'),
|
||||||
|
1,
|
||||||
|
"Check VOLUME.CREATE event in events table"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -121,7 +121,7 @@ test_data = {
|
|||||||
"name": "LargeInstance",
|
"name": "LargeInstance",
|
||||||
"displaytext": "LargeInstance",
|
"displaytext": "LargeInstance",
|
||||||
"cpunumber": 1,
|
"cpunumber": 1,
|
||||||
"cpuspeed": 500,
|
"cpuspeed": 1024,
|
||||||
"memory": 2048,
|
"memory": 2048,
|
||||||
},
|
},
|
||||||
"hasmall": {
|
"hasmall": {
|
||||||
@ -833,6 +833,14 @@ test_data = {
|
|||||||
"ostype": "CentOS 5.6 (64-bit)"
|
"ostype": "CentOS 5.6 (64-bit)"
|
||||||
|
|
||||||
},
|
},
|
||||||
|
"coreos_volume": {
|
||||||
|
"diskname": "Volume_core",
|
||||||
|
"urlvmware":"http://dl.openvm.eu/cloudstack/coreos/x86_64/coreos_production_cloudstack_image-vmware.ova",
|
||||||
|
"urlxen":"http://dl.openvm.eu/cloudstack/coreos/x86_64/coreos_production_cloudstack_image-xen.vhd.bz2",
|
||||||
|
"urlkvm": "http://dl.openvm.eu/cloudstack/coreos/x86_64/" \
|
||||||
|
"coreos_production_cloudstack_image-kvm.qcow2.bz2",
|
||||||
|
"urlhyperv":"http://dl.openvm.eu/cloudstack/coreos/x86_64/coreos_production_cloudstack_image-hyperv.vhd.zip"
|
||||||
|
},
|
||||||
"CentOS6.3template": {
|
"CentOS6.3template": {
|
||||||
"displaytext": "Centos",
|
"displaytext": "Centos",
|
||||||
"name": "Centos",
|
"name": "Centos",
|
||||||
@ -842,6 +850,25 @@ test_data = {
|
|||||||
"format": "OVA",
|
"format": "OVA",
|
||||||
"ispublic": "true"
|
"ispublic": "true"
|
||||||
},
|
},
|
||||||
|
"CentOS7template": {
|
||||||
|
"displaytext": "Centos",
|
||||||
|
"name": "Centos",
|
||||||
|
"passwordenabled": False,
|
||||||
|
"isdynamicallyscalable":True,
|
||||||
|
"ostype": "CentOS 7",
|
||||||
|
"url": "http://dl.openvm.eu/cloudstack/centos/vanilla/7/x86_64/CentOS-7-x86_64-vanilla-xen.vhd.bz2",
|
||||||
|
"format": "VHD",
|
||||||
|
"ispublic": "true",
|
||||||
|
"hypervisor":"Xenserver"
|
||||||
|
},
|
||||||
|
"Rhel7template": {
|
||||||
|
"displaytext": "Rhel",
|
||||||
|
"name": "Rhel",
|
||||||
|
"passwordenabled": False,
|
||||||
|
"ostype": "Red Hat Enterprise Linux 7",
|
||||||
|
"format": "OVA",
|
||||||
|
"ispublic": "true"
|
||||||
|
},
|
||||||
"template_2": {
|
"template_2": {
|
||||||
"displaytext": "Public Template",
|
"displaytext": "Public Template",
|
||||||
"name": "Public template",
|
"name": "Public template",
|
||||||
@ -862,6 +889,15 @@ test_data = {
|
|||||||
"ispublic": "true",
|
"ispublic": "true",
|
||||||
"hypervisor": "XenServer"
|
"hypervisor": "XenServer"
|
||||||
},
|
},
|
||||||
|
"Windows Server 2012": {
|
||||||
|
"displaytext": "Windows Server 2012",
|
||||||
|
"name": "Windows Server 2012",
|
||||||
|
"passwordenabled": False,
|
||||||
|
"format": "OVA",
|
||||||
|
"ostype": "Windows Server 2012 (64-bit)",
|
||||||
|
"ispublic": "true",
|
||||||
|
"hypervisor": "Vmware"
|
||||||
|
},
|
||||||
"privatetemplate": {
|
"privatetemplate": {
|
||||||
"displaytext": "Public Template",
|
"displaytext": "Public Template",
|
||||||
"name": "Public template",
|
"name": "Public template",
|
||||||
|
|||||||
@ -1253,6 +1253,7 @@ class Template:
|
|||||||
"ispublic"] if "ispublic" in services else False
|
"ispublic"] if "ispublic" in services else False
|
||||||
cmd.isextractable = services[
|
cmd.isextractable = services[
|
||||||
"isextractable"] if "isextractable" in services else False
|
"isextractable"] if "isextractable" in services else False
|
||||||
|
cmd.isdynamicallyscalable=services["isdynamicallyscalable"] if "isdynamicallyscalable" in services else False
|
||||||
cmd.passwordenabled = services[
|
cmd.passwordenabled = services[
|
||||||
"passwordenabled"] if "passwordenabled" in services else False
|
"passwordenabled"] if "passwordenabled" in services else False
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user