mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Description: Currently, userdata sent over to the DeployVMCmd and updateVMCmd commands can be upto 2K in length, whether sent over GET or POST. We remove this limitation for POST to change this limit to 32K. Also enabling lazy load on userdata to improve performance during reads of large sized userdata from user VM records. Signed-off-by: Min Chen <min.chen@citrix.com>
109 lines
4.1 KiB
Python
109 lines
4.1 KiB
Python
#!/usr/bin/env python
|
|
|
|
import marvin
|
|
from marvin import cloudstackTestCase
|
|
from marvin.cloudstackTestCase import *
|
|
from marvin.integration.lib.base import *
|
|
|
|
import unittest
|
|
import hashlib
|
|
import random
|
|
import os
|
|
import string
|
|
|
|
class TestDeployVmWithUserData(cloudstackTestCase):
|
|
"""
|
|
This test deploys a virtual machine into a user account
|
|
using the small service offering and builtin template
|
|
"""
|
|
def setUp(self):
|
|
password = "password"
|
|
|
|
self.apiClient = self.testClient.getApiClient() #Get ourselves an API client
|
|
|
|
self.acct = createAccount.createAccountCmd() #The createAccount command
|
|
self.acct.accounttype = 0 #We need a regular user. admins have accounttype=1
|
|
self.acct.firstname = 'firstname'
|
|
self.acct.lastname = 'lastname'
|
|
self.acct.password = password
|
|
self.acct.username = 'user1'
|
|
self.acct.email = 'user1@user.com'
|
|
self.acct.account = 'user1'
|
|
self.acct.domainid = 1 #The default ROOT domain
|
|
self.acctResponse = self.apiClient.createAccount(self.acct)
|
|
|
|
self.debug("Successfully created account: %s, user: %s, id: \
|
|
%s"%(self.acctResponse.account.account, \
|
|
self.acctResponse.account.username, \
|
|
self.acctResponse.account.id))
|
|
|
|
# Generate userdata of 2500 bytes. This is larger than the 2048 bytes limit.
|
|
# CS however allows for upto 4K bytes in the code. So this must succeed.
|
|
# Overall, the query length must not exceed 4K, for then the json decoder
|
|
# will fail this operation at the marvin client side itself.
|
|
user_data = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(2500))
|
|
|
|
self.virtual_machine = {
|
|
"displayname": "Test VM",
|
|
"username": "root",
|
|
"password": "password",
|
|
"ssh_port": 22,
|
|
"hypervisor": 'VMware',
|
|
"privateport": 22,
|
|
"publicport": 22,
|
|
"protocol": 'TCP',
|
|
}
|
|
#self.virtual_machine["userdata"] = base64.b64encode(user_data)
|
|
self.virtual_machine["userdata"] = user_data
|
|
|
|
def test_DeployVm(self):
|
|
"""
|
|
Let's start by defining the attributes of our VM that we will be
|
|
deploying on CloudStack. We will be assuming a single zone is available
|
|
and is configured and all templates are Ready
|
|
"""
|
|
deployVmCmd = deployVirtualMachine.deployVirtualMachineCmd()
|
|
deployVmCmd.zoneid = 1
|
|
deployVmCmd.account = self.acct.account
|
|
deployVmCmd.domainid = self.acct.domainid
|
|
deployVmCmd.templateid = 7
|
|
deployVmCmd.serviceofferingid = 1
|
|
|
|
# Userdata is passed in the virtual_machine dictionary.
|
|
deployVmResponse = VirtualMachine.create(
|
|
self.apiClient,
|
|
self.virtual_machine,
|
|
accountid=self.acct.account,
|
|
domainid=self.acct.domainid,
|
|
serviceofferingid=deployVmCmd.serviceofferingid,
|
|
templateid=deployVmCmd.templateid,
|
|
zoneid=deployVmCmd.zoneid
|
|
)
|
|
|
|
# At this point our VM is expected to be Running. Let's find out what
|
|
# listVirtualMachines tells us about VMs in this account
|
|
|
|
listVmCmd = listVirtualMachines.listVirtualMachinesCmd()
|
|
listVmCmd.id = deployVmResponse.id
|
|
listVmResponse = self.apiClient.listVirtualMachines(listVmCmd)
|
|
|
|
self.assertNotEqual(len(listVmResponse), 0, "Check if the list API \
|
|
returns a non-empty response")
|
|
|
|
vm = listVmResponse[0]
|
|
|
|
self.assertEqual(vm.id, deployVmResponse.id, "Check if the VM returned \
|
|
is the same as the one we deployed")
|
|
|
|
|
|
self.assertEqual(vm.state, "Running", "Check if VM has reached \
|
|
a state of running")
|
|
|
|
def tearDown(self):
|
|
"""
|
|
Delete the account created. This will clear the VM belonging to that account as well.
|
|
"""
|
|
deleteAcct = deleteAccount.deleteAccountCmd()
|
|
deleteAcct.id = self.acctResponse.account.id
|
|
self.apiClient.deleteAccount(deleteAcct)
|