// 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()); } }