You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ko...@apache.org on 2015/05/19 18:20:59 UTC
[13/50] [abbrv] git commit: updated refs/heads/CLOUDSTACK-8301 to
8ff9000
Refactoring the LibvirtComputingResource
- Adding 4 new command wrappers
- 12 unit tests added
- KVM hypervisor plugin with 15.5% coverage
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6748a73b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6748a73b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6748a73b
Branch: refs/heads/CLOUDSTACK-8301
Commit: 6748a73b82bb7d1d45fdde1cbcc02f78b8f7b330
Parents: 5499eec
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri May 1 16:17:09 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Wed May 6 19:24:12 2015 +0200
----------------------------------------------------------------------
.../kvm/resource/LibvirtComputingResource.java | 108 +-----
.../LibvirtCheckNetworkCommandWrapper.java | 57 ++++
.../wrapper/LibvirtCheckSshCommandWrapper.java | 56 +++
...bvirtNetworkRulesSystemVmCommandWrapper.java | 49 +++
.../LibvirtOvsDestroyTunnelCommandWrapper.java | 58 ++++
.../resource/wrapper/LibvirtRequestWrapper.java | 8 +
.../resource/LibvirtComputingResourceTest.java | 337 ++++++++++++++++++-
7 files changed, 573 insertions(+), 100 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748a73b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
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 75c9663..9c1a6b4 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<PhysicalNetworkSetupInfo> 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<String> 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;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748a73b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java
----------------------------------------------------------------------
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 0000000..4cf012d
--- /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<CheckNetworkCommand, Answer, LibvirtComputingResource> {
+
+ @Override
+ public Answer execute(final CheckNetworkCommand command, final LibvirtComputingResource libvirtComputingResource) {
+ final List<PhysicalNetworkSetupInfo> 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
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748a73b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckSshCommandWrapper.java
----------------------------------------------------------------------
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 0000000..d258d6d
--- /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<CheckSshCommand, Answer, LibvirtComputingResource> {
+
+ 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
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748a73b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtNetworkRulesSystemVmCommandWrapper.java
----------------------------------------------------------------------
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 0000000..b8ef8a8
--- /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<NetworkRulesSystemVmCommand, Answer, LibvirtComputingResource> {
+
+ 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
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748a73b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtOvsDestroyTunnelCommandWrapper.java
----------------------------------------------------------------------
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 0000000..ca694f8
--- /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<OvsDestroyTunnelCommand, Answer, LibvirtComputingResource> {
+
+ 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
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748a73b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRequestWrapper.java
----------------------------------------------------------------------
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 87b4ec2..ca7a7d2 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);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6748a73b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
----------------------------------------------------------------------
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 8fd1ecf..1551f98 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;
@@ -1968,6 +1974,30 @@ public class LibvirtComputingResourceTest {
}
@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";
final Long hostId = 1l;
@@ -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<PhysicalNetworkSetupInfo> networkInfoList = new ArrayList<PhysicalNetworkSetupInfo>();
+
+ 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<PhysicalNetworkSetupInfo> networkInfoList = new ArrayList<PhysicalNetworkSetupInfo>();
+
+ 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<PhysicalNetworkSetupInfo> networkInfoList = new ArrayList<PhysicalNetworkSetupInfo>();
+
+ 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<PhysicalNetworkSetupInfo> networkInfoList = new ArrayList<PhysicalNetworkSetupInfo>();
+
+ 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