blob: cb02a230f58a4b6f48ca054ef1f784a90f654178 [file] [log] [blame]
// 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.
package com.cloud.hypervisor.ovm3.resources;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.naming.ConfigurationException;
import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.junit.Test;
import org.mockito.Mockito;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.StartCommand;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.to.DiskTO;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.host.Host;
import com.cloud.hypervisor.ovm3.objects.CloudStackPluginTest;
import com.cloud.hypervisor.ovm3.objects.ConnectionTest;
import com.cloud.hypervisor.ovm3.objects.NetworkTest;
import com.cloud.hypervisor.ovm3.objects.Ovm3ResourceException;
import com.cloud.hypervisor.ovm3.objects.OvmObject;
import com.cloud.hypervisor.ovm3.objects.Xen;
import com.cloud.hypervisor.ovm3.objects.XenTest;
import com.cloud.hypervisor.ovm3.objects.XmlTestResultTest;
import com.cloud.hypervisor.ovm3.resources.helpers.Ovm3Configuration;
import com.cloud.hypervisor.ovm3.resources.helpers.Ovm3ConfigurationTest;
import com.cloud.hypervisor.ovm3.support.Ovm3SupportTest;
import com.cloud.network.Networks;
import com.cloud.storage.Volume;
import com.cloud.template.VirtualMachineTemplate.BootloaderType;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
public class Ovm3HypervisorResourceTest {
ConnectionTest con;
OvmObject ovmObject = new OvmObject();
XmlTestResultTest results = new XmlTestResultTest();
Ovm3ConfigurationTest configTest = new Ovm3ConfigurationTest();
Ovm3HypervisorResource hypervisor = new Ovm3HypervisorResource();
Ovm3SupportTest support = new Ovm3SupportTest();
NetworkTest net = new NetworkTest();
// LinuxTest linux = new LinuxTest();
CloudStackPluginTest csp = new CloudStackPluginTest();
XenTest xen = new XenTest();
String currentStatus = "put";
String vmName = "i-2-3-VM";
@Test
public void configureTest() throws ConfigurationException {
Ovm3Configuration config = new Ovm3Configuration(configTest.getParams());
con = support.prepConnectionResults();
hypervisor.setConnection(con);
results.basicBooleanTest(hypervisor.configure(config.getAgentName(),
configTest.getParams()));
}
/* fails */
/*
@Test(expected = CloudRuntimeException.class)
public void configureFailBaseConnectionTest() throws
ConfigurationException {
hypervisor = support.prepare(configTest.getParams());
results.basicBooleanTest(hypervisor.configure(con.getHostName(),
configTest.getParams()));
}
*/
@Test
public void configureControlInterfaceTest() throws ConfigurationException {
Ovm3Configuration config = new Ovm3Configuration(configTest.getParams());
String netdef = net.getDiscoverNetwork();
netdef = netdef.replaceAll(config.getAgentControlNetworkName(),
"thisisnotit0");
con = support.prepConnectionResults();
con.removeMethodResponse("discover_network");
con.setResult(results.simpleResponseWrapWrapper(netdef));
con.addResult(results.simpleResponseWrapWrapper(net
.getDiscoverNetwork()));
hypervisor.setConnection(con);
results.basicBooleanTest(hypervisor.configure(config.getAgentName(),
configTest.getParams()));
}
@Test
public void startCommandTest() {
}
@Test
public void getCurrentStatusAndConfigureTest()
throws ConfigurationException {
Ovm3Configuration config = new Ovm3Configuration(configTest.getParams());
con = support.prepConnectionResults();
hypervisor.setConnection(con);
results.basicBooleanTest(hypervisor.configure(config.getAgentName(),
configTest.getParams()));
assertNotNull(hypervisor.getCurrentStatus(1L));
assertNotNull(hypervisor.getCurrentStatus(1L));
}
@Test
public void getCurrentStatusFailTest() throws ConfigurationException {
Ovm3Configuration config = new Ovm3Configuration(configTest.getParams());
con = support.prepConnectionResults();
con.setResult(results.simpleResponseWrapWrapper("fail"));
con.removeMethodResponse("echo");
hypervisor.setConnection(con);
results.basicBooleanTest(hypervisor.configure(config.getAgentName(),
configTest.getParams()));
assertNull(hypervisor.getCurrentStatus(1L));
}
@Test
public void getCurrentStatusExceptionTest() throws ConfigurationException {
con = new ConnectionTest();
hypervisor.setConnection(con);
assertNull(hypervisor.getCurrentStatus(1L));
}
/* gives an IOException on ssh */
@Test
public void initializeTest() throws Exception {
Ovm3Configuration config = new Ovm3Configuration(configTest.getParams());
con = support.prepConnectionResults();
hypervisor.setConnection(con);
results.basicBooleanTest(hypervisor.configure(config.getAgentName(),
configTest.getParams()));
con.setIp(config.getAgentIp());
for (StartupCommand start : hypervisor.initialize()) {
assertNotNull(start);
}
}
private Ovm3HypervisorResource vmActionPreparation()
throws ConfigurationException {
Ovm3Configuration config = new Ovm3Configuration(configTest.getParams());
con = support.prepConnectionResults();
hypervisor.setConnection(con);
results.basicBooleanTest(hypervisor.configure(config.getAgentName(),
configTest.getParams()));
return hypervisor;
}
private Boolean rebootVm(String name) throws ConfigurationException {
hypervisor = vmActionPreparation();
con.removeMethodResponse("list_vms");
con.addResult(xen.getMultipleVmsListXML());
con.addResult(xen.getMultipleVmsListXML());
RebootCommand cmd = new RebootCommand(name, true);
Answer ra = hypervisor.executeRequest(cmd);
return ra.getResult();
}
@Test
public void rebootCommandTest() throws ConfigurationException {
results.basicBooleanTest(rebootVm(vmName));
}
@Test
public void rebootCommandFailTest() throws ConfigurationException {
results.basicBooleanTest(rebootVm("bogus"), false);
}
@Test
public void stopVmTest() throws ConfigurationException {
hypervisor = vmActionPreparation();
con.removeMethodResponse("list_vms");
con.setResult(xen.getMultipleVmsListXML());
con.addResult(xen.getMultipleVmsListXML().replace(vmName,
vmName + "-hide"));
StopCommand cmd = new StopCommand(vmName, true, true);
Answer ra = hypervisor.executeRequest(cmd);
results.basicBooleanTest(ra.getResult());
}
/* takes too long */
/*
* @Test
* public void stopVmTestFail() throws ConfigurationException {
* stopVm();
* con.addResult(xen.getVmListXML().replace(vmName, vmName));
* StopCommand cmd = new StopCommand(vmName, true, true);
* StopAnswer ra = hypervisor.execute(cmd);
* results.basicBooleanTest(ra.getResult(), false);
* }
*/
@Test
public void stopVmTreatAsStoppedTest() throws ConfigurationException {
hypervisor = vmActionPreparation();
con.setMethodResponse("list_vms",
xen.getMultipleVmsListXML().replace(vmName, vmName + "-hide"));
StopCommand cmd = new StopCommand(vmName, true, true);
Answer ra = hypervisor.executeRequest(cmd);
results.basicBooleanTest(ra.getResult());
}
@Test
public void stopVmExceptionTest() throws ConfigurationException {
hypervisor = vmActionPreparation();
con.removeMethodResponse("list_vms");
StopCommand cmd = new StopCommand(vmName, true, true);
Answer ra = hypervisor.executeRequest(cmd);
results.basicBooleanTest(ra.getResult(), false);
}
/* not relevant atm */
public void addNicsToSpec(VirtualMachineTO vmspec, List<String> list) {
for (String vif : list) {
String parts[] = vif.split("[,=.]+");
addNicToSpec(vmspec, parts[1], parts[3], parts[4]);
}
}
public void addNicToSpec(VirtualMachineTO vmspec, String mac,
String bridge, String vlan) {
ArrayList<NicTO> nics;
if (vmspec.getNics() != null) {
nics = new ArrayList<NicTO>(Arrays.asList(vmspec.getNics()));
} else {
nics = new ArrayList<NicTO>();
}
NicTO nic = new NicTO();
nic.setType(Networks.TrafficType.Guest);
nic.setMac(mac);
nic.setDeviceId(nics.size());
nics.add(nic);
vmspec.setNics(nics.toArray(new NicTO[nics.size()]));
}
/* hardcoded, dirty */
public void addDisksToSpec(VirtualMachineTO vmspec, List<String> list) {
for (String disk : list) {
String parts[] = disk.split("[:,.]+");
String partdeux[] = parts[1].split("/");
String diskuuid = partdeux[partdeux.length - 1];
String dsuuid = partdeux[3];
String path = parts[1].replace("/" + diskuuid, "");
addDiskToSpec(vmspec, diskuuid, dsuuid, path);
}
}
public void addDiskToSpec(VirtualMachineTO vmspec, String uuid,
String dsuuid, String path) {
ArrayList<DiskTO> disks;
if (vmspec.getDisks() != null) {
disks = new ArrayList<DiskTO>(Arrays.asList(vmspec.getDisks()));
} else {
disks = new ArrayList<DiskTO>();
}
DiskTO disk = new DiskTO();
VolumeObjectTO volume = new VolumeObjectTO();
NfsTO nfsDataStore = new NfsTO();
nfsDataStore.setUuid(dsuuid);
volume.setDataStore(nfsDataStore);
volume.setPath(path);
volume.setUuid(uuid);
disk.setData(volume);
disk.setType(Volume.Type.ROOT);
disks.add(disk);
vmspec.setDisks(disks.toArray(new DiskTO[disks.size()]));
}
public Host getHost(String ip) {
Host host = Mockito.mock(Host.class);
Mockito.when(host.getPrivateIpAddress()).thenReturn(ip);
return host;
}
public VirtualMachineTO createVm(String vmName) throws Ovm3ResourceException {
con = support.prepConnectionResults();
Xen vdata = new Xen(con);
Xen.Vm vm = vdata.getVmConfig(vmName);
vdata.listVm(xen.getRepoId(), xen.getVmId());
// Ovm3VmGuestTypes types = new Ovm3VmGuestTypes();
Long id = 1L;
String instanceName = vm.getVmName();
VirtualMachine.Type type = Type.User;
int cpus = 1; // vm.getVmCpus();
Integer speed = 0;
long minRam = vm.getVmMemory();
long maxRam = vm.getVmMemory();
BootloaderType bootloader = BootloaderType.PyGrub;
String os = "Oracle Enterprise Linux 6.0 (64-bit)";
boolean enableHA = true;
boolean limitCpuUse = false;
String vncPassword = "gobbeldygoo";
// public StartCommand(VirtualMachineTO vm, Host host, boolean
// executeInSequence) {
// ./api/src/com/cloud/agent/api/to/VirtualMachineTO.java
VirtualMachineTO vmspec = new VirtualMachineTO(id, instanceName, type,
cpus, speed, minRam, maxRam, bootloader, os, enableHA,
limitCpuUse, vncPassword);
vmspec.setBootArgs("");
addDisksToSpec(vmspec, vm.getVmDisks());
addNicsToSpec(vmspec, vm.getVmVifs());
return vmspec;
}
@Test
public void createVmTest() throws ConfigurationException,
Ovm3ResourceException {
VirtualMachineTO vmspec = createVm(vmName);
hypervisor = vmActionPreparation();
StartCommand cmd = new StartCommand(vmspec,
getHost(hypervisor.getName()), true);
Answer ra = hypervisor.executeRequest(cmd);
results.basicBooleanTest(ra.getResult());
}
@Test
public void createOtherVmTest() throws ConfigurationException,
Ovm3ResourceException {
VirtualMachineTO vmspec = createVm(vmName);
vmspec.setOs("bogus");
hypervisor = vmActionPreparation();
StartCommand cmd = new StartCommand(vmspec,
getHost(hypervisor.getName()), true);
Answer ra = hypervisor.executeRequest(cmd);
results.basicBooleanTest(ra.getResult());
}
@Test
public void startResourceTest() {
results.basicBooleanTest(hypervisor.start());
}
@Test
public void stopResourceTest() {
results.basicBooleanTest(hypervisor.stop());
}
@Test
public void readyCommandTest() throws ConfigurationException {
hypervisor = support.prepare(configTest.getParams());
ReadyCommand ready = new ReadyCommand();
Answer ra = hypervisor.executeRequest(ready);
results.basicBooleanTest(ra.getResult());
}
}