blob: d9808a98a0a1220dc9ae87da8b41d674b44fe5f7 [file] [log] [blame]
#!/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)