diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 75c9663e35f..9c1a6b42570 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -85,8 +85,6 @@ import com.ceph.rbd.RbdImage; import com.cloud.agent.api.Answer; import com.cloud.agent.api.BackupSnapshotAnswer; import com.cloud.agent.api.BackupSnapshotCommand; -import com.cloud.agent.api.CheckNetworkAnswer; -import com.cloud.agent.api.CheckNetworkCommand; import com.cloud.agent.api.CheckOnHostCommand; import com.cloud.agent.api.Command; import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand; @@ -98,12 +96,10 @@ import com.cloud.agent.api.FenceCommand; import com.cloud.agent.api.HostVmStateReportEntry; import com.cloud.agent.api.ManageSnapshotAnswer; import com.cloud.agent.api.ManageSnapshotCommand; -import com.cloud.agent.api.NetworkRulesSystemVmCommand; import com.cloud.agent.api.NetworkUsageAnswer; import com.cloud.agent.api.NetworkUsageCommand; import com.cloud.agent.api.OvsCreateTunnelAnswer; import com.cloud.agent.api.OvsCreateTunnelCommand; -import com.cloud.agent.api.OvsDestroyTunnelCommand; import com.cloud.agent.api.PingCommand; import com.cloud.agent.api.PingRoutingCommand; import com.cloud.agent.api.PingRoutingWithNwGroupsCommand; @@ -122,8 +118,6 @@ import com.cloud.agent.api.UnPlugNicAnswer; import com.cloud.agent.api.UnPlugNicCommand; import com.cloud.agent.api.VmDiskStatsEntry; import com.cloud.agent.api.VmStatsEntry; -import com.cloud.agent.api.check.CheckSshAnswer; -import com.cloud.agent.api.check.CheckSshCommand; import com.cloud.agent.api.routing.IpAssocCommand; import com.cloud.agent.api.routing.IpAssocVpcCommand; import com.cloud.agent.api.routing.NetworkElementCommand; @@ -178,7 +172,6 @@ import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.RouterPrivateIpStrategy; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PhysicalNetworkSetupInfo; import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResourceBase; import com.cloud.storage.JavaStorageLayer; @@ -1161,7 +1154,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return ""; } - private boolean checkNetwork(final String networkName) { + public boolean checkNetwork(final String networkName) { if (networkName == null) { return true; } @@ -1306,18 +1299,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return execute((UnPlugNicCommand)cmd); } else if (cmd instanceof NetworkElementCommand) { return _virtRouterResource.executeRequest((NetworkElementCommand)cmd); - } else if (cmd instanceof CheckSshCommand) { - return execute((CheckSshCommand)cmd); } else if (cmd instanceof NetworkUsageCommand) { return execute((NetworkUsageCommand)cmd); - } else if (cmd instanceof NetworkRulesSystemVmCommand) { - return execute((NetworkRulesSystemVmCommand)cmd); } else if (cmd instanceof CopyVolumeCommand) { return execute((CopyVolumeCommand)cmd); } else if (cmd instanceof ResizeVolumeCommand) { return execute((ResizeVolumeCommand)cmd); - } else if (cmd instanceof CheckNetworkCommand) { - return execute((CheckNetworkCommand)cmd); } else if (cmd instanceof StorageSubSystemCommand) { return storageHandler.handleStorageCommands((StorageSubSystemCommand)cmd); } else if (cmd instanceof PvlanSetupCommand) { @@ -1326,8 +1313,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return execute((CheckOnHostCommand)cmd); } else if (cmd instanceof OvsCreateTunnelCommand) { return execute((OvsCreateTunnelCommand)cmd); - } else if (cmd instanceof OvsDestroyTunnelCommand) { - return execute((OvsDestroyTunnelCommand)cmd); } else { s_logger.warn("Unsupported command "); return Answer.createUnsupportedCommandAnswer(cmd); @@ -1367,6 +1352,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv s_logger.debug("### KVM network for tunnels created:" + nwName); } catch (final Exception e) { s_logger.warn("createTunnelNetwork failed", e); + return false; } return true; } @@ -1374,7 +1360,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv public synchronized boolean configureTunnelNetwork(final long networkId, final long hostId, final String nwName) { try { - findOrCreateTunnelNetwork(nwName); + final boolean findResult = findOrCreateTunnelNetwork(nwName); + if (!findResult) { + s_logger.warn("LibvirtComputingResource.findOrCreateTunnelNetwork() failed! Cannot proceed creating the tunnel."); + return false; + } final String configuredHosts = Script .runSimpleBashScript("ovs-vsctl get bridge " + nwName + " other_config:ovs-host-setup"); @@ -1441,53 +1431,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } - private Answer execute(final OvsDestroyTunnelCommand cmd) { - try { - if (!findOrCreateTunnelNetwork(cmd.getBridgeName())) { - s_logger.warn("Unable to find tunnel network for GRE key:" - + cmd.getBridgeName()); - return new Answer(cmd, false, "No network found"); - } - - final Script command = new Script(_ovsTunnelPath, _timeout, s_logger); - command.add("destroy_tunnel"); - command.add("--bridge", cmd.getBridgeName()); - command.add("--iface_name", cmd.getInPortName()); - final String result = command.execute(); - if (result == null) { - return new Answer(cmd, true, result); - } else { - return new Answer(cmd, false, result); - } - } catch (final Exception e) { - s_logger.warn("caught execption when destroy ovs tunnel", e); - return new Answer(cmd, false, e.getMessage()); - } - } - - private CheckNetworkAnswer execute(final CheckNetworkCommand cmd) { - final List phyNics = cmd.getPhysicalNetworkInfoList(); - String errMsg = null; - for (final PhysicalNetworkSetupInfo nic : phyNics) { - if (!checkNetwork(nic.getGuestNetworkName())) { - errMsg = "Can not find network: " + nic.getGuestNetworkName(); - break; - } else if (!checkNetwork(nic.getPrivateNetworkName())) { - errMsg = "Can not find network: " + nic.getPrivateNetworkName(); - break; - } else if (!checkNetwork(nic.getPublicNetworkName())) { - errMsg = "Can not find network: " + nic.getPublicNetworkName(); - break; - } - } - - if (errMsg != null) { - return new CheckNetworkAnswer(cmd, false, errMsg); - } else { - return new CheckNetworkAnswer(cmd, true, null); - } - } - private CopyVolumeAnswer execute(final CopyVolumeCommand cmd) { /** This method is only used for copying files from Primary Storage TO Secondary Storage @@ -2957,7 +2900,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv for (final NicTO nic : nics) { if (nic.isSecurityGroupEnabled() || nic.getIsolationUri() != null && nic.getIsolationUri().getScheme().equalsIgnoreCase(IsolationType.Ec2.toString())) { if (vmSpec.getType() != VirtualMachine.Type.User) { - default_network_rules_for_systemvm(conn, vmName); + configureDefaultNetworkRulesForSystemVm(conn, vmName); break; } else { final List nicSecIps = nic.getNicSecIps(); @@ -3193,26 +3136,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv vm.getDevices().addDevice(getVifDriver(nic.getType()).plug(nic, vm.getPlatformEmulator().toString(), nicAdapter).toString()); } - protected CheckSshAnswer execute(final CheckSshCommand cmd) { - final String vmName = cmd.getName(); - final String privateIp = cmd.getIp(); - final int cmdPort = cmd.getPort(); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Ping command port, " + privateIp + ":" + cmdPort); - } - - if (!_virtRouterResource.connect(privateIp, cmdPort)) { - return new CheckSshAnswer(cmd, "Can not ping System vm " + vmName + " because of a connection failure"); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Ping command port succeeded for vm " + vmName); - } - - return new CheckSshAnswer(cmd); - } - public boolean cleanupDisk(final DiskDef disk) { final String path = disk.getDiskPath(); @@ -4240,7 +4163,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return true; } - protected boolean default_network_rules_for_systemvm(final Connect conn, final String vmName) { + public boolean configureDefaultNetworkRulesForSystemVm(final Connect conn, final String vmName) { if (!_canBridgeFirewall) { return false; } @@ -4371,19 +4294,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } - private Answer execute(final NetworkRulesSystemVmCommand cmd) { - boolean success = false; - Connect conn; - try { - conn = LibvirtConnection.getConnectionByVmName(cmd.getVmName()); - success = default_network_rules_for_systemvm(conn, cmd.getVmName()); - } catch (final LibvirtException e) { - s_logger.trace("Ignoring libvirt error.", e); - } - - return new Answer(cmd, success, ""); - } - private String prettyVersion(final long version) { final long major = version / 1000000; final long minor = version % 1000000 / 1000; diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java new file mode 100644 index 00000000000..4cf012d6cd6 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java @@ -0,0 +1,57 @@ +// +// 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.kvm.resource.wrapper; + +import java.util.List; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.CheckNetworkAnswer; +import com.cloud.agent.api.CheckNetworkCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.network.PhysicalNetworkSetupInfo; +import com.cloud.resource.CommandWrapper; + +public final class LibvirtCheckNetworkCommandWrapper extends CommandWrapper { + + @Override + public Answer execute(final CheckNetworkCommand command, final LibvirtComputingResource libvirtComputingResource) { + final List phyNics = command.getPhysicalNetworkInfoList(); + String errMsg = null; + + for (final PhysicalNetworkSetupInfo nic : phyNics) { + if (!libvirtComputingResource.checkNetwork(nic.getGuestNetworkName())) { + errMsg = "Can not find network: " + nic.getGuestNetworkName(); + break; + } else if (!libvirtComputingResource.checkNetwork(nic.getPrivateNetworkName())) { + errMsg = "Can not find network: " + nic.getPrivateNetworkName(); + break; + } else if (!libvirtComputingResource.checkNetwork(nic.getPublicNetworkName())) { + errMsg = "Can not find network: " + nic.getPublicNetworkName(); + break; + } + } + + if (errMsg != null) { + return new CheckNetworkAnswer(command, false, errMsg); + } else { + return new CheckNetworkAnswer(command, true, null); + } + } +} \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckSshCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckSshCommandWrapper.java new file mode 100644 index 00000000000..d258d6d41d3 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckSshCommandWrapper.java @@ -0,0 +1,56 @@ +// +// 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.kvm.resource.wrapper; + +import org.apache.log4j.Logger; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.check.CheckSshAnswer; +import com.cloud.agent.api.check.CheckSshCommand; +import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; + +public final class LibvirtCheckSshCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtOvsVpcRoutingPolicyConfigCommandWrapper.class); + + @Override + public Answer execute(final CheckSshCommand command, final LibvirtComputingResource libvirtComputingResource) { + final String vmName = command.getName(); + final String privateIp = command.getIp(); + final int cmdPort = command.getPort(); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Ping command port, " + privateIp + ":" + cmdPort); + } + + final VirtualRoutingResource virtRouterResource = libvirtComputingResource.getVirtRouterResource(); + if (!virtRouterResource.connect(privateIp, cmdPort)) { + return new CheckSshAnswer(command, "Can not ping System vm " + vmName + " because of a connection failure"); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Ping command port succeeded for vm " + vmName); + } + + return new CheckSshAnswer(command); + } +} \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtNetworkRulesSystemVmCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtNetworkRulesSystemVmCommandWrapper.java new file mode 100644 index 00000000000..b8ef8a8ac2f --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtNetworkRulesSystemVmCommandWrapper.java @@ -0,0 +1,49 @@ +// +// 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.kvm.resource.wrapper; + +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.NetworkRulesSystemVmCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; + +public final class LibvirtNetworkRulesSystemVmCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtOvsVpcRoutingPolicyConfigCommandWrapper.class); + + @Override + public Answer execute(final NetworkRulesSystemVmCommand command, final LibvirtComputingResource libvirtComputingResource) { + boolean success = false; + try { + final LibvirtConnectionWrapper libvirtConnectionWrapper = libvirtComputingResource.getLibvirtConnectionWrapper(); + + final Connect conn = libvirtConnectionWrapper.getConnectionByVmName(command.getVmName()); + success = libvirtComputingResource.configureDefaultNetworkRulesForSystemVm(conn, command.getVmName()); + } catch (final LibvirtException e) { + s_logger.trace("Ignoring libvirt error.", e); + } + + return new Answer(command, success, ""); + } +} \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtOvsDestroyTunnelCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtOvsDestroyTunnelCommandWrapper.java new file mode 100644 index 00000000000..ca694f81797 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtOvsDestroyTunnelCommandWrapper.java @@ -0,0 +1,58 @@ +// +// 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.kvm.resource.wrapper; + +import org.apache.log4j.Logger; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.OvsDestroyTunnelCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.utils.script.Script; + +public final class LibvirtOvsDestroyTunnelCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtOvsDestroyTunnelCommandWrapper.class); + + @Override + public Answer execute(final OvsDestroyTunnelCommand command, final LibvirtComputingResource libvirtComputingResource) { + try { + if (!libvirtComputingResource.findOrCreateTunnelNetwork(command.getBridgeName())) { + s_logger.warn("Unable to find tunnel network for GRE key:" + + command.getBridgeName()); + return new Answer(command, false, "No network found"); + } + + final Script scriptCommand = new Script(libvirtComputingResource.getOvsTunnelPath(), libvirtComputingResource.getTimeout(), s_logger); + scriptCommand.add("destroy_tunnel"); + scriptCommand.add("--bridge", command.getBridgeName()); + scriptCommand.add("--iface_name", command.getInPortName()); + final String result = scriptCommand.execute(); + if (result == null) { + return new Answer(command, true, result); + } else { + return new Answer(command, false, result); + } + } catch (final Exception e) { + s_logger.warn("caught execption when destroy ovs tunnel", e); + return new Answer(command, false, e.getMessage()); + } + } +} \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRequestWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRequestWrapper.java index 87b4ec24d35..ca7a7d2638c 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRequestWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRequestWrapper.java @@ -24,6 +24,7 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.AttachVolumeCommand; import com.cloud.agent.api.CheckHealthCommand; +import com.cloud.agent.api.CheckNetworkCommand; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.CleanupNetworkRulesCmd; import com.cloud.agent.api.Command; @@ -38,8 +39,10 @@ import com.cloud.agent.api.MaintainCommand; import com.cloud.agent.api.MigrateCommand; import com.cloud.agent.api.ModifySshKeysCommand; import com.cloud.agent.api.ModifyStoragePoolCommand; +import com.cloud.agent.api.NetworkRulesSystemVmCommand; import com.cloud.agent.api.NetworkRulesVmSecondaryIpCommand; import com.cloud.agent.api.OvsDestroyBridgeCommand; +import com.cloud.agent.api.OvsDestroyTunnelCommand; import com.cloud.agent.api.OvsFetchInterfaceCommand; import com.cloud.agent.api.OvsSetupBridgeCommand; import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand; @@ -51,6 +54,7 @@ import com.cloud.agent.api.RebootCommand; import com.cloud.agent.api.RebootRouterCommand; import com.cloud.agent.api.StopCommand; import com.cloud.agent.api.UpgradeSnapshotCommand; +import com.cloud.agent.api.check.CheckSshCommand; import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand; import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand; import com.cloud.agent.api.storage.CreateCommand; @@ -112,6 +116,10 @@ public class LibvirtRequestWrapper extends RequestWrapper { linbvirtCommands.put(ModifyStoragePoolCommand.class, new LibvirtModifyStoragePoolCommandWrapper()); linbvirtCommands.put(CleanupNetworkRulesCmd.class, new LibvirtCleanupNetworkRulesCommandWrapper()); linbvirtCommands.put(NetworkRulesVmSecondaryIpCommand.class, new LibvirtNetworkRulesVmSecondaryIpCommandWrapper()); + linbvirtCommands.put(NetworkRulesSystemVmCommand.class, new LibvirtNetworkRulesSystemVmCommandWrapper()); + linbvirtCommands.put(CheckSshCommand.class, new LibvirtCheckSshCommandWrapper()); + linbvirtCommands.put(CheckNetworkCommand.class, new LibvirtCheckNetworkCommandWrapper()); + linbvirtCommands.put(OvsDestroyTunnelCommand.class, new LibvirtOvsDestroyTunnelCommandWrapper()); resources.put(LibvirtComputingResource.class, linbvirtCommands); } diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java index 8fd1ecfd66e..1551f98e4d5 100644 --- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java @@ -67,6 +67,7 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.AttachVolumeCommand; import com.cloud.agent.api.CheckHealthCommand; +import com.cloud.agent.api.CheckNetworkCommand; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.CleanupNetworkRulesCmd; import com.cloud.agent.api.CreateStoragePoolCommand; @@ -80,8 +81,10 @@ import com.cloud.agent.api.MaintainCommand; import com.cloud.agent.api.MigrateCommand; import com.cloud.agent.api.ModifySshKeysCommand; import com.cloud.agent.api.ModifyStoragePoolCommand; +import com.cloud.agent.api.NetworkRulesSystemVmCommand; import com.cloud.agent.api.NetworkRulesVmSecondaryIpCommand; import com.cloud.agent.api.OvsDestroyBridgeCommand; +import com.cloud.agent.api.OvsDestroyTunnelCommand; import com.cloud.agent.api.OvsFetchInterfaceCommand; import com.cloud.agent.api.OvsSetupBridgeCommand; import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand; @@ -98,6 +101,7 @@ import com.cloud.agent.api.RebootRouterCommand; import com.cloud.agent.api.StopCommand; import com.cloud.agent.api.UpgradeSnapshotCommand; import com.cloud.agent.api.VmStatsEntry; +import com.cloud.agent.api.check.CheckSshCommand; import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand; import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand; import com.cloud.agent.api.storage.CreateCommand; @@ -119,6 +123,7 @@ import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; import com.cloud.hypervisor.kvm.storage.KVMStoragePool; import com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetworkSetupInfo; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.StoragePool; @@ -129,6 +134,7 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.DiskProfile; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.PowerState; +import com.cloud.vm.VirtualMachine.Type; @RunWith(PowerMockRunner.class) public class LibvirtComputingResourceTest { @@ -1944,7 +1950,7 @@ public class LibvirtComputingResourceTest { } @Test - public void testOvsSetupBridgeCommandFailure() { + public void testOvsSetupBridgeCommandFailure1() { final String name = "Test"; final Long hostId = 1l; final Long networkId = 1l; @@ -1967,6 +1973,30 @@ public class LibvirtComputingResourceTest { command.getBridgeName()); } + @Test + public void testOvsSetupBridgeCommandFailure2() { + final String name = "Test"; + final Long hostId = 1l; + final Long networkId = 1l; + + final OvsSetupBridgeCommand command = new OvsSetupBridgeCommand(name, hostId, networkId); + + when(libvirtComputingResource.findOrCreateTunnelNetwork(command.getBridgeName())).thenReturn(false); + when(libvirtComputingResource.configureTunnelNetwork(command.getNetworkId(), command.getHostId(), + command.getBridgeName())).thenReturn(true); + + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).findOrCreateTunnelNetwork(command.getBridgeName()); + verify(libvirtComputingResource, times(1)).configureTunnelNetwork(command.getNetworkId(), command.getHostId(), + command.getBridgeName()); + } + @Test public void testOvsDestroyBridgeCommand() { final String name = "Test"; @@ -2043,6 +2073,27 @@ public class LibvirtComputingResourceTest { verify(libvirtComputingResource, times(1)).getTimeout(); } + @SuppressWarnings("unchecked") + @Test + public void testOvsVpcPhysicalTopologyConfigCommandFailure() { + final Host[] hosts = null; + final Tier[] tiers = null; + final Vm[] vms = null; + final String cidr = null; + + final OvsVpcPhysicalTopologyConfigCommand command = new OvsVpcPhysicalTopologyConfigCommand(hosts, tiers, vms, cidr); + + when(libvirtComputingResource.getOvsTunnelPath()).thenThrow(Exception.class); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).getOvsTunnelPath(); + } + @Test public void testOvsVpcRoutingPolicyConfigCommand() { final String id = null; @@ -2066,6 +2117,27 @@ public class LibvirtComputingResourceTest { verify(libvirtComputingResource, times(1)).getTimeout(); } + @SuppressWarnings("unchecked") + @Test + public void testOvsVpcRoutingPolicyConfigCommandFailure() { + final String id = null; + final String cidr = null; + final Acl[] acls = null; + final com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand.Tier[] tiers = null; + + final OvsVpcRoutingPolicyConfigCommand command = new OvsVpcRoutingPolicyConfigCommand(id, cidr, acls, tiers); + + when(libvirtComputingResource.getOvsTunnelPath()).thenThrow(Exception.class); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).getOvsTunnelPath(); + } + @Test public void testCreateStoragePoolCommand() { final StoragePool pool = Mockito.mock(StoragePool.class); @@ -2207,4 +2279,267 @@ public class LibvirtComputingResourceTest { } verify(libvirtComputingResource, times(1)).getLibvirtConnectionWrapper(); } + + @Test + public void testNetworkRulesSystemVmCommand() { + final String vmName = "Test"; + final Type type = Type.SecondaryStorageVm; + + final NetworkRulesSystemVmCommand command = new NetworkRulesSystemVmCommand(vmName, type); + + final LibvirtConnectionWrapper libvirtConnectionWrapper = Mockito.mock(LibvirtConnectionWrapper.class); + final Connect conn = Mockito.mock(Connect.class); + + when(libvirtComputingResource.getLibvirtConnectionWrapper()).thenReturn(libvirtConnectionWrapper); + try { + when(libvirtConnectionWrapper.getConnectionByVmName(command.getVmName())).thenReturn(conn); + } catch (final LibvirtException e) { + fail(e.getMessage()); + } + when(libvirtComputingResource.configureDefaultNetworkRulesForSystemVm(conn, command.getVmName())).thenReturn(true); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertTrue(answer.getResult()); + + try { + verify(libvirtConnectionWrapper, times(1)).getConnectionByVmName(command.getVmName()); + } catch (final LibvirtException e) { + fail(e.getMessage()); + } + verify(libvirtComputingResource, times(1)).getLibvirtConnectionWrapper(); + verify(libvirtComputingResource, times(1)).configureDefaultNetworkRulesForSystemVm(conn, command.getVmName()); + } + + @SuppressWarnings("unchecked") + @Test + public void testNetworkRulesSystemVmCommandFailure() { + final String vmName = "Test"; + final Type type = Type.SecondaryStorageVm; + + final NetworkRulesSystemVmCommand command = new NetworkRulesSystemVmCommand(vmName, type); + + final LibvirtConnectionWrapper libvirtConnectionWrapper = Mockito.mock(LibvirtConnectionWrapper.class); + + when(libvirtComputingResource.getLibvirtConnectionWrapper()).thenReturn(libvirtConnectionWrapper); + try { + when(libvirtConnectionWrapper.getConnectionByVmName(command.getVmName())).thenThrow(LibvirtException.class); + } catch (final LibvirtException e) { + fail(e.getMessage()); + } + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + try { + verify(libvirtConnectionWrapper, times(1)).getConnectionByVmName(command.getVmName()); + } catch (final LibvirtException e) { + fail(e.getMessage()); + } + verify(libvirtComputingResource, times(1)).getLibvirtConnectionWrapper(); + } + + @Test + public void testCheckSshCommand() { + final String instanceName = "Test"; + final String ip = "172.16.16.16"; + final int port = 22; + + final CheckSshCommand command = new CheckSshCommand(instanceName, ip, port); + + final VirtualRoutingResource virtRouterResource = Mockito.mock(VirtualRoutingResource.class); + + final String privateIp = command.getIp(); + final int cmdPort = command.getPort(); + + when(libvirtComputingResource.getVirtRouterResource()).thenReturn(virtRouterResource); + when(virtRouterResource.connect(privateIp, cmdPort)).thenReturn(true); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertTrue(answer.getResult()); + + verify(libvirtComputingResource, times(1)).getVirtRouterResource(); + verify(virtRouterResource, times(1)).connect(privateIp, cmdPort); + } + + @Test + public void testCheckSshCommandFailure() { + final String instanceName = "Test"; + final String ip = "172.16.16.16"; + final int port = 22; + + final CheckSshCommand command = new CheckSshCommand(instanceName, ip, port); + + final VirtualRoutingResource virtRouterResource = Mockito.mock(VirtualRoutingResource.class); + + final String privateIp = command.getIp(); + final int cmdPort = command.getPort(); + + when(libvirtComputingResource.getVirtRouterResource()).thenReturn(virtRouterResource); + when(virtRouterResource.connect(privateIp, cmdPort)).thenReturn(false); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).getVirtRouterResource(); + verify(virtRouterResource, times(1)).connect(privateIp, cmdPort); + } + + @Test + public void testCheckNetworkCommand() { + final List networkInfoList = new ArrayList(); + + final PhysicalNetworkSetupInfo nic = Mockito.mock(PhysicalNetworkSetupInfo.class); + networkInfoList.add(nic); + + final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); + + when(libvirtComputingResource.checkNetwork(nic.getGuestNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(nic.getPrivateNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(nic.getPublicNetworkName())).thenReturn(true); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertTrue(answer.getResult()); + + verify(libvirtComputingResource, times(3)).checkNetwork(nic.getGuestNetworkName()); + verify(libvirtComputingResource, times(3)).checkNetwork(nic.getPrivateNetworkName()); + verify(libvirtComputingResource, times(3)).checkNetwork(nic.getPublicNetworkName()); + } + + @Test + public void testCheckNetworkCommandFail1() { + final List networkInfoList = new ArrayList(); + + final PhysicalNetworkSetupInfo networkSetupInfo = Mockito.mock(PhysicalNetworkSetupInfo.class); + networkInfoList.add(networkSetupInfo); + + final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); + + when(libvirtComputingResource.checkNetwork(networkSetupInfo.getGuestNetworkName())).thenReturn(false); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getGuestNetworkName()); + } + + @Test + public void testCheckNetworkCommandFail2() { + final List networkInfoList = new ArrayList(); + + final PhysicalNetworkSetupInfo networkSetupInfo = Mockito.mock(PhysicalNetworkSetupInfo.class); + networkInfoList.add(networkSetupInfo); + + final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); + + when(libvirtComputingResource.checkNetwork(networkSetupInfo.getGuestNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(networkSetupInfo.getPrivateNetworkName())).thenReturn(false); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getGuestNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getPrivateNetworkName()); + } + + @Test + public void testCheckNetworkCommandFail3() { + final List networkInfoList = new ArrayList(); + + final PhysicalNetworkSetupInfo networkSetupInfo = Mockito.mock(PhysicalNetworkSetupInfo.class); + networkInfoList.add(networkSetupInfo); + + final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); + + when(libvirtComputingResource.checkNetwork(networkSetupInfo.getGuestNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(networkSetupInfo.getPrivateNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(networkSetupInfo.getPublicNetworkName())).thenReturn(false); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getGuestNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getPrivateNetworkName()); + } + + @Test + public void testOvsDestroyTunnelCommand() { + final String networkName = "Test"; + final Long networkId = 1l; + final String inPortName = "eth"; + + final OvsDestroyTunnelCommand command = new OvsDestroyTunnelCommand(networkId, networkName, inPortName); + + when(libvirtComputingResource.findOrCreateTunnelNetwork(command.getBridgeName())).thenReturn(true); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).findOrCreateTunnelNetwork(command.getBridgeName()); + } + + @Test + public void testOvsDestroyTunnelCommandFailure1() { + final String networkName = "Test"; + final Long networkId = 1l; + final String inPortName = "eth"; + + final OvsDestroyTunnelCommand command = new OvsDestroyTunnelCommand(networkId, networkName, inPortName); + + when(libvirtComputingResource.findOrCreateTunnelNetwork(command.getBridgeName())).thenReturn(false); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).findOrCreateTunnelNetwork(command.getBridgeName()); + } + + @SuppressWarnings("unchecked") + @Test + public void testOvsDestroyTunnelCommandFailure2() { + final String networkName = "Test"; + final Long networkId = 1l; + final String inPortName = "eth"; + + final OvsDestroyTunnelCommand command = new OvsDestroyTunnelCommand(networkId, networkName, inPortName); + + when(libvirtComputingResource.findOrCreateTunnelNetwork(command.getBridgeName())).thenThrow(Exception.class); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertFalse(answer.getResult()); + + verify(libvirtComputingResource, times(1)).findOrCreateTunnelNetwork(command.getBridgeName()); + } } \ No newline at end of file