mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Extending Config Drive support * Added support for VMware * Build configdrive.iso on ssvm * Added support for VPC and Isolated Networks * Moved implementation to new Service Provider * UI fix: add support for urlencoded userdata * Add support for building systemvm behind a proxy Co-Authored-By: Raf Smeets <raf.smeets@nuagenetworks.net> Co-Authored-By: Frank Maximus <frank.maximus@nuagenetworks.net> Co-Authored-By: Sigert Goeminne <sigert.goeminne@nuagenetworks.net>
2127 lines
81 KiB
Python
Executable File
2127 lines
81 KiB
Python
Executable File
# 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.
|
|
""" Tests for DHCP DNS offload feature
|
|
"""
|
|
from marvin.cloudstackTestCase import cloudstackTestCase, unittest
|
|
from marvin.lib.utils import (random_gen, validateList, cleanup_resources, get_hypervisor_type)
|
|
from marvin.lib.base import (Account,
|
|
NIC,
|
|
ServiceOffering,
|
|
DiskOffering,
|
|
VirtualMachine,
|
|
Network,
|
|
NetworkOffering,
|
|
Configurations,
|
|
Host,
|
|
Template,
|
|
SSHKeyPair,
|
|
Router)
|
|
from marvin.lib.common import (get_zone,
|
|
get_template,
|
|
get_domain
|
|
)
|
|
from nose.plugins.attrib import attr
|
|
from marvin.codes import PASS,FAIL
|
|
from random import randint
|
|
import random,string,time,tempfile,os,re
|
|
|
|
@unittest.skip("Skipping dhcp-dns-offload tests for now, since it requires external dhcp server")
|
|
class TestDeployVMs(cloudstackTestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.testClient = super(TestDeployVMs, cls).getClsTestClient()
|
|
cls.api_client = cls.testClient.getApiClient()
|
|
cls.services = cls.testClient.getParsedTestDataConfig()
|
|
cls.hypervisor = (get_hypervisor_type(cls.api_client)).lower()
|
|
cls._cleanup = []
|
|
cls.unsupportedHypervisor = False
|
|
if cls.hypervisor not in ["xenserver", "kvm"]:
|
|
cls.unsupportedHypervisor = True
|
|
return
|
|
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
|
cls.domain = get_domain(cls.api_client)
|
|
cls.services['mode'] = cls.zone.networktype
|
|
cls.userdata = "Deploy vm with userdata in shared network"
|
|
cls.template = get_template(
|
|
cls.api_client,
|
|
cls.zone.id,
|
|
cls.services["ostype"]
|
|
)
|
|
cls.services["virtual_machine"]["zoneid"] = cls.zone.id
|
|
cls.services["virtual_machine"]["template"] = cls.template.id
|
|
try:
|
|
cls.service_offering = ServiceOffering.create(
|
|
cls.api_client,
|
|
cls.services["service_offering"]
|
|
)
|
|
cls._cleanup.append(cls.service_offering)
|
|
cls.disk_offering = DiskOffering.create(
|
|
cls.api_client,
|
|
cls.services["disk_offering"]
|
|
)
|
|
cls._cleanup.append(cls.disk_offering)
|
|
cls.network_offering1 = NetworkOffering.create(
|
|
cls.api_client,
|
|
cls.services["nw_off_no_services"],
|
|
)
|
|
cls._cleanup.append(cls.network_offering1)
|
|
# Enable Network offering
|
|
cls.network_offering1.update(cls.api_client, state='Enabled')
|
|
cls.network_offering3 = NetworkOffering.create(
|
|
cls.api_client,
|
|
cls.services["network_offering_shared"],
|
|
)
|
|
cls._cleanup.append(cls.network_offering3)
|
|
# Enable Network offering
|
|
cls.network_offering3.update(cls.api_client, state='Enabled')
|
|
#Create shared network without any services
|
|
cls.shared_network = Network.create(
|
|
cls.api_client,
|
|
cls.services["network2"],
|
|
networkofferingid=cls.network_offering1.id,
|
|
zoneid=cls.zone.id
|
|
)
|
|
cls._cleanup.append(cls.shared_network)
|
|
#Verify network services in a created network
|
|
assert TestDeployVMs.list_nw_services(cls.shared_network.id, cls.network_offering1.id),\
|
|
"Network Services does not match with the offering services"
|
|
#Register passowrd and ssh-key reset enabled template
|
|
template = "ssh-password-template-xen" if cls.hypervisor == "xenserver" else "ssh-password-template-kvm"
|
|
cls.pwd_template = Template.register(cls.api_client,
|
|
cls.services[template],
|
|
zoneid=cls.zone.id)
|
|
cls.pwd_template.download(cls.api_client)
|
|
cls._cleanup.append(cls.pwd_template)
|
|
except Exception as e:
|
|
cls.tearDownClass()
|
|
raise e
|
|
return
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
try:
|
|
cls._cleanup = cls._cleanup[::-1]
|
|
cleanup_resources(cls.api_client, cls._cleanup)
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" % e)
|
|
|
|
def setUp(self):
|
|
self.apiclient = self.testClient.getApiClient()
|
|
self.dbclient = self.testClient.getDbConnection()
|
|
self.cleanup = []
|
|
self.tmp_files = []
|
|
if self.unsupportedHypervisor:
|
|
self.skipTest("Skipping tests because suitable hypervisors not present")
|
|
|
|
def tearDown(self):
|
|
try:
|
|
self.cleanup = self.cleanup[::-1]
|
|
cleanup_resources(self.apiclient, self.cleanup)
|
|
for tmp_file in self.tmp_files:
|
|
os.remove(tmp_file)
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" % e)
|
|
return
|
|
|
|
def getVMIPAddress(self,id):
|
|
"""
|
|
This method retrieves the IP address from a deployed vm.
|
|
"""
|
|
params = ["externaldhcp.vmip.retrieval.interval","externaldhcp.vmip.max.retry"]
|
|
offload_params = {}
|
|
for param in params:
|
|
configs = Configurations.list(
|
|
self.apiclient,
|
|
name=param,
|
|
)
|
|
self.assertEqual(validateList(configs)[0],PASS,"List config returned invalid response")
|
|
config = configs[0]
|
|
offload_params[param] = config
|
|
max_wait = int(offload_params[params[0]].value)*int(offload_params[params[1]].value)
|
|
wait = 0
|
|
status = 0
|
|
while(wait <= max_wait):
|
|
vm_res = VirtualMachine.list(self.apiclient,id=id)
|
|
self.assertEqual(validateList(vm_res)[0], PASS, "vm list returned invalid response")
|
|
for nic in vm_res[0].nic:
|
|
if nic.type == "Shared":
|
|
if nic.ipaddress is None:
|
|
time.sleep(int(offload_params[params[0]].value))
|
|
wait += int(offload_params[params[0]].value)
|
|
status = 0
|
|
break
|
|
else:
|
|
status = 1
|
|
else:
|
|
continue
|
|
if status == 1:
|
|
self.debug("CS has retrieved the vm ip address from the hypervisor")
|
|
break
|
|
return [status, vm_res[0].nic[0].ipaddress]
|
|
|
|
def list_nics(self, vm_id):
|
|
list_vm_res = VirtualMachine.list(self.apiclient, id=vm_id)
|
|
self.assertEqual(validateList(list_vm_res)[0], PASS, "List vms returned invalid response")
|
|
nics = list_vm_res[0].nic
|
|
for nic in nics:
|
|
if nic.type == "Shared":
|
|
nic_res = NIC.list(
|
|
self.apiclient,
|
|
virtualmachineid=vm_id,
|
|
nicid=nic.id
|
|
)
|
|
nic_ip = nic_res[0].ipaddress
|
|
self.assertIsNotNone(nic_ip, "listNics API response does not have the ip address")
|
|
else:
|
|
continue
|
|
return
|
|
|
|
def isConfigDriveIsoAttached(self, vm_ip):
|
|
"""
|
|
This method is to verify whether configdrive iso is attached to vm or not
|
|
Takes vm ip as the input
|
|
Returns mount path if config drive is attached else False
|
|
"""
|
|
mountdir = "/root/iso"
|
|
cmd = "blkid -t LABEL='config-2' /dev/sr? /dev/hd? /dev/sd? /dev/xvd? -o device"
|
|
try:
|
|
self.debug("SSH into VM: %s" % vm_ip)
|
|
ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
|
|
tmp_cmd = ['bash -c "if [ ! -d /root/iso ] ; then mkdir /root/iso ; fi"', "umount /root/iso"]
|
|
for tcmd in tmp_cmd:
|
|
ssh.execute(tcmd)
|
|
configDrive = ssh.execute(cmd)
|
|
res = ssh.execute("mount {} {}".format(str(configDrive[0]), mountdir))
|
|
if str(res).lower().find("mounting read-only") > -1:
|
|
self.debug("configDrive iso has been mounted at location %s" % mountdir)
|
|
return mountdir
|
|
else:
|
|
return False
|
|
except Exception as e:
|
|
self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
|
|
return False
|
|
|
|
def verifyUserData(self, vm_ip, iso_path):
|
|
"""
|
|
Connect to vm and verify Userdata
|
|
"""
|
|
userdata_path = iso_path+"/cloudstack/userdata/user_data.txt"
|
|
try:
|
|
self.debug("SSH into VM: %s" % vm_ip)
|
|
ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
|
|
cmd = "cat %s" % userdata_path
|
|
res = ssh.execute(cmd)
|
|
if str(res).lower().find(self.userdata):
|
|
self.debug("Userdata is found in the attached configDriveIso")
|
|
return True
|
|
else:
|
|
self.debug("Userdata is not found in the attached configDriveIso")
|
|
return False
|
|
except Exception as e:
|
|
self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
|
|
return False
|
|
|
|
return
|
|
|
|
def verifyPassword(self, vm_ip, iso_path):
|
|
password_file = iso_path+"/cloudstack/password/vm_password.txt"
|
|
try:
|
|
self.debug("SSH into VM: %s" % vm_ip)
|
|
ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
|
|
cmd = "cat %s" % password_file
|
|
res = ssh.execute(cmd)
|
|
if str(res).find("No such file or directory"):
|
|
self.debug("Password file is not found")
|
|
return False
|
|
elif str(res).lower().find("saved_password"):
|
|
self.debug("Reset password is not found in the attached configDriveIso")
|
|
return False
|
|
else:
|
|
self.debug("Reset Password is found in the attached configDriveIso")
|
|
return True
|
|
except Exception as e:
|
|
self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
|
|
return False
|
|
return
|
|
|
|
def verifySshKey(self, vm_ip, iso_path):
|
|
|
|
publicKey_file = iso_path+"/cloudstack/metadata/public-keys.txt"
|
|
try:
|
|
self.debug("SSH into VM: %s" % vm_ip)
|
|
ssh = self.vm.get_ssh_client(ipaddress=vm_ip)
|
|
cmd = "cat %s" % publicKey_file
|
|
res = ssh.execute(cmd)
|
|
if str(res).lower().find("saved_password"):
|
|
self.debug("Public Key is found in the attached configDriveIso")
|
|
return True
|
|
else:
|
|
self.debug("Public Key is not found in the attached configDriveIso")
|
|
return False
|
|
except Exception as e:
|
|
self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
|
|
return False
|
|
return
|
|
|
|
def getVMMetaData(self, vm_ip, iso_path):
|
|
|
|
metadata_dir = iso_path+"/cloudstack/metadata/"
|
|
try:
|
|
response = {}
|
|
self.debug("SSH into VM: %s" % vm_ip)
|
|
ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
|
|
vm_files = ["availability-zone.txt", "instance-id.txt", "service-offering.txt", "vm-id.txt"]
|
|
for file in vm_files:
|
|
cmd = "cat %s" % metadata_dir+file
|
|
res = ssh.execute(cmd)
|
|
response[file] = res
|
|
except Exception as e:
|
|
self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
|
|
return response
|
|
|
|
def verifyMetaData(self, metadata):
|
|
|
|
metadata_files = ["availability-zone.txt", "instance-id.txt", "service-offering.txt", "vm-id.txt"]
|
|
for mfile in metadata_files:
|
|
if mfile not in metadata:
|
|
self.fail("{} file is not found in vm metadata".format(mfile))
|
|
self.assertEqual(
|
|
str(metadata["availability-zone.txt"][0]),
|
|
self.zone.name,
|
|
"Zone name inside metadata does not match with the zone"
|
|
)
|
|
self.assertEqual(
|
|
str(metadata["instance-id.txt"][0]),
|
|
self.vm.instancename,
|
|
"vm name inside metadata does not match with the instance name"
|
|
)
|
|
self.assertEqual(
|
|
str(metadata["service-offering.txt"][0]),
|
|
self.vm.serviceofferingname,
|
|
"Service offering inside metadata does not match with the instance offering"
|
|
)
|
|
qresultset = self.dbclient.execute(
|
|
"select id from vm_instance where instance_name='%s';" % \
|
|
self.vm.instancename)
|
|
self.assertEqual(validateList(qresultset)[0], PASS, "sql query returned invalid response")
|
|
self.assertEqual(
|
|
metadata["vm-id.txt"][0],
|
|
unicode(qresultset[0][0]),
|
|
"vm id in metadata does not match with the vm id from cloud db"
|
|
)
|
|
return
|
|
|
|
def generate_ssh_keys(self):
|
|
"""
|
|
This method generates ssh key pair and writes the private key into a temp file and returns the file name
|
|
"""
|
|
self.keypair = SSHKeyPair.create(
|
|
self.apiclient,
|
|
name=random_gen() + ".pem",
|
|
account="admin",
|
|
domainid=1
|
|
)
|
|
self.debug("Created keypair with name: %s" % self.keypair.name)
|
|
self.debug("Writing the private key to local file")
|
|
keyPairFilePath = tempfile.gettempdir() + os.sep + self.keypair.name
|
|
self.tmp_files.append(keyPairFilePath)
|
|
self.debug("File path: %s" % keyPairFilePath)
|
|
f = open(keyPairFilePath, "w+")
|
|
f.write(self.keypair.privatekey)
|
|
f.close()
|
|
os.system("chmod 400 " + keyPairFilePath)
|
|
return keyPairFilePath
|
|
|
|
def verifyIPFetchEvent(self, ipaddr):
|
|
|
|
id = self.dbclient.execute(
|
|
"select instance_id,id from nics where ip4_address='%s' and removed is null;" % ipaddr
|
|
)
|
|
self.assertEqual(
|
|
validateList(id)[0],
|
|
PASS,
|
|
"sql query to select nic id returned invalid response"
|
|
)
|
|
qresultset = self.dbclient.execute(
|
|
"select description from event where type='EXTERNAL.DHCP.VM.IP.FETCH' order by id desc limit 1;"
|
|
)
|
|
self.assertEqual(
|
|
validateList(qresultset)[0],
|
|
PASS,
|
|
"sql query for IP Fetch event returned invalid response"
|
|
)
|
|
return True if re.search("VM %s nic id %s ip address %s got fetched successfully" % \
|
|
(id[0][0], id[0][1], ipaddr), str(qresultset[0])) else False
|
|
|
|
def umountConfigDrive(self, vm_ip, iso_path):
|
|
"""umount config drive iso attached inside guest vm"""
|
|
try:
|
|
self.debug("SSH into VM: %s" % vm_ip)
|
|
ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
|
|
ssh.execute("umount %s" % iso_path)
|
|
except Exception as e:
|
|
self.debug("SSH access failed for vm")
|
|
|
|
@classmethod
|
|
def list_nw_services(cls, nw_id, nw_off_id):
|
|
"""
|
|
Verify network services in a network. List of services supported should be as per the
|
|
network offering with which it has been created.
|
|
return True if created network and network offering has same services else False
|
|
"""
|
|
nw_response = Network.list(cls.api_client, id = nw_id)
|
|
assert validateList(nw_response)[0] == PASS, "list networks returned invalid response"
|
|
nw_services = [service.name for service in nw_response[0].service]
|
|
nw_off_res = NetworkOffering.list(cls.api_client, id = nw_off_id)
|
|
assert validateList(nw_off_res)[0] == PASS, "list network offerings returned invalid response"
|
|
nw_off_services = [service.name for service in nw_off_res[0].service]
|
|
if len(nw_services) == len(nw_off_services) and len(nw_services) == 0:
|
|
return True
|
|
elif len(nw_services) != len(nw_off_services):
|
|
return False
|
|
for srv in nw_services:
|
|
if srv not in nw_off_services:
|
|
return False
|
|
return True
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_01_createNetworks_TC3(self):
|
|
|
|
"""
|
|
Create shared networks with all the network offerings created in the setupClass method
|
|
"""
|
|
nw_offs = [self.network_offering3]
|
|
vlan = self.services["network2"]["vlan"]
|
|
name = self.services["network2"]["name"]
|
|
for nw_off in nw_offs:
|
|
self.services["network2"]["name"]="SharedNetwork%s" % randint(1, 10)
|
|
try:
|
|
self.services["network2"]["vlan"] += 1
|
|
self.shared_network = Network.create(
|
|
self.apiclient,
|
|
self.services["network2"],
|
|
networkofferingid=nw_off.id,
|
|
zoneid=self.zone.id
|
|
)
|
|
self.cleanup.append(self.shared_network)
|
|
self.assertTrue(
|
|
TestDeployVMs.list_nw_services(self.shared_network.id, nw_off.id),
|
|
"Network services not matched with network offering services"
|
|
)
|
|
except Exception as e:
|
|
self.fail("Shared network creation with network offering %s failed with error: %s" % (nw_off, e))
|
|
self.services["network2"]["vlan"] = vlan
|
|
self.services["network2"]["name"] = name
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_02_deployVM_nw_without_services_TC6(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm in that network
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
#Verify config drive is attached to vm or not
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_03_deployVM_with_userdata_TC7(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with userdata in the above network
|
|
3.Verify vm deployment
|
|
4.Verify IP Address retrieval
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation with userdata failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
#Verify config drive is attached to vm or not
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_04_deploy_win_VM_with_userdata_TC8(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy windows vm in the above network
|
|
3.Verify IP address retrieval
|
|
"""
|
|
self.skipTest("Skip windows tests for now")
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.shared_network = Network.create(
|
|
self.apiclient,
|
|
self.services["network2"],
|
|
networkofferingid=self.network_offering1.id,
|
|
zoneid=self.zone.id
|
|
)
|
|
self.cleanup.append(self.shared_network)
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.win_template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"FAIL:VM Creation failed with windows template in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm_id)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_06_deployVM_with_userdata_TC11(self):
|
|
"""
|
|
1.Create shared network with DHCP,DNS and userdata services provided by VR
|
|
2.Deploy vm in that network
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
"""
|
|
vlan = self.services["network2"]["vlan"]
|
|
self.services["network2"]["vlan"] += 1
|
|
self.shared_network = Network.create(
|
|
self.apiclient,
|
|
self.services["network2"],
|
|
networkofferingid=self.network_offering3.id,
|
|
zoneid=self.zone.id
|
|
)
|
|
self.cleanup.append(self.shared_network)
|
|
self.services["network2"]["vlan"] = vlan
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm with in a shared network with DHCP and userdata services provided by VR"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#To make sure that vm got the ip address as part of the cs allocation process check user_ip_address table
|
|
#for allocated state for the assigned ip address
|
|
qresultset = self.dbclient.execute(
|
|
"select allocated from user_ip_address where public_ip_address='%s' and removed is null;" % \
|
|
self.vm.nic[0].ipaddress)
|
|
self.assertEqual(validateList(qresultset)[0],PASS,"sql query returned invalid response")
|
|
self.assertNotEqual(
|
|
qresultset[0],
|
|
'NULL',
|
|
"VM didn't get ip address as part of CS IP allocation process\
|
|
It might have got from external dhcp server in that network")
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_07_deployVM_with_userdata_VR_TC12(self):
|
|
"""
|
|
1.Create shared network with only userdata service and VR as the provider
|
|
2.Verify that network offering creation should fail
|
|
"""
|
|
try:
|
|
self.network_offering4 = NetworkOffering.create(
|
|
self.api_client,
|
|
self.services["nw_off_userdata_VR"],
|
|
)
|
|
self.fail("NO creation with vr as the userdata provider should not be allowed\
|
|
since VR in not the dhcp provider")
|
|
except Exception as e:
|
|
self.debug("NO creation failed as expected with error message %s" % e)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_09_StopStartVMAndGetVMIpAddress_TC16(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval and userdata
|
|
5.Stop start vm and repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm stop/start
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm stop start"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed in vm deployment"
|
|
)
|
|
#Stop/Start VM and verify the IP address retrieval
|
|
self.vm.stop(self.apiclient)
|
|
self.vm.start(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm stop start"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm stop start"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm stop start"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_10_RebootVMAndGetVMIpAddress_TC17(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval and userdata
|
|
5.Reboot vm and repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm reboot
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before reboot"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed while deploying"
|
|
)
|
|
#Reboot VM and verify the IP address retrieval
|
|
self.vm.reboot(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm reboot"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm reboot"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm reboot"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_11_DestroyVMAndGetVMIpAddress_TC18(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval and userdata
|
|
5.Destroy,restore vm and repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm destroy
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before destroy"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed while deploying"
|
|
)
|
|
#Destroy VM and verify the IP address retrieval
|
|
self.vm.delete(self.apiclient,expunge=False)
|
|
self.vm.recover(self.apiclient)
|
|
self.vm.start(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm reboot"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm reboot"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm reboot"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_12_ReInstallVMAndGetVMIpAddress_TC19(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval and userdata
|
|
5.Reinstall vm to same template and repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm reinstall
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before reinstall"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr,configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed while deploying"
|
|
)
|
|
#Reinstall VM and verify the IP address retrieval
|
|
self.vm.restore(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm reinstall"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm reinstall"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm reinstall"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_13_MigrateVMAndGetVMIpAddress_TC20(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval and userdata
|
|
5.Live Migrate vm to another host in the cluster and repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before live migrate"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed while deploying"
|
|
)
|
|
self.umountConfigDrive(ip_addr, configDrive_iso)
|
|
hosts = Host.listForMigration(self.apiclient,virtualmachineid=self.vm.id)
|
|
self.assertEqual(validateList(hosts)[0], PASS, "Find hosts for migration returned invalid response")
|
|
if len(hosts) < 1:
|
|
self.skipTest("No suitable hosts found for vm migration..so skipping test")
|
|
hostid = hosts[0].id
|
|
self.vm.migrate(self.apiclient,hostid=hostid)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm live migrate"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm live migrate"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm live migrate"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_14_VM_with_password_enabled_template_TC24(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with password enabled template
|
|
3.Verify accessing vm with the CS generated password
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.pwd_template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services with password enabled template"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
try:
|
|
self.debug("SSHing into VM: %s" % ip_addr)
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
|
|
except Exception as e:
|
|
self.fail("SSH into VM: %s failed with new password: %s" %
|
|
(self.vm.ssh_ip, e))
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_15_reset_password_TC27(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with password enabled template
|
|
3.Reset password
|
|
4.Verify accessing vm with the new password
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.pwd_template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
self.vm.stop(self.apiclient)
|
|
self.debug("Resetting VM password for VM: %s" % self.vm.name)
|
|
self.vm_password = self.vm.resetPassword(self.apiclient)
|
|
self.debug("Password reset to: %s" % self.vm_password)
|
|
self.debug("Starting VM to verify new password..")
|
|
self.vm.start(self.apiclient)
|
|
self.debug("VM - %s stated!" % self.vm.name)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
try:
|
|
self.debug("SSHing into VM: %s" % ip_addr)
|
|
self.vm.password = self.vm_password
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
|
|
except Exception as e:
|
|
self.fail("SSH into VM: %s failed with new password: %s" %
|
|
(self.vm.ssh_ip, e))
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_16_deployVM_with_sshkeys_TC26(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with ssh key reset script enabled template
|
|
3.Verify vm access with new keys
|
|
"""
|
|
#generate key pair and get private key file name by calling below function
|
|
ssh_pvt_key = self.generate_ssh_keys()
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.pwd_template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
keypair=self.keypair.name
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm with ssh key pair"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
try:
|
|
self.debug("SSHing into VM: %s" % ip_addr)
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(ssh_pvt_key))
|
|
except Exception as e:
|
|
self.fail("SSH into VM: %s failed with ssh key pair: %s" %
|
|
(self.vm.ssh_ip, e))
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_17_reset_sshkeys_TC29(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with ssh key reset script enabled template
|
|
3.Reset keys
|
|
4.Verify vm access with new keys
|
|
"""
|
|
#generate key pair and get private key file name by calling below function
|
|
self.generate_ssh_keys()
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.pwd_template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
keypair=self.keypair.name
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm with ssh key pair"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
try:
|
|
self.vm.stop(self.apiclient)
|
|
except Exception as e:
|
|
self.fail("Failed to stop virtual machine %s with error %s" % (self.vm.id, e))
|
|
self.debug("Creating a new SSH keypair")
|
|
new_pvt_key = self.generate_ssh_keys()
|
|
try:
|
|
self.vm.resetSshKey(
|
|
self.apiclient,
|
|
keypair=self.keypair.name,
|
|
name=self.keypair.name,
|
|
account="admin",
|
|
domainid=1
|
|
)
|
|
except Exception as e:
|
|
self.fail("Failed to reset SSH key: %s, %s" % (self.vm.name, e))
|
|
self.debug("Starting the virtual machine after resetting the keypair")
|
|
try:
|
|
self.vm.start(self.apiclient)
|
|
except Exception as e:
|
|
self.fail("Failed to start virtual machine: %s, %s" % (self.vm.name, e))
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
try:
|
|
self.debug("SSHing into VM: %s" % ip_addr)
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(new_pvt_key))
|
|
except Exception as e:
|
|
self.fail("SSH into VM: %s failed with ssh key pair with error: %s" %
|
|
(self.vm.ssh_ip, e))
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_18_reset_password_verify_after_vm_restart_TC36(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with password enabled template
|
|
3.Reset password
|
|
4.Verify accessing vm with the new password
|
|
5.Stop/Start vm and repeat step 4
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.pwd_template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
self.vm.stop(self.apiclient)
|
|
self.debug("Resetting VM password for VM: %s" % self.vm.name)
|
|
self.vm_password = self.vm.resetPassword(self.apiclient)
|
|
self.debug("Password reset to: %s" % self.vm_password)
|
|
self.debug("Starting VM to verify new password..")
|
|
self.vm.start(self.apiclient)
|
|
self.debug("VM - %s stated!" % self.vm.name)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
try:
|
|
self.debug("SSHing into VM: %s" % ip_addr)
|
|
self.vm.password = self.vm_password
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
|
|
except Exception as e:
|
|
self.fail("SSH into VM: %s failed with new password: %s" %
|
|
(self.vm.ssh_ip, e))
|
|
#Stop start vm and verify connecting to vm with the same password
|
|
self.vm.stop(self.apiclient)
|
|
self.vm.start(self.apiclient)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
try:
|
|
self.debug("SSH into vm after stop start")
|
|
self.vm.password = self.vm_password
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
|
|
except Exception as e:
|
|
self.fail("SSH into vm failed with the same password after vm stop start")
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_19_reset_sshkeys_verify_after_vm_restartTC37(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with ssh key reset script enabled template
|
|
3.Reset keys
|
|
4.Verify vm access with new keys
|
|
5.Stop/start vm and repeat step4
|
|
"""
|
|
#generate key pair and get private key file name by calling below function
|
|
self.generate_ssh_keys()
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.pwd_template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
keypair=self.keypair.name
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm with ssh key pair"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
try:
|
|
self.vm.stop(self.apiclient)
|
|
except Exception as e:
|
|
self.fail("Failed to stop virtual machine %s with error %s" % (self.vm.id, e))
|
|
self.debug("Creating a new SSH keypair")
|
|
new_pvt_key = self.generate_ssh_keys()
|
|
try:
|
|
self.vm.resetSshKey(
|
|
self.apiclient,
|
|
keypair=self.keypair.name,
|
|
name=self.keypair.name,
|
|
account="admin",
|
|
domainid=1
|
|
)
|
|
except Exception as e:
|
|
self.fail("Failed to reset SSH key: %s, %s" % (self.vm.name, e))
|
|
self.debug("Starting the virtual machine after resetting the keypair")
|
|
try:
|
|
self.vm.start(self.apiclient)
|
|
except Exception as e:
|
|
self.fail("Failed to start virtual machine: %s, %s" % (self.vm.name, e))
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
try:
|
|
self.debug("SSHing into VM: %s" % ip_addr)
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(new_pvt_key))
|
|
except Exception as e:
|
|
self.fail("SSH into VM: %s failed with ssh key pair with error: %s" %
|
|
(self.vm.ssh_ip, e))
|
|
self.vm.stop(self.apiclient)
|
|
self.vm.start(self.apiclient)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
try:
|
|
self.debug("SSH into vm after vm stop/start")
|
|
self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(new_pvt_key))
|
|
except Exception as e:
|
|
self.fail("SSH into vm failed with new ssh keypair after vm stop start")
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_20_verify_VM_metadata_TC30(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with userdata in the above network
|
|
3.Verify vm deployment
|
|
4.Verify IP Address retrieval
|
|
5.Verify metadata inside configdrive iso
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm with in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify config drive is attached to vm or not
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_21_StopStartVM_verify_ConfigDrive_TC31(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval and userdata
|
|
5.Stop start vm
|
|
6.Verify userdata and metadata
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm stop/start
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before vm stop start"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr,configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed in vm deployment"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
#Stop/Start VM and verify IP address retrieval,userdata and metadata
|
|
self.vm.stop(self.apiclient)
|
|
self.vm.start(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm stop start"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm stop start"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm stop start"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_22_RebootVM_verify_ConfigDrive_TC32(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval,userdata and metadata
|
|
5.Reboot vm
|
|
6.Repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm stop/start
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before vm reboot"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed in vm deployment"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
#Reboot VM and verify IP address retrieval,userdata and metadata
|
|
self.vm.reboot(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm reboot"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm reboot"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm reboot"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_23_DestroyVM_verify_ConfigDrive_TC33(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval,userdata and metadata
|
|
5.Destroy and restore vm
|
|
6.Repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm stop/start
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before vm destroy"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed in vm deployment"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
#Destroy VM and verify IP address retrieval,userdata and metadata
|
|
self.vm.delete(self.apiclient, expunge=False)
|
|
self.vm.recover(self.apiclient)
|
|
self.vm.start(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm destroy"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm destroy"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm destroy"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_24_ReInstallVM_verify_ConfigDrive_TC34(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval,userdata and metadata
|
|
5.Reinstall vm to the same template
|
|
6.Repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm stop/start
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before vm reinstall"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed in vm reinstall"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
#Reinstall VM and verify the IP address retrieval
|
|
self.vm.restore(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm reinstall"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm reinstall"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr,configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm reinstall"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_25_MigrateVMVM_verify_ConfigDrive_TC35(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm with default cent os template and pass user data
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval,userdata and metadata
|
|
5.Migrate VM and Repeat step4
|
|
"""
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
diskofferingid=self.disk_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"Failed to create vm in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
#Verify configdrive iso attach before vm stop/start
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm before vm reinstall"
|
|
)
|
|
#Add userdata verification test
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr, configDrive_iso),
|
|
True,
|
|
"Userdata is not matching with the data passed in vm reinstall"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
#Migrate VM and verify ip address retrieval,userdata and metadata
|
|
hosts = Host.listForMigration(self.apiclient,virtualmachineid=self.vm.id)
|
|
self.assertEqual(validateList(hosts)[0], PASS, "Find hosts for migration returned invalid response")
|
|
if len(hosts) < 1:
|
|
self.skipTest("No suitable hosts found for vm migration..so skipping test")
|
|
hostid = hosts[0].id
|
|
self.umountConfigDrive(ip_addr, configDrive_iso)
|
|
self.vm.migrate(self.apiclient, hostid=hostid)
|
|
time.sleep(60)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm reinstall"
|
|
)
|
|
self.list_nics(self.vm.id)
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm after vm reinstall"
|
|
)
|
|
self.assertEqual(
|
|
self.verifyUserData(ip_addr,configDrive_iso),
|
|
True,
|
|
"Userdata is not matching after vm reinstall"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_26_DeployVM_verify_IPFetchEvent_TC56(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm in that network
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
5.Verify EXTERNAL.DHCP.VM.IP.FETCH event after IP address retrieval
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
#Verify config drive is attached to vm or not
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm"
|
|
)
|
|
#Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
|
|
self.assertEqual(
|
|
self.verifyIPFetchEvent(ip_addr),
|
|
True,
|
|
"EXTERNAL.DHCP.VM.IP.FETCH is not generated"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_27_StopStartVM_verify_IPFetchEvent_TC57(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm in that network
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
5.Verify EXTERNAL.DHCP.VM.IP.FETCH event after IP address retrieval
|
|
6.Stop/Start vm and repeat step5
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
#Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
|
|
self.assertEqual(
|
|
self.verifyIPFetchEvent(ip_addr),
|
|
True,
|
|
"EXTERNAL.DHCP.VM.IP.FETCH is not generated"
|
|
)
|
|
#Stop/Start VM and verify IP address retrieval,event notification
|
|
self.vm.stop(self.apiclient)
|
|
self.vm.start(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm stop start"
|
|
)
|
|
#Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
|
|
self.assertEqual(
|
|
self.verifyIPFetchEvent(ip_addr),
|
|
True,
|
|
"EXTERNAL.DHCP.VM.IP.FETCH is not generated"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_28_RebootVM_verify_IPFetchEvent_TC58(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm in that network
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
5.Verify EXTERNAL.DHCP.VM.IP.FETCH event after IP address retrieval
|
|
6.Reboot vm and repeat step5
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
#Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
|
|
self.assertEqual(
|
|
self.verifyIPFetchEvent(ip_addr),
|
|
True,
|
|
"EXTERNAL.DHCP.VM.IP.FETCH is not generated"
|
|
)
|
|
#Reboot VM and verify IP address retrieval,event notification
|
|
self.vm.reboot(self.apiclient)
|
|
time.sleep(60)
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address after vm stop start"
|
|
)
|
|
#Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
|
|
self.assertEqual(
|
|
self.verifyIPFetchEvent(ip_addr),
|
|
True,
|
|
"EXTERNAL.DHCP.VM.IP.FETCH is not generated"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_29_deployVM_In_Two_Networks_TC49(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Create isolated network with VR as the service provider
|
|
2.Deploy vm in both the networks
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
5.Verify metadata
|
|
"""
|
|
self.no_isolate = NetworkOffering.create(
|
|
self.apiclient,
|
|
self.services["isolated_network_offering"]
|
|
)
|
|
self.no_isolate.update(self.apiclient, state='Enabled')
|
|
self.isolated_network = Network.create(
|
|
self.apiclient,
|
|
self.services["network"],
|
|
networkofferingid=self.no_isolate.id,
|
|
zoneid=self.zone.id,
|
|
accountid="admin",
|
|
domainid=1
|
|
)
|
|
self.cleanup.append(self.isolated_network)
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id, self.isolated_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
#Verify config drive is attached to vm or not
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_30_deployVM_In_Two_Networks_TC50(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Create another shared network with VR as the service provider
|
|
2.Deploy vm in both the networks
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
5.Verify metadata
|
|
"""
|
|
self.services["shared_network_offering_all_services"]["specifyVlan"]="True"
|
|
self.services["shared_network_offering_all_services"]["specifyIpRanges"]="True"
|
|
self.no_shared_vr = NetworkOffering.create(
|
|
self.apiclient,
|
|
self.services["shared_network_offering_all_services"]
|
|
)
|
|
self.no_shared_vr.update(self.apiclient, state='Enabled')
|
|
self.services["shared_network"]["vlan"] = self.services["vlan"]
|
|
self.services["shared_network"]["gateway"] = self.services["gateway"]
|
|
self.services["shared_network"]["netmask"] = self.services["netmask"]
|
|
self.services["shared_network"]["startip"] = self.services["startip"]
|
|
self.services["shared_network"]["endip"] = self.services["endip"]
|
|
self.shared_network2 = Network.create(
|
|
self.apiclient,
|
|
self.services["shared_network"],
|
|
networkofferingid=self.no_shared_vr.id,
|
|
zoneid=self.zone.id,
|
|
accountid="admin",
|
|
domainid=1
|
|
)
|
|
self.cleanup.append(self.shared_network2)
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id, self.shared_network2.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
#Verify config drive is attached to vm or not
|
|
configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
|
|
self.assertNotEqual(
|
|
configDrive_iso,
|
|
False,
|
|
"Config drive iso is not attached to vm"
|
|
)
|
|
metadata = self.getVMMetaData(ip_addr, configDrive_iso)
|
|
self.verifyMetaData(metadata)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_31_deployVM_with_userdataByVR_TC38(self):
|
|
"""
|
|
1.Create shared network with userdata service and VR as the provider
|
|
2.Deploy vm with userdata in the above network
|
|
3.Verify vm deployment
|
|
4.Verify IP Address retrieval
|
|
"""
|
|
self.skipTest("this combination is not supported")
|
|
self.services["virtual_machine"]["userdata"] = self.userdata
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation with userdata failed in a shared network with VR as the provider"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
vr_res = Router.list(
|
|
self.apiclient,
|
|
networkid=self.shared_network.id,
|
|
listAll=True
|
|
)
|
|
self.assertEqual(validateList(vr_res)[0],PASS,"List Routers returned invalid response")
|
|
vr_ip = vr_res[0].guestipaddress
|
|
ssh = self.vm.get_ssh_client(ipaddress=ip_addr)
|
|
cmd = "curl http://%s/latest/user-data" % vr_ip
|
|
res = ssh.execute(cmd)
|
|
self.assertEqual(
|
|
str(res),
|
|
self.userdata,
|
|
"Failed to get the userdata from VR in shared network"
|
|
)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_32_restart_network_TC6(self):
|
|
"""
|
|
1.Create shared network without any services
|
|
2.Deploy vm in that network
|
|
3.Verify vm deployment
|
|
4.Verify IP address retrieval
|
|
5.Restart network and verify access to VM
|
|
"""
|
|
self.vm = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["virtual_machine"],
|
|
templateid=self.template.id,
|
|
accountid="admin",
|
|
domainid=1,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id,
|
|
networkids=[self.shared_network.id],
|
|
)
|
|
self.assertIsNotNone(
|
|
self.vm,
|
|
"VM creation failed in a shared network without any services"
|
|
)
|
|
self.cleanup.append(self.vm)
|
|
#Verify IP address retrieval using listVirtualMachines API
|
|
ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
|
|
self.assertEqual(
|
|
ip_status,
|
|
1,
|
|
"Failed to retrieve vm ip address"
|
|
)
|
|
#Verify the retrieved ip address in listNICs API response
|
|
self.list_nics(self.vm.id)
|
|
res = self.shared_network.restart(self.apiclient, cleanup=True)
|
|
if res.success:
|
|
self.assertEqual(
|
|
res.success,
|
|
True,
|
|
"Failed to restart shared network without any services"
|
|
)
|
|
else:
|
|
self.fail("Failed restarting shared network without any services")
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware='True')
|
|
def test_33_verify_config_params_TC65(self):
|
|
"""
|
|
#@desc: Validate external dhcp config parameters against invalid values
|
|
#1.Generate random values using special characters, strings and numbers
|
|
#2.Try to update the config params with those values.
|
|
#3.Verify that invalid values are not allowed
|
|
"""
|
|
params = ["externaldhcp.vmip.retrieval.interval","externaldhcp.vmip.max.retry",\
|
|
"externaldhcp.vmipFetch.threadPool.max"]
|
|
for param in params:
|
|
random_num = ''.join(random.choice(string.digits + string.punctuation + string.ascii_letters) \
|
|
for _ in range(3))
|
|
try:
|
|
Configurations.update(
|
|
self.apiclient,
|
|
name=param,
|
|
value=random_num
|
|
)
|
|
self.fail("FAIL:{} takes invalid value".format(param))
|
|
except Exception as e:
|
|
self.debug("Success: Updating dhcp config params with invalid values is not allowed\
|
|
and throws following message: %s" % e)
|
|
return
|
|
|