You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2015/04/02 20:23:02 UTC
[21/39] git commit: updated refs/heads/master to 3e28747
Refactoring GetVncPortCommand, MaintainCommand and SetupCommand to cope with new design.
- Basic test added, but could not mock all the static stuff so the test is not complete yet.
Will look further into it.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/637a56c3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/637a56c3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/637a56c3
Branch: refs/heads/master
Commit: 637a56c3c1f8a33bdbb2344824e4df0ed9dee786
Parents: 11d0336
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Wed Mar 25 19:16:02 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:29 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 30 ++-
.../resource/Xenserver625Resource.java | 2 +-
.../wrapper/CitrixGetVncPortCommandWrapper.java | 56 ++++++
.../wrapper/CitrixMaintainCommandWrapper.java | 75 +++++++
.../resource/wrapper/CitrixRequestWrapper.java | 6 +
.../wrapper/CitrixSetupCommandWrapper.java | 200 +++++++++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 118 ++++++++++-
7 files changed, 473 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/637a56c3/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index c412b54..6c51fae 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -340,10 +340,22 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return _host;
}
+ public boolean isSecurityGroupEnabled() {
+ return _securityGroupEnabled;
+ }
+
+ public void setCanBridgeFirewall(final boolean canBridgeFirewall) {
+ _canBridgeFirewall = canBridgeFirewall;
+ }
+
public boolean canBridgeFirewall() {
return _canBridgeFirewall;
}
+ public boolean canBridgeFirewall(final Connection conn) {
+ return Boolean.valueOf(callHostPlugin(conn, "vmops", "can_bridge_firewall", "host_uuid", _host.getUuid(), "instance", _instance));
+ }
+
private static boolean isAlienVm(final VM vm, final Connection conn) throws XenAPIException, XmlRpcException {
// TODO : we need a better way to tell whether or not the VM belongs to CloudStack
final String vmName = vm.getNameLabel(conn);
@@ -3008,7 +3020,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new ReadyAnswer(cmd);
}
- protected String getVncUrl(final Connection conn, final VM vm) {
+ public String getVncUrl(final Connection conn, final VM vm) {
VM.Record record;
Console c;
try {
@@ -3679,7 +3691,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return argString.toString();
}
- protected boolean setIptables(final Connection conn) {
+ public boolean setIptables(final Connection conn) {
final String result = callHostPlugin(conn, "vmops", "setIptables");
if (result == null || result.isEmpty()) {
return false;
@@ -4399,7 +4411,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected boolean transferManagementNetwork(final Connection conn, final Host host, final PIF src, final PIF.Record spr, final PIF dest) throws XmlRpcException, XenAPIException {
+ public boolean transferManagementNetwork(final Connection conn, final Host host, final PIF src, final PIF.Record spr, final PIF dest) throws XmlRpcException, XenAPIException {
dest.reconfigureIp(conn, spr.ipConfigurationMode, spr.IP, spr.netmask, spr.gateway, spr.DNS);
Host.managementReconfigure(conn, dest);
String hostUuid = null;
@@ -4456,7 +4468,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new StartupCommand[] {cmd};
}
- private void cleanupTemplateSR(final Connection conn) {
+ public void cleanupTemplateSR(final Connection conn) {
Set<PBD> pbds = null;
try {
final Host host = Host.getByUuid(conn, _host.getUuid());
@@ -4493,7 +4505,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected boolean launchHeartBeat(final Connection conn) {
+ public boolean launchHeartBeat(final Connection conn) {
final String result = callHostPluginPremium(conn, "heartbeat",
"host", _host.getUuid(),
"timeout", Integer.toString(_heartbeatTimeout),
@@ -4523,7 +4535,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (_securityGroupEnabled) {
- _canBridgeFirewall = can_bridge_firewall(conn);
+ _canBridgeFirewall = canBridgeFirewall(conn);
if (!_canBridgeFirewall) {
final String msg = "Failed to configure brige firewall";
s_logger.warn(msg);
@@ -4657,7 +4669,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
/* return : if setup is needed */
- protected boolean setupServer(final Connection conn, final Host host) {
+ public boolean setupServer(final Connection conn, final Host host) {
final String packageVersion = CitrixResourceBase.class.getPackage().getImplementationVersion();
final String version = this.getClass().getName() + "-" + (packageVersion == null ? Long.toString(System.currentTimeMillis()) : packageVersion);
@@ -5110,10 +5122,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
- protected boolean can_bridge_firewall(final Connection conn) {
- return Boolean.valueOf(callHostPlugin(conn, "vmops", "can_bridge_firewall", "host_uuid", _host.getUuid(), "instance", _instance));
- }
-
private Answer execute(final OvsSetupBridgeCommand cmd) {
final Connection conn = getConnection();
findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/637a56c3/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
index a01e192..11ab7ba 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
@@ -71,7 +71,7 @@ public class Xenserver625Resource extends XenServerResourceNewBase {
}
@Override
- protected boolean setupServer(final Connection conn,final Host host) {
+ public boolean setupServer(final Connection conn,final Host host) {
final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
try {
sshConnection.connect(null, 60000, 60000);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/637a56c3/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVncPortCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVncPortCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVncPortCommandWrapper.java
new file mode 100644
index 0000000..d69ce27
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVncPortCommandWrapper.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.xenserver.resource.wrapper;
+
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetVncPortAnswer;
+import com.cloud.agent.api.GetVncPortCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.VM;
+
+public final class CitrixGetVncPortCommandWrapper extends CommandWrapper<GetVncPortCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixGetVncPortCommandWrapper.class);
+
+ @Override
+ public Answer execute(final GetVncPortCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Set<VM> vms = VM.getByNameLabel(conn, command.getName());
+ if (vms.size() == 1) {
+ String consoleurl;
+ consoleurl = "consoleurl=" + citrixResourceBase.getVncUrl(conn, vms.iterator().next()) + "&" + "sessionref=" + conn.getSessionReference();
+ return new GetVncPortAnswer(command, consoleurl, -1);
+ } else {
+ return new GetVncPortAnswer(command, "There are " + vms.size() + " VMs named " + command.getName());
+ }
+ } catch (final Exception e) {
+ final String msg = "Unable to get vnc port due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new GetVncPortAnswer(command, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/637a56c3/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMaintainCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMaintainCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMaintainCommandWrapper.java
new file mode 100644
index 0000000..d1c5b70
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMaintainCommandWrapper.java
@@ -0,0 +1,75 @@
+//
+// 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.xenserver.resource.wrapper;
+
+import java.util.Iterator;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.MaintainAnswer;
+import com.cloud.agent.api.MaintainCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.hypervisor.xenserver.resource.XsHost;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixMaintainCommandWrapper extends CommandWrapper<MaintainCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixMaintainCommandWrapper.class);
+
+ @Override
+ public Answer execute(final MaintainCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+
+ final XsHost xsHost = citrixResourceBase.getHost();
+ final String uuid = xsHost.getUuid();
+ final Host host = Host.getByUuid(conn, uuid);
+ // remove all tags cloud stack
+ final Host.Record hr = host.getRecord(conn);
+
+ // Adding this check because could not get the mock to work. Will push the code and fix it afterwards.
+ if (hr == null) {
+ s_logger.warn("Host.Record is null.");
+ return new MaintainAnswer(command, false, "Host.Record is null");
+ }
+
+ final Iterator<String> it = hr.tags.iterator();
+ while (it.hasNext()) {
+ final String tag = it.next();
+ if (tag.contains("cloud")) {
+ it.remove();
+ }
+ }
+ host.setTags(conn, hr.tags);
+ return new MaintainAnswer(command);
+ } catch (final XenAPIException e) {
+ s_logger.warn("Unable to put server in maintainence mode", e);
+ return new MaintainAnswer(command, false, e.getMessage());
+ } catch (final XmlRpcException e) {
+ s_logger.warn("Unable to put server in maintainence mode", e);
+ return new MaintainAnswer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/637a56c3/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
index c31c340..6d262ee 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -33,12 +33,15 @@ import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetStorageStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
+import com.cloud.agent.api.GetVncPortCommand;
+import com.cloud.agent.api.MaintainCommand;
import com.cloud.agent.api.MigrateCommand;
import com.cloud.agent.api.ModifyStoragePoolCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.UpgradeSnapshotCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -93,6 +96,9 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(UpgradeSnapshotCommand.class, new CitrixUpgradeSnapshotCommandWrapper());
map.put(GetStorageStatsCommand.class, new CitrixGetStorageStatsCommandWrapper());
map.put(PrimaryStorageDownloadCommand.class, new CitrixPrimaryStorageDownloadCommandWrapper());
+ map.put(GetVncPortCommand.class, new CitrixGetVncPortCommandWrapper());
+ map.put(SetupCommand.class, new CitrixSetupCommandWrapper());
+ map.put(MaintainCommand.class, new CitrixMaintainCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/637a56c3/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSetupCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSetupCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSetupCommandWrapper.java
new file mode 100644
index 0000000..3b24aa3
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSetupCommandWrapper.java
@@ -0,0 +1,200 @@
+//
+// 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.xenserver.resource.wrapper;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.SetupAnswer;
+import com.cloud.agent.api.SetupCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.Pair;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Bond;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.PIF;
+import com.xensource.xenapi.Pool;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixSetupCommandWrapper extends CommandWrapper<SetupCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixSetupCommandWrapper.class);
+
+ @Override
+ public Answer execute(final SetupCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Map<Pool, Pool.Record> poolRecs = Pool.getAllRecords(conn);
+ if (poolRecs.size() != 1) {
+ throw new CloudRuntimeException("There are " + poolRecs.size() + " pool for host :" + citrixResourceBase.getHost().getUuid());
+ }
+ final Host master = poolRecs.values().iterator().next().master;
+ citrixResourceBase.setupServer(conn, master);
+ final Host host = Host.getByUuid(conn, citrixResourceBase.getHost().getUuid());
+ citrixResourceBase.setupServer(conn, host);
+
+ if (!citrixResourceBase.setIptables(conn)) {
+ s_logger.warn("set xenserver Iptable failed");
+ return null;
+ }
+
+ if (citrixResourceBase.isSecurityGroupEnabled()) {
+ final boolean canBridgeFirewall = citrixResourceBase.canBridgeFirewall(conn);
+ citrixResourceBase.setCanBridgeFirewall(canBridgeFirewall);
+ if (!canBridgeFirewall) {
+ final String msg = "Failed to configure brige firewall";
+ s_logger.warn(msg);
+ s_logger.warn("Check host " + citrixResourceBase.getHost().getIp() +" for CSP is installed or not and check network mode for bridge");
+ return new SetupAnswer(command, msg);
+ }
+
+ }
+
+
+ final boolean r = citrixResourceBase.launchHeartBeat(conn);
+ if (!r) {
+ return null;
+ }
+ citrixResourceBase.cleanupTemplateSR(conn);
+ try {
+ if (command.useMultipath()) {
+ // the config value is set to true
+ host.addToOtherConfig(conn, "multipathing", "true");
+ host.addToOtherConfig(conn, "multipathhandle", "dmp");
+ }
+
+ } catch (final Types.MapDuplicateKey e) {
+ s_logger.debug("multipath is already set");
+ }
+
+ if (command.needSetup() ) {
+ final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "setup_iscsi", "uuid", citrixResourceBase.getHost().getUuid());
+
+ if (!result.contains("> DONE <")) {
+ s_logger.warn("Unable to setup iscsi: " + result);
+ return new SetupAnswer(command, result);
+ }
+
+ Pair<PIF, PIF.Record> mgmtPif = null;
+ final Set<PIF> hostPifs = host.getPIFs(conn);
+ for (final PIF pif : hostPifs) {
+ final PIF.Record rec = pif.getRecord(conn);
+ if (rec.management) {
+ if (rec.VLAN != null && rec.VLAN != -1) {
+ final String msg =
+ new StringBuilder("Unsupported configuration. Management network is on a VLAN. host=").append(citrixResourceBase.getHost().getUuid())
+ .append("; pif=")
+ .append(rec.uuid)
+ .append("; vlan=")
+ .append(rec.VLAN)
+ .toString();
+ s_logger.warn(msg);
+ return new SetupAnswer(command, msg);
+ }
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Management network is on pif=" + rec.uuid);
+ }
+ mgmtPif = new Pair<PIF, PIF.Record>(pif, rec);
+ break;
+ }
+ }
+
+ if (mgmtPif == null) {
+ final String msg = "Unable to find management network for " + citrixResourceBase.getHost().getUuid();
+ s_logger.warn(msg);
+ return new SetupAnswer(command, msg);
+ }
+
+ final Map<Network, Network.Record> networks = Network.getAllRecords(conn);
+ if(networks == null) {
+ final String msg = "Unable to setup as there are no networks in the host: " + citrixResourceBase.getHost().getUuid();
+ s_logger.warn(msg);
+ return new SetupAnswer(command, msg);
+ }
+ for (final Network.Record network : networks.values()) {
+ if (network.nameLabel.equals("cloud-private")) {
+ for (final PIF pif : network.PIFs) {
+ final PIF.Record pr = pif.getRecord(conn);
+ if (citrixResourceBase.getHost().getUuid().equals(pr.host.getUuid(conn))) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Found a network called cloud-private. host=" + citrixResourceBase.getHost().getUuid() + "; Network=" + network.uuid + "; pif=" + pr.uuid);
+ }
+ if (pr.VLAN != null && pr.VLAN != -1) {
+ final String msg =
+ new StringBuilder("Unsupported configuration. Network cloud-private is on a VLAN. Network=").append(network.uuid)
+ .append(" ; pif=")
+ .append(pr.uuid)
+ .toString();
+ s_logger.warn(msg);
+ return new SetupAnswer(command, msg);
+ }
+ if (!pr.management && pr.bondMasterOf != null && pr.bondMasterOf.size() > 0) {
+ if (pr.bondMasterOf.size() > 1) {
+ final String msg =
+ new StringBuilder("Unsupported configuration. Network cloud-private has more than one bond. Network=").append(network.uuid)
+ .append("; pif=")
+ .append(pr.uuid)
+ .toString();
+ s_logger.warn(msg);
+ return new SetupAnswer(command, msg);
+ }
+ final Bond bond = pr.bondMasterOf.iterator().next();
+ final Set<PIF> slaves = bond.getSlaves(conn);
+ for (final PIF slave : slaves) {
+ final PIF.Record spr = slave.getRecord(conn);
+ if (spr.management) {
+ if (!citrixResourceBase.transferManagementNetwork(conn, host, slave, spr, pif)) {
+ final String msg =
+ new StringBuilder("Unable to transfer management network. slave=" + spr.uuid + "; master=" + pr.uuid + "; host=" +
+ citrixResourceBase.getHost().getUuid()).toString();
+ s_logger.warn(msg);
+ return new SetupAnswer(command, msg);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return new SetupAnswer(command, false);
+
+ } catch (final XmlRpcException e) {
+ s_logger.warn("Unable to setup", e);
+ return new SetupAnswer(command, e.getMessage());
+ } catch (final XenAPIException e) {
+ s_logger.warn("Unable to setup", e);
+ return new SetupAnswer(command, e.getMessage());
+ } catch (final Exception e) {
+ s_logger.warn("Unable to setup", e);
+ return new SetupAnswer(command, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/637a56c3/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
index 1873842..45bdea1 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
@@ -3,18 +3,24 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Map;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.xmlrpc.client.XmlRpcClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.AttachIsoCommand;
@@ -28,6 +34,8 @@ import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetStorageStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
+import com.cloud.agent.api.GetVncPortCommand;
+import com.cloud.agent.api.MaintainCommand;
import com.cloud.agent.api.MigrateCommand;
import com.cloud.agent.api.ModifyStoragePoolCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
@@ -35,6 +43,7 @@ import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.UpgradeSnapshotCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -47,14 +56,19 @@ import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.agent.api.to.DataStoreTO;
import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.host.HostEnvironment;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
import com.cloud.hypervisor.xenserver.resource.XsHost;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.vm.DiskProfile;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Marshalling;
-@RunWith(MockitoJUnitRunner.class)
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({Connection.class, Host.Record.class})
public class CitrixRequestWrapperTest {
@Mock
@@ -440,6 +454,106 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testGetVncPortCommand() {
+ final GetVncPortCommand storageDownloadCommand = new GetVncPortCommand(1l, "Test");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testSetupCommand() {
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+ final HostEnvironment env = Mockito.mock(HostEnvironment.class);
+
+ final SetupCommand storageDownloadCommand = new SetupCommand(env);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+
+ final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testMaintainCommand() {
+ // This test needs further work.
+
+ final String uuid = "befc4dcd-f5c6-4015-8791-3c18622b7c7f";
+
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+ final XmlRpcClient client = Mockito.mock(XmlRpcClient.class);
+
+ // final Host.Record hr = PowerMockito.mock(Host.Record.class);
+ // final Host host = PowerMockito.mock(Host.class);
+
+ final MaintainCommand storageDownloadCommand = new MaintainCommand();
+
+ final Map<String, Object> map = new Hashtable<String, Object>();
+ map.put("Value", "Xen");
+
+ final Map<String, Object> spiedMap = spy(map);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+ when(xsHost.getUuid()).thenReturn(uuid);
+ when(conn.getSessionReference()).thenReturn("befc4dcd");
+
+ try {
+ final Object [] params = {Marshalling.toXMLRPC("befc4dcd"), Marshalling.toXMLRPC(uuid)};
+ when(client.execute("host.get_by_uuid", new Object[]{"befc4dcd", uuid})).thenReturn(spiedMap);
+ PowerMockito.when(conn, "dispatch", "host.get_by_uuid", params).thenReturn(spiedMap);
+ } catch (final Exception e) {
+ }
+
+ // try {
+ // PowerMockito.mockStatic(Host.class);
+ // //BDDMockito.given(Host.getByUuid(conn, xsHost.getUuid())).willReturn(host);
+ // PowerMockito.when(Host.getByUuid(conn, xsHost.getUuid())).thenReturn(host);
+ // PowerMockito.verifyStatic(times(1));
+ // } catch (final BadServerResponse e) {
+ // fail(e.getMessage());
+ // } catch (final XenAPIException e) {
+ // fail(e.getMessage());
+ // } catch (final XmlRpcException e) {
+ // fail(e.getMessage());
+ // }
+ //
+ // PowerMockito.mockStatic(Types.class);
+ // PowerMockito.when(Types.toHostRecord(spiedMap)).thenReturn(hr);
+ // PowerMockito.verifyStatic(times(1));
+ //
+ // try {
+ // PowerMockito.mockStatic(Host.Record.class);
+ // when(host.getRecord(conn)).thenReturn(hr);
+ // verify(host, times(1)).getRecord(conn);
+ // } catch (final BadServerResponse e) {
+ // fail(e.getMessage());
+ // } catch (final XenAPIException e) {
+ // fail(e.getMessage());
+ // } catch (final XmlRpcException e) {
+ // fail(e.getMessage());
+ // }
+
+ final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {