mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
1722 lines
86 KiB
Python
1722 lines
86 KiB
Python
# 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.
|
|
|
|
""" Component tests for user data, meta data, ssh keys
|
|
and password reset functionality with
|
|
ConfigDrive and Nuage VSP SDN plugin
|
|
"""
|
|
import base64
|
|
import copy
|
|
import os
|
|
import tempfile
|
|
import threading
|
|
|
|
import sys
|
|
import time
|
|
from datetime import datetime
|
|
from marvin.cloudstackAPI import updateTemplate, resetSSHKeyForVirtualMachine
|
|
from marvin.lib.base import (Account,
|
|
createVlanIpRange,
|
|
listVlanIpRanges,
|
|
NetworkServiceProvider,
|
|
PublicIpRange,
|
|
PublicIPAddress,
|
|
VirtualMachine)
|
|
from marvin.lib.common import list_templates
|
|
from marvin.lib.utils import random_gen
|
|
# Import System Modules
|
|
from nose.plugins.attrib import attr
|
|
|
|
# Import Local Modules
|
|
from component.test_configdrive import MySSHKeyPair, ConfigDriveUtils
|
|
from nuageTestCase import nuageTestCase, needscleanup
|
|
|
|
NO_SUCH_FILE = "No such file or directory"
|
|
|
|
|
|
class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils):
|
|
"""Test user data and password reset functionality
|
|
using configDrive with Nuage VSP SDN plugin
|
|
"""
|
|
|
|
class StartVM(threading.Thread):
|
|
|
|
def __init__(self, nuagetestcase, network, index):
|
|
threading.Thread.__init__(self)
|
|
self.network = network
|
|
self.nuagetestcase = nuagetestcase
|
|
self.vm = None
|
|
self.index = index
|
|
|
|
def run(self):
|
|
self.vm = self.nuagetestcase.create_VM(
|
|
self.network,
|
|
account=self.nuagetestcase.account,
|
|
cleanup=False)
|
|
self.nuagetestcase.check_VM_state(self.vm, state="Running")
|
|
self.nuagetestcase.debug("[Concurrency]VM %d running, name = %s"
|
|
% (self.index + 1, self.vm.name))
|
|
|
|
def get_vm(self):
|
|
return self.vm
|
|
|
|
def stop(self):
|
|
self.vm.delete(self.nuagetestcase.api_client)
|
|
|
|
def update(self):
|
|
expected_user_data = "hello world vm %s" % self.vm.name
|
|
user_data = base64.b64encode(expected_user_data)
|
|
self.vm.update(self.nuagetestcase.api_client, userdata=user_data)
|
|
|
|
class StopVM(threading.Thread):
|
|
|
|
def __init__(self, nuagetestcase, vm, **kwargs):
|
|
threading.Thread.__init__(self)
|
|
self.vm = vm
|
|
self.nuagetestcase = nuagetestcase
|
|
|
|
def run(self):
|
|
self.vm.delete(self.nuagetestcase.api_client)
|
|
if self.vm in self.nuagetestcase.cleanup:
|
|
self.nuagetestcase.cleanup.remove(self.vm)
|
|
|
|
def get_vm(self):
|
|
return self.vm
|
|
|
|
@staticmethod
|
|
def get_name():
|
|
return "delete"
|
|
|
|
class UpdateVM(threading.Thread):
|
|
|
|
def __init__(self, nuagetestcase, vm, **kwargs):
|
|
threading.Thread.__init__(self)
|
|
self.vm = vm
|
|
self.nuagetestcase = nuagetestcase
|
|
self.idx = kwargs["idx"]
|
|
|
|
def run(self):
|
|
self.expected_user_data = "hello world vm %s" % self.vm.name
|
|
user_data = base64.b64encode(self.expected_user_data)
|
|
self.end = None
|
|
self.start = datetime.now()
|
|
self.vm.update(self.nuagetestcase.api_client, userdata=user_data)
|
|
self.end = datetime.now()
|
|
self.nuagetestcase.debug("[Concurrency]Update userdata idx=%d "
|
|
"for vm: %s. Duration in seconds: %s " %
|
|
(self.idx, self.vm.name,
|
|
(self.end - self.start).total_seconds()))
|
|
return self.expected_user_data
|
|
|
|
def get_vm(self):
|
|
return self.vm
|
|
|
|
def get_timestamps(self):
|
|
if not self.end:
|
|
self.end = datetime.now()
|
|
return [self.start, self.end]
|
|
|
|
def get_userdata(self):
|
|
return self.expected_user_data
|
|
|
|
@staticmethod
|
|
def get_name():
|
|
return "userdata"
|
|
|
|
class ResetPassword(threading.Thread):
|
|
|
|
def __init__(self, nuagetestcase, vm, **kwargs):
|
|
threading.Thread.__init__(self)
|
|
self.vm = vm
|
|
self.nuagetestcase = nuagetestcase
|
|
|
|
def run(self):
|
|
self.start = datetime.now()
|
|
self.vm.password = self.vm.resetPassword(
|
|
self.nuagetestcase.api_client)
|
|
self.nuagetestcase.debug("[Concurrency]Password reset to - %s"
|
|
% self.vm.password)
|
|
self.nuagetestcase.debug("[Concurrency]VM - %s password - %s !"
|
|
% (self.vm.name, self.vm.password))
|
|
self.end = datetime.now()
|
|
self.nuagetestcase.debug("[Concurrency]Reset password for vm: %s. "
|
|
"Duration in seconds: %s "
|
|
%
|
|
(self.vm.name,
|
|
(self.end - self.start).total_seconds()))
|
|
|
|
def get_vm(self):
|
|
return self.vm
|
|
|
|
def get_timestamps(self):
|
|
if not self.end:
|
|
self.end = datetime.now()
|
|
return [self.start, self.end]
|
|
|
|
def get_password(self):
|
|
return self.vm.password
|
|
|
|
@staticmethod
|
|
def get_name():
|
|
return "reset password"
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestNuageConfigDrive, cls).setUpClass()
|
|
return
|
|
|
|
def setUp(self):
|
|
# Create an account
|
|
self.account = Account.create(self.api_client,
|
|
self.test_data["account"],
|
|
admin=True,
|
|
domainid=self.domain.id
|
|
)
|
|
self.tmp_files = []
|
|
self.cleanup = [self.account]
|
|
return
|
|
|
|
def tearDown(self):
|
|
super(TestNuageConfigDrive, self).tearDown()
|
|
for tmp_file in self.tmp_files:
|
|
os.remove(tmp_file)
|
|
|
|
self.updateTemplate(False)
|
|
return
|
|
|
|
def validate_firewall_rule(self, fw_rule):
|
|
self.verify_vsd_firewall_rule(fw_rule)
|
|
|
|
def validate_StaticNat_rule_For_VM(self, public_ip, network, vm):
|
|
self.verify_vsd_floating_ip(network, vm, public_ip.ipaddress)
|
|
|
|
def _get_test_data(self, key):
|
|
return self.test_data["nuagevsp"][key]
|
|
|
|
def get_configdrive_provider(self):
|
|
return NetworkServiceProvider.list(
|
|
self.api_client,
|
|
name="ConfigDrive",
|
|
physicalnetworkid=self.vsp_physical_network.id)[0]
|
|
|
|
def create_guest_vm(self, networks, acl_item=None,
|
|
vpc=None, keypair=None):
|
|
vm = self.create_VM(
|
|
networks,
|
|
testdata=self.test_data["virtual_machine_userdata"],
|
|
keypair=keypair)
|
|
# Check VM
|
|
self.check_VM_state(vm, state="Running")
|
|
self.verify_vsd_vm(vm)
|
|
# Check networks
|
|
network_list = []
|
|
if isinstance(networks, list):
|
|
for network in networks:
|
|
network_list.append(network)
|
|
else:
|
|
network_list.append(networks)
|
|
|
|
for network in network_list:
|
|
self.validate_Network(network, state="Implemented")
|
|
self.verify_vsd_network(self.domain.id, network, vpc=vpc)
|
|
|
|
if acl_item is not None:
|
|
self.verify_vsd_firewall_rule(acl_item)
|
|
return vm
|
|
|
|
# =========================================================================
|
|
# --- Gherkin style helper methods ---
|
|
# =========================================================================
|
|
|
|
# =========================================================================
|
|
# --- TEST CASES ---
|
|
# =========================================================================
|
|
|
|
@attr(tags=["advanced", "nuagevsp", "isonw"], required_hardware="true")
|
|
def test_nuage_configdrive_isolated_network(self):
|
|
"""Test Configdrive as provider for isolated Networks
|
|
to provide userdata and password reset functionality
|
|
with Nuage VSP SDN plugin
|
|
"""
|
|
|
|
# 2. Given ConfigDrive provider is enabled in zone
|
|
# And a network offering which has
|
|
# * user data provided by ConfigDrive
|
|
# * No DNS
|
|
# When I create an Isolated Network using that network offering
|
|
# Then the network is successfully created,
|
|
# And is in the "Allocated" state.
|
|
#
|
|
# 3. When I deploy a VM in the created Isolated network with user data,
|
|
# Then the Isolated network state is changed to "Implemented"
|
|
# And the VM is successfully deployed and is in the "Running" state
|
|
# And there is no VR is deployed.
|
|
# 4. And the user data in the ConfigDrive device is as expected
|
|
# 5. And the the vm's password in the ConfigDrive device is as expected
|
|
#
|
|
# 6. When I stop, reset the password, and start the VM
|
|
# 7. Then I can login into the VM using the new password.
|
|
# 8. SSH into the VM for verifying its new password
|
|
# after its password reset.
|
|
# 9. Verify various scenarios and check the data in configdriveIso
|
|
# 10. Delete all the created objects (cleanup).
|
|
|
|
for zone in self.zones:
|
|
self.debug("Zone - %s" % zone.name)
|
|
# Get Zone details
|
|
self.getZoneDetails(zone=zone)
|
|
# Configure VSD sessions
|
|
self.configureVSDSessions()
|
|
|
|
# 1. Given ConfigDrive provider is disabled in zone
|
|
# And a network offering which has
|
|
# user data provided by ConfigDrive
|
|
# Then creating an Isolated Network
|
|
# using that network offering fails
|
|
|
|
self.debug("+++Testing configdrive in an Isolated network fails..."
|
|
"as provider configdrive is still disabled...")
|
|
self.update_provider_state("Disabled")
|
|
create_network = self.verify_network_creation(
|
|
offering_name="isolated_configdrive_network_offering_"
|
|
"withoutdns",
|
|
gateway='10.1.1.1')
|
|
self.assertFalse(create_network.success,
|
|
'Network found success = %s, expected success =%s'
|
|
% (str(create_network.success), 'False'))
|
|
|
|
|
|
|
|
self.debug("+++Test user data & password reset functionality "
|
|
"using configdrive in an Isolated network without VR")
|
|
self.update_provider_state("Enabled")
|
|
create_network1 = self.verify_network_creation(
|
|
offering=create_network.offering,
|
|
gateway='10.1.1.1')
|
|
self.assertTrue(create_network1.success,
|
|
'Network found success = %s, expected success = %s'
|
|
% (str(create_network1.success), 'True'))
|
|
self.validate_Network(create_network1.network, state="Allocated")
|
|
create_network2 = self.verify_network_creation(
|
|
offering=create_network.offering,
|
|
gateway='10.1.2.1')
|
|
self.assertTrue(create_network2.success,
|
|
'Network found success = %s,expected success = %s'
|
|
% (str(create_network2.success), 'True'))
|
|
self.validate_Network(create_network2.network, state="Allocated")
|
|
self.update_password_enable_in_template(True)
|
|
|
|
self.debug("+++Deploy VM in the created Isolated network "
|
|
"with as user data provider configdrive without VR")
|
|
|
|
self.generate_ssh_keys()
|
|
self.debug("keypair name %s " % self.keypair.name)
|
|
vm1 = self.create_guest_vm(create_network1.network,
|
|
keypair=self.keypair.name)
|
|
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(create_network1)
|
|
self.debug("+++Verified no VR is spawned for this network ")
|
|
# We need to have the vm password
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
|
|
public_ip_1 = self.acquire_PublicIPAddress(create_network1.network)
|
|
self.create_and_verify_fip_and_fw(vm1, public_ip_1,
|
|
create_network1.network)
|
|
|
|
self.verify_config_drive_content(
|
|
vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=self.test_data[
|
|
"virtual_machine_userdata"]["userdata"],
|
|
ssh_key=self.keypair)
|
|
|
|
expected_user_data1 = self.update_userdata(vm1, "helloworld vm1")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(True),
|
|
userdata=expected_user_data1)
|
|
|
|
self.generate_ssh_keys()
|
|
self.update_sshkeypair(vm1)
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(True),
|
|
metadata=True,
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
# After sshkey reset we need to have the vm password again
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
|
|
self.debug("Adding a non-default nic to the VM "
|
|
"making it a multi-nic VM...")
|
|
self.nic_operation_VM(vm1, create_network2.network,
|
|
operation="add")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hellomultinicvm1")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("updating non-default nic as the default nic "
|
|
"of the multi-nic VM and enable staticnat...")
|
|
self.nic_operation_VM(vm1,
|
|
create_network2.network, operation="update")
|
|
|
|
public_ip_2 = \
|
|
self.acquire_PublicIPAddress(create_network2.network)
|
|
self.create_and_verify_fip_and_fw(vm1, public_ip_2,
|
|
create_network2.network)
|
|
vm1.stop(self.api_client)
|
|
vm1.start(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip_2,
|
|
self.PasswordTest(False),
|
|
metadata=True,
|
|
userdata=expected_user_data1)
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
self.verify_config_drive_content(vm1, public_ip_2,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1)
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hellomultinicvm1")
|
|
self.verify_config_drive_content(vm1, public_ip_2,
|
|
self.PasswordTest(True),
|
|
userdata=expected_user_data1)
|
|
|
|
self.debug("Updating the default nic of the multi-nic VM, "
|
|
"deleting the non-default nic...")
|
|
self.nic_operation_VM(vm1,
|
|
create_network1.network, operation="update")
|
|
vm1.stop(self.api_client)
|
|
vm1.start(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(False),
|
|
metadata=True,
|
|
userdata=expected_user_data1)
|
|
|
|
multinicvm1 = self.create_guest_vm([create_network2.network,
|
|
create_network1.network])
|
|
multinicvm1.password = multinicvm1.resetPassword(self.api_client)
|
|
self.debug("MultiNICVM Password reset to - %s"
|
|
% multinicvm1.password)
|
|
self.debug("MultiNICVM - %s password - %s !"
|
|
% (multinicvm1.name, multinicvm1.password))
|
|
|
|
public_ip_3 = self.acquire_PublicIPAddress(create_network2.network)
|
|
self.create_and_verify_fip_and_fw(multinicvm1, public_ip_3,
|
|
create_network2.network)
|
|
self.verify_config_drive_content(
|
|
multinicvm1, public_ip_3,
|
|
self.PasswordTest(multinicvm1.password),
|
|
metadata=True,
|
|
userdata=self.test_data[
|
|
"virtual_machine_userdata"]["userdata"])
|
|
expected_user_data2 = self.update_userdata(multinicvm1,
|
|
"hello multinicvm1")
|
|
self.verify_config_drive_content(multinicvm1, public_ip_3,
|
|
self.PasswordTest(True),
|
|
userdata=expected_user_data2)
|
|
|
|
multinicvm1.delete(self.api_client, expunge=True)
|
|
public_ip_3.delete(self.api_client)
|
|
public_ip_2.delete(self.api_client)
|
|
self.nic_operation_VM(vm1,
|
|
create_network2.network, operation="remove")
|
|
create_network2.network.delete(self.api_client)
|
|
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
|
|
self.debug("+++ Restarting the created Isolated network without "
|
|
"VR without cleanup...")
|
|
create_network1.network.restart(self.api_client, cleanup=False)
|
|
self.validate_Network(create_network1.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ Restarting the created Isolated network without "
|
|
"VR with cleanup...")
|
|
create_network1.network.restart(self.api_client, cleanup=True)
|
|
self.validate_Network(create_network1.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ Upgrade offering of created Isolated network with "
|
|
"a dns offering which spins a VR")
|
|
self.upgrade_Network(self.test_data["nuagevsp"][
|
|
"isolated_configdrive_network_offering"],
|
|
create_network1.network)
|
|
vr = self.get_Router(create_network1.network)
|
|
self.check_Router_state(vr, state="Running")
|
|
# VSD verification
|
|
self.verify_vsd_network(self.domain.id, create_network1.network)
|
|
self.verify_vsd_router(vr)
|
|
|
|
self.debug("+++Test user data & password reset functionality "
|
|
"using configdrive in an Isolated network with VR")
|
|
create_vrnetwork1 = self.verify_network_creation(
|
|
offering_name="isolated_configdrive_network_offering",
|
|
gateway='10.1.3.1')
|
|
self.assertTrue(create_vrnetwork1.success,
|
|
'Network found success = %s, expected success = %s'
|
|
% (str(create_vrnetwork1.success), 'True'))
|
|
self.validate_Network(create_vrnetwork1.network, state="Allocated")
|
|
self.debug("+++Deploying a VM in the created Isolated network "
|
|
"with as user data provider configdrive with VR")
|
|
vm2 = self.create_guest_vm(create_vrnetwork1.network)
|
|
|
|
vr2 = self.get_Router(create_vrnetwork1.network)
|
|
self.check_Router_state(vr2, state="Running")
|
|
|
|
# VSD verification
|
|
self.verify_vsd_network(self.domain.id, create_vrnetwork1.network)
|
|
self.verify_vsd_router(vr2)
|
|
self.debug("+++Verified VR is spawned for this network ")
|
|
|
|
# We need to have the vm password
|
|
vm2.password = vm2.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm2.password)
|
|
self.debug("VM2 - %s password - %s !" %
|
|
(vm2.name, vm2.password))
|
|
public_ip_3 = self.acquire_PublicIPAddress(
|
|
create_vrnetwork1.network)
|
|
self.create_and_verify_fip_and_fw(vm2, public_ip_3,
|
|
create_vrnetwork1.network)
|
|
|
|
self.verify_config_drive_content(
|
|
vm2, public_ip_3,
|
|
self.PasswordTest(vm2.password),
|
|
metadata=True,
|
|
userdata=self.test_data[
|
|
"virtual_machine_userdata"]["userdata"])
|
|
|
|
expected_user_data2 = self.update_userdata(vm2, "helloworld vm2")
|
|
self.verify_config_drive_content(vm2, public_ip_3,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2)
|
|
|
|
self.debug("+++ Restarting the created Isolated network with "
|
|
"VR without cleanup...")
|
|
create_vrnetwork1.network.restart(self.api_client, cleanup=False)
|
|
self.validate_Network(create_vrnetwork1.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm2, public_ip_3,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
|
|
self.debug("+++ Restarting the created Isolated network with "
|
|
"VR with cleanup...")
|
|
create_vrnetwork1.network.restart(self.api_client, cleanup=True)
|
|
self.validate_Network(create_vrnetwork1.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm2, public_ip_3,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
|
|
self.debug("+++ Upgrade offering of created Isolated network with "
|
|
"an offering which removes the VR...")
|
|
self.upgrade_Network(
|
|
self.test_data["nuagevsp"][
|
|
"isolated_configdrive_network_offering_withoutdns"],
|
|
create_vrnetwork1.network)
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(create_vrnetwork1.network)
|
|
|
|
self.verify_config_drive_content(vm2, public_ip_3,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
vm2.delete(self.api_client, expunge=True)
|
|
create_vrnetwork1.network.delete(self.api_client)
|
|
|
|
self.debug("+++Verifying userdata after rebootVM - %s" % vm1.name)
|
|
vm1.reboot(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata for VM - %s" % vm1.name)
|
|
expected_user_data1 = self.update_userdata(vm1, "hello afterboot")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
self.debug("Resetting password for VM - %s" % vm1.name)
|
|
self.reset_password(vm1)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password))
|
|
|
|
self.debug("+++ Migrating one of the VMs in the created Isolated "
|
|
"network to another host, if available...")
|
|
self.migrate_VM(vm1)
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata after migrating VM - %s" % vm1.name)
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hello after migrate")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1)
|
|
self.debug("Resetting password for VM - %s" % vm1.name)
|
|
self.reset_password(vm1)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password))
|
|
|
|
self.debug("+++Verify userdata after stopstartVM - %s" % vm1.name)
|
|
vm1.stop(self.api_client)
|
|
vm1.start(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata for VM - %s" % vm1.name)
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hello afterstopstart")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1)
|
|
self.debug("Resetting password for VM - %s" % vm1.name)
|
|
self.reset_password(vm1)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password))
|
|
|
|
self.debug("+++ Verify userdata after VM recover- %s" % vm1.name)
|
|
vm1.delete(self.api_client, expunge=False)
|
|
self.debug("Recover VM - %s" % vm1.name)
|
|
vm1.recover(self.api_client)
|
|
vm1.start(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
self.update_provider_state("Disabled")
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hello after recover")
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ When template is not password enabled, "
|
|
"verify configdrive of VM - %s" % vm1.name)
|
|
vm1.delete(self.api_client, expunge=True)
|
|
self.update_provider_state("Enabled")
|
|
self.updateTemplate(False)
|
|
self.generate_ssh_keys()
|
|
self.debug("keypair name %s " % self.keypair.name)
|
|
vm1 = self.create_guest_vm(create_network1.network,
|
|
keypair=self.keypair.name)
|
|
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"This is sample data")
|
|
public_ip_1 = \
|
|
self.acquire_PublicIPAddress(create_network1.network)
|
|
self.create_and_verify_fip_and_fw(vm1, public_ip_1,
|
|
create_network1.network)
|
|
self.verify_config_drive_content(vm1, public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
vm1.delete(self.api_client, expunge=True)
|
|
create_network1.network.delete(self.api_client)
|
|
|
|
@attr(tags=["advanced", "nuagevsp", "vpc"], required_hardware="true")
|
|
def test_nuage_configdrive_vpc_network(self):
|
|
"""Test Configdrive for VPC Networks
|
|
choose user data with configDrive as service provider
|
|
and test password reset functionality using ConfigDrive
|
|
with Nuage VSP SDN plugin
|
|
"""
|
|
|
|
# 1. Verify VPC Network creation with ConfigDrive fails
|
|
# as ConfigDrive is disabled as provider
|
|
# 2. Create a VPC Network with Nuage VSP VPC tier Network
|
|
# offering specifying ConfigDrive as serviceProvider for userdata,
|
|
# make sure no Dns is in the offering so no VR is spawned.
|
|
# check if it is successfully created and is in "Allocated" state.
|
|
# 3. Deploy a VM in the created VPC tier network with user data,
|
|
# check if the Isolated network state is changed to "Implemented",
|
|
# and the VM is successfully deployed and is in "Running" state.
|
|
# Check that no VR is deployed.
|
|
# 4. SSH into the deployed VM and verify its user data in the iso
|
|
# (expected user data == actual user data).
|
|
# 5. Verify that the guest VM's password in the iso.
|
|
# 6. Reset VM password, and start the VM.
|
|
# 7. Verify that the new guest VM template is password enabled by
|
|
# checking the VM's password (password != "password").
|
|
# 8. SSH into the VM for verifying its new password
|
|
# after its password reset.
|
|
# 9. Verify various scenarios and check the data in configdrive iso
|
|
# 10. Delete all the created objects (cleanup).
|
|
|
|
for zone in self.zones:
|
|
self.debug("Zone - %s" % zone.name)
|
|
# Get Zone details
|
|
self.getZoneDetails(zone=zone)
|
|
# Configure VSD sessions
|
|
self.configureVSDSessions()
|
|
|
|
self.update_provider_state("Disabled")
|
|
create_vpc = self.verify_vpc_creation(
|
|
offering_name="vpc_offering_configdrive_withoutdns")
|
|
self.assertTrue(create_vpc.success,
|
|
"Vpc found success = %s, expected success = %s"
|
|
% (str(create_vpc.success), 'True'))
|
|
acl_list = self.create_NetworkAclList(
|
|
name="acl", description="acl", vpc=create_vpc.vpc)
|
|
acl_item = self.create_NetworkAclRule(
|
|
self.test_data["ingress_rule"], acl_list=acl_list)
|
|
|
|
self.debug("+++Testing configdrive in a VPC Tier network fails..."
|
|
"as provider configdrive is still disabled...")
|
|
create_networkfails = \
|
|
self.verify_network_creation(
|
|
offering_name="vpc_network_offering_configdrive_"
|
|
"withoutdns",
|
|
gateway='10.1.1.1',
|
|
vpc=create_vpc.vpc,
|
|
acl_list=acl_list)
|
|
self.assertFalse(create_networkfails.success,
|
|
"Create Network found success = %s, "
|
|
"expected success = %s"
|
|
% (str(create_networkfails.success), 'False'))
|
|
self.debug("Testing user data&password reset functionality using"
|
|
"configdrive in a VPC network without VR...")
|
|
self.update_provider_state("Enabled")
|
|
|
|
create_tiernetwork = \
|
|
self.verify_network_creation(
|
|
offering=create_networkfails.offering,
|
|
gateway='10.1.1.1',
|
|
vpc=create_vpc.vpc,
|
|
acl_list=acl_list)
|
|
self.assertTrue(create_tiernetwork.success,
|
|
"Create Network found success = %s, "
|
|
"expected success = %s"
|
|
% (str(create_tiernetwork.success), 'True'))
|
|
self.validate_Network(create_tiernetwork.network,
|
|
state="Implemented")
|
|
|
|
create_tiernetwork2 = \
|
|
self.verify_network_creation(
|
|
offering=create_networkfails.offering,
|
|
gateway='10.1.2.1',
|
|
vpc=create_vpc.vpc,
|
|
acl_list=acl_list)
|
|
self.assertTrue(create_tiernetwork2.success,
|
|
'Network found success= %s, expected success= %s'
|
|
% (str(create_tiernetwork2.success), 'True'))
|
|
self.validate_Network(create_tiernetwork2.network,
|
|
state="Implemented")
|
|
|
|
self.update_password_enable_in_template(True)
|
|
|
|
self.generate_ssh_keys()
|
|
self.debug("keypair name %s " % self.keypair.name)
|
|
vm = self.create_guest_vm(create_tiernetwork.network,
|
|
acl_item,
|
|
vpc=create_vpc.vpc,
|
|
keypair=self.keypair.name)
|
|
|
|
vpc_public_ip_1 = \
|
|
self.acquire_PublicIPAddress(create_tiernetwork.network,
|
|
create_vpc.vpc)
|
|
self.create_StaticNatRule_For_VM(vm, vpc_public_ip_1,
|
|
create_tiernetwork.network)
|
|
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(True),
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
expected_user_data = self.update_userdata(vm, "helloworld vm1")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(True),
|
|
metadata=True,
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Resetting password for VM - %s" % vm.name)
|
|
self.reset_password(vm)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
|
|
self.generate_ssh_keys()
|
|
self.update_sshkeypair(vm)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(True),
|
|
metadata=True,
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
# After sshkey reset we need to have the vm password again
|
|
vm.password = vm.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm.name, vm.password))
|
|
|
|
self.debug("+++ Restarting the created vpc without "
|
|
"cleanup...")
|
|
self.restart_Vpc(create_vpc.vpc, cleanup=False)
|
|
self.validate_Vpc(create_vpc.vpc, state="Enabled")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Adding a non-default nic to the VM "
|
|
"making it a multi-nic VM...")
|
|
self.nic_operation_VM(vm, create_tiernetwork2.network,
|
|
operation="add")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
metadata=True,
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
vm.password = vm.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm.name, vm.password))
|
|
|
|
expected_user_data1 = self.update_userdata(vm, "hellomultinicvm1")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("updating non-default nic as the default nic "
|
|
"of the multi-nic VM and enable staticnat...")
|
|
self.nic_operation_VM(vm,
|
|
create_tiernetwork2.network,
|
|
operation="update")
|
|
|
|
vpc_public_ip_2 = \
|
|
self.acquire_PublicIPAddress(create_tiernetwork2.network,
|
|
create_vpc.vpc)
|
|
self.create_StaticNatRule_For_VM(vm, vpc_public_ip_2,
|
|
create_tiernetwork2.network)
|
|
vm.stop(self.api_client)
|
|
vm.start(self.api_client)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_2,
|
|
self.PasswordTest(False),
|
|
metadata=True,
|
|
userdata=expected_user_data1)
|
|
vm.password = vm.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm.name, vm.password))
|
|
self.verify_config_drive_content(vm, vpc_public_ip_2,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data1)
|
|
expected_user_data1 = self.update_userdata(vm, "hellomultinicvm1")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_2,
|
|
self.PasswordTest(True),
|
|
userdata=expected_user_data1)
|
|
|
|
self.debug("Updating the default nic of the multi-nic VM, "
|
|
"deleting the non-default nic...")
|
|
self.nic_operation_VM(vm,
|
|
create_tiernetwork.network,
|
|
operation="update")
|
|
vm.stop(self.api_client)
|
|
vm.start(self.api_client)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(False),
|
|
metadata=True,
|
|
userdata=expected_user_data1)
|
|
vpc_public_ip_2.delete(self.api_client)
|
|
self.nic_operation_VM(vm,
|
|
create_tiernetwork2.network,
|
|
operation="remove")
|
|
create_tiernetwork2.network.delete(self.api_client)
|
|
|
|
vm.password = vm.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm.name, vm.password))
|
|
|
|
self.debug("+++ Restarting the created vpc with "
|
|
"cleanup...")
|
|
self.restart_Vpc(create_vpc.vpc, cleanup=True)
|
|
self.validate_Vpc(create_vpc.vpc, state="Enabled")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ Restarting the created VPC Tier network without "
|
|
"cleanup...")
|
|
create_tiernetwork.network.restart(self.api_client, cleanup=False)
|
|
self.validate_Network(create_tiernetwork.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ Restarting the created VPC Tier network with "
|
|
"cleanup...")
|
|
create_tiernetwork.network.restart(self.api_client, cleanup=True)
|
|
self.validate_Network(create_tiernetwork.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Testing user data & password reset functionality "
|
|
" using configdrive in a VPC network with VR...")
|
|
create_vrvpc = self.verify_vpc_creation(
|
|
offering_name="vpc_offering_configdrive_withdns")
|
|
self.assertTrue(create_vrvpc.success,
|
|
'Vpc found success = %s, expected success = %s'
|
|
% (str(create_vrvpc.success), 'True'))
|
|
acl_list2 = self.create_NetworkAclList(
|
|
name="acl", description="acl", vpc=create_vrvpc.vpc)
|
|
acl_item2 = self.create_NetworkAclRule(
|
|
self.test_data["ingress_rule"], acl_list=acl_list2)
|
|
create_vrnetwork = \
|
|
self.verify_network_creation(
|
|
offering_name="vpc_network_offering_configdrive_withdns",
|
|
gateway='10.1.3.1',
|
|
vpc=create_vrvpc.vpc,
|
|
acl_list=acl_list2)
|
|
self.assertTrue(create_vrnetwork.success,
|
|
"Create Network found success = %s, "
|
|
"expected success = %s"
|
|
% (str(create_vrnetwork.success), 'True'))
|
|
self.validate_Network(create_vrnetwork.network,
|
|
state="Implemented")
|
|
vm2 = self.create_guest_vm(create_vrnetwork.network,
|
|
acl_item2,
|
|
vpc=create_vrvpc.vpc)
|
|
vr2 = self.get_Router(create_vrnetwork.network)
|
|
self.check_Router_state(vr2, state="Running")
|
|
|
|
# VSD verification
|
|
self.verify_vsd_network(self.domain.id, create_vrnetwork.network,
|
|
create_vrvpc.vpc)
|
|
self.verify_vsd_router(vr2)
|
|
self.debug("+++Verified VR is spawned for this network ")
|
|
# We need to have the vm password
|
|
vm2.password = vm2.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm2.password)
|
|
self.debug("VM2 - %s password - %s !" %
|
|
(vm2.name, vm2.password))
|
|
vpc_public_ip_2 = \
|
|
self.acquire_PublicIPAddress(create_vrnetwork.network,
|
|
create_vrvpc.vpc)
|
|
self.create_StaticNatRule_For_VM(vm2, vpc_public_ip_2,
|
|
create_vrnetwork.network)
|
|
|
|
self.verify_config_drive_content(
|
|
vm2, vpc_public_ip_2,
|
|
self.PasswordTest(vm2.password),
|
|
metadata=True,
|
|
userdata=self.test_data["virtual_machine_userdata"][
|
|
"userdata"])
|
|
|
|
expected_user_data2 = self.update_userdata(vm2, "helloworld vm2")
|
|
self.verify_config_drive_content(vm2, vpc_public_ip_2,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2)
|
|
|
|
self.debug("+++ Restarting the created vpc without "
|
|
"cleanup...")
|
|
self.restart_Vpc(create_vrvpc.vpc, cleanup=False)
|
|
self.validate_Vpc(create_vrvpc.vpc, state="Enabled")
|
|
self.verify_config_drive_content(vm2, vpc_public_ip_2,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
|
|
self.debug("+++ Restarting the created vpc with "
|
|
"cleanup...")
|
|
self.restart_Vpc(create_vrvpc.vpc, cleanup=True)
|
|
self.validate_Vpc(create_vrvpc.vpc, state="Enabled")
|
|
self.verify_config_drive_content(vm2, vpc_public_ip_2,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
|
|
self.debug("+++ Restarting the created VPC Tier network without "
|
|
"cleanup...")
|
|
create_vrnetwork.network.restart(self.api_client, cleanup=False)
|
|
self.validate_Network(create_vrnetwork.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm2, vpc_public_ip_2,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
|
|
self.debug("+++ Restarting the created VPC Tier network with "
|
|
"cleanup...")
|
|
create_vrnetwork.network.restart(self.api_client, cleanup=True)
|
|
self.validate_Network(create_vrnetwork.network,
|
|
state="Implemented")
|
|
self.verify_config_drive_content(vm2, vpc_public_ip_2,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
|
|
self.debug("+++ Upgrade offering of created VPC network with "
|
|
"an offering which removes the VR...")
|
|
self.upgrade_Network(self.test_data["nuagevsp"][
|
|
"vpc_network_offering_configdrive_"
|
|
"withoutdns"],
|
|
create_vrnetwork.network)
|
|
|
|
self.verify_config_drive_content(vm2, vpc_public_ip_2,
|
|
self.PasswordTest(vm2.password),
|
|
userdata=expected_user_data2,
|
|
metadata=True)
|
|
|
|
vm2.delete(self.api_client, expunge=True)
|
|
create_vrnetwork.network.delete(self.api_client)
|
|
create_vrvpc.vpc.delete(self.api_client)
|
|
|
|
self.debug("+++ Verify userdata after rebootVM - %s" % vm.name)
|
|
vm.reboot(self.api_client)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
metadata=True,
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata for VM - %s" % vm.name)
|
|
expected_user_data = self.update_userdata(vm,
|
|
"hellovm after reboot")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
self.debug("Resetting password for VM - %s" % vm.name)
|
|
self.reset_password(vm)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password))
|
|
|
|
self.debug("+++ Migrating one of the VMs in the created "
|
|
"VPC Tier network to another host, if available...")
|
|
self.migrate_VM(vm)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata after migrating VM - %s" % vm.name)
|
|
expected_user_data = self.update_userdata(vm,
|
|
"hellovm after migrate")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password),
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
self.debug("Resetting password for VM - %s" % vm.name)
|
|
self.reset_password(vm)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password))
|
|
|
|
self.debug("+++ Verify userdata after stopstartVM - %s" % vm.name)
|
|
vm.stop(self.api_client)
|
|
vm.start(self.api_client)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata for VM - %s" % vm.name)
|
|
expected_user_data = self.update_userdata(vm,
|
|
"hello after stopstart")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
self.debug("Resetting password for VM - %s" % vm.name)
|
|
self.reset_password(vm)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(vm.password))
|
|
|
|
self.debug("+++ Verify userdata after recoverVM - %s" % vm.name)
|
|
vm.delete(self.api_client, expunge=False)
|
|
self.debug("Recover VM - %s" % vm.name)
|
|
vm.recover(self.api_client)
|
|
vm.start(self.api_client)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
self.update_provider_state("Disabled")
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ When template is not password enabled "
|
|
"verify configdrive of VM - %s" % vm.name)
|
|
vm.delete(self.api_client, expunge=True)
|
|
self.update_provider_state("Enabled")
|
|
self.updateTemplate(False)
|
|
|
|
self.generate_ssh_keys()
|
|
self.debug("keypair name %s " % self.keypair.name)
|
|
vm = self.create_guest_vm(create_tiernetwork.network,
|
|
acl_item,
|
|
vpc=create_vpc.vpc,
|
|
keypair=self.keypair.name)
|
|
|
|
expected_user_data = self.update_userdata(vm,
|
|
"This is sample data")
|
|
vpc_public_ip_1 = \
|
|
self.acquire_PublicIPAddress(create_tiernetwork.network,
|
|
create_vpc.vpc)
|
|
self.create_StaticNatRule_For_VM(vm, vpc_public_ip_1,
|
|
create_tiernetwork.network)
|
|
self.verify_config_drive_content(vm, vpc_public_ip_1,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
vm.delete(self.api_client, expunge=True)
|
|
create_tiernetwork.network.delete(self.api_client)
|
|
|
|
def handle_threads(self, source_threads, thread_class, **kwargs):
|
|
my_threads = []
|
|
for aThread in source_threads:
|
|
my_vm = aThread.get_vm()
|
|
self.debug("[Concurrency]%s in vm: %s"
|
|
% (thread_class.get_name(), my_vm.name))
|
|
new_thread = thread_class(self, my_vm, **kwargs)
|
|
my_threads.append(new_thread)
|
|
new_thread.start()
|
|
#
|
|
# Wait until all threads are finished
|
|
self.wait_until_done(my_threads, thread_class.get_name())
|
|
return my_threads
|
|
|
|
@attr(
|
|
tags=["advanced", "nuagevsp", "concurrency"], required_hardware="true")
|
|
def test_nuage_configDrive_concurrency(self):
|
|
""" Verify concurrency of ConfigDrive userdata update & password reset
|
|
"""
|
|
|
|
# Validate the following
|
|
# 1. When ConfigDrive is enabled as provider in zone
|
|
# Create an Isolated Network with Nuage VSP Isolated Network
|
|
# offering specifying ConfigDrive as serviceProvider for userdata,
|
|
# make sure no Dns is in the offering so no VR is spawned.
|
|
# check if it is successfully created and is in the "Allocated"
|
|
# state.
|
|
# 2. Concurrently create a number of VM's in the above isolated network
|
|
# 3. Wait until all VM's are running
|
|
# 4. Concurrently update the userdata of all the VM's
|
|
# 5. Wait util all updates are finished
|
|
# 6. Repeat above (5-6) x times
|
|
# 7. Check userdata in all VM's
|
|
# 8. Concurrently reset password on all VM's
|
|
# 9. Wait until all resets are finished
|
|
# 10. Verify all passwords
|
|
# 11. Concurrently delete all VM's.
|
|
# 12. Restore ConfigDrive provider state
|
|
# 13. Delete all the created objects (cleanup).
|
|
|
|
#
|
|
# 1. When ConfigDrive enabled create network
|
|
default_state = self.update_provider_state("Enabled")
|
|
create_network = self.verify_network_creation(
|
|
offering_name="isolated_configdrive_network_offering_withoutdns",
|
|
gateway='10.1.1.1')
|
|
#
|
|
# 2. Concurrently create all VMs
|
|
self.password_enabled = self.update_password_enable_in_template(False)
|
|
my_create_threads = []
|
|
nbr_vms = 5
|
|
for i in range(nbr_vms):
|
|
# Add VM
|
|
self.debug("+++ [Concurrency]Going to verify %d VM's, starting "
|
|
"the %d VM" % (nbr_vms, i + 1))
|
|
vm_thread = self.StartVM(self, create_network.network, i)
|
|
my_create_threads.append(vm_thread)
|
|
vm_thread.start()
|
|
#
|
|
# 3. Wait until all VM's are running
|
|
self.wait_until_done(my_create_threads, "creation")
|
|
self.assertEqual(
|
|
nbr_vms, len(my_create_threads), "Not all VM's are up")
|
|
|
|
try:
|
|
for i in range(2):
|
|
self.debug("\n+++ [Concurrency]Start update on all VM's")
|
|
#
|
|
# 5. Concurrently update all VM's
|
|
my_update_threads = self.handle_threads(my_create_threads,
|
|
self.UpdateVM, idx=i)
|
|
|
|
first = my_update_threads[0].get_timestamps()
|
|
last = my_update_threads[-1].get_timestamps()
|
|
self.debug("[Concurrency] Update report: first start %s, "
|
|
"last start %s. Duration in seconds: %s" %
|
|
(first[0].strftime("%H:%M:%S-%f"),
|
|
last[0].strftime("%H:%M:%S-%f"),
|
|
(last[0] - first[0]).total_seconds()))
|
|
self.debug("[Concurrency] Update report: first end %s, "
|
|
"last end %s. Duration in seconds: %s" %
|
|
(first[1].strftime("%H:%M:%S-%f"),
|
|
last[1].strftime("%H:%M:%S-%f"),
|
|
(last[0] - first[0]).total_seconds()))
|
|
#
|
|
# 7. Check userdata in all VM's
|
|
self.debug("\n+++ [Concurrency]Check userdata")
|
|
public_ip_1 = self.acquire_PublicIPAddress(create_network.network)
|
|
for aThread in my_update_threads:
|
|
#
|
|
# create floating ip
|
|
self.create_and_verify_fip_and_fw(aThread.get_vm(),
|
|
public_ip_1,
|
|
create_network.network)
|
|
#
|
|
# verify userdata
|
|
self.debug("[Concurrency]verify userdata for vm %s"
|
|
% aThread.get_vm().name)
|
|
self.verify_config_drive_content(
|
|
aThread.get_vm(), public_ip_1,
|
|
self.PasswordTest(None),
|
|
userdata=aThread.get_userdata())
|
|
self.delete_StaticNatRule_For_VM(public_ip_1)
|
|
#
|
|
# 8. Concurrently reset password on all VM's
|
|
self.update_password_enable_in_template(True)
|
|
my_reset_threads = self.handle_threads(my_create_threads,
|
|
self.ResetPassword)
|
|
#
|
|
# 10. Verify the passwords
|
|
self.debug("\n+++ [Concurrency]Verify passwords on all VM's")
|
|
for aThread in my_reset_threads:
|
|
# create floating ip
|
|
self.create_and_verify_fip_and_fw(aThread.get_vm(),
|
|
public_ip_1,
|
|
create_network.network)
|
|
|
|
# verify password
|
|
self.debug("[Concurrency]verify password for vm %s"
|
|
% aThread.get_vm().name)
|
|
self.verify_config_drive_content(
|
|
aThread.get_vm(), public_ip_1,
|
|
self.PasswordTest(aThread.get_password()))
|
|
self.delete_StaticNatRule_For_VM(public_ip_1)
|
|
public_ip_1.delete(self.api_client)
|
|
|
|
self.debug("\n+++ [Concurrency]Stop all VM's")
|
|
|
|
finally:
|
|
self.update_password_enable_in_template(self.password_enabled)
|
|
#
|
|
# 11. Concurrently delete all VM's.
|
|
self.handle_threads(my_create_threads, self.StopVM)
|
|
#
|
|
# 12. Restore ConfigDrive provider state
|
|
self.update_provider_state(default_state)
|
|
#
|
|
# 13. Delete all the created objects (cleanup).
|
|
self.delete_Network(create_network.network)
|
|
|
|
@attr(tags=["advanced", "nuagevsp", "shared"], required_hardware="true")
|
|
def test_nuage_configdrive_shared_network(self):
|
|
"""Test Configdrive as provider for shared Networks
|
|
to provide userdata and password reset functionality
|
|
with Nuage VSP SDN plugin
|
|
"""
|
|
|
|
# 1. When ConfigDrive is disabled as provider in zone
|
|
# Verify Shared Network creation with a network offering
|
|
# which has userdata provided by ConfigDrive fails
|
|
# 2. When ConfigDrive is enabled as provider in zone
|
|
# Create a shared Network with Nuage VSP Isolated Network
|
|
# offering specifying ConfigDrive as serviceProvider
|
|
# for userdata,
|
|
# make sure no Dns is in the offering so no VR is spawned.
|
|
# check if it is successfully created and
|
|
# is in the "Allocated" state.
|
|
# 3. Deploy a VM in the created Shared network with user data,
|
|
# check if the Shared network state is changed to
|
|
# "Implemented", and the VM is successfully deployed and
|
|
# is in the "Running" state.
|
|
# Check that no VR is deployed.
|
|
# 4. SSH into the deployed VM and verify its user data in the iso
|
|
# (expected user data == actual user data).
|
|
# 5. Verify that the guest VM's password in the iso.
|
|
# 6. Reset VM password, and start the VM.
|
|
# 7. Verify that the new guest VM template is password enabled by
|
|
# checking the VM's password (password != "password").
|
|
# 8. SSH into the VM for verifying its new password
|
|
# after its password reset.
|
|
# 9. Verify various scenarios and check the data in configdriveIso
|
|
# 10. Delete all the created objects (cleanup).
|
|
|
|
for zone in self.zones:
|
|
self.debug("Zone - %s" % zone.name)
|
|
# Get Zone details
|
|
self.getZoneDetails(zone=zone)
|
|
# Configure VSD sessions
|
|
self.configureVSDSessions()
|
|
if not self.isNuageInfraUnderlay:
|
|
self.skipTest(
|
|
"Configured Nuage VSP SDN platform infrastructure "
|
|
"does not support underlay networking: "
|
|
"skipping test")
|
|
|
|
self.debug("+++Testing configdrive in an shared network fails..."
|
|
"as provider configdrive is still disabled...")
|
|
self.update_provider_state("Disabled")
|
|
shared_test_data = self.test_data["nuagevsp"]["network_all"]
|
|
shared_network = self.verify_network_creation(
|
|
offering_name="shared_nuage_network_config_drive_offering",
|
|
testdata=shared_test_data)
|
|
self.assertFalse(shared_network.success,
|
|
'Network found success = %s, expected success =%s'
|
|
% (str(shared_network.success), 'False'))
|
|
|
|
self.update_provider_state("Enabled")
|
|
shared_network = self.verify_network_creation(
|
|
offering=shared_network.offering, testdata=shared_test_data)
|
|
self.assertTrue(shared_network.success,
|
|
'Network found success = %s, expected success = %s'
|
|
% (str(shared_network.success), 'True'))
|
|
|
|
self.validate_Network(shared_network.network, state="Allocated")
|
|
|
|
shared_test_data2 = self.test_data["nuagevsp"]["network_all2"]
|
|
shared_network2 = self.verify_network_creation(
|
|
offering=shared_network.offering,
|
|
testdata=shared_test_data2)
|
|
self.assertTrue(shared_network2.success,
|
|
'Network found success = %s, expected success = %s'
|
|
% (str(shared_network2.success), 'True'))
|
|
|
|
self.validate_Network(shared_network2.network, state="Allocated")
|
|
|
|
self.debug("+++Test user data & password reset functionality "
|
|
"using configdrive in an Isolated network without VR")
|
|
|
|
self.update_password_enable_in_template(True)
|
|
public_ip_ranges = PublicIpRange.list(self.api_client)
|
|
for ip_range in public_ip_ranges:
|
|
if shared_network.network.id == ip_range.networkid \
|
|
or shared_network2.network.id == ip_range.networkid:
|
|
self.enable_NuageUnderlayPublicIpRange(ip_range.id)
|
|
|
|
self.generate_ssh_keys()
|
|
self.debug("keypair name %s " % self.keypair.name)
|
|
|
|
self.debug("+++Deploy of a VM on a shared network with multiple "
|
|
"ip ranges, all should have the same value for the "
|
|
"underlay flag.")
|
|
# Add subnet of different gateway
|
|
self.debug("+++ Adding subnet of different gateway")
|
|
|
|
subnet = self.add_subnet_verify(
|
|
shared_network.network,
|
|
self.test_data["nuagevsp"]["publiciprange2"])
|
|
tmp_test_data = copy.deepcopy(
|
|
self.test_data["virtual_machine"])
|
|
|
|
tmp_test_data["ipaddress"] = \
|
|
self.test_data["nuagevsp"]["network_all"]["endip"]
|
|
|
|
with self.assertRaises(Exception):
|
|
self.create_VM(
|
|
[shared_network.network],
|
|
testdata=tmp_test_data)
|
|
|
|
self.debug("+++ In a shared network with multiple ip ranges, "
|
|
"userdata with config drive must be allowed.")
|
|
|
|
self.enable_NuageUnderlayPublicIpRange(subnet.vlan.id)
|
|
|
|
vm1 = self.create_VM(
|
|
[shared_network.network],
|
|
testdata=self.test_data["virtual_machine_userdata"],
|
|
keypair=self.keypair.name)
|
|
# Check VM
|
|
self.check_VM_state(vm1, state="Running")
|
|
# Verify shared Network and VM in VSD
|
|
self.verify_vsd_shared_network(
|
|
self.domain.id,
|
|
shared_network.network,
|
|
gateway=self.test_data["nuagevsp"]["network_all"]["gateway"])
|
|
subnet_id = self.get_subnet_id(
|
|
shared_network.network.id,
|
|
self.test_data["nuagevsp"]["network_all"]["gateway"])
|
|
self.verify_vsd_enterprise_vm(
|
|
self.domain.id,
|
|
shared_network.network, vm1,
|
|
sharedsubnetid=subnet_id)
|
|
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(shared_network)
|
|
self.debug("+++ Verified no VR is spawned for this network ")
|
|
# We need to have the vm password
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
public_ip = PublicIPAddress({"ipaddress": vm1})
|
|
self.verify_config_drive_content(
|
|
vm1, public_ip,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=self.test_data["virtual_machine_userdata"][
|
|
"userdata"])
|
|
expected_user_data = self.update_userdata(vm1, "helloworld vm1")
|
|
self.verify_config_drive_content(
|
|
vm1, public_ip, self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data)
|
|
|
|
self.debug("+++ Adding a non-default nic to the VM "
|
|
"making it a multi-nic VM...")
|
|
self.nic_operation_VM(vm1, shared_network2.network,
|
|
operation="add")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hellomultinicvm1")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ Updating non-default nic as the default nic "
|
|
"of the multi-nic VM...")
|
|
self.nic_operation_VM(vm1,
|
|
shared_network2.network, operation="update")
|
|
vm1.stop(self.api_client)
|
|
vm1.start(self.api_client)
|
|
|
|
public_ip_2 = PublicIPAddress(
|
|
{"ipaddress": VirtualMachine.list(self.api_client,
|
|
id=vm1.id)[0].nic[1]})
|
|
self.verify_config_drive_content(vm1, public_ip_2,
|
|
self.PasswordTest(False),
|
|
metadata=True,
|
|
userdata=expected_user_data1)
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
self.verify_config_drive_content(vm1, public_ip_2,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1)
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hellomultinicvm1")
|
|
self.verify_config_drive_content(vm1, public_ip_2,
|
|
self.PasswordTest(True),
|
|
userdata=expected_user_data1)
|
|
|
|
self.debug("+++ Updating the default nic of the multi-nic VM, "
|
|
"deleting the non-default nic...")
|
|
self.nic_operation_VM(vm1,
|
|
shared_network.network, operation="update")
|
|
vm1.stop(self.api_client)
|
|
vm1.start(self.api_client)
|
|
public_ip = PublicIPAddress({"ipaddress": vm1})
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(False),
|
|
metadata=True,
|
|
userdata=expected_user_data1)
|
|
|
|
self.nic_operation_VM(vm1,
|
|
shared_network2.network, operation="remove")
|
|
|
|
multinicvm1 = self.create_VM([shared_network2.network,
|
|
shared_network.network])
|
|
multinicvm1.password = multinicvm1.resetPassword(self.api_client)
|
|
self.debug("+++ MultiNICVM Password reset to - %s"
|
|
% multinicvm1.password)
|
|
self.debug("MultiNICVM - %s password - %s !"
|
|
% (multinicvm1.name, multinicvm1.password))
|
|
public_ip_3 = \
|
|
PublicIPAddress(
|
|
{"ipaddress": VirtualMachine.list(
|
|
self.api_client, id=multinicvm1.id)[0].nic[0]})
|
|
self.verify_config_drive_content(
|
|
multinicvm1, public_ip_3,
|
|
self.PasswordTest(multinicvm1.password),
|
|
metadata=True)
|
|
expected_user_data2 = self.update_userdata(multinicvm1,
|
|
"hello multinicvm1")
|
|
self.verify_config_drive_content(multinicvm1, public_ip_3,
|
|
self.PasswordTest(True),
|
|
userdata=expected_user_data2)
|
|
multinicvm1.delete(self.api_client, expunge=True)
|
|
|
|
shared_network2.network.delete(self.api_client)
|
|
# We need to have the vm password
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
public_ip = PublicIPAddress({"ipaddress": vm1})
|
|
|
|
self.debug("+++ Verifying userdata after rebootVM - %s" % vm1.name)
|
|
vm1.reboot(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata for VM - %s" % vm1.name)
|
|
expected_user_data1 = self.update_userdata(vm1, "hello afterboot")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
ssh_key=self.keypair)
|
|
self.debug("Resetting password for VM - %s" % vm1.name)
|
|
self.reset_password(vm1)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password))
|
|
|
|
self.debug("+++ Migrating one of the VMs in the created Isolated "
|
|
"network to another host, if available...")
|
|
self.migrate_VM(vm1)
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata after migrating VM - %s" % vm1.name)
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hello after migrate")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password),
|
|
userdata=expected_user_data1)
|
|
self.debug("Resetting password for VM - %s" % vm1.name)
|
|
self.reset_password(vm1)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password))
|
|
|
|
self.debug("+++ Verify userdata after stopstartVM - %s" % vm1.name)
|
|
vm1.stop(self.api_client)
|
|
vm1.start(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("Updating userdata for VM - %s" % vm1.name)
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hello afterstopstart")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1)
|
|
self.debug("Resetting password for VM - %s" % vm1.name)
|
|
self.reset_password(vm1)
|
|
self.debug("SSHing into the VM for verifying its new password "
|
|
"after its password reset...")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(vm1.password))
|
|
|
|
self.debug("+++ Verify userdata after VM recover- %s" % vm1.name)
|
|
vm1.delete(self.api_client, expunge=False)
|
|
self.debug("Recover VM - %s" % vm1.name)
|
|
vm1.recover(self.api_client)
|
|
vm1.start(self.api_client)
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
self.update_provider_state("Disabled")
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"hello after recover")
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
|
|
self.debug("+++ When template is not password enabled, "
|
|
"verify configdrive of VM - %s" % vm1.name)
|
|
vm1.delete(self.api_client, expunge=True)
|
|
self.update_provider_state("Enabled")
|
|
self.updateTemplate(False)
|
|
self.generate_ssh_keys()
|
|
self.debug("keypair name %s " % self.keypair.name)
|
|
vm1 = self.create_VM(
|
|
[shared_network.network],
|
|
testdata=self.test_data["virtual_machine_userdata"],
|
|
keypair=self.keypair.name)
|
|
expected_user_data1 = self.update_userdata(vm1,
|
|
"This is sample data")
|
|
public_ip = PublicIPAddress({"ipaddress": vm1})
|
|
self.verify_config_drive_content(vm1, public_ip,
|
|
self.PasswordTest(False),
|
|
userdata=expected_user_data1,
|
|
metadata=True,
|
|
ssh_key=self.keypair)
|
|
vm1.delete(self.api_client, expunge=True)
|
|
shared_network.network.delete(self.api_client)
|
|
|
|
@attr(tags=["advanced", "nuagevsp", "endurance"], required_hardware="true")
|
|
def test_nuage_configdrive_endurance(self):
|
|
""" Verify endurance of ConfigDrive userdata update
|
|
"""
|
|
# Validate the following
|
|
# 1. When ConfigDrive is enabled as provider in zone
|
|
# Create an Isolated Network with Nuage VSP Isolated Network
|
|
# offering specifying ConfigDrive as serviceProvider for userdata,
|
|
# make sure no Dns is in the offering so no VR is spawned.
|
|
# 2. create a VM in the above isolated network
|
|
# 3. Wait until VM is running
|
|
# 4. Concurrently update the userdata for the VM
|
|
# 5. Wait util all updates are finished
|
|
# 6. Check userdata in VM
|
|
# 7. Delete all the created objects (cleanup).
|
|
for zone in self.zones:
|
|
self.debug("Zone - %s" % zone.name)
|
|
# Get Zone details
|
|
self.getZoneDetails(zone=zone)
|
|
# Configure VSD sessions
|
|
self.configureVSDSessions()
|
|
self.update_provider_state("Enabled")
|
|
create_network = self.verify_network_creation(
|
|
offering_name="isolated_configdrive_network_offering_"
|
|
"withoutdns",
|
|
gateway='10.1.1.1')
|
|
self.assertTrue(create_network.success,
|
|
'Network found success = %s, expected success = %s'
|
|
% (str(create_network.success), 'True'))
|
|
|
|
self.validate_Network(create_network.network, state="Allocated")
|
|
self.update_password_enable_in_template(True)
|
|
self.generate_ssh_keys()
|
|
self.debug("keypair name %s " % self.keypair.name)
|
|
vm1 = self.create_guest_vm(create_network.network,
|
|
keypair=self.keypair.name)
|
|
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(create_network)
|
|
self.debug("+++Verified no VR is spawned for this network ")
|
|
# We need to have the vm password
|
|
vm1.password = vm1.resetPassword(self.api_client)
|
|
self.debug("Password reset to - %s" % vm1.password)
|
|
self.debug("VM - %s password - %s !" %
|
|
(vm1.name, vm1.password))
|
|
|
|
public_ip_1 = self.acquire_PublicIPAddress(create_network.network)
|
|
self.create_and_verify_fip_and_fw(vm1, public_ip_1,
|
|
create_network.network)
|
|
|
|
expected_user_data = self.test_data[
|
|
"virtual_machine_userdata"]["userdata"]
|
|
ssh_client = self.verify_config_drive_content(
|
|
vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair)
|
|
|
|
for i in range(0, 300):
|
|
self.verify_config_drive_content(
|
|
vm1, public_ip_1,
|
|
self.PasswordTest(vm1.password),
|
|
metadata=True,
|
|
userdata=expected_user_data,
|
|
ssh_key=self.keypair,
|
|
ssh_client=ssh_client)
|
|
expected_user_data = \
|
|
self.update_userdata(vm1,
|
|
'This is sample data %s' % i)
|
|
|
|
if __name__ == "__main__" and __package__ is None:
|
|
__package__ = "integration.plugins.nuage"
|