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:22:42 UTC
[01/39] git commit: updated refs/heads/master to 3e28747
Repository: cloudstack
Updated Branches:
refs/heads/master c6416cb76 -> 3e2874788
Adding the refactor of CitrixCheckConsoleProxyLoadCommandWrapper.java and CitrixWatchConsoleProxyLoadCommandWrapper.java
- plus basic tests
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c3ae8c79
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c3ae8c79
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c3ae8c79
Branch: refs/heads/master
Commit: c3ae8c793b8092cf092d66c01ba672a277714ba8
Parents: 4256418
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Mar 20 11:17:46 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:24 2015 +0200
----------------------------------------------------------------------
core/src/com/cloud/resource/CommandWrapper.java | 64 ++++++++++++++++++++
...trixCheckConsoleProxyLoadCommandWrapper.java | 38 ++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 4 ++
...trixWatchConsoleProxyLoadCommandWrapper.java | 38 ++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 26 ++++++++
5 files changed, 170 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c3ae8c79/core/src/com/cloud/resource/CommandWrapper.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/resource/CommandWrapper.java b/core/src/com/cloud/resource/CommandWrapper.java
index f68e92a..15f7b08 100644
--- a/core/src/com/cloud/resource/CommandWrapper.java
+++ b/core/src/com/cloud/resource/CommandWrapper.java
@@ -19,16 +19,80 @@
package com.cloud.resource;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.apache.log4j.Logger;
+
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
+import com.cloud.agent.api.proxy.ConsoleProxyLoadAnswer;
public abstract class CommandWrapper<T extends Command, A extends Answer, R extends ServerResource> {
+ private static final Logger s_logger = Logger.getLogger(CommandWrapper.class);
+
/**
* @param T is the command to be used.
* @param R is the resource base to be used.
* @return A and the Answer from the command.
*/
public abstract A execute(T command, R serverResource);
+
+ /**
+ * Common method so we added it here.
+ *
+ * @param cmd
+ * @param proxyVmId
+ * @param proxyVmName
+ * @param proxyManagementIp
+ * @param cmdPort
+ * @return
+ */
+ protected Answer executeProxyLoadScan(final Command cmd, final long proxyVmId, final String proxyVmName, final String proxyManagementIp, final int cmdPort) {
+ String result = null;
+
+ final StringBuffer sb = new StringBuffer();
+ sb.append("http://").append(proxyManagementIp).append(":" + cmdPort).append("/cmd/getstatus");
+
+ boolean success = true;
+ try {
+ final URL url = new URL(sb.toString());
+ final URLConnection conn = url.openConnection();
+
+ // setting TIMEOUTs to avoid possible waiting until death situations
+ conn.setConnectTimeout(5000);
+ conn.setReadTimeout(5000);
+
+ final InputStream is = conn.getInputStream();
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ final StringBuilder sb2 = new StringBuilder();
+ String line = null;
+ try {
+ while ((line = reader.readLine()) != null) {
+ sb2.append(line + "\n");
+ }
+ result = sb2.toString();
+ } catch (final IOException e) {
+ success = false;
+ } finally {
+ try {
+ is.close();
+ } catch (final IOException e) {
+ s_logger.warn("Exception when closing , console proxy address : " + proxyManagementIp);
+ success = false;
+ }
+ }
+ } catch (final IOException e) {
+ s_logger.warn("Unable to open console proxy command port url, console proxy address : " + proxyManagementIp);
+ success = false;
+ }
+
+ return new ConsoleProxyLoadAnswer(cmd, proxyVmId, proxyVmName, success, result);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c3ae8c79/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckConsoleProxyLoadCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckConsoleProxyLoadCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckConsoleProxyLoadCommandWrapper.java
new file mode 100644
index 0000000..bdf7c31
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckConsoleProxyLoadCommandWrapper.java
@@ -0,0 +1,38 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixCheckConsoleProxyLoadCommandWrapper extends CommandWrapper<CheckConsoleProxyLoadCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final CheckConsoleProxyLoadCommand command, final CitrixResourceBase citrixResourceBase) {
+ final long proxyVmId = command.getProxyVmId();
+ final String proxyVmName = command.getProxyVmName();
+ final String proxyManagementIp = command.getProxyManagementIp();
+ final int cmdPort = command.getProxyCmdPort();
+
+ return executeProxyLoadScan(command, proxyVmId, proxyVmName, proxyManagementIp, cmdPort);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c3ae8c79/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 854116c..5495f60 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
@@ -24,6 +24,8 @@ import java.util.Hashtable;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
+import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.RequestWrapper;
@@ -49,6 +51,8 @@ public class CitrixRequestWrapper extends RequestWrapper {
private void init() {
map.put(RebootRouterCommand.class, new CitrixRebootRouterCommandWrapper());
map.put(CreateCommand.class, new CitrixCreateCommandWrapper());
+ map.put(CheckConsoleProxyLoadCommand.class, new CitrixCheckConsoleProxyLoadCommandWrapper());
+ map.put(WatchConsoleProxyLoadCommand.class, new CitrixWatchConsoleProxyLoadCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c3ae8c79/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixWatchConsoleProxyLoadCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixWatchConsoleProxyLoadCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixWatchConsoleProxyLoadCommandWrapper.java
new file mode 100644
index 0000000..4ee9614
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixWatchConsoleProxyLoadCommandWrapper.java
@@ -0,0 +1,38 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixWatchConsoleProxyLoadCommandWrapper extends CommandWrapper<WatchConsoleProxyLoadCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final WatchConsoleProxyLoadCommand command, final CitrixResourceBase citrixResourceBase) {
+ final long proxyVmId = command.getProxyVmId();
+ final String proxyVmName = command.getProxyVmName();
+ final String proxyManagementIp = command.getProxyManagementIp();
+ final int cmdPort = command.getProxyCmdPort();
+
+ return executeProxyLoadScan(command, proxyVmId, proxyVmName, proxyManagementIp, cmdPort);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c3ae8c79/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 e19883a..f8af543 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
@@ -17,6 +17,8 @@ import com.cloud.agent.api.Answer;
import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
+import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
@@ -70,4 +72,28 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testCheckConsoleProxyLoadCommand() {
+ final CheckConsoleProxyLoadCommand consoleProxyCommand = new CheckConsoleProxyLoadCommand();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(consoleProxyCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testWatchConsoleProxyLoadCommand() {
+ final WatchConsoleProxyLoadCommand watchConsoleProxyCommand = new WatchConsoleProxyLoadCommand(0, 0, "", "", 0);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(watchConsoleProxyCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
\ No newline at end of file
[18/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring the CitrixRebootCommand in order to have the new design applied
- Added basic tests
- Changed the way RebootCommand gets called from RebootRouterCommand
- Made a couple of methods public in the CitrixResourceBase and its subclasses
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f2fab5c8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f2fab5c8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f2fab5c8
Branch: refs/heads/master
Commit: f2fab5c8c367c73463320375a56d55abbe0c4a61
Parents: 9e41b80
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 11:39:29 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:27 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 2 +-
.../xenserver/resource/XenServer56Resource.java | 2 +-
.../resource/XenServer620SP1Resource.java | 2 +-
.../wrapper/CitrixRebootCommandWrapper.java | 68 ++++++++++++++++++++
.../CitrixRebootRouterCommandWrapper.java | 6 +-
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../wrapper/CitrixRequestWrapperTest.java | 16 ++---
7 files changed, 81 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2fab5c8/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 7c80f64..7882b0e 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
@@ -3228,7 +3228,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- void rebootVM(final Connection conn, final VM vm, final String vmName) throws Exception {
+ public void rebootVM(final Connection conn, final VM vm, final String vmName) throws Exception {
Task task = null;
try {
task = vm.cleanRebootAsync(conn);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2fab5c8/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index 1de7b96..1bb2ff4 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -80,7 +80,7 @@ public class XenServer56Resource extends CitrixResourceBase {
}
@Override
- protected void disableVlanNetwork(final Connection conn, final Network network) {
+ public void disableVlanNetwork(final Connection conn, final Network network) {
try {
final Network.Record networkr = network.getRecord(conn);
if (!networkr.nameLabel.startsWith("VLAN")) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2fab5c8/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
index ac2b2a6..e6c66a4 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
@@ -94,7 +94,7 @@ public class XenServer620SP1Resource extends XenServer620Resource {
}
@Override
- protected HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUGroupDetails(final Connection conn) throws XenAPIException, XmlRpcException {
+ public HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUGroupDetails(final Connection conn) throws XenAPIException, XmlRpcException {
final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = new HashMap<String, HashMap<String, VgpuTypesInfo>>();
final Host host = Host.getByUuid(conn, _host.getUuid());
final Set<PGPU> pgpus = host.getPGPUs(conn);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2fab5c8/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootCommandWrapper.java
new file mode 100644
index 0000000..f2cb54c
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootCommandWrapper.java
@@ -0,0 +1,68 @@
+//
+// 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.RebootAnswer;
+import com.cloud.agent.api.RebootCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
+
+public final class CitrixRebootCommandWrapper extends CommandWrapper<RebootCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixRebootCommandWrapper.class);
+
+ @Override
+ public Answer execute(final RebootCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ s_logger.debug("7. The VM " + command.getVmName() + " is in Starting state");
+ try {
+ Set<VM> vms = null;
+ try {
+ vms = VM.getByNameLabel(conn, command.getVmName());
+ } catch (final XenAPIException e0) {
+ s_logger.debug("getByNameLabel failed " + e0.toString());
+ return new RebootAnswer(command, "getByNameLabel failed " + e0.toString(), false);
+ } catch (final Exception e0) {
+ s_logger.debug("getByNameLabel failed " + e0.getMessage());
+ return new RebootAnswer(command, "getByNameLabel failed", false);
+ }
+ for (final VM vm : vms) {
+ try {
+ citrixResourceBase.rebootVM(conn, vm, vm.getNameLabel(conn));
+ } catch (final Exception e) {
+ final String msg = e.toString();
+ s_logger.warn(msg, e);
+ return new RebootAnswer(command, msg, false);
+ }
+ }
+ return new RebootAnswer(command, "reboot succeeded", true);
+ } finally {
+ s_logger.debug("8. The VM " + command.getVmName() + " is in Running state");
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2fab5c8/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java
index c244335..5d860b9 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java
@@ -20,7 +20,6 @@
package com.cloud.hypervisor.xenserver.resource.wrapper;
import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
@@ -33,7 +32,10 @@ public final class CitrixRebootRouterCommandWrapper extends CommandWrapper<Reboo
public Answer execute(final RebootRouterCommand command, final CitrixResourceBase citrixResourceBase) {
final Connection conn = citrixResourceBase.getConnection();
- final RebootAnswer answer = citrixResourceBase.execute((RebootCommand)command);
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+
+ final RebootCommand rebootCommand = new RebootCommand(command.getVmName());
+ final Answer answer = wrapper.execute(rebootCommand, citrixResourceBase);
if (answer.getResult()) {
final String cnct = citrixResourceBase.connect(conn, command.getVmName(), command.getPrivateIpAddress());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2fab5c8/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 5e3e6e4..f83218b 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
@@ -28,6 +28,7 @@ import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.ReadyCommand;
+import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -65,6 +66,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(GetVmDiskStatsCommand.class, new CitrixGetVmDiskStatsCommandWrapper());
map.put(CheckHealthCommand.class, new CitrixCheckHealthCommandWrapper());
map.put(StopCommand.class, new CitrixStopCommandWrapper());
+ map.put(RebootCommand.class, new CitrixRebootCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2fab5c8/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 74f7cdc..98023f7 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
@@ -1,10 +1,8 @@
package com.cloud.hypervisor.xenserver.resource.wrapper;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -24,7 +22,6 @@ import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
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.StopCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -64,21 +61,16 @@ public class CitrixRequestWrapperTest {
@Test
public void testExecuteRebootRouterCommand() {
- final RebootRouterCommand rebootCommand = new RebootRouterCommand("", "");
+ final RebootRouterCommand rebootRouterCommand = new RebootRouterCommand("Test", "127.0.0.1");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- doReturn(rebootAnswer).when(citrixResourceBase).execute((RebootCommand)rebootCommand);
- doReturn(false).when(rebootAnswer).getResult();
+ final Answer answer = wrapper.execute(rebootRouterCommand, citrixResourceBase);
- final Answer answer = wrapper.execute(rebootCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(2)).getConnection();
- verify(citrixResourceBase, times(1)).getConnection();
- verify(citrixResourceBase, times(1)).execute((RebootCommand)rebootCommand);
-
- assertFalse(rebootAnswer.getResult());
- assertEquals(answer, rebootAnswer);
+ assertFalse(answer.getResult());
}
@Test
[15/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring DestroyCommand and CreateStoragePoolCommand wrappers to cope with the new design
- Basic tests added
s Please enter the commit message for your changes. Lines starting
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a06958f4
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a06958f4
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a06958f4
Branch: refs/heads/master
Commit: a06958f46927cc5e1555f45d0678977b37c9261e
Parents: a70d80d
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 14:31:19 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:27 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 10 +--
.../CitrixCreateStoragePoolCommandWrapper.java | 57 ++++++++++++++
.../wrapper/CitrixDestroyCommandWrapper.java | 83 ++++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 4 +
.../wrapper/CitrixRequestWrapperTest.java | 49 +++++++++++-
5 files changed, 192 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a06958f4/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 2f7ba8b..e935303 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
@@ -441,12 +441,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == PrepareForMigrationCommand.class) {
- return execute((PrepareForMigrationCommand)cmd);
- } else if (clazz == MigrateCommand.class) {
- return execute((MigrateCommand)cmd);
- } else if (clazz == DestroyCommand.class) {
- return execute((DestroyCommand)cmd);
} else if (clazz == CreateStoragePoolCommand.class) {
return execute((CreateStoragePoolCommand)cmd);
} else if (clazz == ModifyStoragePoolCommand.class) {
@@ -5863,7 +5857,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected SR getIscsiSR(final Connection conn, final String srNameLabel, final String target, String path, final String chapInitiatorUsername, final String chapInitiatorPassword,
+ public SR getIscsiSR(final Connection conn, final String srNameLabel, final String target, String path, final String chapInitiatorUsername, final String chapInitiatorPassword,
final boolean ignoreIntroduceException) {
synchronized (srNameLabel.intern()) {
final Map<String, String> deviceConfig = new HashMap<String, String>();
@@ -6007,7 +6001,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected SR getNfsSR(final Connection conn, final String poolid, final String uuid, final String server, String serverpath, final String pooldesc) {
+ public SR getNfsSR(final Connection conn, final String poolid, final String uuid, final String server, String serverpath, final String pooldesc) {
final Map<String, String> deviceConfig = new HashMap<String, String>();
try {
serverpath = serverpath.replace("//", "/");
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a06958f4/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateStoragePoolCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateStoragePoolCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateStoragePoolCommandWrapper.java
new file mode 100644
index 0000000..f749abb
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateStoragePoolCommandWrapper.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.xenserver.resource.wrapper;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CreateStoragePoolCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixCreateStoragePoolCommandWrapper extends CommandWrapper<CreateStoragePoolCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixCreateStoragePoolCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CreateStoragePoolCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final StorageFilerTO pool = command.getPool();
+ try {
+ if (pool.getType() == StoragePoolType.NetworkFilesystem) {
+ citrixResourceBase.getNfsSR(conn, Long.toString(pool.getId()), pool.getUuid(), pool.getHost(), pool.getPath(), pool.toString());
+ } else if (pool.getType() == StoragePoolType.IscsiLUN) {
+ citrixResourceBase.getIscsiSR(conn, pool.getUuid(), pool.getHost(), pool.getPath(), null, null, false);
+ } else if (pool.getType() == StoragePoolType.PreSetup) {
+ } else {
+ return new Answer(command, false, "The pool type: " + pool.getType().name() + " is not supported.");
+ }
+ return new Answer(command, true, "success");
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + ", create StoragePool failed due to " + e.toString() + " on host:"
+ + citrixResourceBase.getHost().getUuid() + " pool: " + pool.getHost() + pool.getPath();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a06958f4/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDestroyCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDestroyCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDestroyCommandWrapper.java
new file mode 100644
index 0000000..0685a1b
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDestroyCommandWrapper.java
@@ -0,0 +1,83 @@
+//
+// 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.storage.DestroyCommand;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+
+public final class CitrixDestroyCommandWrapper extends CommandWrapper<DestroyCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixDestroyCommandWrapper.class);
+
+ @Override
+ public Answer execute(final DestroyCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final VolumeTO vol = command.getVolume();
+ // Look up the VDI
+ final String volumeUUID = vol.getPath();
+ VDI vdi = null;
+ try {
+ vdi = citrixResourceBase.getVDIbyUuid(conn, volumeUUID);
+ } catch (final Exception e) {
+ return new Answer(command, true, "Success");
+ }
+ Set<VBD> vbds = null;
+ try {
+ vbds = vdi.getVBDs(conn);
+ } catch (final Exception e) {
+ final String msg = "VDI getVBDS for " + volumeUUID + " failed due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ }
+ for (final VBD vbd : vbds) {
+ try {
+ vbd.unplug(conn);
+ vbd.destroy(conn);
+ } catch (final Exception e) {
+ final String msg = "VM destroy for " + volumeUUID + " failed due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ }
+ }
+ try {
+ final Set<VDI> snapshots = vdi.getSnapshots(conn);
+ for (final VDI snapshot : snapshots) {
+ snapshot.destroy(conn);
+ }
+ vdi.destroy(conn);
+ } catch (final Exception e) {
+ final String msg = "VDI destroy for " + volumeUUID + " failed due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ }
+
+ return new Answer(command, true, "Success");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a06958f4/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 ca0b7d0..af5e5b4 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
@@ -25,6 +25,7 @@ import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
+import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
@@ -37,6 +38,7 @@ import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateCommand;
+import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.RequestWrapper;
import com.cloud.resource.ServerResource;
@@ -73,6 +75,8 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(CheckVirtualMachineCommand.class, new CitrixCheckVirtualMachineCommandWrapper());
map.put(PrepareForMigrationCommand.class, new CitrixPrepareForMigrationCommandWrapper());
map.put(MigrateCommand.class, new CitrixMigrateCommandWrapper());
+ map.put(DestroyCommand.class, new CitrixDestroyCommandWrapper());
+ map.put(CreateStoragePoolCommand.class, new CitrixCreateStoragePoolCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a06958f4/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 e895581..baf7a55 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
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.util.ArrayList;
@@ -12,12 +13,14 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
+import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
@@ -32,8 +35,11 @@ import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
+import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.hypervisor.xenserver.resource.XsHost;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.vm.DiskProfile;
@RunWith(MockitoJUnitRunner.class)
@@ -80,7 +86,9 @@ public class CitrixRequestWrapperTest {
@Test
public void testExecuteCreateCommand() {
- final CreateCommand createCommand = new CreateCommand(new DiskProfile(null), "", new StoragePoolVO(), false);
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+ final DiskProfile diskProfile = Mockito.mock(DiskProfile.class);
+ final CreateCommand createCommand = new CreateCommand(diskProfile, "", poolVO, false);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
@@ -216,7 +224,8 @@ public class CitrixRequestWrapperTest {
@Test
public void testPrepareForMigrationCommand() {
- final PrepareForMigrationCommand prepareCommand = new PrepareForMigrationCommand(new VirtualMachineTO(0, "Test", null, 2, 200, 256, 512, null, "CentOS", true, false, "123"));
+ final VirtualMachineTO machineTO = Mockito.mock(VirtualMachineTO.class);
+ final PrepareForMigrationCommand prepareCommand = new PrepareForMigrationCommand(machineTO);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
@@ -228,7 +237,8 @@ public class CitrixRequestWrapperTest {
@Test
public void testMigrateCommand() {
- final MigrateCommand migrateCommand = new MigrateCommand("Test", "127.0.0.1", false, new VirtualMachineTO(0, "Test", null, 2, 200, 256, 512, null, "CentOS", true, false, "123"), false);
+ final VirtualMachineTO machineTO = Mockito.mock(VirtualMachineTO.class);
+ final MigrateCommand migrateCommand = new MigrateCommand("Test", "127.0.0.1", false, machineTO, false);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
@@ -237,6 +247,39 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testDestroyCommand() {
+
+ final VMTemplateStorageResourceAssoc templateStorage = Mockito.mock(VMTemplateStorageResourceAssoc.class);
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+
+ final DestroyCommand destroyCommand = new DestroyCommand(poolVO, templateStorage);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testCreateStoragePoolCommand() {
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final CreateStoragePoolCommand destroyCommand = new CreateStoragePoolCommand(false, poolVO);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[21/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
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 {
[02/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Adding CitrixCreateCommandWrapper.java and basic unit tests
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4256418a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4256418a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4256418a
Branch: refs/heads/master
Commit: 4256418af9e1c3f5b97c6fe77968f31c0693ce15
Parents: a1e8778
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Mar 20 10:14:04 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:24 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 4 +-
.../wrapper/CitrixCreateCommandWrapper.java | 82 ++++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../wrapper/CitrixRequestWrapperTest.java | 21 +++++
4 files changed, 107 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4256418a/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 73f11c2..b284768 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
@@ -5851,7 +5851,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
- protected VDI getVDIbyUuid(final Connection conn, final String uuid) {
+ public VDI getVDIbyUuid(final Connection conn, final String uuid) {
return getVDIbyUuid(conn, uuid, true);
}
@@ -6742,7 +6742,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected SR getStorageRepository(final Connection conn, final String srNameLabel) {
+ public SR getStorageRepository(final Connection conn, final String srNameLabel) {
Set<SR> srs;
try {
srs = SR.getByNameLabel(conn, srNameLabel);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4256418a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateCommandWrapper.java
new file mode 100644
index 0000000..c58c5a9
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateCommandWrapper.java
@@ -0,0 +1,82 @@
+//
+// 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.HashMap;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.CreateAnswer;
+import com.cloud.agent.api.storage.CreateCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.vm.DiskProfile;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VDI;
+
+public final class CitrixCreateCommandWrapper extends CommandWrapper<CreateCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixCreateCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CreateCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final StorageFilerTO pool = command.getPool();
+ final DiskProfile dskch = command.getDiskCharacteristics();
+
+ VDI vdi = null;
+ try {
+ final SR poolSr = citrixResourceBase.getStorageRepository(conn, pool.getUuid());
+ if (command.getTemplateUrl() != null) {
+ VDI tmpltvdi = null;
+
+ tmpltvdi = citrixResourceBase.getVDIbyUuid(conn, command.getTemplateUrl());
+ vdi = tmpltvdi.createClone(conn, new HashMap<String, String>());
+ vdi.setNameLabel(conn, dskch.getName());
+ } else {
+ final VDI.Record vdir = new VDI.Record();
+ vdir.nameLabel = dskch.getName();
+ vdir.SR = poolSr;
+ vdir.type = Types.VdiType.USER;
+
+ vdir.virtualSize = dskch.getSize();
+ vdi = VDI.create(conn, vdir);
+ }
+
+ VDI.Record vdir;
+ vdir = vdi.getRecord(conn);
+
+ s_logger.debug("Succesfully created VDI for " + command + ". Uuid = " + vdir.uuid);
+
+ final VolumeTO vol =
+ new VolumeTO(command.getVolumeId(), dskch.getType(), pool.getType(), pool.getUuid(), vdir.nameLabel, pool.getPath(), vdir.uuid, vdir.virtualSize, null);
+
+ return new CreateAnswer(command, vol);
+ } catch (final Exception e) {
+ s_logger.warn("Unable to create volume; Pool=" + pool + "; Disk: " + dskch, e);
+ return new CreateAnswer(command, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4256418a/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 124b297..854116c 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
@@ -24,6 +24,7 @@ import java.util.Hashtable;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.RequestWrapper;
import com.cloud.resource.ServerResource;
@@ -47,6 +48,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
private void init() {
map.put(RebootRouterCommand.class, new CitrixRebootRouterCommandWrapper());
+ map.put(CreateCommand.class, new CitrixCreateCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4256418a/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 aa4ebb9..e19883a 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
@@ -7,6 +7,7 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -16,7 +17,10 @@ import com.cloud.agent.api.Answer;
import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.agent.api.storage.CreateAnswer;
+import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.vm.DiskProfile;
@RunWith(MockitoJUnitRunner.class)
public class CitrixRequestWrapperTest {
@@ -25,6 +29,8 @@ public class CitrixRequestWrapperTest {
protected CitrixResourceBase citrixResourceBase;
@Mock
protected RebootAnswer rebootAnswer;
+ @Mock
+ protected CreateAnswer createAnswer;
@Test
public void testWrapperInstance() {
@@ -44,9 +50,24 @@ public class CitrixRequestWrapperTest {
final Answer answer = wrapper.execute(rebootCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
verify(citrixResourceBase, times(1)).execute((RebootCommand)rebootCommand);
assertFalse(rebootAnswer.getResult());
assertEquals(answer, rebootAnswer);
}
+
+ @Test
+ public void testExecuteCreateCommand() {
+ final CreateCommand createCommand = new CreateCommand(new DiskProfile(null), "", new StoragePoolVO(), false);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(createCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
}
\ No newline at end of file
[38/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Adding more tests to cover other possibilities concerning different versions of the XenServer
Adding a better algorithm in order to corver deeper inheritance form the command classes
Removing some unsued variables.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/57d0931b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/57d0931b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/57d0931b
Branch: refs/heads/master
Commit: 57d0931b4950d202994d1b6609329502a60a9edf
Parents: d93935c
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 31 16:49:48 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 16:49:48 2015 +0200
----------------------------------------------------------------------
api/src/com/cloud/agent/api/Answer.java | 14 +--
.../cloudstack/api/agent/test/AnswerTest.java | 8 +-
.../xenserver/resource/XcpServerResource.java | 1 -
.../resource/XenServer56SP2Resource.java | 11 +--
.../resource/XenServer600Resource.java | 15 +--
.../resource/XenServer610Resource.java | 2 -
.../resource/XenServer650Resource.java | 26 +++--
.../resource/wrapper/CitrixRequestWrapper.java | 99 +++++++++++++++-----
.../wrapper/CitrixRequestWrapperTest.java | 23 ++++-
.../wrapper/XenServer56WrapperTest.java | 21 +++++
.../wrapper/XenServer610WrapperTest.java | 56 +++++++++++
.../wrapper/XenServer620WrapperTest.java | 35 +++++++
12 files changed, 242 insertions(+), 69 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/api/src/com/cloud/agent/api/Answer.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/Answer.java b/api/src/com/cloud/agent/api/Answer.java
index 9d10611..fd6a0d1 100644
--- a/api/src/com/cloud/agent/api/Answer.java
+++ b/api/src/com/cloud/agent/api/Answer.java
@@ -26,16 +26,16 @@ public class Answer extends Command {
this(null);
}
- public Answer(Command command) {
+ public Answer(final Command command) {
this(command, true, null);
}
- public Answer(Command command, boolean success, String details) {
+ public Answer(final Command command, final boolean success, final String details) {
result = success;
this.details = details;
}
- public Answer(Command command, Exception e) {
+ public Answer(final Command command, final Exception e) {
this(command, false, ExceptionUtil.toString(e));
}
@@ -52,11 +52,11 @@ public class Answer extends Command {
return false;
}
- public static UnsupportedAnswer createUnsupportedCommandAnswer(Command cmd) {
- return new UnsupportedAnswer(cmd, "Unsupported command issued:" + cmd.toString() + ". Are you sure you got the right type of server?");
+ public static UnsupportedAnswer createUnsupportedCommandAnswer(final Command cmd) {
+ return new UnsupportedAnswer(cmd, "Unsupported command issued: " + cmd.toString() + ". Are you sure you got the right type of server?");
}
- public static UnsupportedAnswer createUnsupportedVersionAnswer(Command cmd) {
+ public static UnsupportedAnswer createUnsupportedVersionAnswer(final Command cmd) {
return new UnsupportedAnswer(cmd, "Unsuppored Version.");
}
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/core/test/org/apache/cloudstack/api/agent/test/AnswerTest.java
----------------------------------------------------------------------
diff --git a/core/test/org/apache/cloudstack/api/agent/test/AnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/AnswerTest.java
index c685d68..6087917 100644
--- a/core/test/org/apache/cloudstack/api/agent/test/AnswerTest.java
+++ b/core/test/org/apache/cloudstack/api/agent/test/AnswerTest.java
@@ -34,19 +34,19 @@ public class AnswerTest {
@Test
public void testExecuteInSequence() {
- boolean b = a.executeInSequence();
+ final boolean b = a.executeInSequence();
assertFalse(b);
}
@Test
public void testGetResult() {
- boolean b = a.getResult();
+ final boolean b = a.getResult();
assertTrue(b);
}
@Test
public void testGetDetails() {
- String d = a.getDetails();
+ final String d = a.getDetails();
assertTrue(d.equals("details"));
}
@@ -60,7 +60,7 @@ public class AnswerTest {
assertFalse(b);
String d = usa.getDetails();
- assertTrue(d.equals("Unsupported command issued:" + acc.toString() + ". Are you sure you got the right type of server?"));
+ assertTrue(d.contains("Unsupported command issued: " + acc.toString() + ". Are you sure you got the right type of server?"));
usa = Answer.createUnsupportedVersionAnswer(acc);
b = usa.executeInSequence();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
index 63cdf11..4b2936e 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
@@ -41,7 +41,6 @@ import com.xensource.xenapi.VM;
public class XcpServerResource extends CitrixResourceBase {
private final static Logger s_logger = Logger.getLogger(XcpServerResource.class);
private static final long mem_32m = 33554432L;
- private String version;
public XcpServerResource() {
super();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56SP2Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56SP2Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56SP2Resource.java
index c0d6f00..3774817 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56SP2Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56SP2Resource.java
@@ -22,15 +22,12 @@ import java.util.List;
import javax.ejb.Local;
-import org.apache.log4j.Logger;
-
import com.cloud.resource.ServerResource;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
@Local(value = ServerResource.class)
public class XenServer56SP2Resource extends XenServer56FP1Resource {
- private static final Logger s_logger = Logger.getLogger(XenServer56SP2Resource.class);
public XenServer56SP2Resource() {
super();
@@ -40,13 +37,13 @@ public class XenServer56SP2Resource extends XenServer56FP1Resource {
@Override
protected List<File> getPatchFiles() {
- List<File> files = new ArrayList<File>();
- String patch = "scripts/vm/hypervisor/xenserver/xenserver56fp1/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xenserver56fp1/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer600Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer600Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer600Resource.java
index 037ded3..c6e5d82 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer600Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer600Resource.java
@@ -22,29 +22,22 @@ import java.util.List;
import javax.ejb.Local;
-import org.apache.log4j.Logger;
-
import com.cloud.resource.ServerResource;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
@Local(value = ServerResource.class)
public class XenServer600Resource extends XenServer56SP2Resource {
- private static final Logger s_logger = Logger.getLogger(XenServer600Resource.class);
-
- public XenServer600Resource() {
- super();
- }
@Override
protected List<File> getPatchFiles() {
- List<File> files = new ArrayList<File>();
- String patch = "scripts/vm/hypervisor/xenserver/xenserver60/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xenserver60/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
index 3c5caf0..e71a97d 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
@@ -239,7 +239,6 @@ public class XenServer610Resource extends XenServer600Resource {
final Map<String, String> token = cmd.getToken();
final String vmName = vmSpec.getName();
final Set<VolumeTO> volumeToSet = null;
- boolean migrated = false;
Task task = null;
try {
final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
@@ -295,7 +294,6 @@ public class XenServer610Resource extends XenServer600Resource {
throw new CloudRuntimeException("Error while migrating vm " + vmName, e);
}
- migrated = true;
return new MigrateWithStorageSendAnswer(cmd, volumeToSet);
} catch (final CloudRuntimeException e) {
s_logger.error("Migration of vm " + vmName + " with storage failed due to " + e.toString(), e);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer650Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer650Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer650Resource.java
index 4fa82a8..98796eb 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer650Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer650Resource.java
@@ -18,32 +18,28 @@
*/
package com.cloud.hypervisor.xenserver.resource;
-import com.cloud.resource.ServerResource;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.script.Script;
-import org.apache.log4j.Logger;
-
-import javax.ejb.Local;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import javax.ejb.Local;
+
+import com.cloud.resource.ServerResource;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.Script;
+
@Local(value=ServerResource.class)
public class XenServer650Resource extends Xenserver625Resource {
- private static final Logger s_logger = Logger.getLogger(XenServer650Resource.class);
-
- public XenServer650Resource() {
- super();
- }
+ @Override
protected List<File> getPatchFiles() {
- List files = new ArrayList();
- String patch = "scripts/vm/hypervisor/xenserver/xenserver65/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xenserver65/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/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 8b0043f..b68ef38 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
@@ -21,6 +21,8 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
import java.util.Hashtable;
+import org.apache.log4j.Logger;
+
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.AttachIsoCommand;
import com.cloud.agent.api.AttachVolumeCommand;
@@ -92,14 +94,14 @@ import com.cloud.resource.ServerResource;
public class CitrixRequestWrapper extends RequestWrapper {
+ private static final Logger s_logger = Logger.getLogger(CitrixRequestWrapper.class);
+
private static CitrixRequestWrapper instance;
static {
instance = new CitrixRequestWrapper();
}
- private boolean initialised;
-
@SuppressWarnings("rawtypes")
private final Hashtable<Class<? extends ServerResource>, Hashtable<Class<? extends Command>, CommandWrapper>> resources;
@@ -184,40 +186,95 @@ public class CitrixRequestWrapper extends RequestWrapper {
final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56P1Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
xenServer56P1Commands.put(FenceCommand.class, new XenServer56FP1FenceCommandWrapper());
resources.put(XenServer56FP1Resource.class, xenServer56P1Commands);
-
- initialised = true;
}
public static CitrixRequestWrapper getInstance() {
return instance;
}
- boolean isInitialised() {
- return initialised;
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
+ @SuppressWarnings({"rawtypes" })
@Override
public Answer execute(final Command command, final ServerResource serverResource) {
- Hashtable<Class<? extends Command>, CommandWrapper> commands = resources.get(serverResource.getClass());
+ final Class<? extends ServerResource> resourceClass = serverResource.getClass();
- // Can't instantiate the CitrixResourceBase because it's abstract. In order to reuse the command with subclasses
- // I need to do this check here.
- if (commands == null) {
- commands = resources.get(serverResource.getClass().getSuperclass());
+ final Hashtable<Class<? extends Command>, CommandWrapper> resourceCommands = retrieveResource(command, resourceClass);
+
+ CommandWrapper<Command, Answer, ServerResource> commandWrapper = retrieveCommands(command.getClass(), resourceCommands);
+
+ while (commandWrapper == null) {
+ //Could not find the command in the given resource, will traverse the family tree.
+ commandWrapper = retryWhenAllFails(command, resourceClass, resourceCommands);
}
- CommandWrapper<Command, Answer, ServerResource> commandWrapper = commands.get(command.getClass());
+ return commandWrapper.execute(command, serverResource);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ protected Hashtable<Class<? extends Command>, CommandWrapper> retrieveResource(final Command command, final Class<? extends ServerResource> resourceClass) {
+ Class<? extends ServerResource> keepResourceClass = resourceClass;
+ Hashtable<Class<? extends Command>, CommandWrapper> resource = resources.get(keepResourceClass);
+ while (resource == null) {
+ try {
+ final Class<? extends ServerResource> keepResourceClass2 = (Class<? extends ServerResource>) keepResourceClass.getSuperclass();
+ resource = resources.get(keepResourceClass2);
- // This is temporary. We have to map the classes with several sub-classes better.
- if (commandWrapper == null && command instanceof NetworkElementCommand) {
- commandWrapper = commands.get(NetworkElementCommand.class);
+ keepResourceClass = keepResourceClass2;
+ } catch (final ClassCastException e) {
+ throw new NullPointerException("No key found for '" + command.getClass() + "' in the Map!");
+ }
}
+ return resource;
+ }
- if (commandWrapper == null) {
- throw new NullPointerException("No key found for '" + command.getClass() + "' in the Map!");
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ protected CommandWrapper<Command, Answer, ServerResource> retrieveCommands(final Class<? extends Command> commandClass,
+ final Hashtable<Class<? extends Command>, CommandWrapper> resourceCommands) {
+
+ Class<? extends Command> keepCommandClass = commandClass;
+ CommandWrapper<Command, Answer, ServerResource> commandWrapper = resourceCommands.get(keepCommandClass);
+ while (commandWrapper == null) {
+ try {
+ final Class<? extends Command> commandClass2 = (Class<? extends Command>) keepCommandClass.getSuperclass();
+
+ if (commandClass2 == null) {
+ throw new NullPointerException("All the COMMAND hierarchy tree has been visited but no compliant key has been found for '" + commandClass +"'.");
+ }
+
+ commandWrapper = resourceCommands.get(commandClass2);
+
+ keepCommandClass = commandClass2;
+ } catch (final NullPointerException e) {
+ // Will now traverse all the resource hierarchy. Returning null is not a problem.
+ // It is all being nicely checked and in case we do not have a resource, an Unsupported answer will be thrown by the base class.
+ return null;
+ }
}
+ return commandWrapper;
+ }
- return commandWrapper.execute(command, serverResource);
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ protected CommandWrapper<Command, Answer, ServerResource> retryWhenAllFails(final Command command, final Class<? extends ServerResource> resourceClass,
+ final Hashtable<Class<? extends Command>, CommandWrapper> resourceCommands) {
+
+ Class<? extends ServerResource> keepResourceClass = resourceClass;
+ CommandWrapper<Command, Answer, ServerResource> commandWrapper = resourceCommands.get(command.getClass());
+ while (commandWrapper == null) {
+ //Could not find the command in the given resource, will traverse the family tree.
+ try {
+ final Class<? extends ServerResource> resourceClass2 = (Class<? extends ServerResource>) keepResourceClass.getSuperclass();
+
+ if (resourceClass2 == null) {
+ throw new NullPointerException("All the SERVER-RESOURCE hierarchy tree has been visited but no compliant key has been found for '" + command.getClass() +"'.");
+ }
+
+ final Hashtable<Class<? extends Command>, CommandWrapper> resourceCommands2 = retrieveResource(command, (Class<? extends ServerResource>) keepResourceClass.getSuperclass());
+ keepResourceClass = resourceClass2;
+
+ commandWrapper = retrieveCommands(command.getClass(), resourceCommands2);
+ } catch (final NullPointerException e) {
+ throw e;
+ }
+ }
+ return commandWrapper;
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/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 286708a..1a02af4 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
@@ -86,6 +86,7 @@ import com.cloud.agent.api.VMSnapshotTO;
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.routing.IpAssocCommand;
import com.cloud.agent.api.routing.IpAssocVpcCommand;
import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
@@ -1753,7 +1754,7 @@ public class CitrixRequestWrapperTest {
}
@Test
- public void testNetworkElementCommand() {
+ public void testIpAssocVpcCommand() {
final VirtualRoutingResource routingResource = Mockito.mock(VirtualRoutingResource.class);
final IpAddressTO [] ips = new IpAddressTO[0];
@@ -1771,6 +1772,26 @@ public class CitrixRequestWrapperTest {
// Requires more testing, but the VirtualResourceRouting is quite big.
assertNull(answer);
}
+
+ @Test
+ public void testIpAssocCommand() {
+ final VirtualRoutingResource routingResource = Mockito.mock(VirtualRoutingResource.class);
+ final IpAddressTO [] ips = new IpAddressTO[0];
+
+ final IpAssocCommand ipAssociation = new IpAssocCommand(ips);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getVirtualRoutingResource()).thenReturn(routingResource);
+
+ final Answer answer = wrapper.execute(ipAssociation, citrixResourceBase);
+
+ verify(routingResource, times(1)).executeRequest(ipAssociation);
+
+ // Requires more testing, but the VirtualResourceRouting is quite big.
+ assertNull(answer);
+ }
}
class NotAValidCommand extends Command {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
index 2035c52..a004344 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
@@ -17,8 +17,11 @@ import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckOnHostCommand;
import com.cloud.agent.api.FenceCommand;
import com.cloud.agent.api.NetworkUsageCommand;
+import com.cloud.agent.api.SetupCommand;
import com.cloud.host.Host;
+import com.cloud.host.HostEnvironment;
import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.hypervisor.xenserver.resource.XsHost;
import com.cloud.utils.ExecutionResult;
import com.cloud.vm.VMInstanceVO;
import com.xensource.xenapi.Connection;
@@ -137,4 +140,22 @@ public class XenServer56WrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testSetupCommand() {
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+ final HostEnvironment env = Mockito.mock(HostEnvironment.class);
+
+ final SetupCommand setupCommand = new SetupCommand(env);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(xenServer56Resource.getHost()).thenReturn(xsHost);
+
+ final Answer answer = wrapper.execute(setupCommand, xenServer56Resource);
+ verify(xenServer56Resource, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
new file mode 100644
index 0000000..edc4b6d
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
@@ -0,0 +1,56 @@
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckNetworkCommand;
+import com.cloud.agent.api.SetupCommand;
+import com.cloud.host.HostEnvironment;
+import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.network.PhysicalNetworkSetupInfo;
+
+@RunWith(PowerMockRunner.class)
+public class XenServer610WrapperTest {
+
+ @Mock
+ protected XenServer610Resource xenServer610Resource;
+
+ @Test
+ public void testCheckNetworkCommandFailure() {
+ final XenServer610Resource xenServer610Resource = new XenServer610Resource();
+
+ final PhysicalNetworkSetupInfo info = new PhysicalNetworkSetupInfo();
+
+ final List<PhysicalNetworkSetupInfo> setupInfos = new ArrayList<PhysicalNetworkSetupInfo>();
+ setupInfos.add(info);
+
+ final CheckNetworkCommand checkNet = new CheckNetworkCommand(setupInfos);
+
+ final Answer answer = xenServer610Resource.executeRequest(checkNet);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testSetupCommand() {
+ final XenServer610Resource xenServer610Resource = new XenServer610Resource();
+
+ final HostEnvironment env = Mockito.mock(HostEnvironment.class);
+
+ final SetupCommand setupCommand = new SetupCommand(env);
+
+ final Answer answer = xenServer610Resource.executeRequest(setupCommand);
+
+ assertFalse(answer.getResult());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57d0931b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620WrapperTest.java
new file mode 100644
index 0000000..74fc9cd
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620WrapperTest.java
@@ -0,0 +1,35 @@
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckNetworkCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer620Resource;
+import com.cloud.network.PhysicalNetworkSetupInfo;
+
+@RunWith(PowerMockRunner.class)
+public class XenServer620WrapperTest {
+
+ @Test
+ public void testCheckNetworkCommandFailure() {
+ final XenServer620Resource xenServer620Resource = new XenServer620Resource();
+
+ final PhysicalNetworkSetupInfo info = new PhysicalNetworkSetupInfo();
+
+ final List<PhysicalNetworkSetupInfo> setupInfos = new ArrayList<PhysicalNetworkSetupInfo>();
+ setupInfos.add(info);
+
+ final CheckNetworkCommand checkNet = new CheckNetworkCommand(setupInfos);
+
+ final Answer answer = xenServer620Resource.executeRequest(checkNet);
+
+ assertTrue(answer.getResult());
+ }
+}
\ No newline at end of file
[35/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
We don't need the Start, Stop, Reboot command in the CitrixRebaseClaas anymore.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d93935ca
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d93935ca
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d93935ca
Branch: refs/heads/master
Commit: d93935caacb46dae183d21a260a112d43cf88caf
Parents: 3ad30a0
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 31 09:26:58 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:33 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 1040 ++++++------------
1 file changed, 360 insertions(+), 680 deletions(-)
----------------------------------------------------------------------
[34/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d93935ca/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 dddff46..7729636 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
@@ -64,8 +64,6 @@ import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.HostStatsEntry;
import com.cloud.agent.api.HostVmStateReportEntry;
-import com.cloud.agent.api.OvsSetTagAndFlowAnswer;
-import com.cloud.agent.api.OvsSetTagAndFlowCommand;
import com.cloud.agent.api.PingCommand;
import com.cloud.agent.api.PingRoutingCommand;
import com.cloud.agent.api.PingRoutingWithNwGroupsCommand;
@@ -104,7 +102,6 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.xenserver.resource.wrapper.CitrixRequestWrapper;
import com.cloud.network.Networks;
import com.cloud.network.Networks.BroadcastDomainType;
-import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.resource.ServerResource;
import com.cloud.resource.hypervisor.HypervisorResource;
@@ -125,7 +122,6 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.utils.ssh.SSHCmdHelper;
import com.cloud.utils.ssh.SshHelper;
-import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.PowerState;
import com.trilead.ssh2.SCPClient;
import com.xensource.xenapi.Bond;
@@ -147,22 +143,20 @@ import com.xensource.xenapi.Types.VmPowerState;
import com.xensource.xenapi.Types.XenAPIException;
import com.xensource.xenapi.VBD;
import com.xensource.xenapi.VDI;
-import com.xensource.xenapi.VGPU;
import com.xensource.xenapi.VIF;
import com.xensource.xenapi.VLAN;
import com.xensource.xenapi.VM;
import com.xensource.xenapi.XenAPIObject;
/**
- * CitrixResourceBase encapsulates the calls to the XenServer Xapi process
- * to perform the required functionalities for CloudStack.
+ * CitrixResourceBase encapsulates the calls to the XenServer Xapi process to
+ * perform the required functionalities for CloudStack.
*
- * ==============> READ THIS <==============
- * Because the XenServer objects can expire when the session expires, we cannot
- * keep any of the actual XenServer objects in this class. The only
- * thing that is constant is the UUID of the XenServer objects but not the
- * objects themselves! This is very important before you do any changes in
- * this code here.
+ * ==============> READ THIS <============== Because the XenServer objects can
+ * expire when the session expires, we cannot keep any of the actual XenServer
+ * objects in this class. The only thing that is constant is the UUID of the
+ * XenServer objects but not the objects themselves! This is very important
+ * before you do any changes in this code here.
*
*/
@Local(value = ServerResource.class)
@@ -188,7 +182,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
protected static final XenServerConnectionPool ConnPool = XenServerConnectionPool.getInstance();
- //static min values for guests on xenserver
+ // static min values for guests on xenserver
private static final long mem_128m = 134217728L;
static final Random Rand = new Random(System.currentTimeMillis());
@@ -206,11 +200,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
private static PowerState convertToPowerState(final VmPowerState ps) {
final PowerState powerState = s_powerStatesTable.get(ps);
- return powerState == null ? PowerState.PowerUnknown : powerState;
+ return powerState == null ? PowerState.PowerUnknown : powerState;
}
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
+ // TODO : we need a better way to tell whether or not the VM belongs to
+ // CloudStack
final String vmName = vm.getNameLabel(conn);
if (vmName.matches("^[ivs]-\\d+-.+")) {
return false;
@@ -229,7 +224,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected int _heartbeatInterval = 60;
protected int _heartbeatTimeout = 120;
protected final XsHost _host = new XsHost();
- protected String _instance; //instance name (default is usually "VM")
+ protected String _instance; // instance name (default is usually "VM")
protected boolean _isOvs = false;
protected String _linkLocalPrivateNetworkName;
protected int _maxNics = 7;
@@ -258,10 +253,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected VirtualRoutingResource _vrResource;
protected int _wait;
- //Hypervisor specific params with generic value, may need to be overridden for specific versions
+ // Hypervisor specific params with generic value, may need to be overridden
+ // for specific versions
long _xsMemoryUsed = 128 * 1024 * 1024L; // xenserver hypervisor used 128 M
- double _xsVirtualizationFactor = 63.0 / 64.0; // 1 - virtualization overhead
+ double _xsVirtualizationFactor = 63.0 / 64.0; // 1 - virtualization overhead
protected StorageSubsystemCommandHandler storageHandler;
@@ -304,18 +300,16 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException(msg);
}
- protected String callHostPluginAsync(final Connection conn, final String plugin,
- final String cmd, final int wait, final Map<String, String> params) {
+ protected String callHostPluginAsync(final Connection conn, final String plugin, final String cmd, final int wait, final Map<String, String> params) {
final int timeout = wait * 1000;
final Map<String, String> args = new HashMap<String, String>();
Task task = null;
try {
- for (final Map.Entry< String, String > entry : params.entrySet()) {
+ for (final Map.Entry<String, String> entry : params.entrySet()) {
args.put(entry.getKey(), entry.getValue());
}
if (s_logger.isTraceEnabled()) {
- s_logger.trace("callHostPlugin executing for command " + cmd
- + " with " + getArgsString(args));
+ s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
}
final Host host = Host.getByUuid(conn, _host.getUuid());
task = host.callPluginAsync(conn, plugin, cmd, args);
@@ -326,24 +320,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (s_logger.isTraceEnabled()) {
s_logger.trace("callHostPlugin Result: " + result);
}
- return result.replace("<value>", "").replace("</value>", "")
- .replace("\n", "");
+ return result.replace("<value>", "").replace("</value>", "").replace("\n", "");
} catch (final Types.HandleInvalid e) {
- s_logger.warn("callHostPlugin failed for cmd: " + cmd
- + " with args " + getArgsString(args)
- + " due to HandleInvalid clazz:" + e.clazz + ", handle:"
- + e.handle);
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to HandleInvalid clazz:" + e.clazz + ", handle:" + e.handle);
} catch (final Exception e) {
- s_logger.warn(
- "callHostPlugin failed for cmd: " + cmd + " with args "
- + getArgsString(args) + " due to " + e.toString(),
- e);
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString(), e);
} finally {
if (task != null) {
try {
task.destroy(conn);
} catch (final Exception e1) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
}
}
@@ -372,8 +359,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
return result.replace("<value>", "").replace("</value>", "").replace("\n", "");
} catch (final Types.HandleInvalid e) {
- s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to HandleInvalid clazz:" + e.clazz + ", handle:" +
- e.handle);
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to HandleInvalid clazz:" + e.clazz + ", handle:" + e.handle);
} catch (final XenAPIException e) {
s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString(), e);
} catch (final Exception e) {
@@ -416,8 +402,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
return result.replace("\n", "");
} catch (final Types.HandleInvalid e) {
- s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to HandleInvalid clazz:" + e.clazz + ", handle:" +
- e.handle);
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to HandleInvalid clazz:" + e.clazz + ", handle:" + e.handle);
} catch (final XenAPIException e) {
s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString(), e);
} catch (final XmlRpcException e) {
@@ -462,11 +447,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_logger.debug("Checking " + srr.nameLabel + " or SR " + srr.uuid + " on " + _host);
}
if (srr.shared) {
- if (SRType.NFS.equals(srr.type) ){
+ if (SRType.NFS.equals(srr.type)) {
final Map<String, String> smConfig = srr.smConfig;
- if( !smConfig.containsKey("nosubdir")) {
+ if (!smConfig.containsKey("nosubdir")) {
smConfig.put("nosubdir", "true");
- sr.setSmConfig(conn,smConfig);
+ sr.setSmConfig(conn, smConfig);
}
}
@@ -508,7 +493,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
private void CheckXenHostInfo() throws ConfigurationException {
final Connection conn = ConnPool.getConnect(_host.getIp(), _username, _password);
- if( conn == null ) {
+ if (conn == null) {
throw new ConfigurationException("Can not create connection to " + _host.getIp());
}
try {
@@ -538,17 +523,16 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
@Override
public ExecutionResult cleanupCommand(final NetworkElementCommand cmd) {
if (cmd instanceof IpAssocCommand && !(cmd instanceof IpAssocVpcCommand)) {
- return cleanupNetworkElementCommand((IpAssocCommand)cmd);
+ return cleanupNetworkElementCommand((IpAssocCommand) cmd);
}
return new ExecutionResult(true, null);
}
-
public boolean cleanupHaltedVms(final Connection conn) throws XenAPIException, XmlRpcException {
final Host host = Host.getByUuid(conn, _host.getUuid());
final Map<VM, VM.Record> vms = VM.getAllRecords(conn);
boolean success = true;
- if(vms != null && !vms.isEmpty()) {
+ if (vms != null && !vms.isEmpty()) {
for (final Map.Entry<VM, VM.Record> entry : vms.entrySet()) {
final VM vm = entry.getKey();
final VM.Record vmRec = entry.getValue();
@@ -583,7 +567,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final NicTO nic = new NicTO();
nic.setMac(ip.getVifMacAddress());
nic.setType(ip.getTrafficType());
- if (ip.getBroadcastUri()== null) {
+ if (ip.getBroadcastUri() == null) {
nic.setBroadcastType(BroadcastDomainType.Native);
} else {
final URI uri = BroadcastDomainType.fromString(ip.getBroadcastUri());
@@ -596,19 +580,21 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
Network network = getNetwork(conn, nic);
-
- // If we are disassociating the last IP address in the VLAN, we need
+ // If we are disassociating the last IP address in the VLAN, we
+ // need
// to remove a VIF
boolean removeVif = false;
- //there is only one ip in this public vlan and removing it, so remove the nic
+ // there is only one ip in this public vlan and removing it, so
+ // remove the nic
if (ipsCount == 1 && !ip.isAdd()) {
removeVif = true;
}
if (removeVif) {
- // Determine the correct VIF on DomR to associate/disassociate the
+ // Determine the correct VIF on DomR to
+ // associate/disassociate the
// IP address with
final VIF correctVif = getCorrectVif(conn, router, network);
if (correctVif != null) {
@@ -680,7 +666,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
final VIF.Record vifr = v.getRecord(conn);
if (v.getNetwork(conn).getUuid(conn).equals(nw.getUuid(conn))) {
- if(vifr != null) {
+ if (vifr != null) {
final Map<String, String> config = vifr.otherConfig;
vifName = config.get("nameLabel");
}
@@ -702,7 +688,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task = vdi.copyAsync(conn, sr);
// poll every 1 seconds , timeout after 2 hours
- waitForTask(conn, task, 1000, (long)wait * 1000);
+ waitForTask(conn, task, 1000, (long) wait * 1000);
checkForSuccess(conn, task);
final VDI dvdi = Types.toVDI(task, conn);
return dvdi;
@@ -720,8 +706,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public HashMap<String, String> clusterVMMetaDataSync(final Connection conn) {
final HashMap<String, String> vmMetaDatum = new HashMap<String, String>();
try {
- final Map<VM, VM.Record> vm_map = VM.getAllRecords(conn); //USE THIS TO GET ALL VMS FROM A CLUSTER
- if(vm_map != null) {
+ final Map<VM, VM.Record> vm_map = VM.getAllRecords(conn); // USE
+ // THIS TO
+ // GET ALL
+ // VMS
+ // FROM A
+ // CLUSTER
+ if (vm_map != null) {
for (final VM.Record record : vm_map.values()) {
if (record.isControlDomain || record.isASnapshot || record.isATemplate) {
continue; // Skip DOM0
@@ -742,44 +733,44 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
_name = name;
try {
- _dcId = Long.parseLong((String)params.get("zone"));
+ _dcId = Long.parseLong((String) params.get("zone"));
} catch (final NumberFormatException e) {
throw new ConfigurationException("Unable to get the zone " + params.get("zone"));
}
- _host.setUuid((String)params.get("guid"));
+ _host.setUuid((String) params.get("guid"));
_name = _host.getUuid();
- _host.setIp((String)params.get("ipaddress"));
-
- _username = (String)params.get("username");
- _password.add((String)params.get("password"));
- _pod = (String)params.get("pod");
- _cluster = (String)params.get("cluster");
- _privateNetworkName = (String)params.get("private.network.device");
- _publicNetworkName = (String)params.get("public.network.device");
- _guestNetworkName = (String)params.get("guest.network.device");
- _instance = (String)params.get("instance.name");
- _securityGroupEnabled = Boolean.parseBoolean((String)params.get("securitygroupenabled"));
-
- _linkLocalPrivateNetworkName = (String)params.get("private.linkLocal.device");
+ _host.setIp((String) params.get("ipaddress"));
+
+ _username = (String) params.get("username");
+ _password.add((String) params.get("password"));
+ _pod = (String) params.get("pod");
+ _cluster = (String) params.get("cluster");
+ _privateNetworkName = (String) params.get("private.network.device");
+ _publicNetworkName = (String) params.get("public.network.device");
+ _guestNetworkName = (String) params.get("guest.network.device");
+ _instance = (String) params.get("instance.name");
+ _securityGroupEnabled = Boolean.parseBoolean((String) params.get("securitygroupenabled"));
+
+ _linkLocalPrivateNetworkName = (String) params.get("private.linkLocal.device");
if (_linkLocalPrivateNetworkName == null) {
_linkLocalPrivateNetworkName = "cloud_link_local_network";
}
- _storageNetworkName1 = (String)params.get("storage.network.device1");
- _storageNetworkName2 = (String)params.get("storage.network.device2");
+ _storageNetworkName1 = (String) params.get("storage.network.device1");
+ _storageNetworkName2 = (String) params.get("storage.network.device2");
- _heartbeatTimeout = NumbersUtil.parseInt((String)params.get("xenserver.heartbeat.timeout"), 120);
- _heartbeatInterval = NumbersUtil.parseInt((String)params.get("xenserver.heartbeat.interval"), 60);
+ _heartbeatTimeout = NumbersUtil.parseInt((String) params.get("xenserver.heartbeat.timeout"), 120);
+ _heartbeatInterval = NumbersUtil.parseInt((String) params.get("xenserver.heartbeat.interval"), 60);
- String value = (String)params.get("wait");
+ String value = (String) params.get("wait");
_wait = NumbersUtil.parseInt(value, 600);
- value = (String)params.get("migratewait");
+ value = (String) params.get("migratewait");
_migratewait = NumbersUtil.parseInt(value, 3600);
- _maxNics = NumbersUtil.parseInt((String)params.get("xenserver.nics.max"), 7);
+ _maxNics = NumbersUtil.parseInt((String) params.get("xenserver.nics.max"), 7);
if (_pod == null) {
throw new ConfigurationException("Unable to get the pod");
@@ -813,12 +804,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
/**
- * This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
+ * This method creates a XenServer network and configures it for being used
+ * as a L2-in-L3 tunneled network
*/
public synchronized Network configureTunnelNetwork(final Connection conn, final Long networkId, final long hostId, final String bridgeName) {
try {
final Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
- //Invoke plugin to setup the bridge which will be used by this network
+ // Invoke plugin to setup the bridge which will be used by this
+ // network
final String bridge = nw.getBridge(conn);
final Map<String, String> nwOtherConfig = nw.getOtherConfig(conn);
final String configuredHosts = nwOtherConfig.get("ovs-host-setup");
@@ -826,7 +819,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (configuredHosts != null) {
final String hostIdsStr[] = configuredHosts.split(",");
for (final String hostIdStr : hostIdsStr) {
- if (hostIdStr.equals(((Long)hostId).toString())) {
+ if (hostIdStr.equals(((Long) hostId).toString())) {
configured = true;
break;
}
@@ -836,22 +829,18 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (!configured) {
String result;
if (bridgeName.startsWith("OVS-DR-VPC-Bridge")) {
- result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge_for_distributed_routing", "bridge", bridge,
- "key", bridgeName,
- "xs_nw_uuid", nw.getUuid(conn),
- "cs_host_id", ((Long)hostId).toString());
+ result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge_for_distributed_routing", "bridge", bridge, "key", bridgeName, "xs_nw_uuid", nw.getUuid(conn),
+ "cs_host_id", ((Long) hostId).toString());
} else {
- result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge", "bridge", bridge,
- "key", bridgeName,
- "xs_nw_uuid", nw.getUuid(conn),
- "cs_host_id", ((Long)hostId).toString());
+ result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge", "bridge", bridge, "key", bridgeName, "xs_nw_uuid", nw.getUuid(conn), "cs_host_id",
+ ((Long) hostId).toString());
}
- //Note down the fact that the ovs bridge has been setup
+ // Note down the fact that the ovs bridge has been setup
final String[] res = result.split(":");
if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
- //TODO: Should make this error not fatal?
- throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge );
+ // TODO: Should make this error not fatal?
+ throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge);
}
}
return nw;
@@ -898,8 +887,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public String copyVhdFromSecondaryStorage(final Connection conn, final String mountpoint, final String sruuid, final int wait) {
final String nameLabel = "cloud-" + UUID.randomUUID().toString();
- final String results =
- callHostPluginAsync(conn, "vmopspremium", "copy_vhd_from_secondarystorage", wait, "mountpoint", mountpoint, "sruuid", sruuid, "namelabel", nameLabel);
+ final String results = callHostPluginAsync(conn, "vmopspremium", "copy_vhd_from_secondarystorage", wait, "mountpoint", mountpoint, "sruuid", sruuid, "namelabel",
+ nameLabel);
String errMsg = null;
if (results == null || results.isEmpty()) {
errMsg = "copy_vhd_from_secondarystorage return null";
@@ -925,7 +914,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final Connection conn = getConnection();
final String hostPath = "/tmp/";
- s_logger.debug("Copying VR with ip " + routerIp +" config file into host "+ _host.getIp() );
+ s_logger.debug("Copying VR with ip " + routerIp + " config file into host " + _host.getIp());
try {
SshHelper.scpTo(_host.getIp(), 22, _username, null, _password.peek(), hostPath, content.getBytes(Charset.defaultCharset()), filename, null);
} catch (final Exception e) {
@@ -933,7 +922,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
final String rc = callHostPlugin(conn, "vmops", "createFileInDomr", "domrip", routerIp, "srcfilepath", hostPath + filename, "dstfilepath", path);
- s_logger.debug ("VR Config file " + filename + " got created in VR, ip " + routerIp + " with content \n" + content);
+ s_logger.debug("VR Config file " + filename + " got created in VR, ip " + routerIp + " with content \n" + content);
return new ExecutionResult(rc.startsWith("succ#"), rc.substring(5));
}
@@ -1054,9 +1043,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
String createTemplateFromSnapshot(final Connection conn, final String templatePath, final String snapshotPath, final int wait) {
final String tmpltLocalDir = UUID.randomUUID().toString();
- final String results =
- callHostPluginAsync(conn, "vmopspremium", "create_privatetemplate_from_snapshot", wait, "templatePath", templatePath, "snapshotPath", snapshotPath,
- "tmpltLocalDir", tmpltLocalDir);
+ final String results = callHostPluginAsync(conn, "vmopspremium", "create_privatetemplate_from_snapshot", wait, "templatePath", templatePath, "snapshotPath", snapshotPath,
+ "tmpltLocalDir", tmpltLocalDir);
String errMsg = null;
if (results == null || results.isEmpty()) {
errMsg = "create_privatetemplate_from_snapshot return null";
@@ -1075,7 +1063,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException(errMsg);
}
- public VBD createVbd(final Connection conn, final DiskTO volume, final String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi) throws XmlRpcException, XenAPIException {
+ public VBD createVbd(final Connection conn, final DiskTO volume, final String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi) throws XmlRpcException,
+ XenAPIException {
final Volume.Type type = volume.getType();
if (vdi == null) {
@@ -1176,7 +1165,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
vifr.otherConfig.put("cloudstack-vm-id", vmSpec.getUuid());
}
- // OVS plugin looks at network UUID in the vif 'otherconfig' details to group VIF's & tunnel ports as part of tier
+ // OVS plugin looks at network UUID in the vif 'otherconfig' details to
+ // group VIF's & tunnel ports as part of tier
// when bridge is setup for distributed routing
vifr.otherConfig.put("cloudstack-network-id", nic.getNetworkUuid());
@@ -1200,7 +1190,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final VIF vif = VIF.create(conn, vifr);
if (s_logger.isDebugEnabled()) {
vifr = vif.getRecord(conn);
- if(vifr != null) {
+ if (vifr != null) {
s_logger.debug("Created a vif " + vifr.uuid + " on " + nic.getDeviceId());
}
}
@@ -1211,7 +1201,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public VM createVmFromTemplate(final Connection conn, final VirtualMachineTO vmSpec, final Host host) throws XenAPIException, XmlRpcException {
final String guestOsTypeName = getGuestOsType(vmSpec.getOs(), vmSpec.getPlatformEmulator(), vmSpec.getBootloader() == BootloaderType.CD);
final Set<VM> templates = VM.getByNameLabel(conn, guestOsTypeName);
- if ( templates == null || templates.isEmpty()) {
+ if (templates == null || templates.isEmpty()) {
throw new CloudRuntimeException("Cannot find template " + guestOsTypeName + " on XenServer host");
}
assert templates.size() == 1 : "Should only have 1 template but found " + templates.size();
@@ -1227,11 +1217,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
vmr.actionsAfterCrash = Types.OnCrashBehaviour.DESTROY;
vmr.actionsAfterShutdown = Types.OnNormalExit.DESTROY;
vmr.otherConfig.put("vm_uuid", vmSpec.getUuid());
- vmr.VCPUsMax = (long) vmSpec.getCpus(); // FIX ME: In case of dynamic scaling this VCPU max should be the minumum of
+ vmr.VCPUsMax = (long) vmSpec.getCpus(); // FIX ME: In case of dynamic
+ // scaling this VCPU max should
+ // be the minumum of
// recommended value for that template and capacity remaining on host
if (isDmcEnabled(conn, host) && vmSpec.isEnableDynamicallyScaleVm()) {
- //scaling is allowed
+ // scaling is allowed
vmr.memoryStaticMin = getStaticMin(vmSpec.getOs(), vmSpec.getBootloader() == BootloaderType.CD, vmSpec.getMinRam(), vmSpec.getMaxRam());
vmr.memoryStaticMax = getStaticMax(vmSpec.getOs(), vmSpec.getBootloader() == BootloaderType.CD, vmSpec.getMinRam(), vmSpec.getMaxRam());
vmr.memoryDynamicMin = vmSpec.getMinRam();
@@ -1244,13 +1236,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
} else {
- //scaling disallowed, set static memory target
+ // scaling disallowed, set static memory target
if (vmSpec.isEnableDynamicallyScaleVm() && !isDmcEnabled(conn, host)) {
s_logger.warn("Host " + host.getHostname(conn) + " does not support dynamic scaling, so the vm " + vmSpec.getName() + " is not dynamically scalable");
}
vmr.memoryStaticMin = vmSpec.getMinRam();
vmr.memoryStaticMax = vmSpec.getMaxRam();
- vmr.memoryDynamicMin = vmSpec.getMinRam();;
+ vmr.memoryDynamicMin = vmSpec.getMinRam();
+ ;
vmr.memoryDynamicMax = vmSpec.getMaxRam();
vmr.VCPUsMax = (long) vmSpec.getCpus();
@@ -1273,14 +1266,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
int utilization = 0; // max CPU cap, default is unlimited
// weight based allocation, CPU weight is calculated per VCPU
- cpuWeight = (int)(speed * 0.99 / _host.getSpeed() * _maxWeight);
+ cpuWeight = (int) (speed * 0.99 / _host.getSpeed() * _maxWeight);
if (cpuWeight > _maxWeight) {
cpuWeight = _maxWeight;
}
if (vmSpec.getLimitCpuUse()) {
- // CPU cap is per VM, so need to assign cap based on the number of vcpus
- utilization = (int)(vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.getSpeed() * 100);
+ // CPU cap is per VM, so need to assign cap based on the number
+ // of vcpus
+ utilization = (int) (vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.getSpeed() * 100);
}
vcpuParams.put("weight", Integer.toString(cpuWeight));
@@ -1307,7 +1301,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final DiskTO[] disks = vmSpec.getDisks();
for (final DiskTO disk : disks) {
if (disk.getType() == Volume.Type.ISO) {
- final TemplateObjectTO iso = (TemplateObjectTO)disk.getData();
+ final TemplateObjectTO iso = (TemplateObjectTO) disk.getData();
final String osType = iso.getGuestOsType();
if (osType != null) {
final String isoGuestOsName = getGuestOsType(osType, vmSpec.getPlatformEmulator(), vmSpec.getBootloader() == BootloaderType.CD);
@@ -1338,14 +1332,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vm;
}
- public VM createWorkingVM(final Connection conn, final String vmName, final String guestOSType, final String platformEmulator, final List<VolumeObjectTO> listVolumeTo) throws BadServerResponse,
- Types.VmBadPowerState, Types.SrFull,
- Types.OperationNotAllowed, XenAPIException, XmlRpcException {
- //below is redundant but keeping for consistency and code readabilty
+ public VM createWorkingVM(final Connection conn, final String vmName, final String guestOSType, final String platformEmulator, final List<VolumeObjectTO> listVolumeTo)
+ throws BadServerResponse, Types.VmBadPowerState, Types.SrFull, Types.OperationNotAllowed, XenAPIException, XmlRpcException {
+ // below is redundant but keeping for consistency and code readabilty
final String guestOsTypeName = platformEmulator;
if (guestOsTypeName == null) {
- final String msg =
- " Hypervisor " + this.getClass().getName() + " doesn't support guest OS type " + guestOSType + ". you can choose 'Other install media' to run it as HVM";
+ final String msg = " Hypervisor " + this.getClass().getName() + " doesn't support guest OS type " + guestOSType
+ + ". you can choose 'Other install media' to run it as HVM";
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
}
@@ -1362,7 +1355,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_logger.warn("Unable to find vdi by uuid: " + vdiUuid + ", skip it");
}
}
- for (final Map.Entry<VDI, VolumeObjectTO>entry : vdiMap.entrySet()) {
+ for (final Map.Entry<VDI, VolumeObjectTO> entry : vdiMap.entrySet()) {
final VDI vdi = entry.getKey();
final VolumeObjectTO volumeTO = entry.getValue();
final VBD.Record vbdr = new VBD.Record();
@@ -1383,19 +1376,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vm;
}
-
protected boolean deleteSecondaryStorageFolder(final Connection conn, final String remoteMountPath, final String folder) {
final String details = callHostPlugin(conn, "vmopsSnapshot", "delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, "folder", folder);
return details != null && details.equals("1");
}
-
- protected String deleteSnapshotBackup(final Connection conn, final Long dcId, final Long accountId, final Long volumeId, final String secondaryStorageMountPath, final String backupUUID) {
+ protected String deleteSnapshotBackup(final Connection conn, final Long dcId, final Long accountId, final Long volumeId, final String secondaryStorageMountPath,
+ final String backupUUID) {
// If anybody modifies the formatting below again, I'll skin them
- final String result =
- callHostPlugin(conn, "vmopsSnapshot", "deleteSnapshotBackup", "backupUUID", backupUUID, "dcId", dcId.toString(), "accountId", accountId.toString(),
- "volumeId", volumeId.toString(), "secondaryStorageMountPath", secondaryStorageMountPath);
+ final String result = callHostPlugin(conn, "vmopsSnapshot", "deleteSnapshotBackup", "backupUUID", backupUUID, "dcId", dcId.toString(), "accountId", accountId.toString(),
+ "volumeId", volumeId.toString(), "secondaryStorageMountPath", secondaryStorageMountPath);
return result;
}
@@ -1424,13 +1415,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public synchronized void destroyTunnelNetwork(final Connection conn, final Network nw, final long hostId) {
try {
final String bridge = nw.getBridge(conn);
- final String result = callHostPlugin(conn, "ovstunnel", "destroy_ovs_bridge", "bridge", bridge,
- "cs_host_id", ((Long)hostId).toString());
+ final String result = callHostPlugin(conn, "ovstunnel", "destroy_ovs_bridge", "bridge", bridge, "cs_host_id", ((Long) hostId).toString());
final String[] res = result.split(":");
if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
- //TODO: Should make this error not fatal?
- //Can Concurrent VM shutdown/migration/reboot events can cause this method
- //to be executed on a bridge which has already been removed?
+ // TODO: Should make this error not fatal?
+ // Can Concurrent VM shutdown/migration/reboot events can cause
+ // this method
+ // to be executed on a bridge which has already been removed?
throw new CloudRuntimeException("Unable to remove OVS bridge " + bridge + ":" + result);
}
return;
@@ -1440,7 +1431,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
-
void destroyVDIbyNameLabel(final Connection conn, final String nameLabel) {
try {
final Set<VDI> vdis = VDI.getByNameLabel(conn, nameLabel);
@@ -1506,50 +1496,48 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
/**
- * enableVlanNetwork creates a Network object, Vlan object, and thereby
- * a tagged PIF object in Xapi.
+ * enableVlanNetwork creates a Network object, Vlan object, and thereby a
+ * tagged PIF object in Xapi.
*
- * In XenServer, VLAN is added by
- * - Create a network, which is unique cluster wide.
- * - Find the PIF that you want to create the VLAN on.
- * - Create a VLAN using the network and the PIF. As a result of this
- * operation, a tagged PIF object is also created.
+ * In XenServer, VLAN is added by - Create a network, which is unique
+ * cluster wide. - Find the PIF that you want to create the VLAN on. -
+ * Create a VLAN using the network and the PIF. As a result of this
+ * operation, a tagged PIF object is also created.
*
- * Here is a list of problems with clustered Xapi implementation that
- * we are trying to circumvent.
- * - There can be multiple Networks with the same name-label so searching
- * using name-label is not unique.
- * - There are no other ways to search for Networks other than listing
- * all of them which is not efficient in our implementation because
- * we can have over 4000 VLAN networks.
- * - In a clustered situation, it's possible for both hosts to detect
- * that the Network is missing and both creates it. This causes a
- * lot of problems as one host may be using one Network and another
- * may be using a different network for their VMs. This causes
- * problems in migration because the VMs are logically attached
- * to different networks in Xapi's database but in reality, they
- * are attached to the same network.
+ * Here is a list of problems with clustered Xapi implementation that we are
+ * trying to circumvent. - There can be multiple Networks with the same
+ * name-label so searching using name-label is not unique. - There are no
+ * other ways to search for Networks other than listing all of them which is
+ * not efficient in our implementation because we can have over 4000 VLAN
+ * networks. - In a clustered situation, it's possible for both hosts to
+ * detect that the Network is missing and both creates it. This causes a lot
+ * of problems as one host may be using one Network and another may be using
+ * a different network for their VMs. This causes problems in migration
+ * because the VMs are logically attached to different networks in Xapi's
+ * database but in reality, they are attached to the same network.
*
* To work around these problems, we do the following.
*
- * - When creating the VLAN network, we name it as VLAN-UUID of the
- * Network it is created on-VLAN Tag. Because VLAN tags is unique with
- * one particular network, this is a unique name-label to quickly
- * retrieve the the VLAN network with when we need it again.
- * - When we create the VLAN network, we add a timestamp and a random
- * number as a tag into the network. Then instead of creating
- * VLAN on that network, we actually retrieve the Network again
- * and this time uses the VLAN network with lowest timestamp or
- * lowest random number as the VLAN network. This allows VLAN creation
- * to happen on multiple hosts concurrently but even if two VLAN
- * networks were created with the same name, only one of them is used.
+ * - When creating the VLAN network, we name it as VLAN-UUID of the Network
+ * it is created on-VLAN Tag. Because VLAN tags is unique with one
+ * particular network, this is a unique name-label to quickly retrieve the
+ * the VLAN network with when we need it again. - When we create the VLAN
+ * network, we add a timestamp and a random number as a tag into the
+ * network. Then instead of creating VLAN on that network, we actually
+ * retrieve the Network again and this time uses the VLAN network with
+ * lowest timestamp or lowest random number as the VLAN network. This allows
+ * VLAN creation to happen on multiple hosts concurrently but even if two
+ * VLAN networks were created with the same name, only one of them is used.
*
- * One cavaet about this approach is that it relies on the timestamp to
- * be relatively accurate among different hosts.
+ * One cavaet about this approach is that it relies on the timestamp to be
+ * relatively accurate among different hosts.
*
- * @param conn Xapi Connection
- * @param tag VLAN tag
- * @param network network on this host to create the VLAN on.
+ * @param conn
+ * Xapi Connection
+ * @param tag
+ * VLAN tag
+ * @param network
+ * network on this host to create the VLAN on.
* @return VLAN Network created.
* @throws XenAPIException
* @throws XmlRpcException
@@ -1579,7 +1567,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
nwr.tags.add(generateTimeStamp());
vlanNetwork = Network.create(conn, nwr);
vlanNic = getNetworkByName(conn, newName);
- if(vlanNic == null) { //Still vlanNic is null means we could not create it for some reason and no exception capture happened.
+ if (vlanNic == null) { // Still vlanNic is null means we could not
+ // create it for some reason and no exception
+ // capture happened.
throw new CloudRuntimeException("Could not find/create vlan network with name: " + newName);
}
}
@@ -1607,346 +1597,22 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vlanNetwork;
}
- private OvsSetTagAndFlowAnswer execute(final OvsSetTagAndFlowCommand cmd) {
- _isOvs = true;
-
- final Connection conn = getConnection();
- try {
- final Network nw = setupvSwitchNetwork(conn);
- final String bridge = nw.getBridge(conn);
-
- /*
- * If VM is domainRouter, this will try to set flow and tag on its
- * none guest network nic. don't worry, it will fail silently at
- * host plugin side
- */
- final String result = callHostPlugin(conn, "ovsgre", "ovs_set_tag_and_flow", "bridge", bridge, "vmName", cmd.getVmName(), "tag", cmd.getTag(), "vlans",
- cmd.getVlans(), "seqno", cmd.getSeqNo());
- s_logger.debug("set flow for " + cmd.getVmName() + " " + result);
-
- if (result.equalsIgnoreCase("SUCCESS")) {
- return new OvsSetTagAndFlowAnswer(cmd, true, result);
- } else {
- return new OvsSetTagAndFlowAnswer(cmd, false, result);
- }
- } catch (final BadServerResponse e) {
- s_logger.error("Failed to set tag and flow", e);
- } catch (final XenAPIException e) {
- s_logger.error("Failed to set tag and flow", e);
- } catch (final XmlRpcException e) {
- s_logger.error("Failed to set tag and flow", e);
- }
-
- return new OvsSetTagAndFlowAnswer(cmd, false, "EXCEPTION");
- }
-
@Override
public RebootAnswer execute(final RebootCommand cmd) {
- final Connection conn = getConnection();
- s_logger.debug("7. The VM " + cmd.getVmName() + " is in Starting state");
- try {
- Set<VM> vms = null;
- try {
- vms = VM.getByNameLabel(conn, cmd.getVmName());
- } catch (final XenAPIException e0) {
- s_logger.debug("getByNameLabel failed " + e0.toString());
- return new RebootAnswer(cmd, "getByNameLabel failed " + e0.toString(), false);
- } catch (final Exception e0) {
- s_logger.debug("getByNameLabel failed " + e0.getMessage());
- return new RebootAnswer(cmd, "getByNameLabel failed", false);
- }
- for (final VM vm : vms) {
- try {
- rebootVM(conn, vm, vm.getNameLabel(conn));
- } catch (final Exception e) {
- final String msg = e.toString();
- s_logger.warn(msg, e);
- return new RebootAnswer(cmd, msg, false);
- }
- }
- return new RebootAnswer(cmd, "reboot succeeded", true);
- } finally {
- s_logger.debug("8. The VM " + cmd.getVmName() + " is in Running state");
- }
+ throw new CloudRuntimeException("The method has been replaced but the implementation CitrixRebootCommandWrapper. "
+ + "Please use the new design in order to keep compatibility. Once all ServerResource implementation are refactored those methods will dissapper.");
}
@Override
public StartAnswer execute(final StartCommand cmd) {
- final Connection conn = getConnection();
- final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
- final String vmName = vmSpec.getName();
- VmPowerState state = VmPowerState.HALTED;
- VM vm = null;
- // if a VDI is created, record its UUID to send back to the CS MS
- final Map<String, String> iqnToPath = new HashMap<String, String>();
- try {
- final Set<VM> vms = VM.getByNameLabel(conn, vmName);
- if (vms != null) {
- for (final VM v : vms) {
- final VM.Record vRec = v.getRecord(conn);
- if (vRec.powerState == VmPowerState.HALTED) {
- v.destroy(conn);
- } else if (vRec.powerState == VmPowerState.RUNNING) {
- final String host = vRec.residentOn.getUuid(conn);
- final String msg = "VM " + vmName + " is runing on host " + host;
- s_logger.debug(msg);
- return new StartAnswer(cmd, msg, host);
- } else {
- final String msg = "There is already a VM having the same name " + vmName + " vm record " + vRec.toString();
- s_logger.warn(msg);
- return new StartAnswer(cmd, msg);
- }
- }
- }
- s_logger.debug("1. The VM " + vmName + " is in Starting state.");
-
- final Host host = Host.getByUuid(conn, _host.getUuid());
- vm = createVmFromTemplate(conn, vmSpec, host);
-
- final GPUDeviceTO gpuDevice = vmSpec.getGpuDevice();
- if (gpuDevice != null) {
- s_logger.debug("Creating VGPU for of VGPU type: " + gpuDevice.getVgpuType() + " in GPU group "
- + gpuDevice.getGpuGroup() + " for VM " + vmName );
- createVGPU(conn, cmd, vm, gpuDevice);
- }
-
- for (final DiskTO disk : vmSpec.getDisks()) {
- final VDI newVdi = prepareManagedDisk(conn, disk, vmName);
-
- if (newVdi != null) {
- final String path = newVdi.getUuid(conn);
-
- iqnToPath.put(disk.getDetails().get(DiskTO.IQN), path);
- }
-
- createVbd(conn, disk, vmName, vm, vmSpec.getBootloader(), newVdi);
- }
-
- if (vmSpec.getType() != VirtualMachine.Type.User) {
- createPatchVbd(conn, vmName, vm);
- }
-
- for (final NicTO nic : vmSpec.getNics()) {
- createVif(conn, vmName, vm, vmSpec, nic);
- }
-
- startVM(conn, host, vm, vmName);
-
- if (_isOvs) {
- // TODO(Salvatore-orlando): This code should go
- for (final NicTO nic : vmSpec.getNics()) {
- if (nic.getBroadcastType() == Networks.BroadcastDomainType.Vswitch) {
- final HashMap<String, String> args = parseDefaultOvsRuleComamnd(BroadcastDomainType.getValue(nic.getBroadcastUri()));
- final OvsSetTagAndFlowCommand flowCmd =
- new OvsSetTagAndFlowCommand(args.get("vmName"), args.get("tag"), args.get("vlans"), args.get("seqno"), Long.parseLong(args.get("vmId")));
- final OvsSetTagAndFlowAnswer r = execute(flowCmd);
- if (!r.getResult()) {
- s_logger.warn("Failed to set flow for VM " + r.getVmId());
- } else {
- s_logger.info("Success to set flow for VM " + r.getVmId());
- }
- }
- }
- }
-
- if (_canBridgeFirewall) {
- String result = null;
- if (vmSpec.getType() != VirtualMachine.Type.User) {
- final NicTO[] nics = vmSpec.getNics();
- boolean secGrpEnabled = false;
- for (final NicTO nic : nics) {
- if (nic.isSecurityGroupEnabled() ||
- nic.getIsolationUri() != null && nic.getIsolationUri().getScheme().equalsIgnoreCase(IsolationType.Ec2.toString())) {
- secGrpEnabled = true;
- break;
- }
- }
- if (secGrpEnabled) {
- result = callHostPlugin(conn, "vmops", "default_network_rules_systemvm", "vmName", vmName);
- if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
- s_logger.warn("Failed to program default network rules for " + vmName);
- } else {
- s_logger.info("Programmed default network rules for " + vmName);
- }
- }
-
- } else {
- //For user vm, program the rules for each nic if the isolation uri scheme is ec2
- final NicTO[] nics = vmSpec.getNics();
- for (final NicTO nic : nics) {
- if (nic.isSecurityGroupEnabled() || nic.getIsolationUri() != null &&
- nic.getIsolationUri().getScheme().equalsIgnoreCase(IsolationType.Ec2.toString())) {
- final List<String> nicSecIps = nic.getNicSecIps();
- String secIpsStr;
- final StringBuilder sb = new StringBuilder();
- if (nicSecIps != null) {
- for (final String ip : nicSecIps) {
- sb.append(ip).append(":");
- }
- secIpsStr = sb.toString();
- } else {
- secIpsStr = "0:";
- }
- result =
- callHostPlugin(conn, "vmops", "default_network_rules", "vmName", vmName, "vmIP", nic.getIp(), "vmMAC", nic.getMac(), "vmID",
- Long.toString(vmSpec.getId()), "secIps", secIpsStr);
-
- if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
- s_logger.warn("Failed to program default network rules for " + vmName + " on nic with ip:" + nic.getIp() + " mac:" + nic.getMac());
- } else {
- s_logger.info("Programmed default network rules for " + vmName + " on nic with ip:" + nic.getIp() + " mac:" + nic.getMac());
- }
- }
- }
- }
- }
-
- state = VmPowerState.RUNNING;
-
- final StartAnswer startAnswer = new StartAnswer(cmd);
-
- startAnswer.setIqnToPath(iqnToPath);
-
- return startAnswer;
- } catch (final Exception e) {
- s_logger.warn("Catch Exception: " + e.getClass().toString() + " due to " + e.toString(), e);
- final String msg = handleVmStartFailure(conn, vmName, vm, "", e);
-
- final StartAnswer startAnswer = new StartAnswer(cmd, msg);
-
- startAnswer.setIqnToPath(iqnToPath);
-
- return startAnswer;
- } finally {
- if (state != VmPowerState.HALTED) {
- s_logger.debug("2. The VM " + vmName + " is in " + state + " state.");
- } else {
- s_logger.debug("The VM is in stopped state, detected problem during startup : " + vmName);
- }
- }
+ throw new CloudRuntimeException("The method has been replaced but the implementation CitrixStartCommandWrapper. "
+ + "Please use the new design in order to keep compatibility. Once all ServerResource implementation are refactored those methods will dissapper.");
}
@Override
public StopAnswer execute(final StopCommand cmd) {
- final String vmName = cmd.getVmName();
- String platformstring = null;
- try {
- final Connection conn = getConnection();
- final Set<VM> vms = VM.getByNameLabel(conn, vmName);
- // stop vm which is running on this host or is in halted state
- final Iterator<VM> iter = vms.iterator();
- while (iter.hasNext()) {
- final VM vm = iter.next();
- final VM.Record vmr = vm.getRecord(conn);
- if (vmr.powerState != VmPowerState.RUNNING) {
- continue;
- }
- if (isRefNull(vmr.residentOn)) {
- continue;
- }
- if (vmr.residentOn.getUuid(conn).equals(_host.getUuid())) {
- continue;
- }
- iter.remove();
- }
-
- if (vms.size() == 0) {
- return new StopAnswer(cmd, "VM does not exist", true);
- }
- for (final VM vm : vms) {
- final VM.Record vmr = vm.getRecord(conn);
- platformstring = StringUtils.mapToString(vmr.platform);
- if (vmr.isControlDomain) {
- final String msg = "Tring to Shutdown control domain";
- s_logger.warn(msg);
- return new StopAnswer(cmd, msg, false);
- }
-
- if (vmr.powerState == VmPowerState.RUNNING && !isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(_host.getUuid())) {
- final String msg = "Stop Vm " + vmName + " failed due to this vm is not running on this host: " + _host.getUuid() + " but host:" + vmr.residentOn.getUuid(conn);
- s_logger.warn(msg);
- return new StopAnswer(cmd, msg, platformstring, false);
- }
-
- if (cmd.checkBeforeCleanup() && vmr.powerState == VmPowerState.RUNNING) {
- final String msg = "Vm " + vmName + " is running on host and checkBeforeCleanup flag is set, so bailing out";
- s_logger.debug(msg);
- return new StopAnswer(cmd, msg, false);
- }
-
- s_logger.debug("9. The VM " + vmName + " is in Stopping state");
-
- try {
- if (vmr.powerState == VmPowerState.RUNNING) {
- /* when stop a vm, set affinity to current xenserver */
- vm.setAffinity(conn, vm.getResidentOn(conn));
-
- if (_canBridgeFirewall) {
- final String result = callHostPlugin(conn, "vmops", "destroy_network_rules_for_vm", "vmName", cmd.getVmName());
- if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
- s_logger.warn("Failed to remove network rules for vm " + cmd.getVmName());
- } else {
- s_logger.info("Removed network rules for vm " + cmd.getVmName());
- }
- }
- shutdownVM(conn, vm, vmName);
- }
- } catch (final Exception e) {
- final String msg = "Catch exception " + e.getClass().getName() + " when stop VM:" + cmd.getVmName() + " due to " + e.toString();
- s_logger.debug(msg);
- return new StopAnswer(cmd, msg, platformstring, false);
- } finally {
-
- try {
- if (vm.getPowerState(conn) == VmPowerState.HALTED) {
- Set<VGPU> vGPUs = null;
- // Get updated GPU details
- try {
- vGPUs = vm.getVGPUs(conn);
- } catch (final XenAPIException e2) {
- s_logger.debug("VM " + vmName + " does not have GPU support.");
- }
- if (vGPUs != null && !vGPUs.isEmpty()) {
- final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = getGPUGroupDetails(conn);
- cmd.setGpuDevice(new GPUDeviceTO(null, null, groupDetails));
- }
-
- final Set<VIF> vifs = vm.getVIFs(conn);
- final List<Network> networks = new ArrayList<Network>();
- for (final VIF vif : vifs) {
- networks.add(vif.getNetwork(conn));
- }
- vm.destroy(conn);
- final SR sr = getISOSRbyVmName(conn, cmd.getVmName());
- removeSR(conn, sr);
- // Disable any VLAN networks that aren't used
- // anymore
- for (final Network network : networks) {
- try {
- if (network.getNameLabel(conn).startsWith("VLAN")) {
- disableVlanNetwork(conn, network);
- }
- } catch (final Exception e) {
- // network might be destroyed by other host
- }
- }
- return new StopAnswer(cmd, "Stop VM " + vmName + " Succeed", platformstring, true);
- }
- } catch (final Exception e) {
- final String msg = "VM destroy failed in Stop " + vmName + " Command due to " + e.getMessage();
- s_logger.warn(msg, e);
- } finally {
- s_logger.debug("10. The VM " + vmName + " is in Stopped state");
- }
- }
- }
-
- } catch (final Exception e) {
- final String msg = "Stop Vm " + vmName + " fail due to " + e.toString();
- s_logger.warn(msg, e);
- return new StopAnswer(cmd, msg, platformstring, false);
- }
- return new StopAnswer(cmd, "Stop VM failed", platformstring, false);
+ throw new CloudRuntimeException("The method has been replaced but the implementation CitrixStopCommandWrapper. "
+ + "Please use the new design in order to keep compatibility. Once all ServerResource implementation are refactored those methods will dissapper.");
}
@Override
@@ -1963,8 +1629,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
cmdline = cmdline.replaceAll(";", "\\\\;");
try {
s_logger.debug("Executing command in VR: " + cmdline);
- result = SshHelper.sshExecute(_host.getIp(), 22, _username, null, _password.peek(), cmdline,
- 60000, 60000, timeout * 1000);
+ result = SshHelper.sshExecute(_host.getIp(), 22, _username, null, _password.peek(), cmdline, 60000, 60000, timeout * 1000);
} catch (final Exception e) {
return new ExecutionResult(false, e.getMessage());
}
@@ -1974,7 +1639,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
@Override
public Answer executeRequest(final Command cmd) {
- // We need this one because the StorageSubSystemCommand is from another hierarchy.
+ // We need this one because the StorageSubSystemCommand is from another
+ // hierarchy.
if (cmd instanceof StorageSubSystemCommand) {
return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
}
@@ -2047,7 +1713,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- ram = (long)((ram - dom0Ram - _xsMemoryUsed) * _xsVirtualizationFactor);
+ ram = (long) ((ram - dom0Ram - _xsMemoryUsed) * _xsVirtualizationFactor);
cmd.setMemory(ram);
cmd.setDom0MinMemory(dom0Ram);
@@ -2130,7 +1796,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
vm.setPlatform(conn, platform);
}
}
- if ( !BootloaderType.CD.equals(vmSpec.getBootloader())) {
+ if (!BootloaderType.CD.equals(vmSpec.getBootloader())) {
final String xenservertoolsversion = details.get("hypervisortoolsversion");
if ((xenservertoolsversion == null || !xenservertoolsversion.equalsIgnoreCase("xenserver61")) && vmSpec.getGpuDevice() == null) {
final Map<String, String> platform = vm.getPlatform(conn);
@@ -2142,7 +1808,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
/**
- * This method just creates a XenServer network following the tunnel network naming convention
+ * This method just creates a XenServer network following the tunnel network
+ * naming convention
*/
public synchronized Network findOrCreateTunnelNetwork(final Connection conn, final String nwName) {
try {
@@ -2153,11 +1820,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (networks.size() == 0) {
rec.nameDescription = "tunnel network id# " + nwName;
rec.nameLabel = nwName;
- //Initialize the ovs-host-setup to avoid error when doing get-param in plugin
+ // Initialize the ovs-host-setup to avoid error when doing
+ // get-param in plugin
final Map<String, String> otherConfig = new HashMap<String, String>();
otherConfig.put("ovs-host-setup", "");
- // Mark 'internal network' as shared so bridge gets automatically created on each host in the cluster
- // when VM with vif connected to this internal network is started
+ // Mark 'internal network' as shared so bridge gets
+ // automatically created on each host in the cluster
+ // when VM with vif connected to this internal network is
+ // started
otherConfig.put("assume_network_is_shared", "true");
rec.otherConfig = otherConfig;
nw = Network.create(conn, rec);
@@ -2203,8 +1873,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return argString.toString();
}
-
-
@Override
public Map<String, Object> getConfigParams() {
return null;
@@ -2342,7 +2010,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
Set<HostCpu> hcs = null;
for (int i = 0; i < 10; i++) {
hcs = myself.getHostCPUs(conn);
- if(hcs != null) {
+ if (hcs != null) {
_host.setCpus(hcs.size());
if (_host.getCpus() > 0) {
break;
@@ -2357,7 +2025,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cpuInfo.get("socket_count") != null) {
_host.setCpuSockets(Integer.parseInt(cpuInfo.get("socket_count")));
}
- // would hcs be null we would have thrown an exception on condition (_host.getCpus() <= 0) by now
+ // would hcs be null we would have thrown an exception on condition
+ // (_host.getCpus() <= 0) by now
for (final HostCpu hc : hcs) {
_host.setSpeed(hc.getSpeed(conn).intValue());
break;
@@ -2414,7 +2083,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
XsLocalNetwork storageNic2 = null;
if (_storageNetworkName2 != null) {
storageNic2 = getNetworkByName(conn, _storageNetworkName2);
- if(storageNic2 != null) {
+ if (storageNic2 != null) {
_host.setStoragePif2(storageNic2.getPifRecord(conn).uuid);
}
}
@@ -2437,16 +2106,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public HostStatsEntry getHostStats(final Connection conn, final GetHostStatsCommand cmd, final String hostGuid, final long hostId) {
final HostStatsEntry hostStats = new HostStatsEntry(hostId, 0, 0, 0, "host", 0, 0, 0, 0);
- final Object[] rrdData = getRRDData(conn, 1); // call rrd method with 1 for host
+ final Object[] rrdData = getRRDData(conn, 1); // call rrd method with 1
+ // for host
if (rrdData == null) {
return null;
}
- final Integer numRows = (Integer)rrdData[0];
- final Integer numColumns = (Integer)rrdData[1];
- final Node legend = (Node)rrdData[2];
- final Node dataNode = (Node)rrdData[3];
+ final Integer numRows = (Integer) rrdData[0];
+ final Integer numColumns = (Integer) rrdData[1];
+ final Node legend = (Node) rrdData[2];
+ final Node dataNode = (Node) rrdData[3];
final NodeList legendChildren = legend.getChildNodes();
for (int col = 0; col < numColumns; col++) {
@@ -2473,9 +2143,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (type.equalsIgnoreCase("host")) {
if (param.matches("pif_eth0_rx")) {
- hostStats.setNetworkReadKBs(getDataAverage(dataNode, col, numRows)/1000);
+ hostStats.setNetworkReadKBs(getDataAverage(dataNode, col, numRows) / 1000);
} else if (param.matches("pif_eth0_tx")) {
- hostStats.setNetworkWriteKBs(getDataAverage(dataNode, col, numRows)/1000);
+ hostStats.setNetworkWriteKBs(getDataAverage(dataNode, col, numRows) / 1000);
} else if (param.contains("memory_total_kib")) {
hostStats.setTotalMemoryKBs(getDataAverage(dataNode, col, numRows));
} else if (param.contains("memory_free_kib")) {
@@ -2486,19 +2156,19 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
/*
- if (param.contains("loadavg")) {
- hostStats.setAverageLoad((hostStats.getAverageLoad() + getDataAverage(dataNode, col, numRows)));
- }
+ * if (param.contains("loadavg")) {
+ * hostStats.setAverageLoad((hostStats.getAverageLoad() +
+ * getDataAverage(dataNode, col, numRows))); }
*/
}
}
// add the host cpu utilization
/*
- if (hostStats.getNumCpus() != 0) {
- hostStats.setCpuUtilization(hostStats.getCpuUtilization() / hostStats.getNumCpus());
- s_logger.debug("Host cpu utilization " + hostStats.getCpuUtilization());
- }
+ * if (hostStats.getNumCpus() != 0) {
+ * hostStats.setCpuUtilization(hostStats.getCpuUtilization() /
+ * hostStats.getNumCpus()); s_logger.debug("Host cpu utilization " +
+ * hostStats.getCpuUtilization()); }
*/
return hostStats;
@@ -2506,13 +2176,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected HashMap<String, HostVmStateReportEntry> getHostVmStateReport(final Connection conn) {
- // TODO : new VM sync model does not require a cluster-scope report, we need to optimize
+ // TODO : new VM sync model does not require a cluster-scope report, we
+ // need to optimize
// the report accordingly
final HashMap<String, HostVmStateReportEntry> vmStates = new HashMap<String, HostVmStateReportEntry>();
Map<VM, VM.Record> vm_map = null;
for (int i = 0; i < 2; i++) {
try {
- vm_map = VM.getAllRecords(conn); //USE THIS TO GET ALL VMS FROM A CLUSTER
+ vm_map = VM.getAllRecords(conn); // USE THIS TO GET ALL VMS FROM
+ // A CLUSTER
break;
} catch (final Throwable e) {
s_logger.warn("Unable to get vms", e);
@@ -2547,10 +2219,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (host_uuid.equalsIgnoreCase(_host.getUuid())) {
- vmStates.put(
- record.nameLabel,
- new HostVmStateReportEntry(convertToPowerState(ps), host_uuid)
- );
+ vmStates.put(record.nameLabel, new HostVmStateReportEntry(convertToPowerState(ps), host_uuid));
}
}
}
@@ -2558,8 +2227,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vmStates;
}
- public SR getIscsiSR(final Connection conn, final String srNameLabel, final String target, String path, final String chapInitiatorUsername, final String chapInitiatorPassword,
- final boolean ignoreIntroduceException) {
+ public SR getIscsiSR(final Connection conn, final String srNameLabel, final String target, String path, final String chapInitiatorUsername,
+ final String chapInitiatorPassword, final boolean ignoreIntroduceException) {
synchronized (srNameLabel.intern()) {
final Map<String, String> deviceConfig = new HashMap<String, String>();
try {
@@ -2601,8 +2270,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
continue;
}
if (target.equals(dc.get("target")) && targetiqn.equals(dc.get("targetIQN")) && lunid.equals(dc.get("lunid"))) {
- throw new CloudRuntimeException("There is a SR using the same configuration target:" + dc.get("target") + ", targetIQN:" + dc.get("targetIQN") +
- ", lunid:" + dc.get("lunid") + " for pool " + srNameLabel + "on host:" + _host.getUuid());
+ throw new CloudRuntimeException("There is a SR using the same configuration target:" + dc.get("target") + ", targetIQN:" + dc.get("targetIQN")
+ + ", lunid:" + dc.get("lunid") + " for pool " + srNameLabel + "on host:" + _host.getUuid());
}
}
deviceConfig.put("target", target);
@@ -2671,7 +2340,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
final Set<Host> setHosts = Host.getAll(conn);
- if(setHosts == null) {
+ if (setHosts == null) {
final String msg = "Unable to create Iscsi SR " + deviceConfig + " due to hosts not available.";
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
@@ -2775,7 +2444,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected SR getLocalEXTSR(final Connection conn) {
try {
final Map<SR, SR.Record> map = SR.getAllRecords(conn);
- if(map != null && !map.isEmpty()) {
+ if (map != null && !map.isEmpty()) {
for (final Map.Entry<SR, SR.Record> entry : map.entrySet()) {
final SR.Record srRec = entry.getValue();
if (SRType.FILE.equals(srRec.type) || SRType.EXT.equals(srRec.type)) {
@@ -2810,7 +2479,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected SR getLocalLVMSR(final Connection conn) {
try {
final Map<SR, SR.Record> map = SR.getAllRecords(conn);
- if(map != null && !map.isEmpty()) {
+ if (map != null && !map.isEmpty()) {
for (final Map.Entry<SR, SR.Record> entry : map.entrySet()) {
final SR.Record srRec = entry.getValue();
if (SRType.LVM.equals(srRec.type)) {
@@ -2853,7 +2522,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final VIF vif = vifIter.next();
try {
final String deviceId = vif.getDevice(conn);
- if(vm.getIsControlDomain(conn) || vif.getCurrentlyAttached(conn)) {
+ if (vm.getIsControlDomain(conn) || vif.getCurrentlyAttached(conn)) {
usedDeviceNums.add(Integer.valueOf(deviceId));
} else {
s_logger.debug("Found unplugged VIF " + deviceId + " in VM " + vmName + " destroy it");
@@ -2892,13 +2561,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
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(_host.getUuid())
- .append("; pif=")
- .append(rec.uuid)
- .append("; vlan=")
- .append(rec.VLAN)
- .toString();
+ final String msg = new StringBuilder("Unsupported configuration. Management network is on a VLAN. host=").append(_host.getUuid()).append("; pif=")
+ .append(rec.uuid).append("; vlan=").append(rec.VLAN).toString();
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
}
@@ -2917,9 +2581,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
final Bond bond = mgmtPifRec.bondSlaveOf;
if (!isRefNull(bond)) {
- final String msg =
- "Management interface is on slave(" + mgmtPifRec.uuid + ") of bond(" + bond.getUuid(conn) + ") on host(" + _host.getUuid() +
- "), please move management interface to bond!";
+ final String msg = "Management interface is on slave(" + mgmtPifRec.uuid + ") of bond(" + bond.getUuid(conn) + ") on host(" + _host.getUuid()
+ + "), please move management interface to bond!";
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
}
@@ -2951,7 +2614,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
} else if (type == TrafficType.Public) {
return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getPublicNetwork()), null, PIF.getByUuid(conn, _host.getPublicPif()), null);
} else if (type == TrafficType.Storage) {
- /* TrafficType.Storage is for secondary storage, while storageNetwork1 is for primary storage, we need better name here */
+ /*
+ * TrafficType.Storage is for secondary storage, while
+ * storageNetwork1 is for primary storage, we need better name here
+ */
return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getStorageNetwork1()), null, PIF.getByUuid(conn, _host.getStoragePif1()), null);
}
@@ -2973,8 +2639,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
assert BroadcastDomainType.getSchemeValue(uri) == BroadcastDomainType.Vlan;
final long vlan = Long.parseLong(BroadcastDomainType.getValue(uri));
return enableVlanNetwork(conn, vlan, network);
- } else if (type == BroadcastDomainType.Native || type == BroadcastDomainType.LinkLocal ||
- type == BroadcastDomainType.Vsp) {
+ } else if (type == BroadcastDomainType.Native || type == BroadcastDomainType.LinkLocal || type == BroadcastDomainType.Vsp) {
return network.getNetwork();
} else if (uri != null && type == BroadcastDomainType.Vswitch) {
final String header = uri.toString().substring(Networks.BroadcastDomainType.Vswitch.scheme().length() + "://".length());
@@ -2996,7 +2661,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return network.getNetwork();
} else if (uri != null && type == BroadcastDomainType.Pvlan) {
assert BroadcastDomainType.getSchemeValue(uri) == BroadcastDomainType.Pvlan;
- // should we consider moving this NetUtils method to BroadcastDomainType?
+ // should we consider moving this NetUtils method to
+ // BroadcastDomainType?
final long vlan = Long.parseLong(NetUtils.getPrimaryPvlanFromUri(uri));
return enableVlanNetwork(conn, vlan, network);
}
@@ -3005,39 +2671,39 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
/**
- * getNetworkByName() retrieves what the server thinks is the actual
- * network used by the XenServer host. This method should always be
- * used to talk to retrieve a network by the name. The reason is
- * because of the problems in using the name label as the way to find
- * the Network.
+ * getNetworkByName() retrieves what the server thinks is the actual network
+ * used by the XenServer host. This method should always be used to talk to
+ * retrieve a network by the name. The reason is because of the problems in
+ * using the name label as the way to find the Network.
*
* To see how we are working around these problems, take a look at
- * enableVlanNetwork(). The following description assumes you have looked
- * at the description on that method.
+ * enableVlanNetwork(). The following description assumes you have looked at
+ * the description on that method.
*
* In order to understand this, we have to see what type of networks are
* within a XenServer that's under CloudStack control.
*
- * - Native Networks: these are networks that are untagged on the
- * XenServer and are used to crate VLAN networks on. These are
- * created by the user and is assumed to be one per cluster.
- * - VLAN Networks: these are dynamically created by CloudStack and can
- * have problems with duplicated names.
- * - LinkLocal Networks: these are dynamically created by CloudStack and
- * can also have problems with duplicated names but these don't have
- * actual PIFs.
+ * - Native Networks: these are networks that are untagged on the XenServer
+ * and are used to crate VLAN networks on. These are created by the user and
+ * is assumed to be one per cluster. - VLAN Networks: these are dynamically
+ * created by CloudStack and can have problems with duplicated names. -
+ * LinkLocal Networks: these are dynamically created by CloudStack and can
+ * also have problems with duplicated names but these don't have actual
+ * PIFs.
*
- * In order to speed to retrieval of a network, we do the following:
- * - We retrieve by the name. If only one network is retrieved, we
- * assume we retrieved the right network.
- * - If more than one network is retrieved, we check to see which one
- * has the pif for the local host and use that.
- * - If a pif is not found, then we look at the tags and find the
- * one with the lowest timestamp. (See enableVlanNetwork())
+ * In order to speed to retrieval of a network, we do the following: - We
+ * retrieve by the name. If only one network is retrieved, we assume we
+ * retrieved the right network. - If more than one network is retrieved, we
+ * check to see which one has the pif for the local host and use that. - If
+ * a pif is not found, then we look at the tags and find the one with the
+ * lowest timestamp. (See enableVlanNetwork())
*
- * @param conn Xapi connection
- * @param name name of the network
- * @return XsNic an object that contains network, network record, pif, and pif record.
+ * @param conn
+ * Xapi connection
+ * @param name
+ * name of the network
+ * @return XsNic an object that contains network, network record, pif, and
+ * pif record.
* @throws XenAPIException
* @throws XmlRpcException
*
@@ -3107,7 +2773,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
serverpath = serverpath.replace("//", "/");
final Set<SR> srs = SR.getAll(conn);
- if(srs != null && !srs.isEmpty()) {
+ if (srs != null && !srs.isEmpty()) {
for (final SR sr : srs) {
if (!SRType.NFS.equals(sr.getType(conn))) {
continue;
@@ -3135,8 +2801,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (server.equals(dc.get("server")) && serverpath.equals(dc.get("serverpath"))) {
- throw new CloudRuntimeException("There is a SR using the same configuration server:" + dc.get("server") + ", serverpath:" + dc.get("serverpath") +
- " for pool " + uuid + " on host:" + _host.getUuid());
+ throw new CloudRuntimeException("There is a SR using the same configuration server:" + dc.get("server") + ", serverpath:" + dc.get("serverpath")
+ + " for pool " + uuid + " on host:" + _host.getUuid());
}
}
@@ -3159,7 +2825,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
private String getOvsTunnelNetworkName(final String broadcastUri) {
if (broadcastUri.contains(".")) {
final String[] parts = broadcastUri.split("\\.");
- return "OVS-DR-VPC-Bridge"+parts[0];
+ return "OVS-DR-VPC-Bridge" + parts[0];
} else {
try {
return "OVSTunnel" + broadcastUri;
@@ -3173,12 +2839,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- public String getPerfMon(final Connection conn, final Map<String, String> params,
- final int wait) {
+ public String getPerfMon(final Connection conn, final Map<String, String> params, final int wait) {
String result = null;
try {
- result = callHostPluginAsync(conn, "vmopspremium", "asmonitor", 60,
- params);
+ result = callHostPluginAsync(conn, "vmopspremium", "asmonitor", 60, params);
if (result != null) {
return result;
}
@@ -3191,7 +2855,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected Object[] getRRDData(final Connection conn, final int flag) {
/*
- * Note: 1 => called from host, hence host stats 2 => called from vm, hence vm stats
+ * Note: 1 => called from host, hence host stats 2 => called from vm,
+ * hence vm stats
*/
Document doc = null;
@@ -3202,7 +2867,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- if (doc == null) { //stats are null when the host plugin call fails (host down state)
+ if (doc == null) { // stats are null when the host plugin call fails
+ // (host down state)
return null;
}
@@ -3254,15 +2920,20 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return ressr;
}
- private long getStaticMax(final String os, final boolean b, final long dynamicMinRam, final long dynamicMaxRam){
+ private long getStaticMax(final String os, final boolean b, final long dynamicMinRam, final long dynamicMaxRam) {
final long recommendedValue = CitrixHelper.getXenServerStaticMax(os, b);
- if(recommendedValue == 0){
+ if (recommendedValue == 0) {
s_logger.warn("No recommended value found for dynamic max, setting static max and dynamic max equal");
return dynamicMaxRam;
}
- final long staticMax = Math.min(recommendedValue, 4l * dynamicMinRam); // XS constraint for stability
- if (dynamicMaxRam > staticMax){ // XS contraint that dynamic max <= static max
- s_logger.warn("dynamixMax " + dynamicMaxRam + " cant be greater than static max " + staticMax + ", can lead to stability issues. Setting static max as much as dynamic max ");
+ final long staticMax = Math.min(recommendedValue, 4l * dynamicMinRam); // XS
+ // constraint
+ // for
+ // stability
+ if (dynamicMaxRam > staticMax) { // XS contraint that dynamic max <=
+ // static max
+ s_logger.warn("dynamixMax " + dynamicMaxRam + " cant be greater than static max " + staticMax
+ + ", can lead to stability issues. Setting static max as much as dynamic max ");
return dynamicMaxRam;
}
return staticMax;
@@ -3275,7 +2946,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
<TRUNCATED>
[30/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactored the remaining commands
- Unit tests added
In the executeRequest I needed to keep the following:
// We need this one because the StorageSubSystemCommand is from another hierarchy.
if (cmd instanceof StorageSubSystemCommand) {
return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
}
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/02571728
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/02571728
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/02571728
Branch: refs/heads/master
Commit: 02571728c61e64399bea77af3d6ac2d6d87d0404
Parents: 24bbfbc
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Mon Mar 30 19:01:46 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:32 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 45 ++-
.../xenserver/resource/XcpServerResource.java | 39 ++-
.../resource/XenServer56FP1Resource.java | 53 ++--
.../resource/Xenserver625Resource.java | 4 +-
.../CitrixNetworkElementCommandWrapper.java | 35 +++
...NetworkRulesVmSecondaryIpCommandWrapper.java | 44 +++
.../CitrixPerformanceMonitorCommandWrapper.java | 41 +++
.../wrapper/CitrixPvlanSetupCommandWrapper.java | 92 ++++++
.../resource/wrapper/CitrixRequestWrapper.java | 24 +-
.../wrapper/CitrixScaleVmCommandWrapper.java | 106 +++++++
.../resource/CitrixResourceBaseTest.java | 4 +-
.../wrapper/CitrixRequestWrapperTest.java | 300 +++++++++++++++++++
12 files changed, 706 insertions(+), 81 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/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 aa92681..6ef756c 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
@@ -350,6 +350,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
_password.add(password);
}
+ public VirtualRoutingResource getVirtualRoutingResource() {
+ return _vrResource;
+ }
+
public boolean isOvs() {
return _isOvs;
}
@@ -458,30 +462,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
@Override
public Answer executeRequest(final Command cmd) {
+ // We need this one because the StorageSubSystemCommand is from another hierarchy.
+ if (cmd instanceof StorageSubSystemCommand) {
+ return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
+ }
+
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
try {
- final Answer answer = wrapper.execute(cmd, this);
- return answer;
+ return wrapper.execute(cmd, this);
} catch (final Exception e) {
- // Ignore it for now. Just removing the command that have already been
- // replaced by the new code.
- }
-
- final Class<? extends Command> clazz = cmd.getClass();
-
- if (cmd instanceof NetworkElementCommand) {
- return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (cmd instanceof StorageSubSystemCommand) {
- return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
- } else if (clazz == NetworkRulesVmSecondaryIpCommand.class) {
- return execute((NetworkRulesVmSecondaryIpCommand) cmd);
- } else if (clazz == ScaleVmCommand.class) {
- return execute((ScaleVmCommand)cmd);
- } else if (clazz == PvlanSetupCommand.class) {
- return execute((PvlanSetupCommand)cmd);
- } else if (clazz == PerformanceMonitorCommand.class) {
- return execute((PerformanceMonitorCommand)cmd);
- } else {
return Answer.createUnsupportedCommandAnswer(cmd);
}
}
@@ -564,7 +553,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- private String getPerfMon(final Connection conn, final Map<String, String> params,
+ public String getPerfMon(final Connection conn, final Map<String, String> params,
final int wait) {
String result = null;
try {
@@ -625,7 +614,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- protected void scaleVM(final Connection conn, final VM vm, final VirtualMachineTO vmSpec, final Host host) throws XenAPIException, XmlRpcException {
+ public void scaleVM(final Connection conn, final VM vm, final VirtualMachineTO vmSpec, final Host host) throws XenAPIException, XmlRpcException {
final Long staticMemoryMax = vm.getMemoryStaticMax(conn);
final Long staticMemoryMin = vm.getMemoryStaticMin(conn);
@@ -806,7 +795,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException(errMsg);
}
- protected XsLocalNetwork getNativeNetworkForTraffic(final Connection conn, final TrafficType type, final String name) throws XenAPIException, XmlRpcException {
+ public XsLocalNetwork getNativeNetworkForTraffic(final Connection conn, final TrafficType type, final String name) throws XenAPIException, XmlRpcException {
if (name != null) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Looking for network named " + name);
@@ -3121,7 +3110,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
* By default this is disallowed, override the specific xenserver resource
* if this is enabled
*/
- protected boolean isDmcEnabled(final Connection conn, final Host host) throws XenAPIException, XmlRpcException {
+ public boolean isDmcEnabled(final Connection conn, final Host host) throws XenAPIException, XmlRpcException {
return false;
}
@@ -5576,7 +5565,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
CheckXenHostInfo();
- storageHandler = getStorageHandler();
+ storageHandler = buildStorageHandler();
_vrResource = new VirtualRoutingResource(this);
if (!_vrResource.configure(name, params)) {
@@ -5585,7 +5574,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return true;
}
- protected StorageSubsystemCommandHandler getStorageHandler() {
+ protected StorageSubsystemCommandHandler buildStorageHandler() {
final XenServerStorageProcessor processor = new XenServerStorageProcessor(this);
return new StorageSubsystemCommandHandlerBase(processor);
}
@@ -7180,4 +7169,4 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final String result = callHostPlugin(conn, "ovstunnel", "getLabel");
return result;
}
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
index 782a530..63cdf11 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
@@ -25,11 +25,6 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VM;
-
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.NetworkUsageAnswer;
@@ -37,6 +32,10 @@ import com.cloud.agent.api.NetworkUsageCommand;
import com.cloud.resource.ServerResource;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
@Local(value = ServerResource.class)
public class XcpServerResource extends CitrixResourceBase {
@@ -49,7 +48,7 @@ public class XcpServerResource extends CitrixResourceBase {
}
@Override
- public Answer executeRequest(Command cmd) {
+ public Answer executeRequest(final Command cmd) {
if (cmd instanceof NetworkUsageCommand) {
return execute((NetworkUsageCommand)cmd);
} else {
@@ -59,29 +58,29 @@ public class XcpServerResource extends CitrixResourceBase {
@Override
protected List<File> getPatchFiles() {
- List<File> files = new ArrayList<File>();
- String patch = "scripts/vm/hypervisor/xenserver/xcpserver/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xcpserver/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
- protected NetworkUsageAnswer execute(NetworkUsageCommand cmd) {
+ protected NetworkUsageAnswer execute(final NetworkUsageCommand cmd) {
try {
- Connection conn = getConnection();
+ final Connection conn = getConnection();
if (cmd.getOption() != null && cmd.getOption().equals("create")) {
- String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
- NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
+ final String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
return answer;
}
- long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
- NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
+ final long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
return answer;
- } catch (Exception ex) {
+ } catch (final Exception ex) {
s_logger.warn("Failed to get network usage stats due to ", ex);
return new NetworkUsageAnswer(cmd, ex);
}
@@ -137,17 +136,17 @@ public class XcpServerResource extends CitrixResourceBase {
cf: https://wiki.xenserver.org/index.php?title=XCP_FAQ_Dynamic_Memory_Control
*/
@Override
- protected void setMemory(Connection conn, VM vm, long minMemsize, long maxMemsize) throws XmlRpcException, XenAPIException {
+ protected void setMemory(final Connection conn, final VM vm, final long minMemsize, final long maxMemsize) throws XmlRpcException, XenAPIException {
//setMemoryLimits(staticMin, staticMax, dynamicMin, dynamicMax)
if (s_logger.isDebugEnabled()) {
s_logger.debug("Memory Limits for VM [" + vm.getNameLabel(conn) + "[staticMin:" + mem_32m + ", staticMax:" + maxMemsize + ", dynamicMin: " + minMemsize +
- ", dynamicMax:" + maxMemsize + "]]");
+ ", dynamicMax:" + maxMemsize + "]]");
}
vm.setMemoryLimits(conn, mem_32m, maxMemsize, minMemsize, maxMemsize);
}
@Override
- protected boolean isDmcEnabled(Connection conn, Host host) {
+ public boolean isDmcEnabled(final Connection conn, final Host host) {
//Dynamic Memory Control (DMC) is a technology provided by Xen Cloud Platform (XCP), starting from the 0.5 release
//For the supported XCPs dmc is default enabled, XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x;
return true;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
index eeeb959..f695582 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
@@ -28,6 +28,11 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
+import com.cloud.agent.api.FenceAnswer;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.resource.ServerResource;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.Script;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.Types.XenAPIException;
@@ -35,12 +40,6 @@ import com.xensource.xenapi.VBD;
import com.xensource.xenapi.VDI;
import com.xensource.xenapi.VM;
-import com.cloud.agent.api.FenceAnswer;
-import com.cloud.agent.api.FenceCommand;
-import com.cloud.resource.ServerResource;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.script.Script;
-
@Local(value = ServerResource.class)
public class XenServer56FP1Resource extends XenServer56Resource {
private static final long mem_128m = 134217728L;
@@ -52,22 +51,22 @@ public class XenServer56FP1Resource extends XenServer56Resource {
@Override
protected List<File> getPatchFiles() {
- List<File> files = new ArrayList<File>();
- String patch = "scripts/vm/hypervisor/xenserver/xenserver56fp1/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xenserver56fp1/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
@Override
- protected FenceAnswer execute(FenceCommand cmd) {
- Connection conn = getConnection();
+ protected FenceAnswer execute(final FenceCommand cmd) {
+ final Connection conn = getConnection();
try {
- Boolean alive = check_heartbeat(cmd.getHostGuid());
+ final Boolean alive = check_heartbeat(cmd.getHostGuid());
if ( alive == null ) {
s_logger.debug("Failed to check heartbeat, so unable to fence");
return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
@@ -76,12 +75,12 @@ public class XenServer56FP1Resource extends XenServer56Resource {
s_logger.debug("Heart beat is still going so unable to fence");
return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
}
- Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
- for (VM vm : vms) {
- Set<VDI> vdis = new HashSet<VDI>();
- Set<VBD> vbds = vm.getVBDs(conn);
- for (VBD vbd : vbds) {
- VDI vdi = vbd.getVDI(conn);
+ final Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
+ for (final VM vm : vms) {
+ final Set<VDI> vdis = new HashSet<VDI>();
+ final Set<VBD> vbds = vm.getVBDs(conn);
+ for (final VBD vbd : vbds) {
+ final VDI vdi = vbd.getVDI(conn);
if (!isRefNull(vdi)) {
vdis.add(vdi);
}
@@ -89,9 +88,9 @@ public class XenServer56FP1Resource extends XenServer56Resource {
s_logger.info("Fence command for VM " + cmd.getVmName());
vm.powerStateReset(conn);
vm.destroy(conn);
- for (VDI vdi : vdis) {
- Map<String, String> smConfig = vdi.getSmConfig(conn);
- for (String key : smConfig.keySet()) {
+ for (final VDI vdi : vdis) {
+ final Map<String, String> smConfig = vdi.getSmConfig(conn);
+ for (final String key : smConfig.keySet()) {
if (key.startsWith("host_")) {
vdi.removeFromSmConfig(conn, key);
break;
@@ -100,10 +99,10 @@ public class XenServer56FP1Resource extends XenServer56Resource {
}
}
return new FenceAnswer(cmd);
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
s_logger.warn("Unable to fence", e);
return new FenceAnswer(cmd, false, e.getMessage());
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.warn("Unable to fence", e);
return new FenceAnswer(cmd, false, e.getMessage());
}
@@ -117,9 +116,9 @@ public class XenServer56FP1Resource extends XenServer56Resource {
* When false, scaling is allowed hence DMC is enabled
*/
@Override
- protected boolean isDmcEnabled(Connection conn, Host host) throws XenAPIException, XmlRpcException {
- Map<String, String> hostParams = host.getLicenseParams(conn);
- Boolean isDmcEnabled = hostParams.get("restrict_dmc").equalsIgnoreCase("false");
+ public boolean isDmcEnabled(final Connection conn, final Host host) throws XenAPIException, XmlRpcException {
+ final Map<String, String> hostParams = host.getLicenseParams(conn);
+ final Boolean isDmcEnabled = hostParams.get("restrict_dmc").equalsIgnoreCase("false");
return isDmcEnabled;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/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 11ab7ba..6a78287 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
@@ -61,7 +61,7 @@ public class Xenserver625Resource extends XenServerResourceNewBase {
}
@Override
- protected StorageSubsystemCommandHandler getStorageHandler() {
+ protected StorageSubsystemCommandHandler buildStorageHandler() {
final XenServerStorageProcessor processor = new Xenserver625StorageProcessor(this);
return new StorageSubsystemCommandHandlerBase(processor);
}
@@ -99,7 +99,7 @@ public class Xenserver625Resource extends XenServerResourceNewBase {
}
@Override
- protected String revertToSnapshot(final Connection conn, final VM vmSnapshot,
+ public String revertToSnapshot(final Connection conn, final VM vmSnapshot,
final String vmName, final String oldVmUuid, final Boolean snapshotMemory, final String hostUUID)
throws Types.XenAPIException, XmlRpcException {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkElementCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkElementCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkElementCommandWrapper.java
new file mode 100644
index 0000000..801a43b
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkElementCommandWrapper.java
@@ -0,0 +1,35 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.routing.NetworkElementCommand;
+import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixNetworkElementCommandWrapper extends CommandWrapper<NetworkElementCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final NetworkElementCommand command, final CitrixResourceBase citrixResourceBase) {
+ final VirtualRoutingResource routingResource = citrixResourceBase.getVirtualRoutingResource();
+ return routingResource.executeRequest(command);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesVmSecondaryIpCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesVmSecondaryIpCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesVmSecondaryIpCommandWrapper.java
new file mode 100644
index 0000000..48e57d8
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesVmSecondaryIpCommandWrapper.java
@@ -0,0 +1,44 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.NetworkRulesVmSecondaryIpCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixNetworkRulesVmSecondaryIpCommandWrapper extends CommandWrapper<NetworkRulesVmSecondaryIpCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final NetworkRulesVmSecondaryIpCommand command, final CitrixResourceBase citrixResourceBase) {
+ boolean success = true;
+ final Connection conn = citrixResourceBase.getConnection();
+
+ final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "network_rules_vmSecondaryIp", "vmName", command.getVmName(), "vmMac", command.getVmMac(),
+ "vmSecIp", command.getVmSecIp(), "action", command.getAction());
+
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ success = false;
+ }
+
+ return new Answer(command, success, "");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPerformanceMonitorCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPerformanceMonitorCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPerformanceMonitorCommandWrapper.java
new file mode 100644
index 0000000..ad670c1
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPerformanceMonitorCommandWrapper.java
@@ -0,0 +1,41 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.PerformanceMonitorAnswer;
+import com.cloud.agent.api.PerformanceMonitorCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixPerformanceMonitorCommandWrapper extends CommandWrapper<PerformanceMonitorCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final PerformanceMonitorCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final String perfMon = citrixResourceBase.getPerfMon(conn, command.getParams(), command.getWait());
+ if (perfMon == null) {
+ return new PerformanceMonitorAnswer(command, false, perfMon);
+ } else {
+ return new PerformanceMonitorAnswer(command, true, perfMon);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPvlanSetupCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPvlanSetupCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPvlanSetupCommandWrapper.java
new file mode 100644
index 0000000..6db9383
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPvlanSetupCommandWrapper.java
@@ -0,0 +1,92 @@
+//
+// 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 org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.PvlanSetupCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixPvlanSetupCommandWrapper extends CommandWrapper<PvlanSetupCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixPvlanSetupCommandWrapper.class);
+
+ @Override
+ public Answer execute(final PvlanSetupCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+
+ final String primaryPvlan = command.getPrimary();
+ final String isolatedPvlan = command.getIsolated();
+ final String op = command.getOp();
+ final String dhcpName = command.getDhcpName();
+ final String dhcpMac = command.getDhcpMac();
+ final String dhcpIp = command.getDhcpIp();
+ final String vmMac = command.getVmMac();
+ final String networkTag = command.getNetworkTag();
+
+ String nwNameLabel = null;
+ try {
+ final XsLocalNetwork nw = citrixResourceBase.getNativeNetworkForTraffic(conn, TrafficType.Guest, networkTag);
+ if (nw == null) {
+ s_logger.error("Network is not configured on the backend for pvlan " + primaryPvlan);
+ throw new CloudRuntimeException("Network for the backend is not configured correctly for pvlan primary: " + primaryPvlan);
+ }
+ nwNameLabel = nw.getNetwork().getNameLabel(conn);
+ } catch (final XenAPIException e) {
+ s_logger.warn("Fail to get network", e);
+ return new Answer(command, false, e.toString());
+ } catch (final XmlRpcException e) {
+ s_logger.warn("Fail to get network", e);
+ return new Answer(command, false, e.toString());
+ }
+
+ String result = null;
+ if (command.getType() == PvlanSetupCommand.Type.DHCP) {
+ result = citrixResourceBase.callHostPlugin(conn, "ovs-pvlan", "setup-pvlan-dhcp", "op", op, "nw-label", nwNameLabel, "primary-pvlan", primaryPvlan, "isolated-pvlan",
+ isolatedPvlan, "dhcp-name", dhcpName, "dhcp-ip", dhcpIp, "dhcp-mac", dhcpMac);
+
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ s_logger.warn("Failed to program pvlan for dhcp server with mac " + dhcpMac);
+ return new Answer(command, false, result);
+ } else {
+ s_logger.info("Programmed pvlan for dhcp server with mac " + dhcpMac);
+ }
+ } else if (command.getType() == PvlanSetupCommand.Type.VM) {
+ result = citrixResourceBase.callHostPlugin(conn, "ovs-pvlan", "setup-pvlan-vm", "op", op, "nw-label", nwNameLabel, "primary-pvlan", primaryPvlan, "isolated-pvlan",
+ isolatedPvlan, "vm-mac", vmMac);
+
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ s_logger.warn("Failed to program pvlan for vm with mac " + vmMac);
+ return new Answer(command, false, result);
+ } else {
+ s_logger.info("Programmed pvlan for vm with mac " + vmMac);
+ }
+ }
+ return new Answer(command, true, result);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/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 289fff9..1553239 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
@@ -21,6 +21,8 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
import java.util.Hashtable;
+import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
+
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.AttachIsoCommand;
import com.cloud.agent.api.AttachVolumeCommand;
@@ -45,6 +47,7 @@ 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.OvsCreateGreTunnelCommand;
import com.cloud.agent.api.OvsCreateTunnelCommand;
import com.cloud.agent.api.OvsDeleteFlowCommand;
@@ -55,13 +58,16 @@ import com.cloud.agent.api.OvsSetTagAndFlowCommand;
import com.cloud.agent.api.OvsSetupBridgeCommand;
import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
+import com.cloud.agent.api.PerformanceMonitorCommand;
import com.cloud.agent.api.PingTestCommand;
import com.cloud.agent.api.PlugNicCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
+import com.cloud.agent.api.PvlanSetupCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
import com.cloud.agent.api.RevertToVMSnapshotCommand;
+import com.cloud.agent.api.ScaleVmCommand;
import com.cloud.agent.api.SecurityGroupRulesCmd;
import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StartCommand;
@@ -72,6 +78,7 @@ 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.routing.NetworkElementCommand;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
@@ -151,16 +158,29 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(CreateVMSnapshotCommand.class, new CitrixCreateVMSnapshotCommandWrapper());
map.put(DeleteVMSnapshotCommand.class, new CitrixDeleteVMSnapshotCommandWrapper());
map.put(RevertToVMSnapshotCommand.class, new CitrixRevertToVMSnapshotCommandWrapper());
+ map.put(NetworkRulesVmSecondaryIpCommand.class, new CitrixNetworkRulesVmSecondaryIpCommandWrapper());
+ map.put(ScaleVmCommand.class, new CitrixScaleVmCommandWrapper());
+ map.put(PvlanSetupCommand.class, new CitrixPvlanSetupCommandWrapper());
+ map.put(PerformanceMonitorCommand.class, new CitrixPerformanceMonitorCommandWrapper());
+ map.put(NetworkElementCommand.class, new CitrixNetworkElementCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
return instance;
}
+ @SuppressWarnings("unchecked")
@Override
public Answer execute(final Command command, final ServerResource serverResource) {
- @SuppressWarnings("unchecked")
- final CommandWrapper<Command, Answer, ServerResource> commandWrapper = map.get(command.getClass());
+ CommandWrapper<Command, Answer, ServerResource> commandWrapper = map.get(command.getClass());
+
+ // This is temporary. We have to map the classes with several sub-classes better.
+ if (commandWrapper == null && command instanceof StorageSubSystemCommand) {
+ commandWrapper = map.get(StorageSubSystemCommand.class);
+ }
+ if (commandWrapper == null && command instanceof NetworkElementCommand) {
+ commandWrapper = map.get(NetworkElementCommand.class);
+ }
if (commandWrapper == null) {
throw new NullPointerException("No key found for '" + command.getClass() + "' in the Map!");
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixScaleVmCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixScaleVmCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixScaleVmCommandWrapper.java
new file mode 100644
index 0000000..47a30f5
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixScaleVmCommandWrapper.java
@@ -0,0 +1,106 @@
+//
+// 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 java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ScaleVmAnswer;
+import com.cloud.agent.api.ScaleVmCommand;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Types.VmPowerState;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
+
+public final class CitrixScaleVmCommandWrapper extends CommandWrapper<ScaleVmCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixScaleVmCommandWrapper.class);
+
+ @Override
+ public Answer execute(final ScaleVmCommand command, final CitrixResourceBase citrixResourceBase) {
+ final VirtualMachineTO vmSpec = command.getVirtualMachine();
+ final String vmName = vmSpec.getName();
+ try {
+ final Connection conn = citrixResourceBase.getConnection();
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+ final Host host = Host.getByUuid(conn, citrixResourceBase.getHost().getUuid());
+
+ // If DMC is not enable then don't execute this command.
+ if (!citrixResourceBase.isDmcEnabled(conn, host)) {
+ throw new CloudRuntimeException("Unable to scale the vm: " + vmName + " as DMC - Dynamic memory control is not enabled for the XenServer:"
+ + citrixResourceBase.getHost().getUuid() + " ,check your license and hypervisor version.");
+ }
+
+ if (vms == null || vms.size() == 0) {
+ s_logger.info("No running VM " + vmName + " exists on XenServer" + citrixResourceBase.getHost().getUuid());
+ return new ScaleVmAnswer(command, false, "VM does not exist");
+ }
+
+ // stop vm which is running on this host or is in halted state
+ final Iterator<VM> iter = vms.iterator();
+ while (iter.hasNext()) {
+ final VM vm = iter.next();
+ final VM.Record vmr = vm.getRecord(conn);
+
+ if (vmr.powerState == VmPowerState.HALTED || vmr.powerState == VmPowerState.RUNNING && !citrixResourceBase.isRefNull(vmr.residentOn)
+ && !vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
+ iter.remove();
+ }
+ }
+
+ for (final VM vm : vms) {
+ vm.getRecord(conn);
+ try {
+ citrixResourceBase.scaleVM(conn, vm, vmSpec, host);
+ } catch (final Exception e) {
+ final String msg = "Catch exception " + e.getClass().getName() + " when scaling VM:" + vmName + " due to " + e.toString();
+ s_logger.debug(msg);
+ return new ScaleVmAnswer(command, false, msg);
+ }
+
+ }
+ final String msg = "scaling VM " + vmName + " is successful on host " + host;
+ s_logger.debug(msg);
+ return new ScaleVmAnswer(command, true, msg);
+
+ } catch (final XenAPIException e) {
+ final String msg = "Upgrade Vm " + vmName + " fail due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new ScaleVmAnswer(command, false, msg);
+ } catch (final XmlRpcException e) {
+ final String msg = "Upgrade Vm " + vmName + " fail due to " + e.getMessage();
+ s_logger.warn(msg, e);
+ return new ScaleVmAnswer(command, false, msg);
+ } catch (final Exception e) {
+ final String msg = "Unable to upgrade " + vmName + " due to " + e.getMessage();
+ s_logger.warn(msg, e);
+ return new ScaleVmAnswer(command, false, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
index e79e8af..4d492aa 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
@@ -66,13 +66,13 @@ public class CitrixResourceBaseTest {
}
@Override
- protected void scaleVM(final Connection conn, final VM vm, final VirtualMachineTO vmSpec, final Host host) throws Types.XenAPIException, XmlRpcException {
+ public void scaleVM(final Connection conn, final VM vm, final VirtualMachineTO vmSpec, final Host host) throws Types.XenAPIException, XmlRpcException {
_host.setSpeed(500);
super.scaleVM(conn, vm, vmSpec, host);
}
@Override
- protected boolean isDmcEnabled(final Connection conn, final Host host) throws Types.XenAPIException, XmlRpcException {
+ public boolean isDmcEnabled(final Connection conn, final Host host) throws Types.XenAPIException, XmlRpcException {
return true;
}
};
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02571728/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 72d5c1a..286708a 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
@@ -11,6 +11,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import java.net.URI;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
@@ -52,6 +53,7 @@ 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.OvsCreateGreTunnelCommand;
import com.cloud.agent.api.OvsCreateTunnelCommand;
import com.cloud.agent.api.OvsDeleteFlowCommand;
@@ -62,14 +64,17 @@ import com.cloud.agent.api.OvsSetTagAndFlowCommand;
import com.cloud.agent.api.OvsSetupBridgeCommand;
import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
+import com.cloud.agent.api.PerformanceMonitorCommand;
import com.cloud.agent.api.PingTestCommand;
import com.cloud.agent.api.PlugNicCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
+import com.cloud.agent.api.PvlanSetupCommand;
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.RevertToVMSnapshotCommand;
+import com.cloud.agent.api.ScaleVmCommand;
import com.cloud.agent.api.SecurityGroupRulesCmd;
import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StartCommand;
@@ -81,19 +86,23 @@ import com.cloud.agent.api.VMSnapshotTO;
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.routing.IpAssocVpcCommand;
import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.agent.api.to.DataStoreTO;
+import com.cloud.agent.api.to.IpAddressTO;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
import com.cloud.host.HostEnvironment;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
import com.cloud.hypervisor.xenserver.resource.XsHost;
import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
+import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PhysicalNetworkSetupInfo;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
@@ -1471,6 +1480,297 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testNetworkRulesVmSecondaryIpCommandSuccess() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final NetworkRulesVmSecondaryIpCommand rulesVm = new NetworkRulesVmSecondaryIpCommand("Test", VirtualMachine.Type.User);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.callHostPlugin(conn, "vmops", "network_rules_vmSecondaryIp", "vmName", rulesVm.getVmName(), "vmMac", rulesVm.getVmMac(),
+ "vmSecIp", rulesVm.getVmSecIp(), "action", rulesVm.getAction())).thenReturn("true");
+
+ final Answer answer = wrapper.execute(rulesVm, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testNetworkRulesVmSecondaryIpCommandFailure() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final NetworkRulesVmSecondaryIpCommand rulesVm = new NetworkRulesVmSecondaryIpCommand("Test", VirtualMachine.Type.User);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.callHostPlugin(conn, "vmops", "network_rules_vmSecondaryIp", "vmName", rulesVm.getVmName(), "vmMac", rulesVm.getVmMac(),
+ "vmSecIp", rulesVm.getVmSecIp(), "action", rulesVm.getAction())).thenReturn("false");
+
+ final Answer answer = wrapper.execute(rulesVm, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testScaleVmCommand() {
+ final String uuid = "6172d8b7-ba10-4a70-93f9-ecaf41f51d53";
+
+ final VirtualMachineTO machineTO = Mockito.mock(VirtualMachineTO.class);
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+ final Host host = Mockito.mock(Host.class);
+
+ final ScaleVmCommand scaleVm = new ScaleVmCommand(machineTO);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+ when(citrixResourceBase.getHost().getUuid()).thenReturn(uuid);
+
+ try {
+ when(citrixResourceBase.isDmcEnabled(conn, host)).thenReturn(true);
+ } catch (final XenAPIException e) {
+ fail(e.getMessage());
+ } catch (final XmlRpcException e) {
+ fail(e.getMessage());
+ }
+
+ final Answer answer = wrapper.execute(scaleVm, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testPvlanSetupCommandDhcpSuccess() {
+ final String label = "net";
+
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsLocalNetwork network = Mockito.mock(XsLocalNetwork.class);
+ final Network network2 = Mockito.mock(Network.class);
+
+ final PvlanSetupCommand lanSetup = PvlanSetupCommand.createDhcpSetup("add", URI.create("http://127.0.0.1"), "tag", "dhcp", "0:0:0:0:0:0", "127.0.0.1");
+
+ final String primaryPvlan = lanSetup.getPrimary();
+ final String isolatedPvlan = lanSetup.getIsolated();
+ final String op = lanSetup.getOp();
+ final String dhcpName = lanSetup.getDhcpName();
+ final String dhcpMac = lanSetup.getDhcpMac();
+ final String dhcpIp = lanSetup.getDhcpIp();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.getNativeNetworkForTraffic(conn, TrafficType.Guest, "tag")).thenReturn(network);
+ when(network.getNetwork()).thenReturn(network2);
+ when(network2.getNameLabel(conn)).thenReturn(label);
+ } catch (final XenAPIException e) {
+ fail(e.getMessage());
+ } catch (final XmlRpcException e) {
+ fail(e.getMessage());
+ }
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovs-pvlan", "setup-pvlan-dhcp", "op", op, "nw-label", label, "primary-pvlan", primaryPvlan, "isolated-pvlan",
+ isolatedPvlan, "dhcp-name", dhcpName, "dhcp-ip", dhcpIp, "dhcp-mac", dhcpMac)).thenReturn("true");
+
+ final Answer answer = wrapper.execute(lanSetup, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testPvlanSetupCommandDhcpFailure() {
+ final String label = "net";
+
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsLocalNetwork network = Mockito.mock(XsLocalNetwork.class);
+ final Network network2 = Mockito.mock(Network.class);
+
+ final PvlanSetupCommand lanSetup = PvlanSetupCommand.createDhcpSetup("add", URI.create("http://127.0.0.1"), "tag", "dhcp", "0:0:0:0:0:0", "127.0.0.1");
+
+ final String primaryPvlan = lanSetup.getPrimary();
+ final String isolatedPvlan = lanSetup.getIsolated();
+ final String op = lanSetup.getOp();
+ final String dhcpName = lanSetup.getDhcpName();
+ final String dhcpMac = lanSetup.getDhcpMac();
+ final String dhcpIp = lanSetup.getDhcpIp();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.getNativeNetworkForTraffic(conn, TrafficType.Guest, "tag")).thenReturn(network);
+ when(network.getNetwork()).thenReturn(network2);
+ when(network2.getNameLabel(conn)).thenReturn(label);
+ } catch (final XenAPIException e) {
+ fail(e.getMessage());
+ } catch (final XmlRpcException e) {
+ fail(e.getMessage());
+ }
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovs-pvlan", "setup-pvlan-dhcp", "op", op, "nw-label", label, "primary-pvlan", primaryPvlan, "isolated-pvlan",
+ isolatedPvlan, "dhcp-name", dhcpName, "dhcp-ip", dhcpIp, "dhcp-mac", dhcpMac)).thenReturn("false");
+
+ final Answer answer = wrapper.execute(lanSetup, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testPvlanSetupCommandVmSuccess() {
+ final String label = "net";
+
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsLocalNetwork network = Mockito.mock(XsLocalNetwork.class);
+ final Network network2 = Mockito.mock(Network.class);
+
+ final PvlanSetupCommand lanSetup = PvlanSetupCommand.createVmSetup("add", URI.create("http://127.0.0.1"), "tag", "0:0:0:0:0:0");
+
+ final String primaryPvlan = lanSetup.getPrimary();
+ final String isolatedPvlan = lanSetup.getIsolated();
+ final String op = lanSetup.getOp();
+ final String vmMac = lanSetup.getVmMac();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.getNativeNetworkForTraffic(conn, TrafficType.Guest, "tag")).thenReturn(network);
+ when(network.getNetwork()).thenReturn(network2);
+ when(network2.getNameLabel(conn)).thenReturn(label);
+ } catch (final XenAPIException e) {
+ fail(e.getMessage());
+ } catch (final XmlRpcException e) {
+ fail(e.getMessage());
+ }
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovs-pvlan", "setup-pvlan-vm", "op", op, "nw-label", label, "primary-pvlan", primaryPvlan, "isolated-pvlan",
+ isolatedPvlan, "vm-mac", vmMac)).thenReturn("true");
+
+ final Answer answer = wrapper.execute(lanSetup, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testPvlanSetupCommandVmFailure() {
+ final String label = "net";
+
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsLocalNetwork network = Mockito.mock(XsLocalNetwork.class);
+ final Network network2 = Mockito.mock(Network.class);
+
+ final PvlanSetupCommand lanSetup = PvlanSetupCommand.createVmSetup("add", URI.create("http://127.0.0.1"), "tag", "0:0:0:0:0:0");
+
+ final String primaryPvlan = lanSetup.getPrimary();
+ final String isolatedPvlan = lanSetup.getIsolated();
+ final String op = lanSetup.getOp();
+ final String vmMac = lanSetup.getVmMac();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.getNativeNetworkForTraffic(conn, TrafficType.Guest, "tag")).thenReturn(network);
+ when(network.getNetwork()).thenReturn(network2);
+ when(network2.getNameLabel(conn)).thenReturn(label);
+ } catch (final XenAPIException e) {
+ fail(e.getMessage());
+ } catch (final XmlRpcException e) {
+ fail(e.getMessage());
+ }
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovs-pvlan", "setup-pvlan-vm", "op", op, "nw-label", label, "primary-pvlan", primaryPvlan, "isolated-pvlan",
+ isolatedPvlan, "vm-mac", vmMac)).thenReturn("false");
+
+ final Answer answer = wrapper.execute(lanSetup, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testPerformanceMonitorCommandSuccess() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final PerformanceMonitorCommand performanceMonitor = new PerformanceMonitorCommand(new Hashtable<String, String>(), 200);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getPerfMon(conn, performanceMonitor.getParams(), performanceMonitor.getWait())).thenReturn("performance");
+
+ final Answer answer = wrapper.execute(performanceMonitor, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testPerformanceMonitorCommandFailure() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final PerformanceMonitorCommand performanceMonitor = new PerformanceMonitorCommand(new Hashtable<String, String>(), 200);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getPerfMon(conn, performanceMonitor.getParams(), performanceMonitor.getWait())).thenReturn(null);
+
+ final Answer answer = wrapper.execute(performanceMonitor, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testNetworkElementCommand() {
+ final VirtualRoutingResource routingResource = Mockito.mock(VirtualRoutingResource.class);
+ final IpAddressTO [] ips = new IpAddressTO[0];
+
+ final IpAssocVpcCommand ipAssociation = new IpAssocVpcCommand(ips);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getVirtualRoutingResource()).thenReturn(routingResource);
+
+ final Answer answer = wrapper.execute(ipAssociation, citrixResourceBase);
+
+ verify(routingResource, times(1)).executeRequest(ipAssociation);
+
+ // Requires more testing, but the VirtualResourceRouting is quite big.
+ assertNull(answer);
+ }
}
class NotAValidCommand extends Command {
[17/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring the CitrixCheckVirtualMachineCommand toc ope with new design
- Added basic tests
- Added tests for RebootRouterCommand
- Removed the code from CitrixResourceBase that has already been refactored
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/cb07b0ba
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/cb07b0ba
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/cb07b0ba
Branch: refs/heads/master
Commit: cb07b0ba08d36d0cb76f07215e3b06b02201bd60
Parents: f2fab5c
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 11:54:21 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:27 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 40 ++++++----------
...CitrixCheckVirtualMachineCommandWrapper.java | 48 ++++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../wrapper/CitrixRequestWrapperTest.java | 28 ++++++++++++
4 files changed, 92 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb07b0ba/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 7882b0e..30c96ee 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
@@ -189,6 +189,7 @@ import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
import com.cloud.exception.InternalErrorException;
import com.cloud.host.Host.Type;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.xenserver.resource.wrapper.CitrixRequestWrapper;
import com.cloud.network.Networks;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
@@ -426,33 +427,20 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
@Override
public Answer executeRequest(final Command cmd) {
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ try {
+ final Answer answer = wrapper.execute(cmd, this);
+ return answer;
+ } catch (final Exception e) {
+ // Ignore it for now. Just removing the command that have already been
+ // replaced by the new code.
+ }
+
final Class<? extends Command> clazz = cmd.getClass();
- if (clazz == CreateCommand.class) {
- return execute((CreateCommand)cmd);
- } else if (cmd instanceof NetworkElementCommand) {
+
+ if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == CheckConsoleProxyLoadCommand.class) {
- return execute((CheckConsoleProxyLoadCommand)cmd);
- } else if (clazz == WatchConsoleProxyLoadCommand.class) {
- return execute((WatchConsoleProxyLoadCommand)cmd);
- } else if (clazz == ReadyCommand.class) {
- return execute((ReadyCommand)cmd);
- } else if (clazz == GetHostStatsCommand.class) {
- return execute((GetHostStatsCommand)cmd);
- } else if (clazz == GetVmStatsCommand.class) {
- return execute((GetVmStatsCommand)cmd);
- } else if (clazz == GetVmDiskStatsCommand.class) {
- return execute((GetVmDiskStatsCommand)cmd);
- } else if (clazz == CheckHealthCommand.class) {
- return execute((CheckHealthCommand)cmd);
- } else if (clazz == StopCommand.class) {
- return execute((StopCommand)cmd);
- } else if (clazz == RebootRouterCommand.class) {
- return execute((RebootRouterCommand)cmd);
- } else if (clazz == RebootCommand.class) {
- return execute((RebootCommand)cmd);
- } else if (clazz == CheckVirtualMachineCommand.class) {
- return execute((CheckVirtualMachineCommand)cmd);
} else if (clazz == PrepareForMigrationCommand.class) {
return execute((PrepareForMigrationCommand)cmd);
} else if (clazz == MigrateCommand.class) {
@@ -2621,7 +2609,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vmStates;
}
- protected PowerState getVmState(final Connection conn, final String vmName) {
+ public PowerState getVmState(final Connection conn, final String vmName) {
int retry = 3;
while (retry-- > 0) {
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb07b0ba/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckVirtualMachineCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckVirtualMachineCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckVirtualMachineCommandWrapper.java
new file mode 100644
index 0000000..1ae20c1
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckVirtualMachineCommandWrapper.java
@@ -0,0 +1,48 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckVirtualMachineAnswer;
+import com.cloud.agent.api.CheckVirtualMachineCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.vm.VirtualMachine.PowerState;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixCheckVirtualMachineCommandWrapper extends CommandWrapper<CheckVirtualMachineCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixCheckVirtualMachineCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CheckVirtualMachineCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final String vmName = command.getVmName();
+ final PowerState powerState = citrixResourceBase.getVmState(conn, vmName);
+ final Integer vncPort = null;
+ if (powerState == PowerState.PowerOn) {
+ s_logger.debug("3. The VM " + vmName + " is in Running state");
+ }
+
+ return new CheckVirtualMachineAnswer(command, powerState, vncPort);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb07b0ba/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 f83218b..77879f9 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
@@ -23,6 +23,7 @@ import java.util.Hashtable;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckHealthCommand;
+import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
@@ -67,6 +68,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(CheckHealthCommand.class, new CitrixCheckHealthCommandWrapper());
map.put(StopCommand.class, new CitrixStopCommandWrapper());
map.put(RebootCommand.class, new CitrixRebootCommandWrapper());
+ map.put(CheckVirtualMachineCommand.class, new CitrixCheckVirtualMachineCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb07b0ba/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 98023f7..2237cf1 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
@@ -16,12 +16,14 @@ import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckHealthCommand;
+import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
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.StopCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -182,6 +184,32 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testRebootCommand() {
+ final RebootCommand rebootCommand = new RebootCommand("Test");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(rebootCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testCheckVirtualMachineCommandCommand() {
+ final CheckVirtualMachineCommand statsCommand = new CheckVirtualMachineCommand("Test");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[37/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring XenServer56NetworkUsageCommandWrapper in order to cope with the new design
- Unit tests added
CitrixResourceBase, XenServer56Resource and XenServer56FP1Resource are now done.
i
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3ad30a01
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3ad30a01
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3ad30a01
Branch: refs/heads/master
Commit: 3ad30a01a85c69cc0a983468b6c12d036fe9d725
Parents: f3842c8
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 31 09:10:40 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:33 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 2 +-
.../xenserver/resource/XenServer56Resource.java | 76 --------------
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../XenServer56NetworkUsageCommandWrapper.java | 102 +++++++++++++++++++
.../wrapper/XenServer56WrapperTest.java | 76 ++++++++++++++
5 files changed, 181 insertions(+), 77 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ad30a01/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 ee9fd2b..dddff46 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
@@ -3088,7 +3088,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return earliestNetwork != null ? new XsLocalNetwork(this, earliestNetwork, earliestNetworkRecord, null, null) : null;
}
- protected long[] getNetworkStats(final Connection conn, final String privateIP) {
+ public long[] getNetworkStats(final Connection conn, final String privateIP) {
final String result = networkUsage(conn, privateIP, "get", null);
final long[] stats = new long[2];
if (result != null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ad30a01/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index 3a9baf1..3a30dae 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -27,12 +27,9 @@ import org.apache.xmlrpc.XmlRpcException;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
-import com.cloud.agent.api.NetworkUsageAnswer;
-import com.cloud.agent.api.NetworkUsageCommand;
import com.cloud.agent.api.StartupCommand;
import com.cloud.hypervisor.xenserver.resource.wrapper.CitrixRequestWrapper;
import com.cloud.resource.ServerResource;
-import com.cloud.utils.ExecutionResult;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
import com.cloud.utils.ssh.SSHCmdHelper;
@@ -55,13 +52,6 @@ public class XenServer56Resource extends CitrixResourceBase {
try {
return wrapper.execute(cmd, this);
} catch (final Exception e) {
- // return Answer.createUnsupportedCommandAnswer(cmd);
- // Ignore this for now. Still working on converting the other commands.
- }
-
- if (cmd instanceof NetworkUsageCommand) {
- return execute((NetworkUsageCommand) cmd);
- } else {
return super.executeRequest(cmd);
}
}
@@ -143,72 +133,6 @@ public class XenServer56Resource extends CitrixResourceBase {
return executeInVR(privateIpAddress, "netusage.sh", args).getDetails();
}
- protected NetworkUsageAnswer VPCNetworkUsage(final NetworkUsageCommand cmd) {
- try {
- final String option = cmd.getOption();
- final String publicIp = cmd.getGatewayIP();
-
- String args = " -l " + publicIp + " ";
- if (option.equals("get")) {
- args += "-g";
- } else if (option.equals("create")) {
- args += "-c";
- final String vpcCIDR = cmd.getVpcCIDR();
- args += " -v " + vpcCIDR;
- } else if (option.equals("reset")) {
- args += "-r";
- } else if (option.equals("vpn")) {
- args += "-n";
- } else if (option.equals("remove")) {
- args += "-d";
- } else {
- return new NetworkUsageAnswer(cmd, "success", 0L, 0L);
- }
-
- final ExecutionResult result = executeInVR(cmd.getPrivateIP(), "vpc_netusage.sh", args);
- final String detail = result.getDetails();
- if (!result.isSuccess()) {
- throw new Exception(" vpc network usage plugin call failed ");
- }
- if (option.equals("get") || option.equals("vpn")) {
- final long[] stats = new long[2];
- if (detail != null) {
- final String[] splitResult = detail.split(":");
- int i = 0;
- while (i < splitResult.length - 1) {
- stats[0] += new Long(splitResult[i++]).longValue();
- stats[1] += new Long(splitResult[i++]).longValue();
- }
- return new NetworkUsageAnswer(cmd, "success", stats[0], stats[1]);
- }
- }
- return new NetworkUsageAnswer(cmd, "success", 0L, 0L);
- } catch (final Exception ex) {
- s_logger.warn("Failed to get network usage stats due to ", ex);
- return new NetworkUsageAnswer(cmd, ex);
- }
- }
-
- protected NetworkUsageAnswer execute(final NetworkUsageCommand cmd) {
- if (cmd.isForVpc()) {
- return VPCNetworkUsage(cmd);
- }
- try {
- final Connection conn = getConnection();
- if (cmd.getOption() != null && cmd.getOption().equals("create")) {
- final String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
- final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
- return answer;
- }
- final long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
- final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
- return answer;
- } catch (final Exception ex) {
- s_logger.warn("Failed to get network usage stats due to ", ex);
- return new NetworkUsageAnswer(cmd, ex);
- }
- }
-
public Boolean checkHeartbeat(final String hostuuid) {
final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ad30a01/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 a5ca115..8b0043f 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
@@ -47,6 +47,7 @@ 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.NetworkUsageCommand;
import com.cloud.agent.api.OvsCreateGreTunnelCommand;
import com.cloud.agent.api.OvsCreateTunnelCommand;
import com.cloud.agent.api.OvsDeleteFlowCommand;
@@ -176,6 +177,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
xenServer56Commands.put(CheckOnHostCommand.class, new XenServer56CheckOnHostCommandWrapper());
xenServer56Commands.put(FenceCommand.class, new XenServer56FenceCommandWrapper());
+ xenServer56Commands.put(NetworkUsageCommand.class, new XenServer56NetworkUsageCommandWrapper());
resources.put(XenServer56Resource.class, xenServer56Commands);
// XenServer56FP1Resource commands
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ad30a01/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56NetworkUsageCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56NetworkUsageCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56NetworkUsageCommandWrapper.java
new file mode 100644
index 0000000..0e3f922
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56NetworkUsageCommandWrapper.java
@@ -0,0 +1,102 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.NetworkUsageAnswer;
+import com.cloud.agent.api.NetworkUsageCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.ExecutionResult;
+import com.xensource.xenapi.Connection;
+
+public final class XenServer56NetworkUsageCommandWrapper extends CommandWrapper<NetworkUsageCommand, Answer, XenServer56Resource> {
+
+ private static final Logger s_logger = Logger.getLogger(XenServer56NetworkUsageCommandWrapper.class);
+
+ @Override
+ public Answer execute(final NetworkUsageCommand command, final XenServer56Resource xenServer56) {
+ if (command.isForVpc()) {
+ return executeNetworkUsage(command, xenServer56);
+ }
+ try {
+ final Connection conn = xenServer56.getConnection();
+ if (command.getOption() != null && command.getOption().equals("create")) {
+ final String result = xenServer56.networkUsage(conn, command.getPrivateIP(), "create", null);
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(command, result, 0L, 0L);
+ return answer;
+ }
+ final long[] stats = xenServer56.getNetworkStats(conn, command.getPrivateIP());
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(command, "", stats[0], stats[1]);
+ return answer;
+ } catch (final Exception ex) {
+ s_logger.warn("Failed to get network usage stats due to ", ex);
+ return new NetworkUsageAnswer(command, ex);
+ }
+ }
+
+ protected NetworkUsageAnswer executeNetworkUsage(final NetworkUsageCommand command, final XenServer56Resource xenServer56) {
+ try {
+ final String option = command.getOption();
+ final String publicIp = command.getGatewayIP();
+
+ String args = " -l " + publicIp + " ";
+ if (option.equals("get")) {
+ args += "-g";
+ } else if (option.equals("create")) {
+ args += "-c";
+ final String vpcCIDR = command.getVpcCIDR();
+ args += " -v " + vpcCIDR;
+ } else if (option.equals("reset")) {
+ args += "-r";
+ } else if (option.equals("vpn")) {
+ args += "-n";
+ } else if (option.equals("remove")) {
+ args += "-d";
+ } else {
+ return new NetworkUsageAnswer(command, "success", 0L, 0L);
+ }
+
+ final ExecutionResult result = xenServer56.executeInVR(command.getPrivateIP(), "vpc_netusage.sh", args);
+ final String detail = result.getDetails();
+ if (!result.isSuccess()) {
+ throw new Exception(" vpc network usage plugin call failed ");
+ }
+ if (option.equals("get") || option.equals("vpn")) {
+ final long[] stats = new long[2];
+ if (detail != null) {
+ final String[] splitResult = detail.split(":");
+ int i = 0;
+ while (i < splitResult.length - 1) {
+ stats[0] += new Long(splitResult[i++]).longValue();
+ stats[1] += new Long(splitResult[i++]).longValue();
+ }
+ return new NetworkUsageAnswer(command, "success", stats[0], stats[1]);
+ }
+ }
+ return new NetworkUsageAnswer(command, "success", 0L, 0L);
+ } catch (final Exception ex) {
+ s_logger.warn("Failed to get network usage stats due to ", ex);
+ return new NetworkUsageAnswer(command, ex);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ad30a01/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
index f93a836..2035c52 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
@@ -16,8 +16,10 @@ import org.powermock.modules.junit4.PowerMockRunner;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckOnHostCommand;
import com.cloud.agent.api.FenceCommand;
+import com.cloud.agent.api.NetworkUsageCommand;
import com.cloud.host.Host;
import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.utils.ExecutionResult;
import com.cloud.vm.VMInstanceVO;
import com.xensource.xenapi.Connection;
@@ -61,4 +63,78 @@ public class XenServer56WrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testNetworkUsageCommandSuccess() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final NetworkUsageCommand networkCommand = new NetworkUsageCommand("192.168.10.10", "domRName", false, "192.168.10.1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(xenServer56Resource.getConnection()).thenReturn(conn);
+ when(xenServer56Resource.getNetworkStats(conn, networkCommand.getPrivateIP())).thenReturn(new long[]{1, 1});
+
+ final Answer answer = wrapper.execute(networkCommand, xenServer56Resource);
+
+ verify(xenServer56Resource, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testNetworkUsageCommandFailure() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final NetworkUsageCommand networkCommand = new NetworkUsageCommand("192.168.10.10", "domRName", false, "192.168.10.1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(xenServer56Resource.getConnection()).thenReturn(conn);
+ when(xenServer56Resource.getNetworkStats(conn, networkCommand.getPrivateIP())).thenReturn(new long[0]);
+
+ final Answer answer = wrapper.execute(networkCommand, xenServer56Resource);
+
+ verify(xenServer56Resource, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testNetworkUsageCommandCreateVpc() {
+ final ExecutionResult executionResult = Mockito.mock(ExecutionResult.class);
+
+ final NetworkUsageCommand networkCommand = new NetworkUsageCommand("192.168.10.10", "domRName", true, "192.168.10.1", "10.1.1.1/24");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final String args = " -l 192.168.10.1 -c -v 10.1.1.1/24";
+ when(xenServer56Resource.executeInVR(networkCommand.getPrivateIP(), "vpc_netusage.sh", args)).thenReturn(executionResult);
+ when(executionResult.isSuccess()).thenReturn(true);
+
+ final Answer answer = wrapper.execute(networkCommand, xenServer56Resource);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testNetworkUsageCommandCreateVpcFailure() {
+ final ExecutionResult executionResult = Mockito.mock(ExecutionResult.class);
+
+ final NetworkUsageCommand networkCommand = new NetworkUsageCommand("192.168.10.10", "domRName", true, "192.168.10.1", "10.1.1.1/24");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final String args = " -l 192.168.10.1 -c -v 10.1.1.1/24";
+ when(xenServer56Resource.executeInVR(networkCommand.getPrivateIP(), "vpc_netusage.sh", args)).thenReturn(executionResult);
+ when(executionResult.isSuccess()).thenReturn(false);
+
+ final Answer answer = wrapper.execute(networkCommand, xenServer56Resource);
+
+ assertFalse(answer.getResult());
+ }
}
\ No newline at end of file
[29/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring other 8 command wrapper in order to cope with the new design
- Advanced unit tests added for half of the commands
- Basic unit tests added for the other half
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/24bbfbc1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/24bbfbc1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/24bbfbc1
Branch: refs/heads/master
Commit: 24bbfbc1e6608aff56b66a6678a8a876842945eb
Parents: fbcae54
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Mon Mar 30 17:31:09 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:32 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 38 ++--
.../CitrixCheckNetworkCommandWrapper.java | 94 +++++++++
...trixClusterVMMetaDataSyncCommandWrapper.java | 57 ++++++
.../CitrixCreateVMSnapshotCommandWrapper.java | 188 +++++++++++++++++
.../CitrixDeleteVMSnapshotCommandWrapper.java | 90 +++++++++
.../wrapper/CitrixPlugNicCommandWrapper.java | 92 +++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 16 ++
.../CitrixRevertToVMSnapshotCommandWrapper.java | 110 ++++++++++
.../wrapper/CitrixUnPlugNicCommandWrapper.java | 72 +++++++
.../CitrixUpdateHostPasswordCommandWrapper.java | 34 ++++
.../wrapper/CitrixRequestWrapperTest.java | 202 +++++++++++++++++++
11 files changed, 968 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/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 c495b75..aa92681 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
@@ -346,6 +346,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return _instance;
}
+ public void addToPwdQueue(final String password) {
+ _password.add(password);
+ }
+
public boolean isOvs() {
return _isOvs;
}
@@ -467,24 +471,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == UpdateHostPasswordCommand.class) {
- return execute((UpdateHostPasswordCommand)cmd);
- } else if (cmd instanceof ClusterVMMetaDataSyncCommand) {
- return execute((ClusterVMMetaDataSyncCommand)cmd);
- } else if (clazz == CheckNetworkCommand.class) {
- return execute((CheckNetworkCommand)cmd);
- } else if (clazz == PlugNicCommand.class) {
- return execute((PlugNicCommand)cmd);
- } else if (clazz == UnPlugNicCommand.class) {
- return execute((UnPlugNicCommand) cmd);
} else if (cmd instanceof StorageSubSystemCommand) {
return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
- } else if (clazz == CreateVMSnapshotCommand.class) {
- return execute((CreateVMSnapshotCommand) cmd);
- } else if (clazz == DeleteVMSnapshotCommand.class) {
- return execute((DeleteVMSnapshotCommand) cmd);
- } else if (clazz == RevertToVMSnapshotCommand.class) {
- return execute((RevertToVMSnapshotCommand) cmd);
} else if (clazz == NetworkRulesVmSecondaryIpCommand.class) {
return execute((NetworkRulesVmSecondaryIpCommand) cmd);
} else if (clazz == ScaleVmCommand.class) {
@@ -798,7 +786,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected String revertToSnapshot(final Connection conn, final VM vmSnapshot, final String vmName, final String oldVmUuid, final Boolean snapshotMemory, final String hostUUID) throws XenAPIException,
+ public String revertToSnapshot(final Connection conn, final VM vmSnapshot, final String vmName, final String oldVmUuid, final Boolean snapshotMemory, final String hostUUID) throws XenAPIException,
XmlRpcException {
final String results =
@@ -3137,7 +3125,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return false;
}
- protected void waitForTask(final Connection c, final Task task, final long pollInterval, final long timeout) throws XenAPIException, XmlRpcException, TimeoutException {
+ public void waitForTask(final Connection c, final Task task, final long pollInterval, final long timeout) throws XenAPIException, XmlRpcException, TimeoutException {
final long beginTime = System.currentTimeMillis();
if (s_logger.isTraceEnabled()) {
s_logger.trace("Task " + task.getNameLabel(c) + " (" + task.getUuid(c) + ") sent to " + c.getSessionReference() + " is pending completion with a " + timeout +
@@ -3161,7 +3149,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected void checkForSuccess(final Connection c, final Task task) throws XenAPIException, XmlRpcException {
+ public void checkForSuccess(final Connection c, final Task task) throws XenAPIException, XmlRpcException {
if (task.getStatus(c) == Types.TaskStatusType.SUCCESS) {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Task " + task.getNameLabel(c) + " (" + task.getUuid(c) + ") completed");
@@ -3748,7 +3736,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- protected VIF getVifByMac(final Connection conn, final VM router, String mac) throws XmlRpcException, XenAPIException {
+ public VIF getVifByMac(final Connection conn, final VM router, String mac) throws XmlRpcException, XenAPIException {
final Set<VIF> routerVIFs = router.getVIFs(conn);
mac = mac.trim();
for (final VIF vif : routerVIFs) {
@@ -3760,7 +3748,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- protected String getLowestAvailableVIFDeviceNum(final Connection conn, final VM vm) {
+ public String getLowestAvailableVIFDeviceNum(final Connection conn, final VM vm) {
String vmName = "";
try {
vmName = vm.getNameLabel(conn);
@@ -4811,7 +4799,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected boolean isNetworkSetupByName(final String nameTag) throws XenAPIException, XmlRpcException {
+ public boolean isNetworkSetupByName(final String nameTag) throws XenAPIException, XmlRpcException {
if (nameTag != null) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Looking for network setup by name " + nameTag);
@@ -6194,7 +6182,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
- private long getVMSnapshotChainSize(final Connection conn, final VolumeObjectTO volumeTo, final String vmName) throws BadServerResponse, XenAPIException, XmlRpcException {
+ public long getVMSnapshotChainSize(final Connection conn, final VolumeObjectTO volumeTo, final String vmName) throws BadServerResponse, XenAPIException, XmlRpcException {
final Set<VDI> allvolumeVDIs = VDI.getByNameLabel(conn, volumeTo.getName());
long size = 0;
for (final VDI vdi : allvolumeVDIs) {
@@ -6378,7 +6366,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- private VM createWorkingVM(final Connection conn, final String vmName, final String guestOSType, final String platformEmulator, final List<VolumeObjectTO> listVolumeTo) throws BadServerResponse,
+ public VM createWorkingVM(final Connection conn, final String vmName, final String guestOSType, final String platformEmulator, final List<VolumeObjectTO> listVolumeTo) throws BadServerResponse,
Types.VmBadPowerState, Types.SrFull,
Types.OperationNotAllowed, XenAPIException, XmlRpcException {
//below is redundant but keeping for consistency and code readabilty
@@ -6928,7 +6916,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new ClusterVMMetaDataSyncAnswer(cmd.getClusterId(), vmMetadatum);
}
- protected HashMap<String, String> clusterVMMetaDataSync(final Connection conn) {
+ public HashMap<String, String> clusterVMMetaDataSync(final Connection conn) {
final HashMap<String, String> vmMetaDatum = new HashMap<String, String>();
try {
final Map<VM, VM.Record> vm_map = VM.getAllRecords(conn); //USE THIS TO GET ALL VMS FROM A CLUSTER
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckNetworkCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckNetworkCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckNetworkCommandWrapper.java
new file mode 100644
index 0000000..fb62fce
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckNetworkCommandWrapper.java
@@ -0,0 +1,94 @@
+//
+// 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.List;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckNetworkAnswer;
+import com.cloud.agent.api.CheckNetworkCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.network.PhysicalNetworkSetupInfo;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixCheckNetworkCommandWrapper extends CommandWrapper<CheckNetworkCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixCheckNetworkCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CheckNetworkCommand command, final CitrixResourceBase citrixResourceBase) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Checking if network name setup is done on the resource");
+ }
+
+ final List<PhysicalNetworkSetupInfo> infoList = command.getPhysicalNetworkInfoList();
+
+ try {
+ boolean errorout = false;
+ String msg = "";
+ for (final PhysicalNetworkSetupInfo info : infoList) {
+ if (!citrixResourceBase.isNetworkSetupByName(info.getGuestNetworkName())) {
+ msg =
+ "For Physical Network id:" + info.getPhysicalNetworkId() + ", Guest Network is not configured on the backend by name " +
+ info.getGuestNetworkName();
+ errorout = true;
+ break;
+ }
+ if (!citrixResourceBase.isNetworkSetupByName(info.getPrivateNetworkName())) {
+ msg =
+ "For Physical Network id:" + info.getPhysicalNetworkId() + ", Private Network is not configured on the backend by name " +
+ info.getPrivateNetworkName();
+ errorout = true;
+ break;
+ }
+ if (!citrixResourceBase.isNetworkSetupByName(info.getPublicNetworkName())) {
+ msg =
+ "For Physical Network id:" + info.getPhysicalNetworkId() + ", Public Network is not configured on the backend by name " +
+ info.getPublicNetworkName();
+ errorout = true;
+ break;
+ }
+ /*if(!isNetworkSetupByName(info.getStorageNetworkName())){
+ msg = "For Physical Network id:"+ info.getPhysicalNetworkId() + ", Storage Network is not configured on the backend by name " + info.getStorageNetworkName();
+ errorout = true;
+ break;
+ }*/
+ }
+ if (errorout) {
+ s_logger.error(msg);
+ return new CheckNetworkAnswer(command, false, msg);
+ } else {
+ return new CheckNetworkAnswer(command, true, "Network Setup check by names is done");
+ }
+
+ } catch (final XenAPIException e) {
+ final String msg = "CheckNetworkCommand failed with XenAPIException:" + e.toString() + " host:" + citrixResourceBase.getHost().getUuid();
+ s_logger.warn(msg, e);
+ return new CheckNetworkAnswer(command, false, msg);
+ } catch (final Exception e) {
+ final String msg = "CheckNetworkCommand failed with Exception:" + e.getMessage() + " host:" + citrixResourceBase.getHost().getUuid();
+ s_logger.warn(msg, e);
+ return new CheckNetworkAnswer(command, false, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixClusterVMMetaDataSyncCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixClusterVMMetaDataSyncCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixClusterVMMetaDataSyncCommandWrapper.java
new file mode 100644
index 0000000..fb7384b
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixClusterVMMetaDataSyncCommandWrapper.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.xenserver.resource.wrapper;
+
+import java.util.HashMap;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ClusterVMMetaDataSyncAnswer;
+import com.cloud.agent.api.ClusterVMMetaDataSyncCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Pool;
+
+public final class CitrixClusterVMMetaDataSyncCommandWrapper extends CommandWrapper<ClusterVMMetaDataSyncCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixClusterVMMetaDataSyncCommandWrapper.class);
+
+ @Override
+ public Answer execute(final ClusterVMMetaDataSyncCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ //check if this is master
+ try {
+ final Pool pool = Pool.getByUuid(conn, citrixResourceBase.getHost().getPool());
+ final Pool.Record poolr = pool.getRecord(conn);
+ final Host.Record hostr = poolr.master.getRecord(conn);
+ if (!citrixResourceBase.getHost().getUuid().equals(hostr.uuid)) {
+ return new ClusterVMMetaDataSyncAnswer(command.getClusterId(), null);
+ }
+ } catch (final Throwable e) {
+ s_logger.warn("Check for master failed, failing the Cluster sync VMMetaData command");
+ return new ClusterVMMetaDataSyncAnswer(command.getClusterId(), null);
+ }
+ final HashMap<String, String> vmMetadatum = citrixResourceBase.clusterVMMetaDataSync(conn);
+ return new ClusterVMMetaDataSyncAnswer(command.getClusterId(), vmMetadatum);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateVMSnapshotCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateVMSnapshotCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateVMSnapshotCommandWrapper.java
new file mode 100644
index 0000000..7ccf927
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCreateVMSnapshotCommandWrapper.java
@@ -0,0 +1,188 @@
+//
+// 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.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CreateVMSnapshotAnswer;
+import com.cloud.agent.api.CreateVMSnapshotCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Pool;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Task;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.Types.VmPowerState;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class CitrixCreateVMSnapshotCommandWrapper extends CommandWrapper<CreateVMSnapshotCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixCreateVMSnapshotCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CreateVMSnapshotCommand command, final CitrixResourceBase citrixResourceBase) {
+ final String vmName = command.getVmName();
+ final String vmSnapshotName = command.getTarget().getSnapshotName();
+ final List<VolumeObjectTO> listVolumeTo = command.getVolumeTOs();
+
+ VmPowerState vmState = VmPowerState.HALTED;
+
+ final String guestOSType = command.getGuestOSType();
+ final String platformEmulator = command.getPlatformEmulator();
+
+ final boolean snapshotMemory = command.getTarget().getType() == VMSnapshot.Type.DiskAndMemory;
+ final long timeout = command.getWait();
+
+ final Connection conn = citrixResourceBase.getConnection();
+ VM vm = null;
+ VM vmSnapshot = null;
+ boolean success = false;
+
+ try {
+ // check if VM snapshot already exists
+ final Set<VM> vmSnapshots = VM.getByNameLabel(conn, command.getTarget().getSnapshotName());
+ if (vmSnapshots == null || vmSnapshots.size() > 0) {
+ return new CreateVMSnapshotAnswer(command, command.getTarget(), command.getVolumeTOs());
+ }
+
+ // check if there is already a task for this VM snapshot
+ Task task = null;
+ Set<Task> tasks = Task.getByNameLabel(conn, "Async.VM.snapshot");
+ if(tasks == null) {
+ tasks = new LinkedHashSet<>();
+ }
+ final Set<Task> tasksByName = Task.getByNameLabel(conn, "Async.VM.checkpoint");
+ if(tasksByName != null) {
+ tasks.addAll(tasksByName);
+ }
+ for (final Task taskItem : tasks) {
+ if (taskItem.getOtherConfig(conn).containsKey("CS_VM_SNAPSHOT_KEY")) {
+ final String vmSnapshotTaskName = taskItem.getOtherConfig(conn).get("CS_VM_SNAPSHOT_KEY");
+ if (vmSnapshotTaskName != null && vmSnapshotTaskName.equals(command.getTarget().getSnapshotName())) {
+ task = taskItem;
+ }
+ }
+ }
+
+ // create a new task if there is no existing task for this VM snapshot
+ if (task == null) {
+ try {
+ vm = citrixResourceBase.getVM(conn, vmName);
+ vmState = vm.getPowerState(conn);
+ } catch (final Exception e) {
+ if (!snapshotMemory) {
+ vm = citrixResourceBase.createWorkingVM(conn, vmName, guestOSType, platformEmulator, listVolumeTo);
+ }
+ }
+
+ if (vm == null) {
+ return new CreateVMSnapshotAnswer(command, false, "Creating VM Snapshot Failed due to can not find vm: " + vmName);
+ }
+
+ // call Xenserver API
+ if (!snapshotMemory) {
+ task = vm.snapshotAsync(conn, vmSnapshotName);
+ } else {
+ final Set<VBD> vbds = vm.getVBDs(conn);
+ final Pool pool = Pool.getByUuid(conn, citrixResourceBase.getHost().getPool());
+ for (final VBD vbd : vbds) {
+ final VBD.Record vbdr = vbd.getRecord(conn);
+ if (vbdr.userdevice.equals("0")) {
+ final VDI vdi = vbdr.VDI;
+ final SR sr = vdi.getSR(conn);
+ // store memory image on the same SR with ROOT volume
+ pool.setSuspendImageSR(conn, sr);
+ }
+ }
+ task = vm.checkpointAsync(conn, vmSnapshotName);
+ }
+ task.addToOtherConfig(conn, "CS_VM_SNAPSHOT_KEY", vmSnapshotName);
+ }
+
+ citrixResourceBase.waitForTask(conn, task, 1000, timeout * 1000);
+ citrixResourceBase.checkForSuccess(conn, task);
+ final String result = task.getResult(conn);
+
+ // extract VM snapshot ref from result
+ final String ref = result.substring("<value>".length(), result.length() - "</value>".length());
+ vmSnapshot = Types.toVM(ref);
+ try {
+ Thread.sleep(5000);
+ } catch (final InterruptedException ex) {
+
+ }
+ // calculate used capacity for this VM snapshot
+ for (final VolumeObjectTO volumeTo : command.getVolumeTOs()) {
+ final long size = citrixResourceBase.getVMSnapshotChainSize(conn, volumeTo, command.getVmName());
+ volumeTo.setSize(size);
+ }
+
+ success = true;
+ return new CreateVMSnapshotAnswer(command, command.getTarget(), command.getVolumeTOs());
+ } catch (final Exception e) {
+ String msg = "";
+ if (e instanceof Types.BadAsyncResult) {
+ final String licenseKeyWord = "LICENCE_RESTRICTION";
+ final Types.BadAsyncResult errorResult = (Types.BadAsyncResult)e;
+ if (errorResult.shortDescription != null && errorResult.shortDescription.contains(licenseKeyWord)) {
+ msg = licenseKeyWord;
+ }
+ } else {
+ msg = e.toString();
+ }
+ s_logger.warn("Creating VM Snapshot " + command.getTarget().getSnapshotName() + " failed due to: " + msg, e);
+ return new CreateVMSnapshotAnswer(command, false, msg);
+ } finally {
+ try {
+ if (!success) {
+ if (vmSnapshot != null) {
+ s_logger.debug("Delete exsisting VM Snapshot " + vmSnapshotName + " after making VolumeTO failed");
+ final Set<VBD> vbds = vmSnapshot.getVBDs(conn);
+ for (final VBD vbd : vbds) {
+ final VBD.Record vbdr = vbd.getRecord(conn);
+ if (vbdr.type == Types.VbdType.DISK) {
+ final VDI vdi = vbdr.VDI;
+ vdi.destroy(conn);
+ }
+ }
+ vmSnapshot.destroy(conn);
+ }
+ }
+ if (vmState == VmPowerState.HALTED) {
+ if (vm != null) {
+ vm.destroy(conn);
+ }
+ }
+ } catch (final Exception e2) {
+ s_logger.error("delete snapshot error due to " + e2.getMessage());
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteVMSnapshotCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteVMSnapshotCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteVMSnapshotCommandWrapper.java
new file mode 100644
index 0000000..10f4091
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteVMSnapshotCommandWrapper.java
@@ -0,0 +1,90 @@
+//
+// 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.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.DeleteVMSnapshotAnswer;
+import com.cloud.agent.api.DeleteVMSnapshotCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class CitrixDeleteVMSnapshotCommandWrapper extends CommandWrapper<DeleteVMSnapshotCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixDeleteVMSnapshotCommandWrapper.class);
+
+ @Override
+ public Answer execute(final DeleteVMSnapshotCommand command, final CitrixResourceBase citrixResourceBase) {
+ final String snapshotName = command.getTarget().getSnapshotName();
+ final Connection conn = citrixResourceBase.getConnection();
+
+ try {
+ final List<VDI> vdiList = new ArrayList<VDI>();
+ final Set<VM> snapshots = VM.getByNameLabel(conn, snapshotName);
+ if (snapshots == null || snapshots.size() == 0) {
+ s_logger.warn("VM snapshot with name " + snapshotName + " does not exist, assume it is already deleted");
+ return new DeleteVMSnapshotAnswer(command, command.getVolumeTOs());
+ }
+ final VM snapshot = snapshots.iterator().next();
+ final Set<VBD> vbds = snapshot.getVBDs(conn);
+ for (final VBD vbd : vbds) {
+ if (vbd.getType(conn) == Types.VbdType.DISK) {
+ final VDI vdi = vbd.getVDI(conn);
+ vdiList.add(vdi);
+ }
+ }
+ if (command.getTarget().getType() == VMSnapshot.Type.DiskAndMemory) {
+ vdiList.add(snapshot.getSuspendVDI(conn));
+ }
+ snapshot.destroy(conn);
+ for (final VDI vdi : vdiList) {
+ vdi.destroy(conn);
+ }
+
+ try {
+ Thread.sleep(5000);
+ } catch (final InterruptedException ex) {
+
+ }
+ // re-calculate used capacify for this VM snapshot
+ for (final VolumeObjectTO volumeTo : command.getVolumeTOs()) {
+ final long size = citrixResourceBase.getVMSnapshotChainSize(conn, volumeTo, command.getVmName());
+ volumeTo.setSize(size);
+ }
+
+ return new DeleteVMSnapshotAnswer(command, command.getVolumeTOs());
+ } catch (final Exception e) {
+ s_logger.warn("Catch Exception: " + e.getClass().toString() + " due to " + e.toString(), e);
+ return new DeleteVMSnapshotAnswer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPlugNicCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPlugNicCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPlugNicCommandWrapper.java
new file mode 100644
index 0000000..a3edfbe
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPlugNicCommandWrapper.java
@@ -0,0 +1,92 @@
+//
+// 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.PlugNicAnswer;
+import com.cloud.agent.api.PlugNicCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.VIF;
+import com.xensource.xenapi.VM;
+
+public final class CitrixPlugNicCommandWrapper extends CommandWrapper<PlugNicCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixPlugNicCommandWrapper.class);
+
+ @Override
+ public Answer execute(final PlugNicCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final String vmName = command.getVmName();
+ try {
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+ if (vms == null || vms.isEmpty()) {
+ return new PlugNicAnswer(command, false, "Can not find VM " + vmName);
+ }
+ final VM vm = vms.iterator().next();
+ final NicTO nic = command.getNic();
+
+ String mac = nic.getMac();
+ final Set<VIF> routerVIFs = vm.getVIFs(conn);
+ mac = mac.trim();
+
+ int counter = 0;
+ for (final VIF vif : routerVIFs) {
+ final String lmac = vif.getMAC(conn);
+ if (lmac.trim().equals(mac)) {
+ counter++;
+ }
+ }
+ // We allow 2 routers with the same mac. It's needed for the redundant vpc routers.
+ // [FIXME] Find a way to identify the type of the router or if it's
+ // redundant.
+ if (counter > 2) {
+ final String msg = " Plug Nic failed due to a VIF with the same mac " + nic.getMac() + " exists in more than 2 routers.";
+ s_logger.error(msg);
+ return new PlugNicAnswer(command, false, msg);
+ }
+
+ // Wilder Rodrigues - replaced this code with the code above.
+ // VIF vif = getVifByMac(conn, vm, nic.getMac());
+ // if (vif != null) {
+ // final String msg = " Plug Nic failed due to a VIF with the same mac " + nic.getMac() + " exists";
+ // s_logger.warn(msg);
+ // return new PlugNicAnswer(cmd, false, msg);
+ // }
+
+ final String deviceId = citrixResourceBase.getLowestAvailableVIFDeviceNum(conn, vm);
+ nic.setDeviceId(Integer.parseInt(deviceId));
+ final VIF vif = citrixResourceBase.createVif(conn, vmName, vm, null, nic);
+ // vif = createVif(conn, vmName, vm, null, nic);
+ vif.plug(conn);
+ return new PlugNicAnswer(command, true, "success");
+ } catch (final Exception e) {
+ final String msg = " Plug Nic failed due to " + e.toString();
+ s_logger.error(msg, e);
+ return new PlugNicAnswer(command, false, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/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 eff580a..289fff9 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
@@ -25,12 +25,16 @@ 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.CheckOnHostCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.CleanupNetworkRulesCmd;
+import com.cloud.agent.api.ClusterVMMetaDataSyncCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
+import com.cloud.agent.api.CreateVMSnapshotCommand;
import com.cloud.agent.api.DeleteStoragePoolCommand;
+import com.cloud.agent.api.DeleteVMSnapshotCommand;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetStorageStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
@@ -52,14 +56,18 @@ import com.cloud.agent.api.OvsSetupBridgeCommand;
import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
import com.cloud.agent.api.PingTestCommand;
+import com.cloud.agent.api.PlugNicCommand;
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.RevertToVMSnapshotCommand;
import com.cloud.agent.api.SecurityGroupRulesCmd;
import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StartCommand;
import com.cloud.agent.api.StopCommand;
+import com.cloud.agent.api.UnPlugNicCommand;
+import com.cloud.agent.api.UpdateHostPasswordCommand;
import com.cloud.agent.api.UpgradeSnapshotCommand;
import com.cloud.agent.api.check.CheckSshCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -135,6 +143,14 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(OvsSetupBridgeCommand.class, new CitrixOvsSetupBridgeCommandWrapper());
map.put(OvsDestroyBridgeCommand.class, new CitrixOvsDestroyBridgeCommandWrapper());
map.put(OvsDestroyTunnelCommand.class, new CitrixOvsDestroyTunnelCommandWrapper());
+ map.put(UpdateHostPasswordCommand.class, new CitrixUpdateHostPasswordCommandWrapper());
+ map.put(ClusterVMMetaDataSyncCommand.class, new CitrixClusterVMMetaDataSyncCommandWrapper());
+ map.put(CheckNetworkCommand.class, new CitrixCheckNetworkCommandWrapper());
+ map.put(PlugNicCommand.class, new CitrixPlugNicCommandWrapper());
+ map.put(UnPlugNicCommand.class, new CitrixUnPlugNicCommandWrapper());
+ map.put(CreateVMSnapshotCommand.class, new CitrixCreateVMSnapshotCommandWrapper());
+ map.put(DeleteVMSnapshotCommand.class, new CitrixDeleteVMSnapshotCommandWrapper());
+ map.put(RevertToVMSnapshotCommand.class, new CitrixRevertToVMSnapshotCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRevertToVMSnapshotCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRevertToVMSnapshotCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRevertToVMSnapshotCommandWrapper.java
new file mode 100644
index 0000000..a929132
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRevertToVMSnapshotCommandWrapper.java
@@ -0,0 +1,110 @@
+//
+// 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.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.RevertToVMSnapshotAnswer;
+import com.cloud.agent.api.RevertToVMSnapshotCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.vm.VirtualMachine.PowerState;
+import com.cloud.vm.snapshot.VMSnapshot;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class CitrixRevertToVMSnapshotCommandWrapper extends CommandWrapper<RevertToVMSnapshotCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixRevertToVMSnapshotCommandWrapper.class);
+
+ @Override
+ public Answer execute(final RevertToVMSnapshotCommand command, final CitrixResourceBase citrixResourceBase) {
+ final String vmName = command.getVmName();
+ final List<VolumeObjectTO> listVolumeTo = command.getVolumeTOs();
+ final VMSnapshot.Type vmSnapshotType = command.getTarget().getType();
+ final Boolean snapshotMemory = vmSnapshotType == VMSnapshot.Type.DiskAndMemory;
+ final Connection conn = citrixResourceBase.getConnection();
+ PowerState vmState = null;
+ VM vm = null;
+ try {
+
+ final Set<VM> vmSnapshots = VM.getByNameLabel(conn, command.getTarget().getSnapshotName());
+ if (vmSnapshots == null || vmSnapshots.size() == 0) {
+ return new RevertToVMSnapshotAnswer(command, false, "Cannot find vmSnapshot with name: " + command.getTarget().getSnapshotName());
+ }
+
+ final VM vmSnapshot = vmSnapshots.iterator().next();
+
+ // find target VM or creating a work VM
+ try {
+ vm = citrixResourceBase.getVM(conn, vmName);
+ } catch (final Exception e) {
+ vm = citrixResourceBase.createWorkingVM(conn, vmName, command.getGuestOSType(), command.getPlatformEmulator(), listVolumeTo);
+ }
+
+ if (vm == null) {
+ return new RevertToVMSnapshotAnswer(command, false, "Revert to VM Snapshot Failed due to can not find vm: " + vmName);
+ }
+
+ // call plugin to execute revert
+ citrixResourceBase.revertToSnapshot(conn, vmSnapshot, vmName, vm.getUuid(conn), snapshotMemory, citrixResourceBase.getHost().getUuid());
+ vm = citrixResourceBase.getVM(conn, vmName);
+ final Set<VBD> vbds = vm.getVBDs(conn);
+ final Map<String, VDI> vdiMap = new HashMap<String, VDI>();
+ // get vdi:vbdr to a map
+ for (final VBD vbd : vbds) {
+ final VBD.Record vbdr = vbd.getRecord(conn);
+ if (vbdr.type == Types.VbdType.DISK) {
+ final VDI vdi = vbdr.VDI;
+ vdiMap.put(vbdr.userdevice, vdi);
+ }
+ }
+
+ if (!snapshotMemory) {
+ vm.destroy(conn);
+ vmState = PowerState.PowerOff;
+ } else {
+ vmState = PowerState.PowerOn;
+ }
+
+ // after revert, VM's volumes path have been changed, need to report to manager
+ for (final VolumeObjectTO volumeTo : listVolumeTo) {
+ final Long deviceId = volumeTo.getDeviceId();
+ final VDI vdi = vdiMap.get(deviceId.toString());
+ volumeTo.setPath(vdi.getUuid(conn));
+ }
+
+ return new RevertToVMSnapshotAnswer(command, listVolumeTo, vmState);
+ } catch (final Exception e) {
+ s_logger.error("revert vm " + vmName + " to snapshot " + command.getTarget().getSnapshotName() + " failed due to " + e.getMessage());
+ return new RevertToVMSnapshotAnswer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUnPlugNicCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUnPlugNicCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUnPlugNicCommandWrapper.java
new file mode 100644
index 0000000..6250835
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUnPlugNicCommandWrapper.java
@@ -0,0 +1,72 @@
+//
+// 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.UnPlugNicAnswer;
+import com.cloud.agent.api.UnPlugNicCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.VIF;
+import com.xensource.xenapi.VM;
+
+public final class CitrixUnPlugNicCommandWrapper extends CommandWrapper<UnPlugNicCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixUnPlugNicCommandWrapper.class);
+
+ @Override
+ public Answer execute(final UnPlugNicCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final String vmName = command.getVmName();
+ try {
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+ if (vms == null || vms.isEmpty()) {
+ return new UnPlugNicAnswer(command, false, "Can not find VM " + vmName);
+ }
+ final VM vm = vms.iterator().next();
+ final NicTO nic = command.getNic();
+ final String mac = nic.getMac();
+ final VIF vif = citrixResourceBase.getVifByMac(conn, vm, mac);
+ if (vif != null) {
+ vif.unplug(conn);
+ final Network network = vif.getNetwork(conn);
+ vif.destroy(conn);
+ try {
+ if (network.getNameLabel(conn).startsWith("VLAN")) {
+ citrixResourceBase.disableVlanNetwork(conn, network);
+ }
+ } catch (final Exception e) {
+ }
+ }
+ return new UnPlugNicAnswer(command, true, "success");
+ } catch (final Exception e) {
+ final String msg = " UnPlug Nic failed due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new UnPlugNicAnswer(command, false, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpdateHostPasswordCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpdateHostPasswordCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpdateHostPasswordCommandWrapper.java
new file mode 100644
index 0000000..f2f1fb5
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpdateHostPasswordCommandWrapper.java
@@ -0,0 +1,34 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.UpdateHostPasswordCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixUpdateHostPasswordCommandWrapper extends CommandWrapper<UpdateHostPasswordCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final UpdateHostPasswordCommand command, final CitrixResourceBase citrixResourceBase) {
+ citrixResourceBase.addToPwdQueue(command.getNewPassword());
+ return new Answer(command, true, null);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24bbfbc1/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 8b8c9ce..72d5c1a 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
@@ -13,9 +13,11 @@ import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Hashtable;
+import java.util.List;
import java.util.Map;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.junit.Test;
@@ -30,12 +32,16 @@ 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.CheckOnHostCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.CleanupNetworkRulesCmd;
+import com.cloud.agent.api.ClusterVMMetaDataSyncCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
+import com.cloud.agent.api.CreateVMSnapshotCommand;
import com.cloud.agent.api.DeleteStoragePoolCommand;
+import com.cloud.agent.api.DeleteVMSnapshotCommand;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetStorageStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
@@ -57,16 +63,21 @@ import com.cloud.agent.api.OvsSetupBridgeCommand;
import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
import com.cloud.agent.api.PingTestCommand;
+import com.cloud.agent.api.PlugNicCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
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.RevertToVMSnapshotCommand;
import com.cloud.agent.api.SecurityGroupRulesCmd;
import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StartCommand;
import com.cloud.agent.api.StopCommand;
+import com.cloud.agent.api.UnPlugNicCommand;
+import com.cloud.agent.api.UpdateHostPasswordCommand;
import com.cloud.agent.api.UpgradeSnapshotCommand;
+import com.cloud.agent.api.VMSnapshotTO;
import com.cloud.agent.api.check.CheckSshCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
@@ -76,12 +87,14 @@ import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.agent.api.to.DataStoreTO;
+import com.cloud.agent.api.to.NicTO;
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.hypervisor.xenserver.resource.XsLocalNetwork;
+import com.cloud.network.PhysicalNetworkSetupInfo;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
@@ -92,6 +105,7 @@ import com.xensource.xenapi.Host;
import com.xensource.xenapi.Marshalling;
import com.xensource.xenapi.Network;
import com.xensource.xenapi.PIF;
+import com.xensource.xenapi.Pool;
import com.xensource.xenapi.Types.BadServerResponse;
import com.xensource.xenapi.Types.XenAPIException;
@@ -1269,6 +1283,194 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testUpdateHostPasswordCommand() {
+ final UpdateHostPasswordCommand updatePwd = new UpdateHostPasswordCommand("test", "123");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(updatePwd, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testClusterVMMetaDataSyncCommand() {
+ final String uuid = "6172d8b7-ba10-4a70-93f9-ecaf41f51d53";
+
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final Pool pool = PowerMockito.mock(Pool.class);
+ final Pool.Record poolr = Mockito.mock(Pool.Record.class);
+ final Host.Record hostr = Mockito.mock(Host.Record.class);
+ final Host master = Mockito.mock(Host.class);
+
+ final ClusterVMMetaDataSyncCommand vmDataSync = new ClusterVMMetaDataSyncCommand(10, 1l);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+ when(citrixResourceBase.getHost().getUuid()).thenReturn(uuid);
+
+ PowerMockito.mockStatic(Pool.Record.class);
+
+ when(pool.getRecord(conn)).thenReturn(poolr);
+ poolr.master = master;
+ when(poolr.master.getRecord(conn)).thenReturn(hostr);
+ hostr.uuid = uuid;
+
+ } 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(vmDataSync, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testCheckNetworkCommandSuccess() {
+ final List<PhysicalNetworkSetupInfo> setupInfos = new ArrayList<PhysicalNetworkSetupInfo>();
+
+ final CheckNetworkCommand checkNet = new CheckNetworkCommand(setupInfos);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(checkNet, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testCheckNetworkCommandFailure() {
+ final PhysicalNetworkSetupInfo info = new PhysicalNetworkSetupInfo();
+
+ final List<PhysicalNetworkSetupInfo> setupInfos = new ArrayList<PhysicalNetworkSetupInfo>();
+ setupInfos.add(info);
+
+ final CheckNetworkCommand checkNet = new CheckNetworkCommand(setupInfos);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(checkNet, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testPlugNicCommand() {
+ final NicTO nicTO = Mockito.mock(NicTO.class);
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final PlugNicCommand plugNic = new PlugNicCommand(nicTO, "Test", VirtualMachine.Type.User);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(plugNic, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testUnPlugNicCommand() {
+ final NicTO nicTO = Mockito.mock(NicTO.class);
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final UnPlugNicCommand unplugNic = new UnPlugNicCommand(nicTO, "Test");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(unplugNic, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testCreateVMSnapshotCommand() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final VMSnapshotTO snapshotTO = Mockito.mock(VMSnapshotTO.class);
+ final List<VolumeObjectTO> volumeTOs = new ArrayList<VolumeObjectTO>();
+
+ final CreateVMSnapshotCommand vmSnapshot = new CreateVMSnapshotCommand("Test", snapshotTO, volumeTOs, "Debian");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(vmSnapshot, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testDeleteVMSnapshotCommand() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final VMSnapshotTO snapshotTO = Mockito.mock(VMSnapshotTO.class);
+ final List<VolumeObjectTO> volumeTOs = new ArrayList<VolumeObjectTO>();
+
+ final DeleteVMSnapshotCommand vmSnapshot = new DeleteVMSnapshotCommand("Test", snapshotTO, volumeTOs, "Debian");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(vmSnapshot, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testRevertToVMSnapshotCommand() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final VMSnapshotTO snapshotTO = Mockito.mock(VMSnapshotTO.class);
+ final List<VolumeObjectTO> volumeTOs = new ArrayList<VolumeObjectTO>();
+
+ final RevertToVMSnapshotCommand vmSnapshot = new RevertToVMSnapshotCommand("Test", snapshotTO, volumeTOs, "Debian");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(vmSnapshot, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[33/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Removing all private/protected/public execute() methods from CitrixResourceBase class
Started the refactor of the XenServer56Resource class
- Unit test added
Changing the CitrixRequestWrapper in order to cope with multiple resources classes and commands
Still have to remove few methods form CitrixResourceBase
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4600eef8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4600eef8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4600eef8
Branch: refs/heads/master
Commit: 4600eef87c435598e5d3f1fbe2910d58803c0029
Parents: 0257172
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 31 00:27:06 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:32 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 9574 +++++++-----------
.../resource/XenServer56FP1Resource.java | 2 +-
.../xenserver/resource/XenServer56Resource.java | 53 +-
.../resource/wrapper/CitrixRequestWrapper.java | 158 +-
.../XenServer56CheckOnHostCommandWrapper.java | 48 +
.../resource/CitrixResourceBaseTest.java | 188 -
.../wrapper/XenServer56WrapperTest.java | 38 +
7 files changed, 4027 insertions(+), 6034 deletions(-)
----------------------------------------------------------------------
[03/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
First piece of the refactor of the CitrisResourceBase
- The same pattern will be used by the other subclasses of the ServerResource interface.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a1e87782
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a1e87782
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a1e87782
Branch: refs/heads/master
Commit: a1e87782116671521f73a23bb36fd788345366cb
Parents: ed979b1
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Thu Mar 19 15:37:08 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:24 2015 +0200
----------------------------------------------------------------------
core/src/com/cloud/resource/CommandWrapper.java | 34 +++++
core/src/com/cloud/resource/RequestWrapper.java | 32 +++++
.../xenserver/resource/CitrixResourceBase.java | 6 +-
.../xenserver/resource/XenServer56Resource.java | 141 +++++++++----------
.../CitrixRebootRouterCommandWrapper.java | 50 +++++++
.../resource/wrapper/CitrixRequestWrapper.java | 63 +++++++++
.../wrapper/CitrixRequestWrapperTest.java | 52 +++++++
7 files changed, 304 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a1e87782/core/src/com/cloud/resource/CommandWrapper.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/resource/CommandWrapper.java b/core/src/com/cloud/resource/CommandWrapper.java
new file mode 100644
index 0000000..f68e92a
--- /dev/null
+++ b/core/src/com/cloud/resource/CommandWrapper.java
@@ -0,0 +1,34 @@
+//
+// 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.resource;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+
+
+public abstract class CommandWrapper<T extends Command, A extends Answer, R extends ServerResource> {
+
+ /**
+ * @param T is the command to be used.
+ * @param R is the resource base to be used.
+ * @return A and the Answer from the command.
+ */
+ public abstract A execute(T command, R serverResource);
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a1e87782/core/src/com/cloud/resource/RequestWrapper.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/resource/RequestWrapper.java b/core/src/com/cloud/resource/RequestWrapper.java
new file mode 100644
index 0000000..6fd1c66
--- /dev/null
+++ b/core/src/com/cloud/resource/RequestWrapper.java
@@ -0,0 +1,32 @@
+//
+// 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.resource;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+
+public abstract class RequestWrapper {
+
+ /**
+ * @param command to be executed.
+ * @return an Answer for the executed command.
+ */
+ public abstract Answer execute(Command command, ServerResource serverResource);
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a1e87782/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 96374e4..73f11c2 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
@@ -2047,7 +2047,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected String networkUsage(final Connection conn, final String privateIpAddress, final String option, final String vif) {
+ public String networkUsage(final Connection conn, final String privateIpAddress, final String option, final String vif) {
if (option.equals("get")) {
return "0:0";
}
@@ -3096,7 +3096,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected Answer execute(final RebootRouterCommand cmd) {
+ public Answer execute(final RebootRouterCommand cmd) {
final Connection conn = getConnection();
final RebootAnswer answer = execute((RebootCommand)cmd);
if (answer.getResult()) {
@@ -3630,7 +3630,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return msg;
}
- protected String connect(final Connection conn, final String vmname, final String ipAddress) {
+ public String connect(final Connection conn, final String vmname, final String ipAddress) {
return connect(conn, vmname, ipAddress, 3922);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a1e87782/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index eec972e..a8e9efa 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -26,15 +26,6 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Network;
-import com.xensource.xenapi.PIF;
-import com.xensource.xenapi.Types.IpConfigurationMode;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VLAN;
-import com.xensource.xenapi.VM;
-
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckOnHostAnswer;
import com.cloud.agent.api.CheckOnHostCommand;
@@ -49,13 +40,21 @@ import com.cloud.utils.ExecutionResult;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
import com.cloud.utils.ssh.SSHCmdHelper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.PIF;
+import com.xensource.xenapi.Types.IpConfigurationMode;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VLAN;
+import com.xensource.xenapi.VM;
@Local(value = ServerResource.class)
public class XenServer56Resource extends CitrixResourceBase {
private final static Logger s_logger = Logger.getLogger(XenServer56Resource.class);
@Override
- public Answer executeRequest(Command cmd) {
+ public Answer executeRequest(final Command cmd) {
if (cmd instanceof FenceCommand) {
return execute((FenceCommand)cmd);
} else if (cmd instanceof NetworkUsageCommand) {
@@ -68,63 +67,63 @@ public class XenServer56Resource extends CitrixResourceBase {
@Override
protected List<File> getPatchFiles() {
- List<File> files = new ArrayList<File>();
- String patch = "scripts/vm/hypervisor/xenserver/xenserver56/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xenserver56/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
@Override
- protected void disableVlanNetwork(Connection conn, Network network) {
+ protected void disableVlanNetwork(final Connection conn, final Network network) {
try {
- Network.Record networkr = network.getRecord(conn);
+ final Network.Record networkr = network.getRecord(conn);
if (!networkr.nameLabel.startsWith("VLAN")) {
return;
}
- String bridge = networkr.bridge.trim();
- for (PIF pif : networkr.PIFs) {
- PIF.Record pifr = pif.getRecord(conn);
+ final String bridge = networkr.bridge.trim();
+ for (final PIF pif : networkr.PIFs) {
+ final PIF.Record pifr = pif.getRecord(conn);
if (!pifr.host.getUuid(conn).equalsIgnoreCase(_host.uuid)) {
continue;
}
- VLAN vlan = pifr.VLANMasterOf;
+ final VLAN vlan = pifr.VLANMasterOf;
if (vlan != null) {
- String vlannum = pifr.VLAN.toString();
- String device = pifr.device.trim();
+ final String vlannum = pifr.VLAN.toString();
+ final String device = pifr.device.trim();
if (vlannum.equals("-1")) {
return;
}
try {
vlan.destroy(conn);
- Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.uuid);
host.forgetDataSourceArchives(conn, "pif_" + bridge + "_tx");
host.forgetDataSourceArchives(conn, "pif_" + bridge + "_rx");
host.forgetDataSourceArchives(conn, "pif_" + device + "." + vlannum + "_tx");
host.forgetDataSourceArchives(conn, "pif_" + device + "." + vlannum + "_rx");
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.trace("Catch " + e.getClass().getName() + ": failed to destory VLAN " + device + " on host " + _host.uuid + " due to " + e.toString());
}
}
return;
}
- } catch (XenAPIException e) {
- String msg = "Unable to disable VLAN network due to " + e.toString();
+ } catch (final XenAPIException e) {
+ final String msg = "Unable to disable VLAN network due to " + e.toString();
s_logger.warn(msg, e);
- } catch (Exception e) {
- String msg = "Unable to disable VLAN network due to " + e.getMessage();
+ } catch (final Exception e) {
+ final String msg = "Unable to disable VLAN network due to " + e.getMessage();
s_logger.warn(msg, e);
}
}
@Override
- protected String networkUsage(Connection conn, final String privateIpAddress, final String option, final String vif) {
+ public String networkUsage(final Connection conn, final String privateIpAddress, final String option, final String vif) {
String args = "";
if (option.equals("get")) {
args += "-g";
@@ -143,18 +142,18 @@ public class XenServer56Resource extends CitrixResourceBase {
return executeInVR(privateIpAddress, "netusage.sh", args).getDetails();
}
- protected NetworkUsageAnswer VPCNetworkUsage(NetworkUsageCommand cmd) {
+ protected NetworkUsageAnswer VPCNetworkUsage(final NetworkUsageCommand cmd) {
try {
- Connection conn = getConnection();
- String option = cmd.getOption();
- String publicIp = cmd.getGatewayIP();
+ final Connection conn = getConnection();
+ final String option = cmd.getOption();
+ final String publicIp = cmd.getGatewayIP();
String args = " -l " + publicIp + " ";
if (option.equals("get")) {
args += "-g";
} else if (option.equals("create")) {
args += "-c";
- String vpcCIDR = cmd.getVpcCIDR();
+ final String vpcCIDR = cmd.getVpcCIDR();
args += " -v " + vpcCIDR;
} else if (option.equals("reset")) {
args += "-r";
@@ -166,67 +165,67 @@ public class XenServer56Resource extends CitrixResourceBase {
return new NetworkUsageAnswer(cmd, "success", 0L, 0L);
}
- ExecutionResult result = executeInVR(cmd.getPrivateIP(), "vpc_netusage.sh", args);
- String detail = result.getDetails();
+ final ExecutionResult result = executeInVR(cmd.getPrivateIP(), "vpc_netusage.sh", args);
+ final String detail = result.getDetails();
if (!result.isSuccess()) {
throw new Exception(" vpc network usage plugin call failed ");
}
if (option.equals("get") || option.equals("vpn")) {
- long[] stats = new long[2];
+ final long[] stats = new long[2];
if (detail != null) {
- String[] splitResult = detail.split(":");
+ final String[] splitResult = detail.split(":");
int i = 0;
while (i < splitResult.length - 1) {
- stats[0] += (new Long(splitResult[i++])).longValue();
- stats[1] += (new Long(splitResult[i++])).longValue();
+ stats[0] += new Long(splitResult[i++]).longValue();
+ stats[1] += new Long(splitResult[i++]).longValue();
}
return new NetworkUsageAnswer(cmd, "success", stats[0], stats[1]);
}
}
return new NetworkUsageAnswer(cmd, "success", 0L, 0L);
- } catch (Exception ex) {
+ } catch (final Exception ex) {
s_logger.warn("Failed to get network usage stats due to ", ex);
return new NetworkUsageAnswer(cmd, ex);
}
}
- protected NetworkUsageAnswer execute(NetworkUsageCommand cmd) {
+ protected NetworkUsageAnswer execute(final NetworkUsageCommand cmd) {
if (cmd.isForVpc()) {
return VPCNetworkUsage(cmd);
}
try {
- Connection conn = getConnection();
+ final Connection conn = getConnection();
if (cmd.getOption() != null && cmd.getOption().equals("create")) {
- String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
- NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
+ final String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
return answer;
}
- long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
- NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
+ final long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
return answer;
- } catch (Exception ex) {
+ } catch (final Exception ex) {
s_logger.warn("Failed to get network usage stats due to ", ex);
return new NetworkUsageAnswer(cmd, ex);
}
}
- protected Boolean check_heartbeat(String hostuuid) {
- com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
+ protected Boolean check_heartbeat(final String hostuuid) {
+ final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
try {
sshConnection.connect(null, 60000, 60000);
if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
throw new CloudRuntimeException("Unable to authenticate");
}
- String shcmd = "/opt/cloud/bin/check_heartbeat.sh " + hostuuid + " "
- + Integer.toString(_heartbeatInterval * 2);
+ final String shcmd = "/opt/cloud/bin/check_heartbeat.sh " + hostuuid + " "
+ + Integer.toString(_heartbeatInterval * 2);
if (!SSHCmdHelper.sshExecuteCmd(sshConnection, shcmd)) {
s_logger.debug("Heart beat is gone so dead.");
return false;
}
s_logger.debug("Heart beat is still going");
return true;
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("health check failed due to catch exception " + e.toString());
return null;
} finally {
@@ -234,10 +233,10 @@ public class XenServer56Resource extends CitrixResourceBase {
}
}
- protected FenceAnswer execute(FenceCommand cmd) {
- Connection conn = getConnection();
+ protected FenceAnswer execute(final FenceCommand cmd) {
+ final Connection conn = getConnection();
try {
- Boolean alive = check_heartbeat(cmd.getHostGuid());
+ final Boolean alive = check_heartbeat(cmd.getHostGuid());
if ( alive == null ) {
s_logger.debug("Failed to check heartbeat, so unable to fence");
return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
@@ -246,17 +245,17 @@ public class XenServer56Resource extends CitrixResourceBase {
s_logger.debug("Heart beat is still going so unable to fence");
return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
}
- Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
- for (VM vm : vms) {
+ final Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
+ for (final VM vm : vms) {
s_logger.info("Fence command for VM " + cmd.getVmName());
vm.powerStateReset(conn);
vm.destroy(conn);
}
return new FenceAnswer(cmd);
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
s_logger.warn("Unable to fence", e);
return new FenceAnswer(cmd, false, e.getMessage());
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.warn("Unable to fence", e);
return new FenceAnswer(cmd, false, e.getMessage());
}
@@ -264,11 +263,11 @@ public class XenServer56Resource extends CitrixResourceBase {
@Override
- protected boolean transferManagementNetwork(Connection conn, Host host, PIF src, PIF.Record spr, PIF dest) throws XmlRpcException, XenAPIException {
+ protected 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;
- int count = 0;
+ final int count = 0;
while (count < 10) {
try {
Thread.sleep(10000);
@@ -276,11 +275,11 @@ public class XenServer56Resource extends CitrixResourceBase {
if (hostUuid != null) {
break;
}
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
s_logger.debug("Waiting for host to come back: " + e.getMessage());
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.debug("Waiting for host to come back: " + e.getMessage());
- } catch (InterruptedException e) {
+ } catch (final InterruptedException e) {
s_logger.debug("Gotta run");
return false;
}
@@ -297,21 +296,21 @@ public class XenServer56Resource extends CitrixResourceBase {
@Override
public StartupCommand[] initialize() {
pingXAPI();
- StartupCommand[] cmds = super.initialize();
+ final StartupCommand[] cmds = super.initialize();
return cmds;
}
@Override
- protected CheckOnHostAnswer execute(CheckOnHostCommand cmd) {
- Boolean alive = check_heartbeat(cmd.getHost().getGuid());
+ protected CheckOnHostAnswer execute(final CheckOnHostCommand cmd) {
+ final Boolean alive = check_heartbeat(cmd.getHost().getGuid());
String msg = "";
if (alive == null) {
- msg = " cannot determine ";
+ msg = " cannot determine ";
} else if ( alive == true) {
- msg = "Heart beat is still going";
+ msg = "Heart beat is still going";
} else {
- msg = "Heart beat is gone so dead.";
+ msg = "Heart beat is gone so dead.";
}
s_logger.debug(msg);
return new CheckOnHostAnswer(cmd, alive, msg);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a1e87782/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java
new file mode 100644
index 0000000..c244335
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRebootRouterCommandWrapper.java
@@ -0,0 +1,50 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.RebootAnswer;
+import com.cloud.agent.api.RebootCommand;
+import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixRebootRouterCommandWrapper extends CommandWrapper<RebootRouterCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final RebootRouterCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+
+ final RebootAnswer answer = citrixResourceBase.execute((RebootCommand)command);
+
+ if (answer.getResult()) {
+ final String cnct = citrixResourceBase.connect(conn, command.getVmName(), command.getPrivateIpAddress());
+ citrixResourceBase.networkUsage(conn, command.getPrivateIpAddress(), "create", null);
+
+ if (cnct == null) {
+ return answer;
+ } else {
+ return new Answer(command, false, cnct);
+ }
+ }
+ return answer;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a1e87782/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
new file mode 100644
index 0000000..124b297
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -0,0 +1,63 @@
+//
+// 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.Hashtable;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.RequestWrapper;
+import com.cloud.resource.ServerResource;
+
+public class CitrixRequestWrapper extends RequestWrapper {
+
+ private static CitrixRequestWrapper instance;
+
+ static {
+ instance = new CitrixRequestWrapper();
+ }
+
+ @SuppressWarnings("rawtypes")
+ private final Hashtable<Class<? extends Command>, CommandWrapper> map;
+
+ @SuppressWarnings("rawtypes")
+ private CitrixRequestWrapper() {
+ map = new Hashtable<Class<? extends Command>, CommandWrapper>();
+ init();
+ }
+
+ private void init() {
+ map.put(RebootRouterCommand.class, new CitrixRebootRouterCommandWrapper());
+ }
+
+ public static CitrixRequestWrapper getInstance() {
+ return instance;
+ }
+
+ @Override
+ public Answer execute(final Command command, final ServerResource serverResource) {
+ @SuppressWarnings("unchecked")
+ final CommandWrapper<Command, Answer, ServerResource> commandWrapper = map.get(command.getClass());
+
+ return commandWrapper.execute(command, serverResource);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a1e87782/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
new file mode 100644
index 0000000..aa4ebb9
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
@@ -0,0 +1,52 @@
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.RebootAnswer;
+import com.cloud.agent.api.RebootCommand;
+import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CitrixRequestWrapperTest {
+
+ @Mock
+ protected CitrixResourceBase citrixResourceBase;
+ @Mock
+ protected RebootAnswer rebootAnswer;
+
+ @Test
+ public void testWrapperInstance() {
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+ }
+
+ @Test
+ public void testExecuteRebootRouterCommand() {
+ final RebootRouterCommand rebootCommand = new RebootRouterCommand("", "");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ doReturn(rebootAnswer).when(citrixResourceBase).execute((RebootCommand)rebootCommand);
+ doReturn(false).when(rebootAnswer).getResult();
+
+ final Answer answer = wrapper.execute(rebootCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).execute((RebootCommand)rebootCommand);
+
+ assertFalse(rebootAnswer.getResult());
+ assertEquals(answer, rebootAnswer);
+ }
+}
\ No newline at end of file
[39/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Merge remote-tracking branch 'sbp/refactor/citrix_resource_base-REBASE'
This closes #137
Signed-off-by: Rohit Yadav <ro...@shapeblue.com>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3e287478
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3e287478
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3e287478
Branch: refs/heads/master
Commit: 3e2874788152cb3363450ccb40e54fa8d169e50e
Parents: c6416cb 57d0931
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Thu Apr 2 23:51:50 2015 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Thu Apr 2 23:52:09 2015 +0530
----------------------------------------------------------------------
api/src/com/cloud/agent/api/Answer.java | 14 +-
.../api/storage/AbstractDownloadCommand.java | 18 +-
.../storage/PrimaryStorageDownloadCommand.java | 25 +-
core/src/com/cloud/resource/CommandWrapper.java | 98 +
core/src/com/cloud/resource/RequestWrapper.java | 32 +
.../cloudstack/api/agent/test/AnswerTest.java | 8 +-
.../xenserver/resource/CitrixHelper.java | 28 +-
.../xenserver/resource/CitrixResourceBase.java | 9850 +++++++-----------
.../xenserver/resource/XcpOssResource.java | 103 +-
.../xenserver/resource/XcpServerResource.java | 40 +-
.../resource/XenServer56FP1Resource.java | 77 +-
.../xenserver/resource/XenServer56Resource.java | 218 +-
.../resource/XenServer56SP2Resource.java | 11 +-
.../resource/XenServer600Resource.java | 15 +-
.../resource/XenServer610Resource.java | 228 +-
.../resource/XenServer620Resource.java | 33 +-
.../resource/XenServer620SP1Resource.java | 82 +-
.../resource/XenServer650Resource.java | 26 +-
.../resource/XenServerStorageProcessor.java | 864 +-
.../resource/Xenserver625Resource.java | 59 +-
.../resource/Xenserver625StorageProcessor.java | 576 +-
.../hypervisor/xenserver/resource/XsHost.java | 212 +
.../xenserver/resource/XsLocalNetwork.java | 91 +
.../wrapper/CitrixAttachIsoCommandWrapper.java | 134 +
.../CitrixAttachVolumeCommandWrapper.java | 144 +
...trixCheckConsoleProxyLoadCommandWrapper.java | 38 +
.../CitrixCheckHealthCommandWrapper.java | 35 +
.../CitrixCheckNetworkCommandWrapper.java | 94 +
.../CitrixCheckOnHostCommandWrapper.java | 34 +
.../wrapper/CitrixCheckSshCommandWrapper.java | 63 +
...CitrixCheckVirtualMachineCommandWrapper.java | 48 +
.../CitrixCleanupNetworkRulesCmdWrapper.java | 54 +
...trixClusterVMMetaDataSyncCommandWrapper.java | 57 +
.../wrapper/CitrixCreateCommandWrapper.java | 82 +
.../CitrixCreateStoragePoolCommandWrapper.java | 57 +
.../CitrixCreateVMSnapshotCommandWrapper.java | 188 +
.../CitrixDeleteStoragePoolCommandWrapper.java | 52 +
.../CitrixDeleteVMSnapshotCommandWrapper.java | 90 +
.../wrapper/CitrixDestroyCommandWrapper.java | 83 +
.../CitrixGetHostStatsCommandWrapper.java | 48 +
.../CitrixGetStorageStatsCommandWrapper.java | 69 +
.../CitrixGetVmDiskStatsCommandWrapper.java | 34 +
.../wrapper/CitrixGetVmStatsCommandWrapper.java | 82 +
.../wrapper/CitrixGetVncPortCommandWrapper.java | 56 +
.../wrapper/CitrixMaintainCommandWrapper.java | 75 +
.../wrapper/CitrixMigrateCommandWrapper.java | 84 +
.../CitrixModifySshKeysCommandWrapper.java | 33 +
.../CitrixModifyStoragePoolCommandWrapper.java | 96 +
.../CitrixNetworkElementCommandWrapper.java | 35 +
...itrixNetworkRulesSystemVmCommandWrapper.java | 45 +
...NetworkRulesVmSecondaryIpCommandWrapper.java | 44 +
.../CitrixOvsCreateGreTunnelCommandWrapper.java | 67 +
.../CitrixOvsCreateTunnelCommandWrapper.java | 67 +
.../CitrixOvsDeleteFlowCommandWrapper.java | 62 +
.../CitrixOvsDestroyBridgeCommandWrapper.java | 53 +
.../CitrixOvsDestroyTunnelCommandWrapper.java | 58 +
.../CitrixOvsFetchInterfaceCommandWrapper.java | 71 +
.../CitrixOvsSetTagAndFlowCommandWrapper.java | 72 +
.../CitrixOvsSetupBridgeCommandWrapper.java | 45 +
...VpcPhysicalTopologyConfigCommandWrapper.java | 57 +
...OvsVpcRoutingPolicyConfigCommandWrapper.java | 57 +
.../CitrixPerformanceMonitorCommandWrapper.java | 41 +
.../wrapper/CitrixPingTestCommandWrapper.java | 47 +
.../wrapper/CitrixPlugNicCommandWrapper.java | 92 +
...CitrixPrepareForMigrationCommandWrapper.java | 61 +
...rixPrimaryStorageDownloadCommandWrapper.java | 83 +
.../wrapper/CitrixPvlanSetupCommandWrapper.java | 92 +
.../wrapper/CitrixReadyCommandWrapper.java | 75 +
.../wrapper/CitrixRebootCommandWrapper.java | 68 +
.../CitrixRebootRouterCommandWrapper.java | 52 +
.../resource/wrapper/CitrixRequestWrapper.java | 280 +
.../CitrixResizeVolumeCommandWrapper.java | 52 +
.../CitrixRevertToVMSnapshotCommandWrapper.java | 110 +
.../wrapper/CitrixScaleVmCommandWrapper.java | 106 +
.../CitrixSecurityGroupRulesCommandWrapper.java | 61 +
.../wrapper/CitrixSetupCommandWrapper.java | 200 +
.../wrapper/CitrixStartCommandWrapper.java | 210 +
.../wrapper/CitrixStopCommandWrapper.java | 173 +
.../wrapper/CitrixUnPlugNicCommandWrapper.java | 72 +
.../CitrixUpdateHostPasswordCommandWrapper.java | 34 +
.../CitrixUpgradeSnapshotCommandWrapper.java | 64 +
...trixWatchConsoleProxyLoadCommandWrapper.java | 38 +
.../XenServer56CheckOnHostCommandWrapper.java | 48 +
.../XenServer56FP1FenceCommandWrapper.java | 92 +
.../wrapper/XenServer56FenceCommandWrapper.java | 71 +
.../XenServer56NetworkUsageCommandWrapper.java | 102 +
.../xenserver/XenServerResourceNewBase.java | 75 +-
.../test/com/cloud/ha/XenServerFencerTest.java | 39 -
.../resource/CitrixResourceBaseTest.java | 190 -
.../wrapper/CitrixRequestWrapperTest.java | 1804 ++++
.../wrapper/XenServer56FP1WrapperTest.java | 49 +
.../wrapper/XenServer56WrapperTest.java | 161 +
.../wrapper/XenServer610WrapperTest.java | 56 +
.../wrapper/XenServer620WrapperTest.java | 35 +
94 files changed, 12287 insertions(+), 7717 deletions(-)
----------------------------------------------------------------------
[23/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring GetStorageStatsCommand and PrimaryStorageDownloadCommand to cope with the new design
Fix the NPE in the constructor that was never used
- Basic tests added for all changes
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/11d03368
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/11d03368
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/11d03368
Branch: refs/heads/master
Commit: 11d0336803048b156731da15239147e7f6b4d03a
Parents: ea374b6
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 18:04:39 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:29 2015 +0200
----------------------------------------------------------------------
.../api/storage/AbstractDownloadCommand.java | 18 ++---
.../storage/PrimaryStorageDownloadCommand.java | 25 ++----
.../xenserver/resource/CitrixResourceBase.java | 14 +---
.../CitrixGetStorageStatsCommandWrapper.java | 69 ++++++++++++++++
...rixPrimaryStorageDownloadCommandWrapper.java | 83 ++++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 4 +
.../wrapper/CitrixRequestWrapperTest.java | 40 ++++++++++
7 files changed, 217 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11d03368/core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java b/core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java
index 0bde5e3..0670eef 100644
--- a/core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java
+++ b/core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java
@@ -31,8 +31,8 @@ public abstract class AbstractDownloadCommand extends SsCommand {
protected AbstractDownloadCommand() {
}
- protected AbstractDownloadCommand(String name, String url, ImageFormat format, Long accountId) {
- assert (url != null);
+ protected AbstractDownloadCommand(final String name, String url, final ImageFormat format, final Long accountId) {
+ assert url != null;
url = url.replace('\\', '/');
this.url = url;
@@ -41,14 +41,14 @@ public abstract class AbstractDownloadCommand extends SsCommand {
this.name = name;
}
- protected AbstractDownloadCommand(AbstractDownloadCommand that) {
+ protected AbstractDownloadCommand(final AbstractDownloadCommand that) {
super(that);
- assert (that.url != null);
+ assert that.url != null;
- this.url = that.url.replace('\\', '/');
- this.format = that.format;
- this.accountId = that.accountId;
- this.name = that.name;
+ url = that.url.replace('\\', '/');
+ format = that.format;
+ accountId = that.accountId;
+ name = that.name;
}
public String getUrl() {
@@ -73,7 +73,7 @@ public abstract class AbstractDownloadCommand extends SsCommand {
}
public void setUrl(String url) {
- assert (url != null);
+ assert url != null;
url = url.replace('\\', '/');
this.url = url;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11d03368/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
index f8b88c9..ce8ed21 100644
--- a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
+++ b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
@@ -37,22 +37,13 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
String primaryStorageUrl;
protected PrimaryStorageDownloadCommand() {
-
- }
-
- public PrimaryStorageDownloadCommand(String url, StoragePool pool, int wait) {
- super(null, url, null, null);
- this.poolId = pool.getId();
- this.poolUuid = pool.getUuid();
- this.primaryPool = new StorageFilerTO(pool);
- setWait(wait);
}
- public PrimaryStorageDownloadCommand(String name, String url, ImageFormat format, long accountId, StoragePool pool, int wait) {
+ public PrimaryStorageDownloadCommand(final String name, final String url, final ImageFormat format, final long accountId, final StoragePool pool, final int wait) {
super(name, url, format, accountId);
- this.poolId = pool.getId();
- this.poolUuid = pool.getUuid();
- this.primaryPool = new StorageFilerTO(pool);
+ poolId = pool.getId();
+ poolUuid = pool.getUuid();
+ primaryPool = new StorageFilerTO(pool);
setWait(wait);
}
@@ -68,15 +59,15 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
return primaryPool;
}
- public void setLocalPath(String path) {
- this.localPath = path;
+ public void setLocalPath(final String path) {
+ localPath = path;
}
public String getLocalPath() {
return localPath;
}
- public void setSecondaryStorageUrl(String url) {
+ public void setSecondaryStorageUrl(final String url) {
secondaryStorageUrl = url;
}
@@ -84,7 +75,7 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
return secondaryStorageUrl;
}
- public void setPrimaryStorageUrl(String url) {
+ public void setPrimaryStorageUrl(final String url) {
primaryStorageUrl = url;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11d03368/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 3c55a88..c412b54 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
@@ -441,12 +441,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == AttachVolumeCommand.class) {
- return execute((AttachVolumeCommand)cmd);
- } else if (clazz == AttachIsoCommand.class) {
- return execute((AttachIsoCommand) cmd);
- } else if (clazz == UpgradeSnapshotCommand.class) {
- return execute((UpgradeSnapshotCommand)cmd);
} else if (clazz == GetStorageStatsCommand.class) {
return execute((GetStorageStatsCommand)cmd);
} else if (clazz == PrimaryStorageDownloadCommand.class) {
@@ -2751,7 +2745,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- String copy_vhd_from_secondarystorage(final Connection conn, final String mountpoint, final String sruuid, final int wait) {
+ public String copyVhdFromSecondaryStorage(final Connection conn, final String mountpoint, final String sruuid, final int wait) {
final String nameLabel = "cloud-" + UUID.randomUUID().toString();
final String results =
callHostPluginAsync(conn, "vmopspremium", "copy_vhd_from_secondarystorage", wait, "mountpoint", mountpoint, "sruuid", sruuid, "namelabel", nameLabel);
@@ -2794,7 +2788,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
final String pUuid = poolsr.getUuid(conn);
final boolean isISCSI = IsISCSI(poolsr.getType(conn));
- final String uuid = copy_vhd_from_secondarystorage(conn, tmplpath, pUuid, wait);
+ final String uuid = copyVhdFromSecondaryStorage(conn, tmplpath, pUuid, wait);
final VDI tmpl = getVDIbyUuid(conn, uuid);
final VDI snapshotvdi = tmpl.snapshot(conn, new HashMap<String, String>());
final String snapshotUuid = snapshotvdi.getUuid(conn);
@@ -6589,7 +6583,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- boolean IsISCSI(final String type) {
+ public boolean IsISCSI(final String type) {
return SRType.LVMOHBA.equals(type) || SRType.LVMOISCSI.equals(type) || SRType.LVM.equals(type);
}
@@ -6838,7 +6832,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return success;
}
- protected String getVhdParent(final Connection conn, final String primaryStorageSRUuid, final String snapshotUuid, final Boolean isISCSI) {
+ public String getVhdParent(final Connection conn, final String primaryStorageSRUuid, final String snapshotUuid, final Boolean isISCSI) {
final String parentUuid =
callHostPlugin(conn, "vmopsSnapshot", "getVhdParent", "primaryStorageSRUuid", primaryStorageSRUuid, "snapshotUuid", snapshotUuid, "isISCSI",
isISCSI.toString());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11d03368/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetStorageStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetStorageStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetStorageStatsCommandWrapper.java
new file mode 100644
index 0000000..e0001cc
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetStorageStatsCommandWrapper.java
@@ -0,0 +1,69 @@
+//
+// 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 org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetStorageStatsAnswer;
+import com.cloud.agent.api.GetStorageStatsCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixGetStorageStatsCommandWrapper extends CommandWrapper<GetStorageStatsCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixGetStorageStatsCommandWrapper.class);
+
+ @Override
+ public Answer execute(final GetStorageStatsCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Set<SR> srs = SR.getByNameLabel(conn, command.getStorageId());
+ if (srs.size() != 1) {
+ final String msg = "There are " + srs.size() + " storageid: " + command.getStorageId();
+ s_logger.warn(msg);
+ return new GetStorageStatsAnswer(command, msg);
+ }
+ final SR sr = srs.iterator().next();
+ sr.scan(conn);
+ final long capacity = sr.getPhysicalSize(conn);
+ final long used = sr.getPhysicalUtilisation(conn);
+ return new GetStorageStatsAnswer(command, capacity, used);
+ } catch (final XenAPIException e) {
+ final String msg = "GetStorageStats Exception:" + e.toString() + "host:" + citrixResourceBase.getHost().getUuid() + "storageid: " + command.getStorageId();
+ s_logger.warn(msg);
+ return new GetStorageStatsAnswer(command, msg);
+ } catch (final XmlRpcException e) {
+ final String msg = "GetStorageStats Exception:" + e.getMessage() + "host:" + citrixResourceBase.getHost().getUuid() + "storageid: " + command.getStorageId();
+ s_logger.warn(msg);
+ return new GetStorageStatsAnswer(command, msg);
+ } catch (final Exception e) {
+ final String msg = "GetStorageStats Exception:" + e.getMessage() + "host:" + citrixResourceBase.getHost().getUuid() + "storageid: " + command.getStorageId();
+ s_logger.warn(msg);
+ return new GetStorageStatsAnswer(command, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11d03368/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrimaryStorageDownloadCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrimaryStorageDownloadCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrimaryStorageDownloadCommandWrapper.java
new file mode 100644
index 0000000..2705207
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrimaryStorageDownloadCommandWrapper.java
@@ -0,0 +1,83 @@
+//
+// 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.net.URI;
+import java.util.HashMap;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
+import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.VDI;
+
+public final class CitrixPrimaryStorageDownloadCommandWrapper extends CommandWrapper<PrimaryStorageDownloadCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixPrimaryStorageDownloadCommandWrapper.class);
+
+ @Override
+ public Answer execute(final PrimaryStorageDownloadCommand command, final CitrixResourceBase citrixResourceBase) {
+ final String tmplturl = command.getUrl();
+ final String poolName = command.getPoolUuid();
+ final int wait = command.getWait();
+ try {
+ final URI uri = new URI(tmplturl);
+ final String tmplpath = uri.getHost() + ":" + uri.getPath();
+ final Connection conn = citrixResourceBase.getConnection();
+ SR poolsr = null;
+ final Set<SR> srs = SR.getByNameLabel(conn, poolName);
+ if (srs.size() != 1) {
+ final String msg = "There are " + srs.size() + " SRs with same name: " + poolName;
+ s_logger.warn(msg);
+ return new PrimaryStorageDownloadAnswer(msg);
+ } else {
+ poolsr = srs.iterator().next();
+ }
+ final String pUuid = poolsr.getUuid(conn);
+ final boolean isISCSI = citrixResourceBase.IsISCSI(poolsr.getType(conn));
+ final String uuid = citrixResourceBase.copyVhdFromSecondaryStorage(conn, tmplpath, pUuid, wait);
+ final VDI tmpl = citrixResourceBase.getVDIbyUuid(conn, uuid);
+ final VDI snapshotvdi = tmpl.snapshot(conn, new HashMap<String, String>());
+ final String snapshotUuid = snapshotvdi.getUuid(conn);
+ snapshotvdi.setNameLabel(conn, "Template " + command.getName());
+ final String parentuuid = citrixResourceBase.getVhdParent(conn, pUuid, snapshotUuid, isISCSI);
+ final VDI parent = citrixResourceBase.getVDIbyUuid(conn, parentuuid);
+ final Long phySize = parent.getPhysicalUtilisation(conn);
+ tmpl.destroy(conn);
+ poolsr.scan(conn);
+ try {
+ Thread.sleep(5000);
+ } catch (final Exception e) {
+ }
+ return new PrimaryStorageDownloadAnswer(snapshotvdi.getUuid(conn), phySize);
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + " on host:" + citrixResourceBase.getHost().getUuid() + " for template: " + tmplturl + " due to "
+ + e.toString();
+ s_logger.warn(msg, e);
+ return new PrimaryStorageDownloadAnswer(msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11d03368/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 1deefea..c31c340 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
@@ -30,6 +30,7 @@ import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.DeleteStoragePoolCommand;
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.MigrateCommand;
@@ -44,6 +45,7 @@ import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
+import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.RequestWrapper;
@@ -89,6 +91,8 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(AttachVolumeCommand.class, new CitrixAttachVolumeCommandWrapper());
map.put(AttachIsoCommand.class, new CitrixAttachIsoCommandWrapper());
map.put(UpgradeSnapshotCommand.class, new CitrixUpgradeSnapshotCommandWrapper());
+ map.put(GetStorageStatsCommand.class, new CitrixGetStorageStatsCommandWrapper());
+ map.put(PrimaryStorageDownloadCommand.class, new CitrixPrimaryStorageDownloadCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11d03368/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 d5f44e0..1873842 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
@@ -25,6 +25,7 @@ import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.DeleteStoragePoolCommand;
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.MigrateCommand;
@@ -41,11 +42,14 @@ import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
+import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
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.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;
@@ -400,6 +404,42 @@ public class CitrixRequestWrapperTest {
assertTrue(answer.getResult());
}
+
+ @Test
+ public void testGetStorageStatsCommand() {
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+ final DataStoreTO store = Mockito.mock(DataStoreTO.class);
+
+ final GetStorageStatsCommand storageStatsCommand = new GetStorageStatsCommand(store);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+
+ final Answer answer = wrapper.execute(storageStatsCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testPrimaryStorageDownloadCommand() {
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+
+ final PrimaryStorageDownloadCommand storageDownloadCommand = new PrimaryStorageDownloadCommand("Test", "http://127.0.0.1", ImageFormat.VHD, 1l, poolVO, 200);
+
+ 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());
+ }
}
class NotAValidCommand extends Command {
[10/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/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 b284768..850cbb3 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
@@ -349,8 +349,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return true;
}
- protected boolean cleanupHaltedVms(final Connection conn) throws XenAPIException, XmlRpcException {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ public boolean cleanupHaltedVms(final Connection conn) throws XenAPIException, XmlRpcException {
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final Map<VM, VM.Record> vms = VM.getAllRecords(conn);
boolean success = true;
if(vms != null && !vms.isEmpty()) {
@@ -397,19 +397,19 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected boolean pingXAPI() {
final Connection conn = getConnection();
try {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
if( !host.getEnabled(conn) ) {
- s_logger.debug("Host " + _host.ip + " is not enabled!");
+ s_logger.debug("Host " + _host.getIp() + " is not enabled!");
return false;
}
} catch (final Exception e) {
- s_logger.debug("cannot get host enabled status, host " + _host.ip + " due to " + e.toString(), e);
+ s_logger.debug("cannot get host enabled status, host " + _host.getIp() + " due to " + e.toString(), e);
return false;
}
try {
callHostPlugin(conn, "echo", "main");
} catch (final Exception e) {
- s_logger.debug("cannot ping host " + _host.ip + " due to " + e.toString(), e);
+ s_logger.debug("cannot ping host " + _host.getIp() + " due to " + e.toString(), e);
return false;
}
return true;
@@ -417,7 +417,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected String logX(final XenAPIObject obj, final String msg) {
- return new StringBuilder("Host ").append(_host.ip).append(" ").append(obj.toWireString()).append(": ").append(msg).toString();
+ return new StringBuilder("Host ").append(_host.getIp()).append(" ").append(obj.toWireString()).append(": ").append(msg).toString();
}
@Override
@@ -554,7 +554,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
cmdline = cmdline.replaceAll(";", "\\\\;");
try {
s_logger.debug("Executing command in VR: " + cmdline);
- result = SshHelper.sshExecute(_host.ip, 22, _username, null, _password.peek(), cmdline,
+ result = SshHelper.sshExecute(_host.getIp(), 22, _username, null, _password.peek(), cmdline,
60000, 60000, timeout * 1000);
} catch (final Exception e) {
return new ExecutionResult(false, e.getMessage());
@@ -573,11 +573,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final Connection conn = getConnection();
final String hostPath = "/tmp/";
- s_logger.debug("Copying VR with ip " + routerIp +" config file into host "+ _host.ip );
+ s_logger.debug("Copying VR with ip " + routerIp +" config file into host "+ _host.getIp() );
try {
- SshHelper.scpTo(_host.ip, 22, _username, null, _password.peek(), hostPath, content.getBytes(Charset.defaultCharset()), filename, null);
+ SshHelper.scpTo(_host.getIp(), 22, _username, null, _password.peek(), hostPath, content.getBytes(Charset.defaultCharset()), filename, null);
} catch (final Exception e) {
- s_logger.warn("scp VR config file into host " + _host.ip + " failed with exception " + e.getMessage().toString());
+ s_logger.warn("scp VR config file into host " + _host.getIp() + " failed with exception " + e.getMessage().toString());
}
final String rc = callHostPlugin(conn, "vmops", "createFileInDomr", "domrip", routerIp, "srcfilepath", hostPath + filename, "dstfilepath", path);
@@ -652,7 +652,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_logger.trace("callHostPlugin executing for command " + cmd
+ " with " + getArgsString(args));
}
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
task = host.callPluginAsync(conn, plugin, cmd, args);
// poll every 1 seconds
waitForTask(conn, task, 1000, timeout);
@@ -678,7 +678,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task.destroy(conn);
} catch (final Exception e1) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + e1.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
}
}
@@ -706,14 +706,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
// weight based allocation
- cpuWeight = (int)(speed * 0.99 / _host.speed * _maxWeight);
+ cpuWeight = (int)(speed * 0.99 / _host.getSpeed() * _maxWeight);
if (cpuWeight > _maxWeight) {
cpuWeight = _maxWeight;
}
if (vmSpec.getLimitCpuUse()) {
long utilization = 0; // max CPU cap, default is unlimited
- utilization = (int)(vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.speed * 100);
+ utilization = (int)(vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.getSpeed() * 100);
//vm.addToVCPUsParamsLive(conn, "cap", Long.toString(utilization)); currently xenserver doesnot support Xapi to add VCPUs params live.
callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", Long.toString(utilization), "vmname", vmSpec.getName());
}
@@ -728,11 +728,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
final Connection conn = getConnection();
final Set<VM> vms = VM.getByNameLabel(conn, vmName);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
// If DMC is not enable then don't execute this command.
if (!isDmcEnabled(conn, host)) {
- throw new CloudRuntimeException("Unable to scale the vm: " + vmName + " as DMC - Dynamic memory control is not enabled for the XenServer:" + _host.uuid +
+ throw new CloudRuntimeException("Unable to scale the vm: " + vmName + " as DMC - Dynamic memory control is not enabled for the XenServer:" + _host.getUuid() +
" ,check your license and hypervisor version.");
}
@@ -743,13 +743,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final VM.Record vmr = vm.getRecord(conn);
if (vmr.powerState == VmPowerState.HALTED ||
- vmr.powerState == VmPowerState.RUNNING && !isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(_host.uuid)) {
+ vmr.powerState == VmPowerState.RUNNING && !isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(_host.getUuid())) {
iter.remove();
}
}
if (vms.size() == 0) {
- s_logger.info("No running VM " + vmName + " exists on XenServer" + _host.uuid);
+ s_logger.info("No running VM " + vmName + " exists on XenServer" + _host.getUuid());
return new ScaleVmAnswer(cmd, false, "VM does not exist");
}
@@ -812,7 +812,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
// call plugin to execute revert
- revertToSnapshot(conn, vmSnapshot, vmName, vm.getUuid(conn), snapshotMemory, _host.uuid);
+ revertToSnapshot(conn, vmSnapshot, vmName, vm.getUuid(conn), snapshotMemory, _host.getUuid());
vm = getVM(conn, vmName);
final Set<VBD> vbds = vm.getVBDs(conn);
final Map<String, VDI> vdiMap = new HashMap<String, VDI>();
@@ -875,17 +875,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (type == TrafficType.Guest) {
- return new XsLocalNetwork(Network.getByUuid(conn, _host.guestNetwork), null, PIF.getByUuid(conn, _host.guestPif), null);
+ return new XsLocalNetwork(Network.getByUuid(conn, _host.getGuestNetwork()), null, PIF.getByUuid(conn, _host.getGuestPif()), null);
} else if (type == TrafficType.Control) {
setupLinkLocalNetwork(conn);
- return new XsLocalNetwork(Network.getByUuid(conn, _host.linkLocalNetwork));
+ return new XsLocalNetwork(Network.getByUuid(conn, _host.getLinkLocalNetwork()));
} else if (type == TrafficType.Management) {
- return new XsLocalNetwork(Network.getByUuid(conn, _host.privateNetwork), null, PIF.getByUuid(conn, _host.privatePif), null);
+ return new XsLocalNetwork(Network.getByUuid(conn, _host.getPrivateNetwork()), null, PIF.getByUuid(conn, _host.getPrivatePif()), null);
} else if (type == TrafficType.Public) {
- return new XsLocalNetwork(Network.getByUuid(conn, _host.publicNetwork), null, PIF.getByUuid(conn, _host.publicPif), null);
+ return new XsLocalNetwork(Network.getByUuid(conn, _host.getPublicNetwork()), null, PIF.getByUuid(conn, _host.getPublicPif()), null);
} else if (type == TrafficType.Storage) {
/* TrafficType.Storage is for secondary storage, while storageNetwork1 is for primary storage, we need better name here */
- return new XsLocalNetwork(Network.getByUuid(conn, _host.storageNetwork1), null, PIF.getByUuid(conn, _host.storagePif1), null);
+ return new XsLocalNetwork(Network.getByUuid(conn, _host.getStorageNetwork1()), null, PIF.getByUuid(conn, _host.getStoragePif1()), null);
}
throw new CloudRuntimeException("Unsupported network type: " + type);
@@ -893,7 +893,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
private synchronized Network setupvSwitchNetwork(final Connection conn) {
try {
- if (_host.vswitchNetwork == null) {
+ if (_host.getVswitchNetwork() == null) {
Network vswitchNw = null;
final Network.Record rec = new Network.Record();
final String nwName = Networks.BroadcastScheme.VSwitch.toString();
@@ -906,9 +906,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
} else {
vswitchNw = networks.iterator().next();
}
- _host.vswitchNetwork = vswitchNw;
+ _host.setVswitchNetwork(vswitchNw);
}
- return _host.vswitchNetwork;
+ return _host.getVswitchNetwork();
} catch (final BadServerResponse e) {
s_logger.error("Failed to setup vswitch network", e);
} catch (final XenAPIException e) {
@@ -1152,12 +1152,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
for (final PBD pbd : pbds) {
final PBD.Record pbdr = pbd.getRecord(conn);
- if (pbdr.host.getUuid(conn).equals(_host.uuid)) {
+ if (pbdr.host.getUuid(conn).equals(_host.getUuid())) {
return;
}
}
sr.setShared(conn, true);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final PBD.Record pbdr = pbds.iterator().next().getRecord(conn);
pbdr.host = host;
pbdr.uuid = "";
@@ -1383,14 +1383,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
int utilization = 0; // max CPU cap, default is unlimited
// weight based allocation, CPU weight is calculated per VCPU
- cpuWeight = (int)(speed * 0.99 / _host.speed * _maxWeight);
+ cpuWeight = (int)(speed * 0.99 / _host.getSpeed() * _maxWeight);
if (cpuWeight > _maxWeight) {
cpuWeight = _maxWeight;
}
if (vmSpec.getLimitCpuUse()) {
// CPU cap is per VM, so need to assign cap based on the number of vcpus
- utilization = (int)(vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.speed * 100);
+ utilization = (int)(vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.getSpeed() * 100);
}
vcpuParams.put("weight", Integer.toString(cpuWeight));
@@ -1549,7 +1549,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected VBD createPatchVbd(final Connection conn, final String vmName, final VM vm) throws XmlRpcException, XenAPIException {
- if (_host.systemvmisouuid == null) {
+ if (_host.getSystemvmisouuid() == null) {
final Set<SR> srs = SR.getByNameLabel(conn, "XenServer Tools");
if (srs.size() != 1) {
throw new CloudRuntimeException("There are " + srs.size() + " SRs with name XenServer Tools");
@@ -1559,16 +1559,16 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final SR.Record srr = sr.getRecord(conn);
- if (_host.systemvmisouuid == null) {
+ if (_host.getSystemvmisouuid() == null) {
for (final VDI vdi : srr.VDIs) {
final VDI.Record vdir = vdi.getRecord(conn);
if (vdir.nameLabel.contains("systemvm.iso")) {
- _host.systemvmisouuid = vdir.uuid;
+ _host.setSystemvmisouuid(vdir.uuid);
break;
}
}
}
- if (_host.systemvmisouuid == null) {
+ if (_host.getSystemvmisouuid() == null) {
throw new CloudRuntimeException("can not find systemvmiso");
}
}
@@ -1581,12 +1581,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
cdromVBDR.mode = Types.VbdMode.RO;
cdromVBDR.type = Types.VbdType.CD;
final VBD cdromVBD = VBD.create(conn, cdromVBDR);
- cdromVBD.insert(conn, VDI.getByUuid(conn, _host.systemvmisouuid));
+ cdromVBD.insert(conn, VDI.getByUuid(conn, _host.getSystemvmisouuid()));
return cdromVBD;
}
- protected void destroyPatchVbd(final Connection conn, final String vmName) throws XmlRpcException, XenAPIException {
+ public void destroyPatchVbd(final Connection conn, final String vmName) throws XmlRpcException, XenAPIException {
try {
if (!vmName.startsWith("r-") && !vmName.startsWith("s-") && !vmName.startsWith("v-")) {
return;
@@ -1763,7 +1763,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
s_logger.debug("1. The VM " + vmName + " is in Starting state.");
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
vm = createVmFromTemplate(conn, vmSpec, host);
final GPUDeviceTO gpuDevice = vmSpec.getGpuDevice();
@@ -1972,7 +1972,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
private boolean doPingTest(final Connection conn, final String computingHostIp) {
- final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
+ final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
try {
sshConnection.connect(null, 60000, 60000);
if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
@@ -1981,7 +1981,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final String cmd = "ping -c 2 " + computingHostIp;
if (!SSHCmdHelper.sshExecuteCmd(sshConnection, cmd)) {
- throw new CloudRuntimeException("Cannot ping host " + computingHostIp + " from host " + _host.ip);
+ throw new CloudRuntimeException("Cannot ping host " + computingHostIp + " from host " + _host.getIp());
}
return true;
} catch (final Exception e) {
@@ -2026,7 +2026,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final Connection conn = getConnection();
try {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
// remove all tags cloud stack
final Host.Record hr = host.getRecord(conn);
final Iterator<String> it = hr.tags.iterator();
@@ -2441,7 +2441,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected Document getStatsRawXML(final Connection conn, final boolean host) {
final Date currentDate = new Date();
- String urlStr = "http://" + _host.ip + "/rrd_updates?";
+ String urlStr = "http://" + _host.getIp() + "/rrd_updates?";
urlStr += "session_id=" + conn.getSessionReference();
urlStr += "&host=" + (host ? "true" : "false");
urlStr += "&cf=" + _consolidationFunction;
@@ -2605,7 +2605,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_logger.error("Failed to get host uuid for host " + host.toWireString(), e);
}
- if (host_uuid.equalsIgnoreCase(_host.uuid)) {
+ if (host_uuid.equalsIgnoreCase(_host.getUuid())) {
vmStates.put(
record.nameLabel,
new HostVmStateReportEntry(convertToPowerState(ps), host_uuid)
@@ -2832,7 +2832,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
return new PrimaryStorageDownloadAnswer(snapshotvdi.getUuid(conn), phySize);
} catch (final Exception e) {
- final String msg = "Catch Exception " + e.getClass().getName() + " on host:" + _host.uuid + " for template: " + tmplturl + " due to " + e.toString();
+ final String msg = "Catch Exception " + e.getClass().getName() + " on host:" + _host.getUuid() + " for template: " + tmplturl + " due to " + e.toString();
s_logger.warn(msg, e);
return new PrimaryStorageDownloadAnswer(msg);
}
@@ -2957,7 +2957,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
if (dsthost == null) {
- final String msg = "Migration failed due to unable to find host " + ipaddr + " in XenServer pool " + _host.pool;
+ final String msg = "Migration failed due to unable to find host " + ipaddr + " in XenServer pool " + _host.getPool();
s_logger.warn(msg);
return new MigrateAnswer(cmd, false, msg, null);
}
@@ -2982,7 +2982,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
protected Pair<VM, VM.Record> getControlDomain(final Connection conn) throws XenAPIException, XmlRpcException {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
Set<VM> vms = null;
vms = host.getResidentVMs(conn);
for (final VM vm : vms) {
@@ -2994,7 +2994,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("Com'on no control domain? What the crap?!#@!##$@");
}
- protected void umountSnapshotDir(final Connection conn, final Long dcId) {
+ public void umountSnapshotDir(final Connection conn, final Long dcId) {
try {
callHostPlugin(conn, "vmopsSnapshot", "unmountSnapshotsDir", "dcId", dcId.toString());
} catch (final Exception e) {
@@ -3013,7 +3013,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
setupLinkLocalNetwork(conn);
// try to destroy CD-ROM device for all system VMs on this host
try {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final Set<VM> vms = host.getResidentVMs(conn);
for (final VM vm : vms) {
destroyPatchVbd(conn, vm.getNameLabel(conn));
@@ -3240,11 +3240,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("Reboot VM catch HandleInvalid and VM is not in RUNNING state");
}
} catch (final XenAPIException e) {
- s_logger.debug("Unable to Clean Reboot VM(" + vmName + ") on host(" + _host.uuid + ") due to " + e.toString() + ", try hard reboot");
+ s_logger.debug("Unable to Clean Reboot VM(" + vmName + ") on host(" + _host.getUuid() + ") due to " + e.toString() + ", try hard reboot");
try {
vm.hardReboot(conn);
} catch (final Exception e1) {
- final String msg = "Unable to hard Reboot VM(" + vmName + ") on host(" + _host.uuid + ") due to " + e.toString();
+ final String msg = "Unable to hard Reboot VM(" + vmName + ") on host(" + _host.getUuid() + ") due to " + e.toString();
s_logger.warn(msg, e1);
throw new CloudRuntimeException(msg);
}
@@ -3253,7 +3253,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task.destroy(conn);
} catch (final Exception e1) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + e1.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
}
}
@@ -3288,14 +3288,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("Shutdown VM catch HandleInvalid and VM is not in HALTED state");
}
} catch (final XenAPIException e) {
- s_logger.debug("Unable to cleanShutdown VM(" + vmName + ") on host(" + _host.uuid + ") due to " + e.toString());
+ s_logger.debug("Unable to cleanShutdown VM(" + vmName + ") on host(" + _host.getUuid() + ") due to " + e.toString());
try {
VmPowerState state = vm.getPowerState(conn);
if (state == VmPowerState.RUNNING) {
try {
vm.hardShutdown(conn);
} catch (final Exception e1) {
- s_logger.debug("Unable to hardShutdown VM(" + vmName + ") on host(" + _host.uuid + ") due to " + e.toString());
+ s_logger.debug("Unable to hardShutdown VM(" + vmName + ") on host(" + _host.getUuid() + ") due to " + e.toString());
state = vm.getPowerState(conn);
if (state == VmPowerState.RUNNING) {
forceShutdownVM(conn, vm);
@@ -3310,7 +3310,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException(msg);
}
} catch (final Exception e1) {
- final String msg = "Unable to hardShutdown VM(" + vmName + ") on host(" + _host.uuid + ") due to " + e.toString();
+ final String msg = "Unable to hardShutdown VM(" + vmName + ") on host(" + _host.getUuid() + ") due to " + e.toString();
s_logger.warn(msg, e1);
throw new CloudRuntimeException(msg);
}
@@ -3319,7 +3319,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task.destroy(conn);
} catch (final Exception e1) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + e1.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
}
}
@@ -3349,7 +3349,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("Start VM " + vmName + " catch BadAsyncResult and VM is not in RUNNING state");
}
} catch (final XenAPIException e) {
- final String msg = "Unable to start VM(" + vmName + ") on host(" + _host.uuid + ") due to " + e.toString();
+ final String msg = "Unable to start VM(" + vmName + ") on host(" + _host.getUuid() + ") due to " + e.toString();
s_logger.warn(msg, e);
throw new CloudRuntimeException(msg);
} finally {
@@ -3357,7 +3357,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task.destroy(conn);
} catch (final Exception e1) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + e1.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
}
}
@@ -3382,7 +3382,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("migrate VM catch HandleInvalid and VM is not running on dest host");
}
} catch (final XenAPIException e) {
- final String msg = "Unable to migrate VM(" + vmName + ") from host(" + _host.uuid + ")";
+ final String msg = "Unable to migrate VM(" + vmName + ") from host(" + _host.getUuid() + ")";
s_logger.warn(msg, e);
throw new CloudRuntimeException(msg);
} finally {
@@ -3390,7 +3390,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task.destroy(conn);
} catch (final Exception e1) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + e1.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
}
}
@@ -3413,7 +3413,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task.destroy(conn);
} catch (final Exception e) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + e.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e.toString());
}
}
}
@@ -3430,7 +3430,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (s_logger.isTraceEnabled()) {
s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
}
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
task = host.callPluginAsync(conn, plugin, cmd, args);
// poll every 1 seconds
waitForTask(conn, task, 1000, timeout);
@@ -3452,7 +3452,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
task.destroy(conn);
} catch (final Exception e1) {
- s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + e1.toString());
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
}
}
@@ -3477,7 +3477,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (isRefNull(vmr.residentOn)) {
continue;
}
- if (vmr.residentOn.getUuid(conn).equals(_host.uuid)) {
+ if (vmr.residentOn.getUuid(conn).equals(_host.getUuid())) {
continue;
}
iter.remove();
@@ -3495,8 +3495,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new StopAnswer(cmd, msg, false);
}
- if (vmr.powerState == VmPowerState.RUNNING && !isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(_host.uuid)) {
- final String msg = "Stop Vm " + vmName + " failed due to this vm is not running on this host: " + _host.uuid + " but host:" + vmr.residentOn.getUuid(conn);
+ if (vmr.powerState == VmPowerState.RUNNING && !isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(_host.getUuid())) {
+ final String msg = "Stop Vm " + vmName + " failed due to this vm is not running on this host: " + _host.getUuid() + " but host:" + vmr.residentOn.getUuid(conn);
s_logger.warn(msg);
return new StopAnswer(cmd, msg, platformstring, false);
}
@@ -3683,7 +3683,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (s_logger.isTraceEnabled()) {
s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
}
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final String result = host.callPlugin(conn, plugin, cmd, args);
if (s_logger.isTraceEnabled()) {
s_logger.trace("callHostPlugin Result: " + result);
@@ -3718,14 +3718,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected XsLocalNetwork getManagementNetwork(final Connection conn) throws XmlRpcException, XenAPIException {
PIF mgmtPif = null;
PIF.Record mgmtPifRec = null;
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
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(_host.uuid)
+ new StringBuilder("Unsupported configuration. Management network is on a VLAN. host=").append(_host.getUuid())
.append("; pif=")
.append(rec.uuid)
.append("; vlan=")
@@ -3743,14 +3743,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
if (mgmtPif == null) {
- final String msg = "Unable to find management network for " + _host.uuid;
+ final String msg = "Unable to find management network for " + _host.getUuid();
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
}
final Bond bond = mgmtPifRec.bondSlaveOf;
if (!isRefNull(bond)) {
final String msg =
- "Management interface is on slave(" + mgmtPifRec.uuid + ") of bond(" + bond.getUuid(conn) + ") on host(" + _host.uuid +
+ "Management interface is on slave(" + mgmtPifRec.uuid + ") of bond(" + bond.getUuid(conn) + ") on host(" + _host.getUuid() +
"), please move management interface to bond!";
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
@@ -4020,7 +4020,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (vlanNic == null) { // Can't find it, then create it.
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Creating VLAN network for " + tag + " on host " + _host.ip);
+ s_logger.debug("Creating VLAN network for " + tag + " on host " + _host.getIp());
}
final Network.Record nwr = new Network.Record();
nwr.nameLabel = newName;
@@ -4042,7 +4042,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Creating VLAN " + tag + " on host " + _host.ip + " on device " + nPifr.device);
+ s_logger.debug("Creating VLAN " + tag + " on host " + _host.getIp() + " on device " + nPifr.device);
}
final VLAN vlan = VLAN.create(conn, nPif, tag, vlanNetwork);
if (vlan != null) {
@@ -4072,7 +4072,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
for (final PBD pbd : pbds) {
final Host host = pbd.getHost(conn);
- if (!isRefNull(host) && host.getUuid(conn).equals(_host.uuid)) {
+ if (!isRefNull(host) && host.getUuid(conn).equals(_host.getUuid())) {
if (!pbd.getCurrentlyAttached(conn)) {
pbd.plug(conn);
}
@@ -4085,10 +4085,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
} catch (final XenAPIException e) {
- final String msg = "Unable to get local LVMSR in host:" + _host.uuid + e.toString();
+ final String msg = "Unable to get local LVMSR in host:" + _host.getUuid() + e.toString();
s_logger.warn(msg);
} catch (final XmlRpcException e) {
- final String msg = "Unable to get local LVMSR in host:" + _host.uuid + e.getCause();
+ final String msg = "Unable to get local LVMSR in host:" + _host.getUuid() + e.getCause();
s_logger.warn(msg);
}
return null;
@@ -4107,7 +4107,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
for (final PBD pbd : pbds) {
final Host host = pbd.getHost(conn);
- if (!isRefNull(host) && host.getUuid(conn).equals(_host.uuid)) {
+ if (!isRefNull(host) && host.getUuid(conn).equals(_host.getUuid())) {
if (!pbd.getCurrentlyAttached(conn)) {
pbd.plug(conn);
}
@@ -4120,10 +4120,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
} catch (final XenAPIException e) {
- final String msg = "Unable to get local EXTSR in host:" + _host.uuid + e.toString();
+ final String msg = "Unable to get local EXTSR in host:" + _host.getUuid() + e.toString();
s_logger.warn(msg);
} catch (final XmlRpcException e) {
- final String msg = "Unable to get local EXTSR in host:" + _host.uuid + e.getCause();
+ final String msg = "Unable to get local EXTSR in host:" + _host.getUuid() + e.getCause();
s_logger.warn(msg);
}
return null;
@@ -4133,30 +4133,30 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final SR lvmsr = getLocalLVMSR(conn);
if (lvmsr != null) {
try {
- _host.localSRuuid = lvmsr.getUuid(conn);
+ _host.setLocalSRuuid(lvmsr.getUuid(conn));
final String lvmuuid = lvmsr.getUuid(conn);
final long cap = lvmsr.getPhysicalSize(conn);
if (cap > 0) {
final long avail = cap - lvmsr.getPhysicalUtilisation(conn);
lvmsr.setNameLabel(conn, lvmuuid);
- final String name = "Cloud Stack Local LVM Storage Pool for " + _host.uuid;
+ final String name = "Cloud Stack Local LVM Storage Pool for " + _host.getUuid();
lvmsr.setNameDescription(conn, name);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final String address = host.getAddress(conn);
final StoragePoolInfo pInfo = new StoragePoolInfo(lvmuuid, address, SRType.LVM.toString(), SRType.LVM.toString(), StoragePoolType.LVM, cap, avail);
final StartupStorageCommand cmd = new StartupStorageCommand();
cmd.setPoolInfo(pInfo);
- cmd.setGuid(_host.uuid);
+ cmd.setGuid(_host.getUuid());
cmd.setDataCenter(Long.toString(_dcId));
cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL);
return cmd;
}
} catch (final XenAPIException e) {
- final String msg = "build local LVM info err in host:" + _host.uuid + e.toString();
+ final String msg = "build local LVM info err in host:" + _host.getUuid() + e.toString();
s_logger.warn(msg);
} catch (final XmlRpcException e) {
- final String msg = "build local LVM info err in host:" + _host.uuid + e.getMessage();
+ final String msg = "build local LVM info err in host:" + _host.getUuid() + e.getMessage();
s_logger.warn(msg);
}
}
@@ -4165,28 +4165,28 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (extsr != null) {
try {
final String extuuid = extsr.getUuid(conn);
- _host.localSRuuid = extuuid;
+ _host.setLocalSRuuid(extuuid);
final long cap = extsr.getPhysicalSize(conn);
if (cap > 0) {
final long avail = cap - extsr.getPhysicalUtilisation(conn);
extsr.setNameLabel(conn, extuuid);
- final String name = "Cloud Stack Local EXT Storage Pool for " + _host.uuid;
+ final String name = "Cloud Stack Local EXT Storage Pool for " + _host.getUuid();
extsr.setNameDescription(conn, name);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final String address = host.getAddress(conn);
final StoragePoolInfo pInfo = new StoragePoolInfo(extuuid, address, SRType.EXT.toString(), SRType.EXT.toString(), StoragePoolType.EXT, cap, avail);
final StartupStorageCommand cmd = new StartupStorageCommand();
cmd.setPoolInfo(pInfo);
- cmd.setGuid(_host.uuid);
+ cmd.setGuid(_host.getUuid());
cmd.setDataCenter(Long.toString(_dcId));
cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL);
return cmd;
}
} catch (final XenAPIException e) {
- final String msg = "build local EXT info err in host:" + _host.uuid + e.toString();
+ final String msg = "build local EXT info err in host:" + _host.getUuid() + e.toString();
s_logger.warn(msg);
} catch (final XmlRpcException e) {
- final String msg = "build local EXT info err in host:" + _host.uuid + e.getMessage();
+ final String msg = "build local EXT info err in host:" + _host.getUuid() + e.getMessage();
s_logger.warn(msg);
}
}
@@ -4199,7 +4199,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (!pingXAPI()) {
Thread.sleep(1000);
if (!pingXAPI()) {
- s_logger.warn("can not ping xenserver " + _host.uuid);
+ s_logger.warn("can not ping xenserver " + _host.getUuid());
return null;
}
}
@@ -4222,7 +4222,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
private HashMap<String, Pair<Long, Long>> syncNetworkGroups(final Connection conn, final long id) {
final HashMap<String, Pair<Long, Long>> states = new HashMap<String, Pair<Long, Long>>();
- final String result = callHostPlugin(conn, "vmops", "get_rule_logs_for_vms", "host_uuid", _host.uuid);
+ final String result = callHostPlugin(conn, "vmops", "get_rule_logs_for_vms", "host_uuid", _host.getUuid());
s_logger.trace("syncNetworkGroups: id=" + id + " got: " + result);
final String[] rulelogs = result != null ? result.split(";") : new String[0];
for (final String rulesforvm : rulelogs) {
@@ -4247,98 +4247,98 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected boolean getHostInfo(final Connection conn) throws IllegalArgumentException {
try {
- final Host myself = Host.getByUuid(conn, _host.uuid);
+ final Host myself = Host.getByUuid(conn, _host.getUuid());
Set<HostCpu> hcs = null;
for (int i = 0; i < 10; i++) {
hcs = myself.getHostCPUs(conn);
if(hcs != null) {
- _host.cpus = hcs.size();
- if (_host.cpus > 0) {
+ _host.setCpus(hcs.size());
+ if (_host.getCpus() > 0) {
break;
}
}
Thread.sleep(5000);
}
- if (_host.cpus <= 0) {
- throw new CloudRuntimeException("Cannot get the numbers of cpu from XenServer host " + _host.ip);
+ if (_host.getCpus() <= 0) {
+ throw new CloudRuntimeException("Cannot get the numbers of cpu from XenServer host " + _host.getIp());
}
final Map<String, String> cpuInfo = myself.getCpuInfo(conn);
if (cpuInfo.get("socket_count") != null) {
- _host.cpuSockets = Integer.parseInt(cpuInfo.get("socket_count"));
+ _host.setCpuSockets(Integer.parseInt(cpuInfo.get("socket_count")));
}
- // would hcs be null we would have thrown an exception on condition (_host.cpus <= 0) by now
+ // would hcs be null we would have thrown an exception on condition (_host.getCpus() <= 0) by now
for (final HostCpu hc : hcs) {
- _host.speed = hc.getSpeed(conn).intValue();
+ _host.setSpeed(hc.getSpeed(conn).intValue());
break;
}
final Host.Record hr = myself.getRecord(conn);
- _host.productVersion = CitrixHelper.getProductVersion(hr);
+ _host.setProductVersion(CitrixHelper.getProductVersion(hr));
final XsLocalNetwork privateNic = getManagementNetwork(conn);
_privateNetworkName = privateNic.getNetworkRecord(conn).nameLabel;
- _host.privatePif = privateNic.getPifRecord(conn).uuid;
- _host.privateNetwork = privateNic.getNetworkRecord(conn).uuid;
- _host.systemvmisouuid = null;
+ _host.setPrivatePif(privateNic.getPifRecord(conn).uuid);
+ _host.setPrivateNetwork(privateNic.getNetworkRecord(conn).uuid);
+ _host.setSystemvmisouuid(null);
XsLocalNetwork guestNic = null;
if (_guestNetworkName != null && !_guestNetworkName.equals(_privateNetworkName)) {
guestNic = getNetworkByName(conn, _guestNetworkName);
if (guestNic == null) {
s_logger.warn("Unable to find guest network " + _guestNetworkName);
- throw new IllegalArgumentException("Unable to find guest network " + _guestNetworkName + " for host " + _host.ip);
+ throw new IllegalArgumentException("Unable to find guest network " + _guestNetworkName + " for host " + _host.getIp());
}
} else {
guestNic = privateNic;
_guestNetworkName = _privateNetworkName;
}
- _host.guestNetwork = guestNic.getNetworkRecord(conn).uuid;
- _host.guestPif = guestNic.getPifRecord(conn).uuid;
+ _host.setGuestNetwork(guestNic.getNetworkRecord(conn).uuid);
+ _host.setGuestPif(guestNic.getPifRecord(conn).uuid);
XsLocalNetwork publicNic = null;
if (_publicNetworkName != null && !_publicNetworkName.equals(_guestNetworkName)) {
publicNic = getNetworkByName(conn, _publicNetworkName);
if (publicNic == null) {
- s_logger.warn("Unable to find public network " + _publicNetworkName + " for host " + _host.ip);
- throw new IllegalArgumentException("Unable to find public network " + _publicNetworkName + " for host " + _host.ip);
+ s_logger.warn("Unable to find public network " + _publicNetworkName + " for host " + _host.getIp());
+ throw new IllegalArgumentException("Unable to find public network " + _publicNetworkName + " for host " + _host.getIp());
}
} else {
publicNic = guestNic;
_publicNetworkName = _guestNetworkName;
}
- _host.publicPif = publicNic.getPifRecord(conn).uuid;
- _host.publicNetwork = publicNic.getNetworkRecord(conn).uuid;
+ _host.setPublicPif(publicNic.getPifRecord(conn).uuid);
+ _host.setPublicNetwork(publicNic.getNetworkRecord(conn).uuid);
if (_storageNetworkName1 == null) {
_storageNetworkName1 = _guestNetworkName;
}
XsLocalNetwork storageNic1 = null;
storageNic1 = getNetworkByName(conn, _storageNetworkName1);
if (storageNic1 == null) {
- s_logger.warn("Unable to find storage network " + _storageNetworkName1 + " for host " + _host.ip);
- throw new IllegalArgumentException("Unable to find storage network " + _storageNetworkName1 + " for host " + _host.ip);
+ s_logger.warn("Unable to find storage network " + _storageNetworkName1 + " for host " + _host.getIp());
+ throw new IllegalArgumentException("Unable to find storage network " + _storageNetworkName1 + " for host " + _host.getIp());
} else {
- _host.storageNetwork1 = storageNic1.getNetworkRecord(conn).uuid;
- _host.storagePif1 = storageNic1.getPifRecord(conn).uuid;
+ _host.setStorageNetwork1(storageNic1.getNetworkRecord(conn).uuid);
+ _host.setStoragePif1(storageNic1.getPifRecord(conn).uuid);
}
XsLocalNetwork storageNic2 = null;
if (_storageNetworkName2 != null) {
storageNic2 = getNetworkByName(conn, _storageNetworkName2);
if(storageNic2 != null) {
- _host.storagePif2 = storageNic2.getPifRecord(conn).uuid;
+ _host.setStoragePif2(storageNic2.getPifRecord(conn).uuid);
}
}
- s_logger.info("XenServer Version is " + _host.productVersion + " for host " + _host.ip);
- s_logger.info("Private Network is " + _privateNetworkName + " for host " + _host.ip);
- s_logger.info("Guest Network is " + _guestNetworkName + " for host " + _host.ip);
- s_logger.info("Public Network is " + _publicNetworkName + " for host " + _host.ip);
+ s_logger.info("XenServer Version is " + _host.getProductVersion() + " for host " + _host.getIp());
+ s_logger.info("Private Network is " + _privateNetworkName + " for host " + _host.getIp());
+ s_logger.info("Guest Network is " + _guestNetworkName + " for host " + _host.getIp());
+ s_logger.info("Public Network is " + _publicNetworkName + " for host " + _host.getIp());
return true;
} catch (final XenAPIException e) {
- s_logger.warn("Unable to get host information for " + _host.ip, e);
+ s_logger.warn("Unable to get host information for " + _host.getIp(), e);
return false;
} catch (final Exception e) {
- s_logger.warn("Unable to get host information for " + _host.ip, e);
+ s_logger.warn("Unable to get host information for " + _host.getIp(), e);
return false;
}
}
@@ -4349,7 +4349,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- private void setupLinkLocalNetwork(final Connection conn) {
+ public void setupLinkLocalNetwork(final Connection conn) {
try {
final Network.Record rec = new Network.Record();
final Set<Network> networks = Network.getByNameLabel(conn, _linkLocalPrivateNetworkName);
@@ -4416,7 +4416,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final String brName = linkLocal.getBridge(conn);
callHostPlugin(conn, "vmops", "setLinkLocalIP", "brName", brName);
- _host.linkLocalNetwork = linkLocal.getUuid(conn);
+ _host.setLinkLocalNetwork(linkLocal.getUuid(conn));
} catch (final XenAPIException e) {
s_logger.warn("Unable to create local link network", e);
@@ -4461,7 +4461,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public StartupCommand[] initialize() throws IllegalArgumentException {
final Connection conn = getConnection();
if (!getHostInfo(conn)) {
- s_logger.warn("Unable to get host information for " + _host.ip);
+ s_logger.warn("Unable to get host information for " + _host.getIp());
return null;
}
final StartupRoutingCommand cmd = new StartupRoutingCommand();
@@ -4471,7 +4471,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
cmd.setPoolSync(false);
try {
- final Pool pool = Pool.getByUuid(conn, _host.pool);
+ final Pool pool = Pool.getByUuid(conn, _host.getPool());
final Pool.Record poolr = pool.getRecord(conn);
poolr.master.getRecord(conn);
} catch (final Throwable e) {
@@ -4487,7 +4487,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
private void cleanupTemplateSR(final Connection conn) {
Set<PBD> pbds = null;
try {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
pbds = host.getPBDs(conn);
} catch (final XenAPIException e) {
s_logger.warn("Unable to get the SRs " + e.toString(), e);
@@ -4523,11 +4523,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected boolean launchHeartBeat(final Connection conn) {
final String result = callHostPluginPremium(conn, "heartbeat",
- "host", _host.uuid,
+ "host", _host.getUuid(),
"timeout", Integer.toString(_heartbeatTimeout),
"interval", Integer.toString(_heartbeatInterval));
if (result == null || !result.contains("> DONE <")) {
- s_logger.warn("Unable to launch the heartbeat process on " + _host.ip);
+ s_logger.warn("Unable to launch the heartbeat process on " + _host.getIp());
return false;
}
return true;
@@ -4538,11 +4538,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
final Map<Pool, Pool.Record> poolRecs = Pool.getAllRecords(conn);
if (poolRecs.size() != 1) {
- throw new CloudRuntimeException("There are " + poolRecs.size() + " pool for host :" + _host.uuid);
+ throw new CloudRuntimeException("There are " + poolRecs.size() + " pool for host :" + _host.getUuid());
}
final Host master = poolRecs.values().iterator().next().master;
setupServer(conn, master);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
setupServer(conn, host);
if (!setIptables(conn)) {
@@ -4555,7 +4555,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (!_canBridgeFirewall) {
final String msg = "Failed to configure brige firewall";
s_logger.warn(msg);
- s_logger.warn("Check host " + _host.ip +" for CSP is installed or not and check network mode for bridge");
+ s_logger.warn("Check host " + _host.getIp() +" for CSP is installed or not and check network mode for bridge");
return new SetupAnswer(cmd, msg);
}
@@ -4579,7 +4579,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (cmd.needSetup() ) {
- final String result = callHostPlugin(conn, "vmops", "setup_iscsi", "uuid", _host.uuid);
+ final String result = callHostPlugin(conn, "vmops", "setup_iscsi", "uuid", _host.getUuid());
if (!result.contains("> DONE <")) {
s_logger.warn("Unable to setup iscsi: " + result);
@@ -4593,7 +4593,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
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(_host.uuid)
+ new StringBuilder("Unsupported configuration. Management network is on a VLAN. host=").append(_host.getUuid())
.append("; pif=")
.append(rec.uuid)
.append("; vlan=")
@@ -4611,14 +4611,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (mgmtPif == null) {
- final String msg = "Unable to find management network for " + _host.uuid;
+ final String msg = "Unable to find management network for " + _host.getUuid();
s_logger.warn(msg);
return new SetupAnswer(cmd, 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: " + _host.uuid;
+ final String msg = "Unable to setup as there are no networks in the host: " + _host.getUuid();
s_logger.warn(msg);
return new SetupAnswer(cmd, msg);
}
@@ -4626,9 +4626,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (network.nameLabel.equals("cloud-private")) {
for (final PIF pif : network.PIFs) {
final PIF.Record pr = pif.getRecord(conn);
- if (_host.uuid.equals(pr.host.getUuid(conn))) {
+ if (_host.getUuid().equals(pr.host.getUuid(conn))) {
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Found a network called cloud-private. host=" + _host.uuid + "; Network=" + network.uuid + "; pif=" + pr.uuid);
+ s_logger.debug("Found a network called cloud-private. host=" + _host.getUuid() + "; Network=" + network.uuid + "; pif=" + pr.uuid);
}
if (pr.VLAN != null && pr.VLAN != -1) {
final String msg =
@@ -4657,7 +4657,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (!transferManagementNetwork(conn, host, slave, spr, pif)) {
final String msg =
new StringBuilder("Unable to transfer management network. slave=" + spr.uuid + "; master=" + pr.uuid + "; host=" +
- _host.uuid).toString();
+ _host.getUuid()).toString();
s_logger.warn(msg);
return new SetupAnswer(cmd, msg);
}
@@ -4849,11 +4849,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
} catch (final XenAPIException e) {
- final String msg = "CheckNetworkCommand failed with XenAPIException:" + e.toString() + " host:" + _host.uuid;
+ final String msg = "CheckNetworkCommand failed with XenAPIException:" + e.toString() + " host:" + _host.getUuid();
s_logger.warn(msg, e);
return new CheckNetworkAnswer(cmd, false, msg);
} catch (final Exception e) {
- final String msg = "CheckNetworkCommand failed with Exception:" + e.getMessage() + " host:" + _host.uuid;
+ final String msg = "CheckNetworkCommand failed with Exception:" + e.getMessage() + " host:" + _host.getUuid();
s_logger.warn(msg, e);
return new CheckNetworkAnswer(cmd, false, msg);
}
@@ -4885,7 +4885,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
pbds = sr.getPBDs(conn);
for (final PBD pbd : pbds) {
final PBD.Record pbdr = pbd.getRecord(conn);
- if (pbdr.host != null && pbdr.host.getUuid(conn).equals(_host.uuid)) {
+ if (pbdr.host != null && pbdr.host.getUuid(conn).equals(_host.getUuid())) {
if (!pbdr.currentlyAttached) {
pbd.plug(conn);
}
@@ -4912,11 +4912,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final long used = sr.getPhysicalUtilisation(conn);
return new GetStorageStatsAnswer(cmd, capacity, used);
} catch (final XenAPIException e) {
- final String msg = "GetStorageStats Exception:" + e.toString() + "host:" + _host.uuid + "storageid: " + cmd.getStorageId();
+ final String msg = "GetStorageStats Exception:" + e.toString() + "host:" + _host.getUuid() + "storageid: " + cmd.getStorageId();
s_logger.warn(msg);
return new GetStorageStatsAnswer(cmd, msg);
} catch (final XmlRpcException e) {
- final String msg = "GetStorageStats Exception:" + e.getMessage() + "host:" + _host.uuid + "storageid: " + cmd.getStorageId();
+ final String msg = "GetStorageStats Exception:" + e.getMessage() + "host:" + _host.getUuid() + "storageid: " + cmd.getStorageId();
s_logger.warn(msg);
return new GetStorageStatsAnswer(cmd, msg);
}
@@ -4940,7 +4940,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final SR.Record srr = sr.getRecord(conn);
final Set<PBD> pbds = sr.getPBDs(conn);
if (pbds.size() == 0) {
- final String msg = "There is no PBDs for this SR: " + srr.nameLabel + " on host:" + _host.uuid;
+ final String msg = "There is no PBDs for this SR: " + srr.nameLabel + " on host:" + _host.getUuid();
s_logger.warn(msg);
return false;
}
@@ -4956,7 +4956,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
boolean found = false;
for (final PBD pbd : pbds) {
final PBD.Record pbdr = pbd.getRecord(conn);
@@ -5007,7 +5007,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new Answer(cmd, true, "success");
} catch (final Exception e) {
final String msg =
- "Catch Exception " + e.getClass().getName() + ", create StoragePool failed due to " + e.toString() + " on host:" + _host.uuid + " pool: " +
+ "Catch Exception " + e.getClass().getName() + ", create StoragePool failed due to " + e.toString() + " on host:" + _host.getUuid() + " pool: " +
pool.getHost() + pool.getPath();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
@@ -5021,7 +5021,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
final Map<Pool, Pool.Record> poolRecs = Pool.getAllRecords(conn);
if (poolRecs.size() != 1) {
- throw new CloudRuntimeException("There are " + poolRecs.size() + " pool for host :" + _host.uuid);
+ throw new CloudRuntimeException("There are " + poolRecs.size() + " pool for host :" + _host.getUuid());
}
final Host master = poolRecs.values().iterator().next().master;
for (int i = 0; i < params.length; i += 2) {
@@ -5058,21 +5058,21 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return srUuid;
}
String result = null;
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final Set<String> tags = host.getTags(conn);
if (force || !tags.contains("cloud-heartbeat-" + srUuid)) {
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Setting up the heartbeat sr for host " + _host.ip + " and sr " + srUuid);
+ s_logger.debug("Setting up the heartbeat sr for host " + _host.getIp() + " and sr " + srUuid);
}
final Set<PBD> pbds = sr.getPBDs(conn);
for (final PBD pbd : pbds) {
final PBD.Record pbdr = pbd.getRecord(conn);
- if (!pbdr.currentlyAttached && pbdr.host.getUuid(conn).equals(_host.uuid)) {
+ if (!pbdr.currentlyAttached && pbdr.host.getUuid(conn).equals(_host.getUuid())) {
pbd.plug(conn);
break;
}
}
- result = callHostPluginThroughMaster(conn, "vmopspremium", "setup_heartbeat_sr", "host", _host.uuid, "sr", srUuid);
+ result = callHostPluginThroughMaster(conn, "vmopspremium", "setup_heartbeat_sr", "host", _host.getUuid(), "sr", srUuid);
if (result == null || !result.split("#")[1].equals("0")) {
throw new CloudRuntimeException("Unable to setup heartbeat sr on SR " + srUuid + " due to " + result);
}
@@ -5082,7 +5082,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
host.setTags(conn, tags);
}
}
- result = callHostPluginPremium(conn, "setup_heartbeat_file", "host", _host.uuid, "sr", srUuid, "add", "true");
+ result = callHostPluginPremium(conn, "setup_heartbeat_file", "host", _host.getUuid(), "sr", srUuid, "add", "true");
if (result == null || !result.split("#")[1].equals("0")) {
throw new CloudRuntimeException("Unable to setup heartbeat file entry on SR " + srUuid + " due to " + result);
}
@@ -5108,11 +5108,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(cmd, capacity, available, tInfo);
return answer;
} catch (final XenAPIException e) {
- final String msg = "ModifyStoragePoolCommand add XenAPIException:" + e.toString() + " host:" + _host.uuid + " pool: " + pool.getHost() + pool.getPath();
+ final String msg = "ModifyStoragePoolCommand add XenAPIException:" + e.toString() + " host:" + _host.getUuid() + " pool: " + pool.getHost() + pool.getPath();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
} catch (final Exception e) {
- final String msg = "ModifyStoragePoolCommand add XenAPIException:" + e.getMessage() + " host:" + _host.uuid + " pool: " + pool.getHost() + pool.getPath();
+ final String msg = "ModifyStoragePoolCommand add XenAPIException:" + e.getMessage() + " host:" + _host.getUuid() + " pool: " + pool.getHost() + pool.getPath();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
}
@@ -5120,17 +5120,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
try {
final SR sr = getStorageRepository(conn, pool.getUuid());
final String srUuid = sr.getUuid(conn);
- final String result = callHostPluginPremium(conn, "setup_heartbeat_file", "host", _host.uuid, "sr", srUuid, "add", "false");
+ final String result = callHostPluginPremium(conn, "setup_heartbeat_file", "host", _host.getUuid(), "sr", srUuid, "add", "false");
if (result == null || !result.split("#")[1].equals("0")) {
throw new CloudRuntimeException("Unable to remove heartbeat file entry for SR " + srUuid + " due to " + result);
}
return new Answer(cmd, true, "seccuss");
} catch (final XenAPIException e) {
- final String msg = "ModifyStoragePoolCommand remove XenAPIException:" + e.toString() + " host:" + _host.uuid + " pool: " + pool.getHost() + pool.getPath();
+ final String msg = "ModifyStoragePoolCommand remove XenAPIException:" + e.toString() + " host:" + _host.getUuid() + " pool: " + pool.getHost() + pool.getPath();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
} catch (final Exception e) {
- final String msg = "ModifyStoragePoolCommand remove XenAPIException:" + e.getMessage() + " host:" + _host.uuid + " pool: " + pool.getHost() + pool.getPath();
+ final String msg = "ModifyStoragePoolCommand remove XenAPIException:" + e.getMessage() + " host:" + _host.getUuid() + " pool: " + pool.getHost() + pool.getPath();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
}
@@ -5139,7 +5139,7 @@ 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.uuid, "instance", _instance));
+ return Boolean.valueOf(callHostPlugin(conn, "vmops", "can_bridge_firewall", "host_uuid", _host.getUuid(), "instance", _instance));
}
private Answer execute(final OvsSetupBridgeCommand cmd) {
@@ -5289,7 +5289,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
private List<Pair<String, Long>> ovsFullSyncStates() {
final Connection conn = getConnection();
- final String result = callHostPlugin(conn, "ovsgre", "ovs_get_vm_log", "host_uuid", _host.uuid);
+ final String result = callHostPlugin(conn, "ovsgre", "ovs_get_vm_log", "host_uuid", _host.getUuid());
final String[] logs = result != null ? result.split(";") : new String[0];
final List<Pair<String, Long>> states = new ArrayList<Pair<String, Long>>();
for (final String log : logs) {
@@ -5349,12 +5349,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (is_xcp()) {
label = getLabel();
}
- s_logger.debug("Will look for network with name-label:" + label + " on host " + _host.ip);
+ s_logger.debug("Will look for network with name-label:" + label + " on host " + _host.getIp());
final Connection conn = getConnection();
try {
final XsLocalNetwork nw = getNetworkByName(conn, label);
if(nw == null) {
- throw new CloudRuntimeException("Unable to locate the network with name-label: " + label + " on host: " + _host.ip);
+ throw new CloudRuntimeException("Unable to locate the network with name-label: " + label + " on host: " + _host.getIp());
}
s_logger.debug("Network object:" + nw.getNetwork().getUuid(conn));
final PIF pif = nw.getPif(conn);
@@ -5362,13 +5362,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_logger.debug("PIF object:" + pifRec.uuid + "(" + pifRec.device + ")");
return new OvsFetchInterfaceAnswer(cmd, true, "Interface " + pifRec.device + " retrieved successfully", pifRec.IP, pifRec.netmask, pifRec.MAC);
} catch (final BadServerResponse e) {
- s_logger.error("An error occurred while fetching the interface for " + label + " on host " + _host.ip, e);
+ s_logger.error("An error occurred while fetching the interface for " + label + " on host " + _host.getIp(), e);
return new OvsFetchInterfaceAnswer(cmd, false, "EXCEPTION:" + e.getMessage());
} catch (final XenAPIException e) {
- s_logger.error("An error occurred while fetching the interface for " + label + " on host " + _host.ip, e);
+ s_logger.error("An error occurred while fetching the interface for " + label + " on host " + _host.getIp(), e);
return new OvsFetchInterfaceAnswer(cmd, false, "EXCEPTION:" + e.getMessage());
} catch (final XmlRpcException e) {
- s_logger.error("An error occurred while fetching the interface for " + label + " on host " + _host.ip, e);
+ s_logger.error("An error occurred while fetching the interface for " + label + " on host " + _host.getIp(), e);
return new OvsFetchInterfaceAnswer(cmd, false, "EXCEPTION:" + e.getMessage());
}
}
@@ -5387,30 +5387,30 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
Long.toString(cmd.getFrom()), "to", Long.toString(cmd.getTo()));
final String[] res = result.split(":");
if (res.length != 2 || res.length == 2 && res[1].equalsIgnoreCase("[]")) {
- return new OvsCreateGreTunnelAnswer(cmd, false, result, _host.ip, bridge);
+ return new OvsCreateGreTunnelAnswer(cmd, false, result, _host.getIp(), bridge);
} else {
- return new OvsCreateGreTunnelAnswer(cmd, true, result, _host.ip, bridge, Integer.parseInt(res[1]));
+ return new OvsCreateGreTunnelAnswer(cmd, true, result, _host.getIp(), bridge, Integer.parseInt(res[1]));
}
} catch (final BadServerResponse e) {
- s_logger.error("An error occurred while creating a GRE tunnel to " + cmd.getRemoteIp() + " on host " + _host.ip, e);
+ s_logger.error("An error occurred while creating a GRE tunnel to " + cmd.getRemoteIp() + " on host " + _host.getIp(), e);
} catch (final XenAPIException e) {
- s_logger.error("An error occurred while creating a GRE tunnel to " + cmd.getRemoteIp() + " on host " + _host.ip, e);
+ s_logger.error("An error occurred while creating a GRE tunnel to " + cmd.getRemoteIp() + " on host " + _host.getIp(), e);
} catch (final XmlRpcException e) {
- s_logger.error("An error occurred while creating a GRE tunnel to " + cmd.getRemoteIp() + " on host " + _host.ip, e);
+ s_logger.error("An error occurred while creating a GRE tunnel to " + cmd.getRemoteIp() + " on host " + _host.getIp(), e);
}
- return new OvsCreateGreTunnelAnswer(cmd, false, "EXCEPTION", _host.ip, bridge);
+ return new OvsCreateGreTunnelAnswer(cmd, false, "EXCEPTION", _host.getIp(), bridge);
}
private Answer execute(final SecurityGroupRulesCmd cmd) {
final Connection conn = getConnection();
if (s_logger.isTraceEnabled()) {
- s_logger.trace("Sending network rules command to " + _host.ip);
+ s_logger.trace("Sending network rules command to " + _host.getIp());
}
if (!_canBridgeFirewall) {
- s_logger.warn("Host " + _host.ip + " cannot do bridge firewalling");
- return new SecurityGroupRuleAnswer(cmd, false, "Host " + _host.ip + " cannot do bridge firewalling",
+ s_logger.warn("Host " + _host.getIp() + " cannot do bridge firewalling");
+ return new SecurityGroupRuleAnswer(cmd, false, "Host " + _host.getIp() + " cannot do bridge firewalling",
SecurityGroupRuleAnswer.FailureReason.CANNOT_BRIDGE_FIREWALL);
}
@@ -5438,7 +5438,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final Answer answer = new Answer(cmd, true, "success");
return answer;
} catch (final Exception e) {
- final String msg = "DeleteStoragePoolCommand XenAPIException:" + e.getMessage() + " host:" + _host.uuid + " pool: " + poolTO.getHost() + poolTO.getPath();
+ final String msg = "DeleteStoragePoolCommand XenAPIException:" + e.getMessage() + " host:" + _host.getUuid() + " pool: " + poolTO.getHost() + poolTO.getPath();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
}
@@ -5446,7 +5446,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
public Connection getConnection() {
- return ConnPool.connect(_host.uuid, _host.pool, _host.ip, _username, _password, _wait);
+ return ConnPool.connect(_host.getUuid(), _host.getPool(), _host.getIp(), _username, _password, _wait);
}
@@ -5454,7 +5454,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
final StringBuilder caps = new StringBuilder();
try {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final Host.Record hr = host.getRecord(conn);
Map<String, String> details = cmd.getHostDetails();
@@ -5467,12 +5467,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
productBrand = hr.softwareVersion.get("platform_name");
}
details.put("product_brand", productBrand);
- details.put("product_version", _host.productVersion);
+ details.put("product_version", _host.getProductVersion());
if (hr.softwareVersion.get("product_version_text_short") != null) {
details.put("product_version_text_short", hr.softwareVersion.get("product_version_text_short"));
cmd.setHypervisorVersion(hr.softwareVersion.get("product_version_text_short"));
- cmd.setHypervisorVersion(_host.productVersion);
+ cmd.setHypervisorVersion(_host.getProductVersion());
}
if (_privateNetworkName != null) {
details.put("private.network.device", _privateNetworkName);
@@ -5480,8 +5480,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
cmd.setHostDetails(details);
cmd.setName(hr.nameLabel);
- cmd.setGuid(_host.uuid);
- cmd.setPool(_host.pool);
+ cmd.setGuid(_host.getUuid());
+ cmd.setPool(_host.getPool());
cmd.setDataCenter(Long.toString(_dcId));
for (final String cap : hr.capabilities) {
if (cap.length() > 0) {
@@ -5493,9 +5493,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
cmd.setCaps(caps.toString());
- cmd.setSpeed(_host.speed);
- cmd.setCpuSockets(_host.cpuSockets);
- cmd.setCpus(_host.cpus);
+ cmd.setSpeed(_host.getSpeed());
+ cmd.setCpuSockets(_host.getCpuSockets());
+ cmd.setCpus(_host.getCpus());
final HostMetrics hm = host.getMetrics(conn);
@@ -5518,19 +5518,19 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_logger.debug("Total Ram: " + ram + " dom0 Ram: " + dom0Ram);
}
- PIF pif = PIF.getByUuid(conn, _host.privatePif);
+ PIF pif = PIF.getByUuid(conn, _host.getPrivatePif());
PIF.Record pifr = pif.getRecord(conn);
if (pifr.IP != null && pifr.IP.length() > 0) {
cmd.setPrivateIpAddress(pifr.IP);
cmd.setPrivateMacAddress(pifr.MAC);
cmd.setPrivateNetmask(pifr.netmask);
} else {
- cmd.setPrivateIpAddress(_host.ip);
+ cmd.setPrivateIpAddress(_host.getIp());
cmd.setPrivateMacAddress(pifr.MAC);
cmd.setPrivateNetmask("255.255.255.0");
}
- pif = PIF.getByUuid(conn, _host.publicPif);
+ pif = PIF.getByUuid(conn, _host.getPublicPif());
pifr = pif.getRecord(conn);
if (pifr.IP != null && pifr.IP.length() > 0) {
cmd.setPublicIpAddress(pifr.IP);
@@ -5538,8 +5538,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
cmd.setPublicNetmask(pifr.netmask);
}
- if (_host.storagePif1 != null) {
- pif = PIF.getByUuid(conn, _host.storagePif1);
+ if (_host.getStoragePif1() != null) {
+ pif = PIF.getByUuid(conn, _host.getStoragePif1());
pifr = pif.getRecord(conn);
if (pifr.IP != null && pifr.IP.length() > 0) {
cmd.setStorageIpAddress(pifr.IP);
@@ -5548,8 +5548,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- if (_host.storagePif2 != null) {
- pif = PIF.getByUuid(conn, _host.storagePif2);
+ if (_host.getStoragePif2() != null) {
+ pif = PIF.getByUuid(conn, _host.getStoragePif2());
pifr = pif.getRecord(conn);
if (pifr.IP != null && pifr.IP.length() > 0) {
cmd.setStorageIpAddressDeux(pifr.IP);
@@ -5584,10 +5584,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new ConfigurationException("Unable to get the zone " + params.get("zone"));
}
- _host.uuid = (String)params.get("guid");
+ _host.setUuid((String)params.get("guid"));
- _name = _host.uuid;
- _host.ip = (String)params.get("ipaddress");
+ _name = _host.getUuid();
+ _host.setIp((String)params.get("ipaddress"));
_username = (String)params.get("username");
_password.add((String)params.get("password"));
@@ -5622,7 +5622,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new ConfigurationException("Unable to get the pod");
}
- if (_host.ip == null) {
+ if (_host.getIp() == null) {
throw new ConfigurationException("Unable to get the host address");
}
@@ -5634,7 +5634,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new ConfigurationException("Unable to get the password");
}
- if (_host.uuid == null) {
+ if (_host.getUuid() == null) {
throw new ConfigurationException("Unable to get the uuid");
}
@@ -5655,23 +5655,23 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
private void CheckXenHostInfo() throws ConfigurationException {
- final Connection conn = ConnPool.getConnect(_host.ip, _username, _password);
+ final Connection conn = ConnPool.getConnect(_host.getIp(), _username, _password);
if( conn == null ) {
- throw new ConfigurationException("Can not create connection to " + _host.ip);
+ throw new ConfigurationException("Can not create connection to " + _host.getIp());
}
try {
Host.Record hostRec = null;
try {
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
hostRec = host.getRecord(conn);
final Pool.Record poolRec = Pool.getAllRecords(conn).values().iterator().next();
- _host.pool = poolRec.uuid;
+ _host.setPool(poolRec.uuid);
} catch (final Exception e) {
- throw new ConfigurationException("Can not get host information from " + _host.ip);
+ throw new ConfigurationException("Can not get host information from " + _host.getIp());
}
- if (!hostRec.address.equals(_host.ip)) {
- final String msg = "Host " + _host.ip + " seems be reinstalled, please remove this host and readd";
+ if (!hostRec.address.equals(_host.getIp())) {
+ final String msg = "Host " + _host.getIp() + " seems be reinstalled, please remove this host and readd";
s_logger.error(msg);
throw new ConfigurationException(msg);
}
@@ -5779,7 +5779,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final Map<String, String> smConfig = new HashMap<String, String>();
smConfig.put("nosubdir", "true");
final SR sr = SR.create(conn, host, deviceConfig, new Long(0), name, uri.getHost() + uri.getPath(), SRType.NFS.toString(), "user", shared, smConfig);
@@ -5809,7 +5809,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
String path = uri.getPath();
path = path.replace("//", "/");
deviceConfig.put("location", uri.getHost() + ":" + path);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final SR sr = SR.create(conn, host, deviceConfig, new Long(0), uri.getHost() + path, "iso", "iso", "iso", shared, new HashMap<String, String>());
sr.setNameLabel(conn, vmName + "-ISO");
sr.setNameDescription(conn, deviceConfig.get("location"));
@@ -5915,7 +5915,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (target.equals(dc.get("target")) && targetiqn.equals(dc.get("targetIQN")) && lunid.equals(dc.get("lunid"))) {
throw new CloudRuntimeException("There is a SR using the same configuration target:" + dc.get("target") + ", targetIQN:" + dc.get("targetIQN") +
- ", lunid:" + dc.get("lunid") + " for pool " + srNameLabel + "on host:" + _host.uuid);
+ ", lunid:" + dc.get("lunid") + " for pool " + srNameLabel + "on host:" + _host.getUuid());
}
}
deviceConfig.put("target", target);
@@ -5926,7 +5926,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
deviceConfig.put("chappassword", chapInitiatorPassword);
}
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final Map<String, String> smConfig = new HashMap<String, String>();
final String type = SRType.LVMOISCSI.toString();
SR sr = null;
@@ -6049,14 +6049,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (server.equals(dc.get("server")) && serverpath.equals(dc.get("serverpath"))) {
throw new CloudRuntimeException("There is a SR using the same configuration server:" + dc.get("server") + ", serverpath:" + dc.get("serverpath") +
- " for pool " + uuid + " on host:" + _host.uuid);
+ " for pool " + uuid + " on host:" + _host.getUuid());
}
}
}
deviceConfig.put("server", server);
deviceConfig.put("serverpath", serverpath);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
final Map<String, String> smConfig = new HashMap<String, String>();
smConfig.put("nosubdir", "true");
final SR sr = SR.create(conn, host, deviceConfig, new Long(0), uuid, poolid, SRType.NFS.toString(), "user", true, smConfig);
@@ -6355,7 +6355,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
task = vm.snapshotAsync(conn, vmSnapshotName);
} else {
final Set<VBD> vbds = vm.getVBDs(conn);
- final Poo
<TRUNCATED>
[31/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4600eef8/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
index f695582..26f148e 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
@@ -66,7 +66,7 @@ public class XenServer56FP1Resource extends XenServer56Resource {
protected FenceAnswer execute(final FenceCommand cmd) {
final Connection conn = getConnection();
try {
- final Boolean alive = check_heartbeat(cmd.getHostGuid());
+ final Boolean alive = checkHeartbeat(cmd.getHostGuid());
if ( alive == null ) {
s_logger.debug("Failed to check heartbeat, so unable to fence");
return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4600eef8/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index 6b3efb5..85cdf04 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -27,14 +27,13 @@ import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.CheckOnHostAnswer;
-import com.cloud.agent.api.CheckOnHostCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.FenceAnswer;
import com.cloud.agent.api.FenceCommand;
import com.cloud.agent.api.NetworkUsageAnswer;
import com.cloud.agent.api.NetworkUsageCommand;
import com.cloud.agent.api.StartupCommand;
+import com.cloud.hypervisor.xenserver.resource.wrapper.CitrixRequestWrapper;
import com.cloud.resource.ServerResource;
import com.cloud.utils.ExecutionResult;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -55,16 +54,24 @@ public class XenServer56Resource extends CitrixResourceBase {
@Override
public Answer executeRequest(final Command cmd) {
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ try {
+ return wrapper.execute(cmd, this);
+ } catch (final Exception e) {
+ // return Answer.createUnsupportedCommandAnswer(cmd);
+ // Ignore this for now. Still working on converting the other commands.
+ }
+
if (cmd instanceof FenceCommand) {
- return execute((FenceCommand)cmd);
+ return execute((FenceCommand) cmd);
} else if (cmd instanceof NetworkUsageCommand) {
- return execute((NetworkUsageCommand)cmd);
+ return execute((NetworkUsageCommand) cmd);
} else {
return super.executeRequest(cmd);
}
}
-
@Override
protected List<File> getPatchFiles() {
final List<File> files = new ArrayList<File>();
@@ -144,7 +151,6 @@ public class XenServer56Resource extends CitrixResourceBase {
protected NetworkUsageAnswer VPCNetworkUsage(final NetworkUsageCommand cmd) {
try {
- final Connection conn = getConnection();
final String option = cmd.getOption();
final String publicIp = cmd.getGatewayIP();
@@ -209,7 +215,7 @@ public class XenServer56Resource extends CitrixResourceBase {
}
}
- protected Boolean check_heartbeat(final String hostuuid) {
+ public Boolean checkHeartbeat(final String hostuuid) {
final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
try {
sshConnection.connect(null, 60000, 60000);
@@ -217,15 +223,14 @@ public class XenServer56Resource extends CitrixResourceBase {
throw new CloudRuntimeException("Unable to authenticate");
}
- final String shcmd = "/opt/cloud/bin/check_heartbeat.sh " + hostuuid + " "
- + Integer.toString(_heartbeatInterval * 2);
+ final String shcmd = "/opt/cloud/bin/check_heartbeat.sh " + hostuuid + " " + Integer.toString(_heartbeatInterval * 2);
if (!SSHCmdHelper.sshExecuteCmd(sshConnection, shcmd)) {
s_logger.debug("Heart beat is gone so dead.");
return false;
}
s_logger.debug("Heart beat is still going");
return true;
- } catch (final Exception e) {
+ } catch (final Exception e) {
s_logger.debug("health check failed due to catch exception " + e.toString());
return null;
} finally {
@@ -236,12 +241,12 @@ public class XenServer56Resource extends CitrixResourceBase {
protected FenceAnswer execute(final FenceCommand cmd) {
final Connection conn = getConnection();
try {
- final Boolean alive = check_heartbeat(cmd.getHostGuid());
- if ( alive == null ) {
+ final Boolean alive = checkHeartbeat(cmd.getHostGuid());
+ if (alive == null) {
s_logger.debug("Failed to check heartbeat, so unable to fence");
return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
}
- if ( alive ) {
+ if (alive) {
s_logger.debug("Heart beat is still going so unable to fence");
return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
}
@@ -261,7 +266,6 @@ public class XenServer56Resource extends CitrixResourceBase {
}
}
-
@Override
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);
@@ -300,26 +304,7 @@ public class XenServer56Resource extends CitrixResourceBase {
return cmds;
}
-
- @Override
- protected CheckOnHostAnswer execute(final CheckOnHostCommand cmd) {
- final Boolean alive = check_heartbeat(cmd.getHost().getGuid());
- String msg = "";
- if (alive == null) {
- msg = " cannot determine ";
- } else if ( alive == true) {
- msg = "Heart beat is still going";
- } else {
- msg = "Heart beat is gone so dead.";
- }
- s_logger.debug(msg);
- return new CheckOnHostAnswer(cmd, alive, msg);
-
- }
-
-
public XenServer56Resource() {
super();
}
-
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4600eef8/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 1553239..05caabd 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
@@ -21,8 +21,6 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
import java.util.Hashtable;
-import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
-
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.AttachIsoCommand;
import com.cloud.agent.api.AttachVolumeCommand;
@@ -83,6 +81,8 @@ import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.storage.ResizeVolumeCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.RequestWrapper;
import com.cloud.resource.ServerResource;
@@ -95,91 +95,113 @@ public class CitrixRequestWrapper extends RequestWrapper {
instance = new CitrixRequestWrapper();
}
+ private boolean initialised;
+
@SuppressWarnings("rawtypes")
- private final Hashtable<Class<? extends Command>, CommandWrapper> map;
+ private final Hashtable<Class<? extends ServerResource>, Hashtable<Class<? extends Command>, CommandWrapper>> resources;
@SuppressWarnings("rawtypes")
private CitrixRequestWrapper() {
- map = new Hashtable<Class<? extends Command>, CommandWrapper>();
+ resources = new Hashtable<Class<? extends ServerResource>, Hashtable<Class<? extends Command>, CommandWrapper>>();
init();
}
+ @SuppressWarnings("rawtypes")
private void init() {
- map.put(RebootRouterCommand.class, new CitrixRebootRouterCommandWrapper());
- map.put(CreateCommand.class, new CitrixCreateCommandWrapper());
- map.put(CheckConsoleProxyLoadCommand.class, new CitrixCheckConsoleProxyLoadCommandWrapper());
- map.put(WatchConsoleProxyLoadCommand.class, new CitrixWatchConsoleProxyLoadCommandWrapper());
- map.put(ReadyCommand.class, new CitrixReadyCommandWrapper());
- map.put(GetHostStatsCommand.class, new CitrixGetHostStatsCommandWrapper());
- map.put(GetVmStatsCommand.class, new CitrixGetVmStatsCommandWrapper());
- map.put(GetVmDiskStatsCommand.class, new CitrixGetVmDiskStatsCommandWrapper());
- map.put(CheckHealthCommand.class, new CitrixCheckHealthCommandWrapper());
- map.put(StopCommand.class, new CitrixStopCommandWrapper());
- map.put(RebootCommand.class, new CitrixRebootCommandWrapper());
- map.put(CheckVirtualMachineCommand.class, new CitrixCheckVirtualMachineCommandWrapper());
- map.put(PrepareForMigrationCommand.class, new CitrixPrepareForMigrationCommandWrapper());
- map.put(MigrateCommand.class, new CitrixMigrateCommandWrapper());
- map.put(DestroyCommand.class, new CitrixDestroyCommandWrapper());
- map.put(CreateStoragePoolCommand.class, new CitrixCreateStoragePoolCommandWrapper());
- map.put(ModifyStoragePoolCommand.class, new CitrixModifyStoragePoolCommandWrapper());
- map.put(DeleteStoragePoolCommand.class, new CitrixDeleteStoragePoolCommandWrapper());
- map.put(ResizeVolumeCommand.class, new CitrixResizeVolumeCommandWrapper());
- map.put(AttachVolumeCommand.class, new CitrixAttachVolumeCommandWrapper());
- map.put(AttachIsoCommand.class, new CitrixAttachIsoCommandWrapper());
- 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());
- map.put(PingTestCommand.class, new CitrixPingTestCommandWrapper());
- map.put(CheckOnHostCommand.class, new CitrixCheckOnHostCommandWrapper());
- map.put(ModifySshKeysCommand.class, new CitrixModifySshKeysCommandWrapper());
- map.put(StartCommand.class, new CitrixStartCommandWrapper());
- map.put(OvsSetTagAndFlowCommand.class, new CitrixOvsSetTagAndFlowCommandWrapper());
- map.put(CheckSshCommand.class, new CitrixCheckSshCommandWrapper());
- map.put(SecurityGroupRulesCmd.class, new CitrixSecurityGroupRulesCommandWrapper());
- map.put(OvsFetchInterfaceCommand.class, new CitrixOvsFetchInterfaceCommandWrapper());
- map.put(OvsCreateGreTunnelCommand.class, new CitrixOvsCreateGreTunnelCommandWrapper());
- map.put(OvsDeleteFlowCommand.class, new CitrixOvsDeleteFlowCommandWrapper());
- map.put(OvsVpcPhysicalTopologyConfigCommand.class, new CitrixOvsVpcPhysicalTopologyConfigCommandWrapper());
- map.put(OvsVpcRoutingPolicyConfigCommand.class, new CitrixOvsVpcRoutingPolicyConfigCommandWrapper());
- map.put(CleanupNetworkRulesCmd.class, new CitrixCleanupNetworkRulesCmdWrapper());
- map.put(NetworkRulesSystemVmCommand.class, new CitrixNetworkRulesSystemVmCommandWrapper());
- map.put(OvsCreateTunnelCommand.class, new CitrixOvsCreateTunnelCommandWrapper());
- map.put(OvsSetupBridgeCommand.class, new CitrixOvsSetupBridgeCommandWrapper());
- map.put(OvsDestroyBridgeCommand.class, new CitrixOvsDestroyBridgeCommandWrapper());
- map.put(OvsDestroyTunnelCommand.class, new CitrixOvsDestroyTunnelCommandWrapper());
- map.put(UpdateHostPasswordCommand.class, new CitrixUpdateHostPasswordCommandWrapper());
- map.put(ClusterVMMetaDataSyncCommand.class, new CitrixClusterVMMetaDataSyncCommandWrapper());
- map.put(CheckNetworkCommand.class, new CitrixCheckNetworkCommandWrapper());
- map.put(PlugNicCommand.class, new CitrixPlugNicCommandWrapper());
- map.put(UnPlugNicCommand.class, new CitrixUnPlugNicCommandWrapper());
- map.put(CreateVMSnapshotCommand.class, new CitrixCreateVMSnapshotCommandWrapper());
- map.put(DeleteVMSnapshotCommand.class, new CitrixDeleteVMSnapshotCommandWrapper());
- map.put(RevertToVMSnapshotCommand.class, new CitrixRevertToVMSnapshotCommandWrapper());
- map.put(NetworkRulesVmSecondaryIpCommand.class, new CitrixNetworkRulesVmSecondaryIpCommandWrapper());
- map.put(ScaleVmCommand.class, new CitrixScaleVmCommandWrapper());
- map.put(PvlanSetupCommand.class, new CitrixPvlanSetupCommandWrapper());
- map.put(PerformanceMonitorCommand.class, new CitrixPerformanceMonitorCommandWrapper());
- map.put(NetworkElementCommand.class, new CitrixNetworkElementCommandWrapper());
+ // CitrixResourceBase commands
+ final Hashtable<Class<? extends Command>, CommandWrapper> citrixCommands = new Hashtable<Class<? extends Command>, CommandWrapper>();
+ citrixCommands.put(RebootRouterCommand.class, new CitrixRebootRouterCommandWrapper());
+ citrixCommands.put(CreateCommand.class, new CitrixCreateCommandWrapper());
+ citrixCommands.put(CheckConsoleProxyLoadCommand.class, new CitrixCheckConsoleProxyLoadCommandWrapper());
+ citrixCommands.put(WatchConsoleProxyLoadCommand.class, new CitrixWatchConsoleProxyLoadCommandWrapper());
+ citrixCommands.put(ReadyCommand.class, new CitrixReadyCommandWrapper());
+ citrixCommands.put(GetHostStatsCommand.class, new CitrixGetHostStatsCommandWrapper());
+ citrixCommands.put(GetVmStatsCommand.class, new CitrixGetVmStatsCommandWrapper());
+ citrixCommands.put(GetVmDiskStatsCommand.class, new CitrixGetVmDiskStatsCommandWrapper());
+ citrixCommands.put(CheckHealthCommand.class, new CitrixCheckHealthCommandWrapper());
+ citrixCommands.put(StopCommand.class, new CitrixStopCommandWrapper());
+ citrixCommands.put(RebootCommand.class, new CitrixRebootCommandWrapper());
+ citrixCommands.put(CheckVirtualMachineCommand.class, new CitrixCheckVirtualMachineCommandWrapper());
+ citrixCommands.put(PrepareForMigrationCommand.class, new CitrixPrepareForMigrationCommandWrapper());
+ citrixCommands.put(MigrateCommand.class, new CitrixMigrateCommandWrapper());
+ citrixCommands.put(DestroyCommand.class, new CitrixDestroyCommandWrapper());
+ citrixCommands.put(CreateStoragePoolCommand.class, new CitrixCreateStoragePoolCommandWrapper());
+ citrixCommands.put(ModifyStoragePoolCommand.class, new CitrixModifyStoragePoolCommandWrapper());
+ citrixCommands.put(DeleteStoragePoolCommand.class, new CitrixDeleteStoragePoolCommandWrapper());
+ citrixCommands.put(ResizeVolumeCommand.class, new CitrixResizeVolumeCommandWrapper());
+ citrixCommands.put(AttachVolumeCommand.class, new CitrixAttachVolumeCommandWrapper());
+ citrixCommands.put(AttachIsoCommand.class, new CitrixAttachIsoCommandWrapper());
+ citrixCommands.put(UpgradeSnapshotCommand.class, new CitrixUpgradeSnapshotCommandWrapper());
+ citrixCommands.put(GetStorageStatsCommand.class, new CitrixGetStorageStatsCommandWrapper());
+ citrixCommands.put(PrimaryStorageDownloadCommand.class, new CitrixPrimaryStorageDownloadCommandWrapper());
+ citrixCommands.put(GetVncPortCommand.class, new CitrixGetVncPortCommandWrapper());
+ citrixCommands.put(SetupCommand.class, new CitrixSetupCommandWrapper());
+ citrixCommands.put(MaintainCommand.class, new CitrixMaintainCommandWrapper());
+ citrixCommands.put(PingTestCommand.class, new CitrixPingTestCommandWrapper());
+ citrixCommands.put(CheckOnHostCommand.class, new CitrixCheckOnHostCommandWrapper());
+ citrixCommands.put(ModifySshKeysCommand.class, new CitrixModifySshKeysCommandWrapper());
+ citrixCommands.put(StartCommand.class, new CitrixStartCommandWrapper());
+ citrixCommands.put(OvsSetTagAndFlowCommand.class, new CitrixOvsSetTagAndFlowCommandWrapper());
+ citrixCommands.put(CheckSshCommand.class, new CitrixCheckSshCommandWrapper());
+ citrixCommands.put(SecurityGroupRulesCmd.class, new CitrixSecurityGroupRulesCommandWrapper());
+ citrixCommands.put(OvsFetchInterfaceCommand.class, new CitrixOvsFetchInterfaceCommandWrapper());
+ citrixCommands.put(OvsCreateGreTunnelCommand.class, new CitrixOvsCreateGreTunnelCommandWrapper());
+ citrixCommands.put(OvsDeleteFlowCommand.class, new CitrixOvsDeleteFlowCommandWrapper());
+ citrixCommands.put(OvsVpcPhysicalTopologyConfigCommand.class, new CitrixOvsVpcPhysicalTopologyConfigCommandWrapper());
+ citrixCommands.put(OvsVpcRoutingPolicyConfigCommand.class, new CitrixOvsVpcRoutingPolicyConfigCommandWrapper());
+ citrixCommands.put(CleanupNetworkRulesCmd.class, new CitrixCleanupNetworkRulesCmdWrapper());
+ citrixCommands.put(NetworkRulesSystemVmCommand.class, new CitrixNetworkRulesSystemVmCommandWrapper());
+ citrixCommands.put(OvsCreateTunnelCommand.class, new CitrixOvsCreateTunnelCommandWrapper());
+ citrixCommands.put(OvsSetupBridgeCommand.class, new CitrixOvsSetupBridgeCommandWrapper());
+ citrixCommands.put(OvsDestroyBridgeCommand.class, new CitrixOvsDestroyBridgeCommandWrapper());
+ citrixCommands.put(OvsDestroyTunnelCommand.class, new CitrixOvsDestroyTunnelCommandWrapper());
+ citrixCommands.put(UpdateHostPasswordCommand.class, new CitrixUpdateHostPasswordCommandWrapper());
+ citrixCommands.put(ClusterVMMetaDataSyncCommand.class, new CitrixClusterVMMetaDataSyncCommandWrapper());
+ citrixCommands.put(CheckNetworkCommand.class, new CitrixCheckNetworkCommandWrapper());
+ citrixCommands.put(PlugNicCommand.class, new CitrixPlugNicCommandWrapper());
+ citrixCommands.put(UnPlugNicCommand.class, new CitrixUnPlugNicCommandWrapper());
+ citrixCommands.put(CreateVMSnapshotCommand.class, new CitrixCreateVMSnapshotCommandWrapper());
+ citrixCommands.put(DeleteVMSnapshotCommand.class, new CitrixDeleteVMSnapshotCommandWrapper());
+ citrixCommands.put(RevertToVMSnapshotCommand.class, new CitrixRevertToVMSnapshotCommandWrapper());
+ citrixCommands.put(NetworkRulesVmSecondaryIpCommand.class, new CitrixNetworkRulesVmSecondaryIpCommandWrapper());
+ citrixCommands.put(ScaleVmCommand.class, new CitrixScaleVmCommandWrapper());
+ citrixCommands.put(PvlanSetupCommand.class, new CitrixPvlanSetupCommandWrapper());
+ citrixCommands.put(PerformanceMonitorCommand.class, new CitrixPerformanceMonitorCommandWrapper());
+ citrixCommands.put(NetworkElementCommand.class, new CitrixNetworkElementCommandWrapper());
+ resources.put(CitrixResourceBase.class, citrixCommands);
+
+ // XenServer56Resource commands
+ final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
+ xenServer56Commands.put(CheckOnHostCommand.class, new XenServer56CheckOnHostCommandWrapper());
+ resources.put(XenServer56Resource.class, xenServer56Commands);
+
+ initialised = true;
}
public static CitrixRequestWrapper getInstance() {
return instance;
}
- @SuppressWarnings("unchecked")
+ boolean isInitialised() {
+ return initialised;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Answer execute(final Command command, final ServerResource serverResource) {
- CommandWrapper<Command, Answer, ServerResource> commandWrapper = map.get(command.getClass());
+ Hashtable<Class<? extends Command>, CommandWrapper> commands = resources.get(serverResource.getClass());
- // This is temporary. We have to map the classes with several sub-classes better.
- if (commandWrapper == null && command instanceof StorageSubSystemCommand) {
- commandWrapper = map.get(StorageSubSystemCommand.class);
+ // Can't instantiate the CitrixResourceBase because it's abstract. In order to reuse the command with subclasses
+ // I need to do this check here.
+ if (commands == null) {
+ commands = resources.get(serverResource.getClass().getSuperclass());
}
+
+ CommandWrapper<Command, Answer, ServerResource> commandWrapper = commands.get(command.getClass());
+
+ // This is temporary. We have to map the classes with several sub-classes better.
if (commandWrapper == null && command instanceof NetworkElementCommand) {
- commandWrapper = map.get(NetworkElementCommand.class);
+ commandWrapper = commands.get(NetworkElementCommand.class);
}
if (commandWrapper == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4600eef8/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56CheckOnHostCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56CheckOnHostCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56CheckOnHostCommandWrapper.java
new file mode 100644
index 0000000..972936e
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56CheckOnHostCommandWrapper.java
@@ -0,0 +1,48 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckOnHostAnswer;
+import com.cloud.agent.api.CheckOnHostCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.resource.CommandWrapper;
+
+public final class XenServer56CheckOnHostCommandWrapper extends CommandWrapper<CheckOnHostCommand, Answer, XenServer56Resource> {
+
+ private static final Logger s_logger = Logger.getLogger(XenServer56CheckOnHostCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CheckOnHostCommand command, final XenServer56Resource xenServer56) {
+ final Boolean alive = xenServer56.checkHeartbeat(command.getHost().getGuid());
+ String msg = "";
+ if (alive == null) {
+ msg = " cannot determine ";
+ } else if ( alive == true) {
+ msg = "Heart beat is still going";
+ } else {
+ msg = "Heart beat is gone so dead.";
+ }
+ s_logger.debug(msg);
+ return new CheckOnHostAnswer(command, alive, msg);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4600eef8/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
deleted file mode 100644
index 4d492aa..0000000
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * 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;
-
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.xmlrpc.XmlRpcException;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
-
-import com.cloud.agent.api.ScaleVmAnswer;
-import com.cloud.agent.api.ScaleVmCommand;
-import com.cloud.agent.api.to.IpAddressTO;
-import com.cloud.agent.api.to.VirtualMachineTO;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Types;
-import com.xensource.xenapi.VIF;
-import com.xensource.xenapi.VM;
-import com.xensource.xenapi.XenAPIObject;
-
-public class CitrixResourceBaseTest {
-
- @Spy
- CitrixResourceBase _resource = new CitrixResourceBase() {
-
- @Override
- public ScaleVmAnswer execute(final ScaleVmCommand cmd) {
- return super.execute(cmd);
- }
-
- @Override
- public String callHostPlugin(final Connection conn, final String plugin, final String cmd, final String... params) {
- return "Success";
- }
-
- @Override
- public void scaleVM(final Connection conn, final VM vm, final VirtualMachineTO vmSpec, final Host host) throws Types.XenAPIException, XmlRpcException {
- _host.setSpeed(500);
- super.scaleVM(conn, vm, vmSpec, host);
- }
-
- @Override
- public boolean isDmcEnabled(final Connection conn, final Host host) throws Types.XenAPIException, XmlRpcException {
- return true;
- }
- };
- @Mock
- XsHost _host;
- @Mock
- Host host;
- @Mock
- ScaleVmCommand cmd;
- @Mock
- VirtualMachineTO vmSpec;
- @Mock
- Connection conn;
- @Mock
- VM vm;
-
- @Before
- public void setup() {
-
- MockitoAnnotations.initMocks(this);
-
- doReturn(vmSpec).when(cmd).getVirtualMachine();
- doReturn("i-2-3-VM").when(vmSpec).getName();
-
- }
-
- // Expecting XmlRpcException while trying to get the record of vm using connection
- @Test(expected = XmlRpcException.class)
- public void testScaleVMF1() throws Types.BadServerResponse, Types.XenAPIException, XmlRpcException {
- doReturn(conn).when(_resource).getConnection();
- final Set<VM> vms = mock(Set.class);
-
- final Iterator iter = mock(Iterator.class);
- doReturn(iter).when(vms).iterator();
- when(iter.hasNext()).thenReturn(true).thenReturn(false);
- doReturn(vm).when(iter).next();
- final VM.Record vmr = mock(VM.Record.class);
- when(vm.getRecord(conn)).thenThrow(new XmlRpcException("XmlRpcException"));
- when(vm.getRecord(conn)).thenReturn(vmr);
- vmr.powerState = Types.VmPowerState.RUNNING;
- vmr.residentOn = mock(Host.class);
- final XenAPIObject object = mock(XenAPIObject.class);
- doReturn(new String("OpaqueRef:NULL")).when(object).toWireString();
- doNothing().when(_resource).scaleVM(conn, vm, vmSpec, host);
-
- _resource.execute(cmd);
- verify(iter, times(2)).hasNext();
- verify(iter, times(2)).next();
-
- }
-
- // Test to scale vm "i-2-3-VM" cpu-cap disabled
- @Test
- public void testScaleVMF2() throws Types.XenAPIException, XmlRpcException {
-
- when(vm.getMemoryStaticMax(conn)).thenReturn(1073741824L);
- when(vm.getMemoryStaticMin(conn)).thenReturn(268435456L);
- doReturn(536870912L).when(vmSpec).getMinRam();
- doReturn(536870912L).when(vmSpec).getMaxRam();
- doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L);
- doReturn(1).when(vmSpec).getCpus();
- doNothing().when(vm).setVCPUsNumberLive(conn, 1L);
- doReturn(500).when(vmSpec).getMinSpeed();
- doReturn(false).when(vmSpec).getLimitCpuUse();
- final Map<String, String> args = mock(HashMap.class);
- when(host.callPlugin(conn, "vmops", "add_to_VCPUs_params_live", args)).thenReturn("Success");
- doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM");
-
- _resource.scaleVM(conn, vm, vmSpec, host);
-
- verify(vmSpec, times(1)).getLimitCpuUse();
- verify(_resource, times(1)).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM");
- }
-
- // Test to scale vm "i-2-3-VM" cpu-cap enabled
- @Test
- public void testScaleVMF3() throws Types.XenAPIException, XmlRpcException {
-
- when(vm.getMemoryStaticMax(conn)).thenReturn(1073741824L);
- when(vm.getMemoryStaticMin(conn)).thenReturn(268435456L);
- doReturn(536870912L).when(vmSpec).getMinRam();
- doReturn(536870912L).when(vmSpec).getMaxRam();
- doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L);
- doReturn(1).when(vmSpec).getCpus();
- doNothing().when(vm).setVCPUsNumberLive(conn, 1L);
- doReturn(500).when(vmSpec).getMinSpeed();
- doReturn(500).when(vmSpec).getMaxSpeed();
- doReturn(true).when(vmSpec).getLimitCpuUse();
- doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", "99", "vmname", "i-2-3-VM");
- final Map<String, String> args = mock(HashMap.class);
- when(host.callPlugin(conn, "vmops", "add_to_VCPUs_params_live", args)).thenReturn("Success");
- doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM");
-
- _resource.scaleVM(conn, vm, vmSpec, host);
-
- verify(vmSpec, times(1)).getLimitCpuUse();
- verify(_resource, times(1)).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM");
- verify(_resource, times(1)).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", "99", "vmname", "i-2-3-VM");
- }
-
-
- @Test
- public void testSetNicDevIdIfCorrectVifIsNotNull() throws Exception {
- final IpAddressTO ip = mock(IpAddressTO.class);
- when(ip.isAdd()).thenReturn(false);
- final VIF correctVif = null;
- try {
- _resource.setNicDevIdIfCorrectVifIsNotNull(conn, ip, correctVif);
- } catch (final NullPointerException e) {
- fail("this test is meant to show that null pointer is not thrown");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4600eef8/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
new file mode 100644
index 0000000..b8f43df
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
@@ -0,0 +1,38 @@
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckOnHostCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ Connection.class, Host.Record.class })
+public class XenServer56WrapperTest {
+
+ @Mock
+ private XenServer56Resource xenServer56Resource;
+
+ @Test
+ public void testCheckOnHostCommand() {
+ final com.cloud.host.Host host = Mockito.mock(com.cloud.host.Host.class);
+ final CheckOnHostCommand onHostCommand = new CheckOnHostCommand(host);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(onHostCommand, xenServer56Resource);
+
+ assertTrue(answer.getResult());
+ }
+}
[06/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java b/plugins/hypervisors/xenserver/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
index 161a7b2..4971eb3 100644
--- a/plugins/hypervisors/xenserver/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
+++ b/plugins/hypervisors/xenserver/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
@@ -25,6 +25,11 @@ import java.util.concurrent.TimeoutException;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer620SP1Resource;
+import com.cloud.utils.Pair;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VirtualMachine;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Event;
import com.xensource.xenapi.EventBatch;
@@ -35,12 +40,6 @@ import com.xensource.xenapi.Types;
import com.xensource.xenapi.Types.XenAPIException;
import com.xensource.xenapi.VM;
-import com.cloud.agent.api.StartupCommand;
-import com.cloud.hypervisor.xenserver.resource.XenServer620SP1Resource;
-import com.cloud.utils.Pair;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.vm.VirtualMachine;
-
/**
*
* XenServerResourceNewBase is an abstract base class that encapsulates how
@@ -67,16 +66,16 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
@Override
public StartupCommand[] initialize() throws IllegalArgumentException {
- StartupCommand[] cmds = super.initialize();
+ final StartupCommand[] cmds = super.initialize();
- Connection conn = getConnection();
+ final Connection conn = getConnection();
Pool pool;
try {
- pool = Pool.getByUuid(conn, _host.pool);
- Pool.Record poolr = pool.getRecord(conn);
+ pool = Pool.getByUuid(conn, _host.getPool());
+ final Pool.Record poolr = pool.getRecord(conn);
- Host.Record masterRecord = poolr.master.getRecord(conn);
- if (_host.uuid.equals(masterRecord.uuid)) {
+ final Host.Record masterRecord = poolr.master.getRecord(conn);
+ if (_host.getUuid().equals(masterRecord.uuid)) {
_listener = new VmEventListener(true);
//
@@ -87,36 +86,37 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
} else {
_listener = new VmEventListener(false);
}
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
throw new CloudRuntimeException("Unable to determine who is the master", e);
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
throw new CloudRuntimeException("Unable to determine who is the master", e);
}
return cmds;
}
- protected void waitForTask2(Connection c, Task task, long pollInterval, long timeout) throws XenAPIException, XmlRpcException, TimeoutException {
- long beginTime = System.currentTimeMillis();
+ protected void waitForTask2(final Connection c, final Task task, final long pollInterval, final long timeout) throws XenAPIException, XmlRpcException, TimeoutException {
+ final long beginTime = System.currentTimeMillis();
if (s_logger.isTraceEnabled()) {
s_logger.trace("Task " + task.getNameLabel(c) + " (" + task.getType(c) + ") sent to " + c.getSessionReference() + " is pending completion with a " + timeout +
- "ms timeout");
+ "ms timeout");
}
- Set<String> classes = new HashSet<String>();
+ final Set<String> classes = new HashSet<String>();
classes.add("Task/" + task.toWireString());
String token = "";
- Double t = new Double(timeout / 1000);
+ final Double t = new Double(timeout / 1000);
while (true) {
- EventBatch map = Event.from(c, classes, token, t);
+ final EventBatch map = Event.from(c, classes, token, t);
token = map.token;
@SuppressWarnings("unchecked")
+ final
Set<Event.Record> events = map.events;
if (events.size() == 0) {
- String msg = "No event for task " + task.toWireString();
+ final String msg = "No event for task " + task.toWireString();
s_logger.warn(msg);
task.cancel(c);
throw new TimeoutException(msg);
}
- for (Event.Record rec : events) {
+ for (final Event.Record rec : events) {
if (!(rec.snapshot instanceof Task.Record)) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Skipping over " + rec);
@@ -124,7 +124,7 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
continue;
}
- Task.Record taskRecord = (Task.Record)rec.snapshot;
+ final Task.Record taskRecord = (Task.Record)rec.snapshot;
if (taskRecord.status != Types.TaskStatusType.PENDING) {
if (s_logger.isDebugEnabled()) {
@@ -139,7 +139,7 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
}
}
if (System.currentTimeMillis() - beginTime > timeout) {
- String msg = "Async " + timeout / 1000 + " seconds timeout for task " + task.toString();
+ final String msg = "Async " + timeout / 1000 + " seconds timeout for task " + task.toString();
s_logger.warn(msg);
task.cancel(c);
throw new TimeoutException(msg);
@@ -155,7 +155,7 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
Set<String> _classes;
String _token = "";
- public VmEventListener(boolean isMaster) {
+ public VmEventListener(final boolean isMaster) {
_isMaster = isMaster;
_classes = new HashSet<String>();
_classes.add("VM");
@@ -163,22 +163,23 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
@Override
public void run() {
- setName("XS-Listener-" + _host.ip);
+ setName("XS-Listener-" + _host.getIp());
while (!_stop) {
try {
- Connection conn = getConnection();
+ final Connection conn = getConnection();
EventBatch results;
try {
results = Event.from(conn, _classes, _token, new Double(30));
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Retrying the waiting on VM events due to: ", e);
continue;
}
_token = results.token;
@SuppressWarnings("unchecked")
+ final
Set<Event.Record> events = results.events;
- for (Event.Record event : events) {
+ for (final Event.Record event : events) {
try {
if (!(event.snapshot instanceof VM.Record)) {
if (s_logger.isDebugEnabled()) {
@@ -186,24 +187,24 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
}
continue;
}
- VM.Record vm = (VM.Record)event.snapshot;
+ final VM.Record vm = (VM.Record)event.snapshot;
String hostUuid = null;
if (vm.residentOn != null && !vm.residentOn.toWireString().contains("OpaqueRef:NULL")) {
hostUuid = vm.residentOn.getUuid(conn);
}
recordChanges(conn, vm, hostUuid);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Skipping over " + event, e);
}
}
- } catch (Throwable th) {
+ } catch (final Throwable th) {
s_logger.error("Exception caught in eventlistener thread: ", th);
}
}
}
- protected void recordChanges(Connection conn, VM.Record rec, String hostUuid) {
+ protected void recordChanges(final Connection conn, final VM.Record rec, final String hostUuid) {
}
@@ -211,16 +212,16 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
public void start() {
if (_isMaster) {
// Throw away the initial set of events because they're history
- Connection conn = getConnection();
+ final Connection conn = getConnection();
EventBatch results;
try {
results = Event.from(conn, _classes, _token, new Double(30));
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Retrying the waiting on VM events due to: ", e);
throw new CloudRuntimeException("Unable to start a listener thread to listen to VM events", e);
}
_token = results.token;
- s_logger.debug("Starting the event listener thread for " + _host.uuid);
+ s_logger.debug("Starting the event listener thread for " + _host.getUuid());
super.start();
}
}
@@ -234,7 +235,7 @@ public class XenServerResourceNewBase extends XenServer620SP1Resource {
if (_changes.size() == 0) {
return null;
}
- HashMap<String, Pair<String, VirtualMachine.State>> diff = _changes;
+ final HashMap<String, Pair<String, VirtualMachine.State>> diff = _changes;
_changes = new HashMap<String, Pair<String, VirtualMachine.State>>();
return diff;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
index 0c2944c..e79e8af 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java
@@ -39,6 +39,10 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
+import com.cloud.agent.api.ScaleVmAnswer;
+import com.cloud.agent.api.ScaleVmCommand;
+import com.cloud.agent.api.to.IpAddressTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.Types;
@@ -46,35 +50,29 @@ import com.xensource.xenapi.VIF;
import com.xensource.xenapi.VM;
import com.xensource.xenapi.XenAPIObject;
-import com.cloud.agent.api.ScaleVmAnswer;
-import com.cloud.agent.api.ScaleVmCommand;
-import com.cloud.agent.api.to.IpAddressTO;
-import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase.XsHost;
-
public class CitrixResourceBaseTest {
@Spy
CitrixResourceBase _resource = new CitrixResourceBase() {
@Override
- public ScaleVmAnswer execute(ScaleVmCommand cmd) {
+ public ScaleVmAnswer execute(final ScaleVmCommand cmd) {
return super.execute(cmd);
}
@Override
- public String callHostPlugin(Connection conn, String plugin, String cmd, String... params) {
+ public String callHostPlugin(final Connection conn, final String plugin, final String cmd, final String... params) {
return "Success";
}
@Override
- protected void scaleVM(Connection conn, VM vm, VirtualMachineTO vmSpec, Host host) throws Types.XenAPIException, XmlRpcException {
- _host.speed = 500;
+ protected void scaleVM(final Connection conn, final VM vm, final VirtualMachineTO vmSpec, final Host host) throws Types.XenAPIException, XmlRpcException {
+ _host.setSpeed(500);
super.scaleVM(conn, vm, vmSpec, host);
}
@Override
- protected boolean isDmcEnabled(Connection conn, Host host) throws Types.XenAPIException, XmlRpcException {
+ protected boolean isDmcEnabled(final Connection conn, final Host host) throws Types.XenAPIException, XmlRpcException {
return true;
}
};
@@ -105,18 +103,18 @@ public class CitrixResourceBaseTest {
@Test(expected = XmlRpcException.class)
public void testScaleVMF1() throws Types.BadServerResponse, Types.XenAPIException, XmlRpcException {
doReturn(conn).when(_resource).getConnection();
- Set<VM> vms = mock(Set.class);
+ final Set<VM> vms = mock(Set.class);
- Iterator iter = mock(Iterator.class);
+ final Iterator iter = mock(Iterator.class);
doReturn(iter).when(vms).iterator();
when(iter.hasNext()).thenReturn(true).thenReturn(false);
doReturn(vm).when(iter).next();
- VM.Record vmr = mock(VM.Record.class);
+ final VM.Record vmr = mock(VM.Record.class);
when(vm.getRecord(conn)).thenThrow(new XmlRpcException("XmlRpcException"));
when(vm.getRecord(conn)).thenReturn(vmr);
vmr.powerState = Types.VmPowerState.RUNNING;
vmr.residentOn = mock(Host.class);
- XenAPIObject object = mock(XenAPIObject.class);
+ final XenAPIObject object = mock(XenAPIObject.class);
doReturn(new String("OpaqueRef:NULL")).when(object).toWireString();
doNothing().when(_resource).scaleVM(conn, vm, vmSpec, host);
@@ -139,7 +137,7 @@ public class CitrixResourceBaseTest {
doNothing().when(vm).setVCPUsNumberLive(conn, 1L);
doReturn(500).when(vmSpec).getMinSpeed();
doReturn(false).when(vmSpec).getLimitCpuUse();
- Map<String, String> args = mock(HashMap.class);
+ final Map<String, String> args = mock(HashMap.class);
when(host.callPlugin(conn, "vmops", "add_to_VCPUs_params_live", args)).thenReturn("Success");
doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM");
@@ -164,7 +162,7 @@ public class CitrixResourceBaseTest {
doReturn(500).when(vmSpec).getMaxSpeed();
doReturn(true).when(vmSpec).getLimitCpuUse();
doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", "99", "vmname", "i-2-3-VM");
- Map<String, String> args = mock(HashMap.class);
+ final Map<String, String> args = mock(HashMap.class);
when(host.callPlugin(conn, "vmops", "add_to_VCPUs_params_live", args)).thenReturn("Success");
doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM");
@@ -178,12 +176,12 @@ public class CitrixResourceBaseTest {
@Test
public void testSetNicDevIdIfCorrectVifIsNotNull() throws Exception {
- IpAddressTO ip = mock(IpAddressTO.class);
+ final IpAddressTO ip = mock(IpAddressTO.class);
when(ip.isAdd()).thenReturn(false);
- VIF correctVif = null;
+ final VIF correctVif = null;
try {
_resource.setNicDevIdIfCorrectVifIsNotNull(conn, ip, correctVif);
- } catch (NullPointerException e) {
+ } catch (final NullPointerException e) {
fail("this test is meant to show that null pointer is not thrown");
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/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 f8af543..3e7fb57 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
@@ -14,6 +14,7 @@ import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
@@ -96,4 +97,16 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testReadyCommandCommand() {
+ final ReadyCommand readyCommand = new ReadyCommand();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(readyCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
\ No newline at end of file
[36/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring XenServer56 and 56FP1 Resources in order to cope with new FenceCommandWrapper
- Unit tests added
Also removed an unit test that was doing nothing.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f3842c81
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f3842c81
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f3842c81
Branch: refs/heads/master
Commit: f3842c81f8ae35b21131abe8d88c8cbc3b201b1c
Parents: 4600eef
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 31 07:44:39 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:33 2015 +0200
----------------------------------------------------------------------
.../resource/XenServer56FP1Resource.java | 56 ------------
.../xenserver/resource/XenServer56Resource.java | 36 +-------
.../resource/wrapper/CitrixRequestWrapper.java | 8 ++
.../XenServer56FP1FenceCommandWrapper.java | 92 ++++++++++++++++++++
.../wrapper/XenServer56FenceCommandWrapper.java | 71 +++++++++++++++
.../test/com/cloud/ha/XenServerFencerTest.java | 39 ---------
.../wrapper/XenServer56FP1WrapperTest.java | 49 +++++++++++
.../wrapper/XenServer56WrapperTest.java | 34 +++++++-
8 files changed, 251 insertions(+), 134 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
index 26f148e..1143528 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
@@ -18,32 +18,22 @@ package com.cloud.hypervisor.xenserver.resource;
import java.io.File;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import javax.ejb.Local;
-import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.cloud.agent.api.FenceAnswer;
-import com.cloud.agent.api.FenceCommand;
import com.cloud.resource.ServerResource;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VBD;
-import com.xensource.xenapi.VDI;
-import com.xensource.xenapi.VM;
@Local(value = ServerResource.class)
public class XenServer56FP1Resource extends XenServer56Resource {
- private static final long mem_128m = 134217728L;
- private static final Logger s_logger = Logger.getLogger(XenServer56FP1Resource.class);
public XenServer56FP1Resource() {
super();
@@ -62,52 +52,6 @@ public class XenServer56FP1Resource extends XenServer56Resource {
return files;
}
- @Override
- protected FenceAnswer execute(final FenceCommand cmd) {
- final Connection conn = getConnection();
- try {
- final Boolean alive = checkHeartbeat(cmd.getHostGuid());
- if ( alive == null ) {
- s_logger.debug("Failed to check heartbeat, so unable to fence");
- return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
- }
- if ( alive ) {
- s_logger.debug("Heart beat is still going so unable to fence");
- return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
- }
- final Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
- for (final VM vm : vms) {
- final Set<VDI> vdis = new HashSet<VDI>();
- final Set<VBD> vbds = vm.getVBDs(conn);
- for (final VBD vbd : vbds) {
- final VDI vdi = vbd.getVDI(conn);
- if (!isRefNull(vdi)) {
- vdis.add(vdi);
- }
- }
- s_logger.info("Fence command for VM " + cmd.getVmName());
- vm.powerStateReset(conn);
- vm.destroy(conn);
- for (final VDI vdi : vdis) {
- final Map<String, String> smConfig = vdi.getSmConfig(conn);
- for (final String key : smConfig.keySet()) {
- if (key.startsWith("host_")) {
- vdi.removeFromSmConfig(conn, key);
- break;
- }
- }
- }
- }
- return new FenceAnswer(cmd);
- } catch (final XmlRpcException e) {
- s_logger.warn("Unable to fence", e);
- return new FenceAnswer(cmd, false, e.getMessage());
- } catch (final XenAPIException e) {
- s_logger.warn("Unable to fence", e);
- return new FenceAnswer(cmd, false, e.getMessage());
- }
- }
-
/**
* When Dynamic Memory Control (DMC) is enabled -
* xenserver allows scaling the guest memory while the guest is running
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index 85cdf04..3a9baf1 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -19,7 +19,6 @@ package com.cloud.hypervisor.xenserver.resource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
import javax.ejb.Local;
@@ -28,8 +27,6 @@ import org.apache.xmlrpc.XmlRpcException;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
-import com.cloud.agent.api.FenceAnswer;
-import com.cloud.agent.api.FenceCommand;
import com.cloud.agent.api.NetworkUsageAnswer;
import com.cloud.agent.api.NetworkUsageCommand;
import com.cloud.agent.api.StartupCommand;
@@ -46,7 +43,6 @@ import com.xensource.xenapi.PIF;
import com.xensource.xenapi.Types.IpConfigurationMode;
import com.xensource.xenapi.Types.XenAPIException;
import com.xensource.xenapi.VLAN;
-import com.xensource.xenapi.VM;
@Local(value = ServerResource.class)
public class XenServer56Resource extends CitrixResourceBase {
@@ -63,9 +59,7 @@ public class XenServer56Resource extends CitrixResourceBase {
// Ignore this for now. Still working on converting the other commands.
}
- if (cmd instanceof FenceCommand) {
- return execute((FenceCommand) cmd);
- } else if (cmd instanceof NetworkUsageCommand) {
+ if (cmd instanceof NetworkUsageCommand) {
return execute((NetworkUsageCommand) cmd);
} else {
return super.executeRequest(cmd);
@@ -238,34 +232,6 @@ public class XenServer56Resource extends CitrixResourceBase {
}
}
- protected FenceAnswer execute(final FenceCommand cmd) {
- final Connection conn = getConnection();
- try {
- final Boolean alive = checkHeartbeat(cmd.getHostGuid());
- if (alive == null) {
- s_logger.debug("Failed to check heartbeat, so unable to fence");
- return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
- }
- if (alive) {
- s_logger.debug("Heart beat is still going so unable to fence");
- return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
- }
- final Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
- for (final VM vm : vms) {
- s_logger.info("Fence command for VM " + cmd.getVmName());
- vm.powerStateReset(conn);
- vm.destroy(conn);
- }
- return new FenceAnswer(cmd);
- } catch (final XmlRpcException e) {
- s_logger.warn("Unable to fence", e);
- return new FenceAnswer(cmd, false, e.getMessage());
- } catch (final XenAPIException e) {
- s_logger.warn("Unable to fence", e);
- return new FenceAnswer(cmd, false, e.getMessage());
- }
- }
-
@Override
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);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/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 05caabd..a5ca115 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
@@ -35,6 +35,7 @@ import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.CreateVMSnapshotCommand;
import com.cloud.agent.api.DeleteStoragePoolCommand;
import com.cloud.agent.api.DeleteVMSnapshotCommand;
+import com.cloud.agent.api.FenceCommand;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetStorageStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
@@ -82,6 +83,7 @@ import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.hypervisor.xenserver.resource.XenServer56FP1Resource;
import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.RequestWrapper;
@@ -173,8 +175,14 @@ public class CitrixRequestWrapper extends RequestWrapper {
// XenServer56Resource commands
final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
xenServer56Commands.put(CheckOnHostCommand.class, new XenServer56CheckOnHostCommandWrapper());
+ xenServer56Commands.put(FenceCommand.class, new XenServer56FenceCommandWrapper());
resources.put(XenServer56Resource.class, xenServer56Commands);
+ // XenServer56FP1Resource commands
+ final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56P1Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
+ xenServer56P1Commands.put(FenceCommand.class, new XenServer56FP1FenceCommandWrapper());
+ resources.put(XenServer56FP1Resource.class, xenServer56P1Commands);
+
initialised = true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java
new file mode 100644
index 0000000..b169636
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java
@@ -0,0 +1,92 @@
+//
+// 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.HashSet;
+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.FenceAnswer;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class XenServer56FP1FenceCommandWrapper extends CommandWrapper<FenceCommand, Answer, XenServer56Resource> {
+
+ private static final Logger s_logger = Logger.getLogger(XenServer56FP1FenceCommandWrapper.class);
+
+ @Override
+ public Answer execute(final FenceCommand command, final XenServer56Resource xenServer56) {
+ final Connection conn = xenServer56.getConnection();
+ try {
+ final Boolean alive = xenServer56.checkHeartbeat(command.getHostGuid());
+ if ( alive == null ) {
+ s_logger.debug("Failed to check heartbeat, so unable to fence");
+ return new FenceAnswer(command, false, "Failed to check heartbeat, so unable to fence");
+ }
+ if ( alive ) {
+ s_logger.debug("Heart beat is still going so unable to fence");
+ return new FenceAnswer(command, false, "Heartbeat is still going on unable to fence");
+ }
+ final Set<VM> vms = VM.getByNameLabel(conn, command.getVmName());
+ for (final VM vm : vms) {
+ final Set<VDI> vdis = new HashSet<VDI>();
+ final Set<VBD> vbds = vm.getVBDs(conn);
+ for (final VBD vbd : vbds) {
+ final VDI vdi = vbd.getVDI(conn);
+ if (!xenServer56.isRefNull(vdi)) {
+ vdis.add(vdi);
+ }
+ }
+ s_logger.info("Fence command for VM " + command.getVmName());
+ vm.powerStateReset(conn);
+ vm.destroy(conn);
+ for (final VDI vdi : vdis) {
+ final Map<String, String> smConfig = vdi.getSmConfig(conn);
+ for (final String key : smConfig.keySet()) {
+ if (key.startsWith("host_")) {
+ vdi.removeFromSmConfig(conn, key);
+ break;
+ }
+ }
+ }
+ }
+ return new FenceAnswer(command);
+ } catch (final XmlRpcException e) {
+ s_logger.warn("Unable to fence", e);
+ return new FenceAnswer(command, false, e.getMessage());
+ } catch (final XenAPIException e) {
+ s_logger.warn("Unable to fence", e);
+ return new FenceAnswer(command, false, e.getMessage());
+ } catch (final Exception e) {
+ s_logger.warn("Unable to fence", e);
+ return new FenceAnswer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.java
new file mode 100644
index 0000000..ece3329
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.java
@@ -0,0 +1,71 @@
+//
+// 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 org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.FenceAnswer;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
+
+public final class XenServer56FenceCommandWrapper extends CommandWrapper<FenceCommand, Answer, XenServer56Resource> {
+
+ private static final Logger s_logger = Logger.getLogger(XenServer56FenceCommandWrapper.class);
+
+ @Override
+ public Answer execute(final FenceCommand command, final XenServer56Resource xenServer56) {
+ final Connection conn = xenServer56.getConnection();
+ try {
+ final Boolean alive = xenServer56.checkHeartbeat(command.getHostGuid());
+ if (alive == null) {
+ s_logger.debug("Failed to check heartbeat, so unable to fence");
+ return new FenceAnswer(command, false, "Failed to check heartbeat, so unable to fence");
+ }
+ if (alive) {
+ s_logger.debug("Heart beat is still going so unable to fence");
+ return new FenceAnswer(command, false, "Heartbeat is still going on unable to fence");
+ }
+ final Set<VM> vms = VM.getByNameLabel(conn, command.getVmName());
+ for (final VM vm : vms) {
+ s_logger.info("Fence command for VM " + command.getVmName());
+ vm.powerStateReset(conn);
+ vm.destroy(conn);
+ }
+ return new FenceAnswer(command);
+ } catch (final XmlRpcException e) {
+ s_logger.warn("Unable to fence", e);
+ return new FenceAnswer(command, false, e.getMessage());
+ } catch (final XenAPIException e) {
+ s_logger.warn("Unable to fence", e);
+ return new FenceAnswer(command, false, e.getMessage());
+ } catch (final Exception e) {
+ s_logger.warn("Unable to fence", e);
+ return new FenceAnswer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java b/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java
deleted file mode 100644
index bd1d8f8..0000000
--- a/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.ha;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-
-public class XenServerFencerTest {
-
- @Test
- public void testSetAndGetName() throws Exception {
- XenServerFencer xenServerFencer = new XenServerFencer();
- String name = "name";
-
- xenServerFencer.setName(name);
- String actual = xenServerFencer.getName();
-
- assertEquals(name, actual);
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java
new file mode 100644
index 0000000..578302e
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java
@@ -0,0 +1,49 @@
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.host.Host;
+import com.cloud.hypervisor.xenserver.resource.XenServer56FP1Resource;
+import com.cloud.vm.VMInstanceVO;
+import com.xensource.xenapi.Connection;
+
+@RunWith(PowerMockRunner.class)
+public class XenServer56FP1WrapperTest {
+
+ @Mock
+ private XenServer56FP1Resource xenServer56Resource;
+
+ @Test
+ public void testFenceCommand() {
+ final VMInstanceVO vm = Mockito.mock(VMInstanceVO.class);
+ final Host host = Mockito.mock(Host.class);
+
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final FenceCommand fenceCommand = new FenceCommand(vm, host);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(xenServer56Resource.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(fenceCommand, xenServer56Resource);
+
+ verify(xenServer56Resource, times(1)).getConnection();
+ verify(xenServer56Resource, times(1)).checkHeartbeat(fenceCommand.getHostGuid());
+
+ assertFalse(answer.getResult());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
index b8f43df..f93a836 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
@@ -1,23 +1,27 @@
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.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CheckOnHostCommand;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.host.Host;
import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.vm.VMInstanceVO;
import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
@RunWith(PowerMockRunner.class)
-@PrepareForTest({ Connection.class, Host.Record.class })
public class XenServer56WrapperTest {
@Mock
@@ -35,4 +39,26 @@ public class XenServer56WrapperTest {
assertTrue(answer.getResult());
}
-}
+
+ @Test
+ public void testFenceCommand() {
+ final VMInstanceVO vm = Mockito.mock(VMInstanceVO.class);
+ final Host host = Mockito.mock(Host.class);
+
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final FenceCommand fenceCommand = new FenceCommand(vm, host);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(xenServer56Resource.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(fenceCommand, xenServer56Resource);
+
+ verify(xenServer56Resource, times(1)).getConnection();
+ verify(xenServer56Resource, times(1)).checkHeartbeat(fenceCommand.getHostGuid());
+
+ assertFalse(answer.getResult());
+ }
+}
\ No newline at end of file
[05/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring the GetHostStatsCommand
- Added basic tests
- Added test for when the key (Command) does not exist in the Map
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/0e51379d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/0e51379d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/0e51379d
Branch: refs/heads/master
Commit: 0e51379da72257e34fd24ae8d46df64981458347
Parents: 30e72e4
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 10:16:16 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:25 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 2 +-
.../resource/wrapper/CitrixRequestWrapper.java | 6 +++
.../wrapper/GetHostStatsCommandWrapper.java | 48 ++++++++++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 36 +++++++++++++++
4 files changed, 91 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0e51379d/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 850cbb3..42d37d5 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
@@ -2250,7 +2250,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected HostStatsEntry getHostStats(final Connection conn, final GetHostStatsCommand cmd, final String hostGuid, final long hostId) {
+ public HostStatsEntry getHostStats(final Connection conn, final GetHostStatsCommand cmd, final String hostGuid, final long hostId) {
final HostStatsEntry hostStats = new HostStatsEntry(hostId, 0, 0, 0, "host", 0, 0, 0, 0);
final Object[] rrdData = getRRDData(conn, 1); // call rrd method with 1 for host
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0e51379d/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 f2a921c..98989ab 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
@@ -23,6 +23,7 @@ import java.util.Hashtable;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
+import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootRouterCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -55,6 +56,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(CheckConsoleProxyLoadCommand.class, new CitrixCheckConsoleProxyLoadCommandWrapper());
map.put(WatchConsoleProxyLoadCommand.class, new CitrixWatchConsoleProxyLoadCommandWrapper());
map.put(ReadyCommand.class, new CitrixReadyCommandWrapper());
+ map.put(GetHostStatsCommand.class, new GetHostStatsCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
@@ -66,6 +68,10 @@ public class CitrixRequestWrapper extends RequestWrapper {
@SuppressWarnings("unchecked")
final CommandWrapper<Command, Answer, ServerResource> commandWrapper = map.get(command.getClass());
+ if (commandWrapper == null) {
+ throw new NullPointerException("No key found for '" + command.getClass() + "' in the Map!");
+ }
+
return commandWrapper.execute(command, serverResource);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0e51379d/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java
new file mode 100644
index 0000000..d605367
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java
@@ -0,0 +1,48 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetHostStatsAnswer;
+import com.cloud.agent.api.GetHostStatsCommand;
+import com.cloud.agent.api.HostStatsEntry;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class GetHostStatsCommandWrapper extends CommandWrapper<GetHostStatsCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(GetHostStatsCommandWrapper.class);
+
+ @Override
+ public Answer execute(final GetHostStatsCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final HostStatsEntry hostStats = citrixResourceBase.getHostStats(conn, command, command.getHostGuid(), command.getHostId());
+ return new GetHostStatsAnswer(command, hostStats);
+ } catch (final Exception e) {
+ final String msg = "Unable to get Host stats" + e.toString();
+ s_logger.warn(msg, e);
+ return new GetHostStatsAnswer(command, null);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0e51379d/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 3e7fb57..027a5fd 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,6 +3,7 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -14,6 +15,8 @@ import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
@@ -42,6 +45,18 @@ public class CitrixRequestWrapperTest {
}
@Test
+ public void testUnknownCommand() {
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ try {
+ wrapper.execute(new NotAValidCommand(), citrixResourceBase);
+ } catch (final Exception e) {
+ assertTrue(e instanceof NullPointerException);
+ }
+ }
+
+ @Test
public void testExecuteRebootRouterCommand() {
final RebootRouterCommand rebootCommand = new RebootRouterCommand("", "");
@@ -109,4 +124,25 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testGetHostStatsCommandCommand() {
+ final GetHostStatsCommand statsCommand = new GetHostStatsCommand(null, null, 0);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
+}
+
+class NotAValidCommand extends Command {
+
+ @Override
+ public boolean executeInSequence() {
+ return false;
+ }
+
}
\ No newline at end of file
[14/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactor the CheckHealthCommand and GetVmDiskStatsCommand classes in CitrixResourceBase
- Added basic tests for both wrappers
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c7830efe
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c7830efe
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c7830efe
Branch: refs/heads/master
Commit: c7830efef5d168adf37e64da639908f4186a01c2
Parents: 8f04108
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 11:05:43 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:26 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 2 +-
.../wrapper/CheckHealthCommandWrapper.java | 35 ++++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 4 +++
.../wrapper/GetVmDiskStatsCommandWrapper.java | 34 +++++++++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 26 +++++++++++++++
5 files changed, 100 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7830efe/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 024307d..c7405fc 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
@@ -394,7 +394,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
- protected boolean pingXAPI() {
+ public boolean pingXAPI() {
final Connection conn = getConnection();
try {
final Host host = Host.getByUuid(conn, _host.getUuid());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7830efe/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java
new file mode 100644
index 0000000..fa2e0ca
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java
@@ -0,0 +1,35 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckHealthAnswer;
+import com.cloud.agent.api.CheckHealthCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CheckHealthCommandWrapper extends CommandWrapper<CheckHealthCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final CheckHealthCommand command, final CitrixResourceBase citrixResourceBase) {
+ final boolean result = citrixResourceBase.pingXAPI();
+ return new CheckHealthAnswer(command, result);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7830efe/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 9c2f08d..b3996c1 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
@@ -22,8 +22,10 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
import java.util.Hashtable;
import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
+import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootRouterCommand;
@@ -59,6 +61,8 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(ReadyCommand.class, new CitrixReadyCommandWrapper());
map.put(GetHostStatsCommand.class, new GetHostStatsCommandWrapper());
map.put(GetVmStatsCommand.class, new GetVmStatsCommandWrapper());
+ map.put(GetVmDiskStatsCommand.class, new GetVmDiskStatsCommandWrapper());
+ map.put(CheckHealthCommand.class, new CheckHealthCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7830efe/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java
new file mode 100644
index 0000000..a403322
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java
@@ -0,0 +1,34 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetVmDiskStatsAnswer;
+import com.cloud.agent.api.GetVmDiskStatsCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class GetVmDiskStatsCommandWrapper extends CommandWrapper<GetVmDiskStatsCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final GetVmDiskStatsCommand command, final CitrixResourceBase citrixResourceBase) {
+ return new GetVmDiskStatsAnswer(command, null, null, null);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c7830efe/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 e54e809..69071c0 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
@@ -17,8 +17,10 @@ import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
+import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootAnswer;
@@ -151,6 +153,30 @@ public class CitrixRequestWrapperTest {
assertTrue(answer.getResult());
}
+
+ @Test
+ public void testGetVmDiskStatsCommandCommand() {
+ final GetVmDiskStatsCommand statsCommand = new GetVmDiskStatsCommand(new ArrayList<String>(), null, null);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testCheckHealthCommandCommand() {
+ final CheckHealthCommand statsCommand = new CheckHealthCommand();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[16/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring PrepareForMigrationCommand and MigrateCommand in order to cope with the new design
- Basic tests added
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a70d80df
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a70d80df
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a70d80df
Branch: refs/heads/master
Commit: a70d80dfd690b6cda2dde0eff163da31f55c24ee
Parents: cb07b0b
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 13:51:48 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:27 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 6 +-
.../wrapper/CitrixMigrateCommandWrapper.java | 84 ++++++++++++++++++++
...CitrixPrepareForMigrationCommandWrapper.java | 61 ++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 4 +
.../wrapper/CitrixRequestWrapperTest.java | 49 +++++++++---
5 files changed, 190 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a70d80df/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 30c96ee..2f7ba8b 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
@@ -1013,7 +1013,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected Network getNetwork(final Connection conn, final NicTO nic) throws XenAPIException, XmlRpcException {
+ public Network getNetwork(final Connection conn, final NicTO nic) throws XenAPIException, XmlRpcException {
final String name = nic.getName();
final XsLocalNetwork network = getNativeNetworkForTraffic(conn, nic.getType(), name);
if (network == null) {
@@ -1125,7 +1125,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vif;
}
- protected void prepareISO(final Connection conn, final String vmName) throws XmlRpcException, XenAPIException {
+ public void prepareISO(final Connection conn, final String vmName) throws XmlRpcException, XenAPIException {
final Set<VM> vms = VM.getByNameLabel(conn, vmName);
if (vms == null || vms.size() != 1) {
@@ -3355,7 +3355,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- private void migrateVM(final Connection conn, final Host destHost, final VM vm, final String vmName) throws Exception {
+ public void migrateVM(final Connection conn, final Host destHost, final VM vm, final String vmName) throws Exception {
Task task = null;
try {
final Map<String, String> other = new HashMap<String, String>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a70d80df/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMigrateCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMigrateCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMigrateCommandWrapper.java
new file mode 100644
index 0000000..6c5e55c
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixMigrateCommandWrapper.java
@@ -0,0 +1,84 @@
+//
+// 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.MigrateAnswer;
+import com.cloud.agent.api.MigrateCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VM;
+
+public final class CitrixMigrateCommandWrapper extends CommandWrapper<MigrateCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixMigrateCommandWrapper.class);
+
+ @Override
+ public Answer execute(final MigrateCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final String vmName = command.getVmName();
+
+ try {
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+
+ final String ipaddr = command.getDestinationIp();
+
+ final Set<Host> hosts = Host.getAll(conn);
+ Host dsthost = null;
+ if(hosts != null) {
+ for (final Host host : hosts) {
+ if (host.getAddress(conn).equals(ipaddr)) {
+ dsthost = host;
+ break;
+ }
+ }
+ }
+ if (dsthost == null) {
+ final String msg = "Migration failed due to unable to find host " + ipaddr + " in XenServer pool " + citrixResourceBase.getHost().getPool();
+ s_logger.warn(msg);
+ return new MigrateAnswer(command, false, msg, null);
+ }
+ for (final VM vm : vms) {
+ final Set<VBD> vbds = vm.getVBDs(conn);
+ for (final VBD vbd : vbds) {
+ final VBD.Record vbdRec = vbd.getRecord(conn);
+ if (vbdRec.type.equals(Types.VbdType.CD) && !vbdRec.empty) {
+ vbd.eject(conn);
+ break;
+ }
+ }
+ citrixResourceBase.migrateVM(conn, dsthost, vm, vmName);
+ vm.setAffinity(conn, dsthost);
+ }
+ return new MigrateAnswer(command, true, "migration succeeded", null);
+ } catch (final Exception e) {
+ s_logger.warn(e.getMessage(), e);
+ return new MigrateAnswer(command, false, e.getMessage(), null);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a70d80df/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrepareForMigrationCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrepareForMigrationCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrepareForMigrationCommandWrapper.java
new file mode 100644
index 0000000..a8bc182
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPrepareForMigrationCommandWrapper.java
@@ -0,0 +1,61 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.PrepareForMigrationAnswer;
+import com.cloud.agent.api.PrepareForMigrationCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixPrepareForMigrationCommandWrapper extends CommandWrapper<PrepareForMigrationCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixPrepareForMigrationCommandWrapper.class);
+
+ @Override
+ public Answer execute(final PrepareForMigrationCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+
+ final VirtualMachineTO vm = command.getVirtualMachine();
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Preparing host for migrating " + vm);
+ }
+
+ final NicTO[] nics = vm.getNics();
+ try {
+ citrixResourceBase.prepareISO(conn, vm.getName());
+
+ for (final NicTO nic : nics) {
+ citrixResourceBase.getNetwork(conn, nic);
+ }
+ s_logger.debug("4. The VM " + vm.getName() + " is in Migrating state");
+
+ return new PrepareForMigrationAnswer(command);
+ } catch (final Exception e) {
+ s_logger.warn("Catch Exception " + e.getClass().getName() + " prepare for migration failed due to " + e.toString(), e);
+ return new PrepareForMigrationAnswer(command, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a70d80df/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 77879f9..ca0b7d0 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
@@ -28,6 +28,8 @@ import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
+import com.cloud.agent.api.MigrateCommand;
+import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootCommand;
import com.cloud.agent.api.RebootRouterCommand;
@@ -69,6 +71,8 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(StopCommand.class, new CitrixStopCommandWrapper());
map.put(RebootCommand.class, new CitrixRebootCommandWrapper());
map.put(CheckVirtualMachineCommand.class, new CitrixCheckVirtualMachineCommandWrapper());
+ map.put(PrepareForMigrationCommand.class, new CitrixPrepareForMigrationCommandWrapper());
+ map.put(MigrateCommand.class, new CitrixMigrateCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a70d80df/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 2237cf1..e895581 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
@@ -21,6 +21,8 @@ import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
+import com.cloud.agent.api.MigrateCommand;
+import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
@@ -30,6 +32,7 @@ import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
+import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
import com.cloud.vm.DiskProfile;
@@ -37,11 +40,11 @@ import com.cloud.vm.DiskProfile;
public class CitrixRequestWrapperTest {
@Mock
- protected CitrixResourceBase citrixResourceBase;
+ private CitrixResourceBase citrixResourceBase;
@Mock
- protected RebootAnswer rebootAnswer;
+ private RebootAnswer rebootAnswer;
@Mock
- protected CreateAnswer createAnswer;
+ private CreateAnswer createAnswer;
@Test
public void testWrapperInstance() {
@@ -114,7 +117,7 @@ public class CitrixRequestWrapperTest {
}
@Test
- public void testReadyCommandCommand() {
+ public void testReadyCommand() {
final ReadyCommand readyCommand = new ReadyCommand();
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
@@ -126,7 +129,7 @@ public class CitrixRequestWrapperTest {
}
@Test
- public void testGetHostStatsCommandCommand() {
+ public void testGetHostStatsCommand() {
final GetHostStatsCommand statsCommand = new GetHostStatsCommand(null, null, 0);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
@@ -138,7 +141,7 @@ public class CitrixRequestWrapperTest {
}
@Test
- public void testGetVmStatsCommandCommand() {
+ public void testGetVmStatsCommand() {
final GetVmStatsCommand statsCommand = new GetVmStatsCommand(new ArrayList<String>(), null, null);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
@@ -150,7 +153,7 @@ public class CitrixRequestWrapperTest {
}
@Test
- public void testGetVmDiskStatsCommandCommand() {
+ public void testGetVmDiskStatsCommand() {
final GetVmDiskStatsCommand statsCommand = new GetVmDiskStatsCommand(new ArrayList<String>(), null, null);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
@@ -162,7 +165,7 @@ public class CitrixRequestWrapperTest {
}
@Test
- public void testCheckHealthCommandCommand() {
+ public void testCheckHealthCommand() {
final CheckHealthCommand statsCommand = new CheckHealthCommand();
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
@@ -200,16 +203,40 @@ public class CitrixRequestWrapperTest {
}
@Test
- public void testCheckVirtualMachineCommandCommand() {
- final CheckVirtualMachineCommand statsCommand = new CheckVirtualMachineCommand("Test");
+ public void testCheckVirtualMachineCommand() {
+ final CheckVirtualMachineCommand virtualMachineCommand = new CheckVirtualMachineCommand("Test");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(virtualMachineCommand, citrixResourceBase);
assertTrue(answer.getResult());
}
+
+ @Test
+ public void testPrepareForMigrationCommand() {
+ final PrepareForMigrationCommand prepareCommand = new PrepareForMigrationCommand(new VirtualMachineTO(0, "Test", null, 2, 200, 256, 512, null, "CentOS", true, false, "123"));
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(prepareCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testMigrateCommand() {
+ final MigrateCommand migrateCommand = new MigrateCommand("Test", "127.0.0.1", false, new VirtualMachineTO(0, "Test", null, 2, 200, 256, 512, null, "CentOS", true, false, "123"), false);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(migrateCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[07/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/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 c10844e..a01e192 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
@@ -24,22 +24,20 @@ import java.util.List;
import javax.ejb.Local;
+import org.apache.cloudstack.hypervisor.xenserver.XenServerResourceNewBase;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Types;
-import com.xensource.xenapi.VM;
-
-import org.apache.cloudstack.hypervisor.xenserver.XenServerResourceNewBase;
-
import com.cloud.resource.ServerResource;
import com.cloud.storage.resource.StorageSubsystemCommandHandler;
import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
import com.cloud.utils.ssh.SSHCmdHelper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VM;
@Local(value=ServerResource.class)
public class Xenserver625Resource extends XenServerResourceNewBase {
@@ -51,49 +49,48 @@ public class Xenserver625Resource extends XenServerResourceNewBase {
@Override
protected List<File> getPatchFiles() {
- List<File> files = new ArrayList<File>();
- String patch = "scripts/vm/hypervisor/xenserver/xenserver62/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xenserver62/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
@Override
protected StorageSubsystemCommandHandler getStorageHandler() {
- XenServerStorageProcessor processor = new Xenserver625StorageProcessor(this);
+ final XenServerStorageProcessor processor = new Xenserver625StorageProcessor(this);
return new StorageSubsystemCommandHandlerBase(processor);
}
@Override
- protected void umountSnapshotDir(Connection conn, Long dcId) {
-
+ public void umountSnapshotDir(final Connection conn, final Long dcId) {
}
@Override
- protected boolean setupServer(Connection conn,Host host) {
- com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
+ protected 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);
if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
throw new CloudRuntimeException("Unable to authenticate");
}
- String cmd = "rm -f /opt/xensource/sm/hostvmstats.py " +
- "/opt/xensource/bin/copy_vhd_to_secondarystorage.sh " +
- "/opt/xensource/bin/copy_vhd_from_secondarystorage.sh " +
- "/opt/xensource/bin/create_privatetemplate_from_snapshot.sh " +
- "/opt/xensource/bin/vhd-util " +
- "/opt/cloud/bin/copy_vhd_to_secondarystorage.sh " +
- "/opt/cloud/bin/copy_vhd_from_secondarystorage.sh " +
- "/opt/cloud/bin/create_privatetemplate_from_snapshot.sh " +
- "/opt/cloud/bin/vhd-util";
+ final String cmd = "rm -f /opt/xensource/sm/hostvmstats.py " +
+ "/opt/xensource/bin/copy_vhd_to_secondarystorage.sh " +
+ "/opt/xensource/bin/copy_vhd_from_secondarystorage.sh " +
+ "/opt/xensource/bin/create_privatetemplate_from_snapshot.sh " +
+ "/opt/xensource/bin/vhd-util " +
+ "/opt/cloud/bin/copy_vhd_to_secondarystorage.sh " +
+ "/opt/cloud/bin/copy_vhd_from_secondarystorage.sh " +
+ "/opt/cloud/bin/create_privatetemplate_from_snapshot.sh " +
+ "/opt/cloud/bin/vhd-util";
SSHCmdHelper.sshExecuteCmd(sshConnection, cmd);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Catch exception " + e.toString(), e);
} finally {
sshConnection.close();
@@ -102,11 +99,11 @@ public class Xenserver625Resource extends XenServerResourceNewBase {
}
@Override
- protected String revertToSnapshot(Connection conn, VM vmSnapshot,
- String vmName, String oldVmUuid, Boolean snapshotMemory, String hostUUID)
- throws Types.XenAPIException, XmlRpcException {
+ protected String revertToSnapshot(final Connection conn, final VM vmSnapshot,
+ final String vmName, final String oldVmUuid, final Boolean snapshotMemory, final String hostUUID)
+ throws Types.XenAPIException, XmlRpcException {
- String results = callHostPluginAsync(conn, "vmopsSnapshot",
+ final String results = callHostPluginAsync(conn, "vmopsSnapshot",
"revert_memory_snapshot", 10 * 60 * 1000, "snapshotUUID",
vmSnapshot.getUuid(conn), "vmName", vmName, "oldVmUuid",
oldVmUuid, "snapshotMemory", snapshotMemory.toString(), "hostUUID", hostUUID);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
index c4f2dc9..37c311a 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
@@ -62,20 +62,20 @@ import com.xensource.xenapi.VDI;
public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
private static final Logger s_logger = Logger.getLogger(XenServerStorageProcessor.class);
- public Xenserver625StorageProcessor(CitrixResourceBase resource) {
+ public Xenserver625StorageProcessor(final CitrixResourceBase resource) {
super(resource);
}
- protected boolean mountNfs(Connection conn, String remoteDir, String localDir) {
+ protected boolean mountNfs(final Connection conn, final String remoteDir, String localDir) {
if (localDir == null) {
localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(remoteDir.getBytes());
}
- String results = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-storage", "mountNfsSecondaryStorage", 100 * 1000,
- "localDir", localDir, "remoteDir", remoteDir);
+ final String results = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-storage", "mountNfsSecondaryStorage", 100 * 1000, "localDir", localDir, "remoteDir",
+ remoteDir);
if (results == null || results.isEmpty()) {
- String errMsg = "Could not mount secondary storage " + remoteDir + " on host " + localDir;
+ final String errMsg = "Could not mount secondary storage " + remoteDir + " on host " + localDir;
s_logger.warn(errMsg);
@@ -85,8 +85,8 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
return true;
}
- protected boolean makeDirectory(Connection conn, String path) {
- String result = hypervisorResource.callHostPlugin(conn, "cloud-plugin-storage", "makeDirectory", "path", path);
+ protected boolean makeDirectory(final Connection conn, final String path) {
+ final String result = hypervisorResource.callHostPlugin(conn, "cloud-plugin-storage", "makeDirectory", "path", path);
if (result == null || result.isEmpty()) {
return false;
@@ -95,27 +95,27 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
return true;
}
- protected SR createFileSR(Connection conn, String path) {
+ protected SR createFileSR(final Connection conn, final String path) {
SR sr = null;
PBD pbd = null;
try {
- String srname = hypervisorResource.getHost().uuid + path.trim();
+ final String srname = hypervisorResource.getHost().getUuid() + path.trim();
- Set<SR> srs = SR.getByNameLabel(conn, srname);
+ final Set<SR> srs = SR.getByNameLabel(conn, srname);
if (srs != null && !srs.isEmpty()) {
return srs.iterator().next();
}
- Map<String, String> smConfig = new HashMap<String, String>();
+ final Map<String, String> smConfig = new HashMap<String, String>();
- Host host = Host.getByUuid(conn, hypervisorResource.getHost().uuid);
- String uuid = UUID.randomUUID().toString();
+ final Host host = Host.getByUuid(conn, hypervisorResource.getHost().getUuid());
+ final String uuid = UUID.randomUUID().toString();
sr = SR.introduce(conn, uuid, srname, srname, "file", "file", false, smConfig);
- PBD.Record record = new PBD.Record();
+ final PBD.Record record = new PBD.Record();
record.host = host;
record.SR = sr;
@@ -131,12 +131,12 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
sr.scan(conn);
return sr;
- } catch (Exception ex) {
+ } catch (final Exception ex) {
try {
if (pbd != null) {
pbd.destroy(conn);
}
- } catch (Exception e1) {
+ } catch (final Exception e1) {
s_logger.debug("Failed to destroy PBD", ex);
}
@@ -144,11 +144,11 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (sr != null) {
sr.forget(conn);
}
- } catch (Exception e2) {
+ } catch (final Exception e2) {
s_logger.error("Failed to forget SR", ex);
}
- String msg = "createFileSR failed! due to the following: " + ex.toString();
+ final String msg = "createFileSR failed! due to the following: " + ex.toString();
s_logger.warn(msg, ex);
@@ -156,52 +156,52 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
}
- protected SR createFileSr(Connection conn, String remotePath, String dir) {
- String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(remotePath.getBytes());
+ protected SR createFileSr(final Connection conn, final String remotePath, final String dir) {
+ final String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(remotePath.getBytes());
mountNfs(conn, remotePath, localDir);
- SR sr = createFileSR(conn, localDir + "/" + dir);
+ final SR sr = createFileSR(conn, localDir + "/" + dir);
return sr;
}
@Override
- public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) {
- DataTO srcData = cmd.getSrcTO();
- DataTO destData = cmd.getDestTO();
- int wait = cmd.getWait();
- DataStoreTO srcStore = srcData.getDataStore();
- Connection conn = hypervisorResource.getConnection();
+ public Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) {
+ final DataTO srcData = cmd.getSrcTO();
+ final DataTO destData = cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final DataStoreTO srcStore = srcData.getDataStore();
+ final Connection conn = hypervisorResource.getConnection();
SR srcSr = null;
Task task = null;
try {
- if ((srcStore instanceof NfsTO) && (srcData.getObjectType() == DataObjectType.TEMPLATE)) {
- NfsTO srcImageStore = (NfsTO)srcStore;
- TemplateObjectTO srcTemplate = (TemplateObjectTO)srcData;
- String storeUrl = srcImageStore.getUrl();
- URI uri = new URI(storeUrl);
+ if (srcStore instanceof NfsTO && srcData.getObjectType() == DataObjectType.TEMPLATE) {
+ final NfsTO srcImageStore = (NfsTO) srcStore;
+ final TemplateObjectTO srcTemplate = (TemplateObjectTO) srcData;
+ final String storeUrl = srcImageStore.getUrl();
+ final URI uri = new URI(storeUrl);
String volumePath = srcData.getPath();
volumePath = StringUtils.stripEnd(volumePath, "/");
- String[] splits = volumePath.split("/");
+ final String[] splits = volumePath.split("/");
String volumeDirectory = volumePath;
if (splits.length > 4) {
- //"template/tmpl/dcid/templateId/templatename"
- int index = volumePath.lastIndexOf("/");
+ // "template/tmpl/dcid/templateId/templatename"
+ final int index = volumePath.lastIndexOf("/");
volumeDirectory = volumePath.substring(0, index);
}
srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory);
- Set<VDI> setVdis = srcSr.getVDIs(conn);
+ final Set<VDI> setVdis = srcSr.getVDIs(conn);
if (setVdis.size() != 1) {
return new CopyCmdAnswer("Can't find template VDI under: " + uri.getHost() + ":" + uri.getPath() + "/" + volumeDirectory);
}
- VDI srcVdi = setVdis.iterator().next();
+ final VDI srcVdi = setVdis.iterator().next();
boolean managed = false;
String storageHost = null;
@@ -211,7 +211,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
String chapInitiatorUsername = null;
String chapInitiatorSecret = null;
- PrimaryDataStoreTO destStore = (PrimaryDataStoreTO)destData.getDataStore();
+ final PrimaryDataStoreTO destStore = (PrimaryDataStoreTO) destData.getDataStore();
Map<String, String> details = destStore.getDetails();
@@ -240,13 +240,12 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
details.put(DiskTO.CHAP_INITIATOR_SECRET, chapInitiatorSecret);
destSr = hypervisorResource.prepareManagedSr(conn, details);
- }
- else {
- String srName = destStore.getUuid();
- Set<SR> srs = SR.getByNameLabel(conn, srName);
+ } else {
+ final String srName = destStore.getUuid();
+ final Set<SR> srs = SR.getByNameLabel(conn, srName);
if (srs.size() != 1) {
- String msg = "There are " + srs.size() + " SRs with same name: " + srName;
+ final String msg = "There are " + srs.size() + " SRs with same name: " + srName;
s_logger.warn(msg);
@@ -262,17 +261,17 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
hypervisorResource.checkForSuccess(conn, task);
- VDI tmplVdi = Types.toVDI(task, conn);
+ final VDI tmplVdi = Types.toVDI(task, conn);
final String uuidToReturn;
- Long physicalSize = tmplVdi.getPhysicalUtilisation(conn);
+ final Long physicalSize = tmplVdi.getPhysicalUtilisation(conn);
if (managed) {
uuidToReturn = tmplVdi.getUuid(conn);
tmplVdi.setNameLabel(conn, managedStoragePoolRootVolumeName);
} else {
- VDI snapshotVdi = tmplVdi.snapshot(conn, new HashMap<String, String>());
+ final VDI snapshotVdi = tmplVdi.snapshot(conn, new HashMap<String, String>());
uuidToReturn = snapshotVdi.getUuid(conn);
@@ -283,12 +282,12 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
destSr.scan(conn);
- try{
+ try {
Thread.sleep(5000);
- } catch (Exception e) {
+ } catch (final Exception e) {
}
- TemplateObjectTO newVol = new TemplateObjectTO();
+ final TemplateObjectTO newVol = new TemplateObjectTO();
newVol.setUuid(uuidToReturn);
newVol.setPath(uuidToReturn);
@@ -299,8 +298,8 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
return new CopyCmdAnswer(newVol);
}
- } catch (Exception e) {
- String msg = "Catch Exception " + e.getClass().getName() + " for template due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + " for template due to " + e.toString();
s_logger.warn(msg, e);
@@ -309,7 +308,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (task != null) {
try {
task.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("unable to destroy task (" + task.toWireString() + ") due to " + e.toString());
}
}
@@ -322,7 +321,8 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
return new CopyCmdAnswer("not implemented yet");
}
- protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, String localMountPoint, String path, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, String prevSnapshotUuid, Boolean isISCSI, int wait) {
+ protected String backupSnapshot(final Connection conn, final String primaryStorageSRUuid, final String localMountPoint, final String path,
+ final String secondaryStorageMountPath, final String snapshotUuid, String prevBackupUuid, final String prevSnapshotUuid, final Boolean isISCSI, int wait) {
boolean filesrcreated = false;
// boolean copied = false;
@@ -331,12 +331,12 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
SR ssSR = null;
- String remoteDir = secondaryStorageMountPath;
+ final String remoteDir = secondaryStorageMountPath;
try {
ssSR = createFileSr(conn, remoteDir, path);
filesrcreated = true;
- VDI snapshotvdi = VDI.getByUuid(conn, snapshotUuid);
+ final VDI snapshotvdi = VDI.getByUuid(conn, snapshotUuid);
if (wait == 0) {
wait = 2 * 60 * 60;
}
@@ -345,7 +345,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
try {
VDI previousSnapshotVdi = null;
if (prevSnapshotUuid != null) {
- previousSnapshotVdi = VDI.getByUuid(conn,prevSnapshotUuid);
+ previousSnapshotVdi = VDI.getByUuid(conn, prevSnapshotUuid);
}
task = snapshotvdi.copyAsync(conn, ssSR, previousSnapshotVdi, null);
// poll every 1 seconds ,
@@ -357,15 +357,15 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (task != null) {
try {
task.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("unable to destroy task(" + task.toWireString() + ") due to " + e.toString());
}
}
}
- String result = dvdi.getUuid(conn).concat("#").concat(dvdi.getPhysicalUtilisation(conn).toString());
+ final String result = dvdi.getUuid(conn).concat("#").concat(dvdi.getPhysicalUtilisation(conn).toString());
return result;
- } catch (Exception e) {
- String msg = "Exception in backupsnapshot stage due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Exception in backupsnapshot stage due to " + e.toString();
s_logger.debug(msg);
throw new CloudRuntimeException(msg, e);
} finally {
@@ -373,16 +373,16 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (filesrcreated && ssSR != null) {
hypervisorResource.removeSR(conn, ssSR);
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Exception in backupsnapshot cleanup stage due to " + e.toString());
}
}
}
@Override
- protected String getVhdParent(Connection conn, String primaryStorageSRUuid, String snapshotUuid, Boolean isISCSI) {
- String parentUuid = hypervisorResource.callHostPlugin(conn, "cloud-plugin-storage", "getVhdParent", "primaryStorageSRUuid", primaryStorageSRUuid,
- "snapshotUuid", snapshotUuid, "isISCSI", isISCSI.toString());
+ protected String getVhdParent(final Connection conn, final String primaryStorageSRUuid, final String snapshotUuid, final Boolean isISCSI) {
+ final String parentUuid = hypervisorResource.callHostPlugin(conn, "cloud-plugin-storage", "getVhdParent", "primaryStorageSRUuid", primaryStorageSRUuid, "snapshotUuid",
+ snapshotUuid, "isISCSI", isISCSI.toString());
if (parentUuid == null || parentUuid.isEmpty() || parentUuid.equalsIgnoreCase("None")) {
s_logger.debug("Unable to get parent of VHD " + snapshotUuid + " in SR " + primaryStorageSRUuid);
@@ -393,64 +393,64 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
@Override
- public Answer backupSnapshot(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- DataTO cacheData = cmd.getCacheTO();
- DataTO destData = cmd.getDestTO();
- int wait = cmd.getWait();
- PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcData.getDataStore();
- String primaryStorageNameLabel = primaryStore.getUuid();
+ public Answer backupSnapshot(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final DataTO srcData = cmd.getSrcTO();
+ final DataTO cacheData = cmd.getCacheTO();
+ final DataTO destData = cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO) srcData.getDataStore();
+ final String primaryStorageNameLabel = primaryStore.getUuid();
String secondaryStorageUrl = null;
NfsTO cacheStore = null;
String destPath = null;
if (cacheData != null) {
- cacheStore = (NfsTO)cacheData.getDataStore();
+ cacheStore = (NfsTO) cacheData.getDataStore();
secondaryStorageUrl = cacheStore.getUrl();
destPath = cacheData.getPath();
} else {
- cacheStore = (NfsTO)destData.getDataStore();
+ cacheStore = (NfsTO) destData.getDataStore();
secondaryStorageUrl = cacheStore.getUrl();
destPath = destData.getPath();
}
- SnapshotObjectTO snapshotTO = (SnapshotObjectTO)srcData;
- SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO)destData;
- String snapshotUuid = snapshotTO.getPath();
+ final SnapshotObjectTO snapshotTO = (SnapshotObjectTO) srcData;
+ final SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO) destData;
+ final String snapshotUuid = snapshotTO.getPath();
- String prevBackupUuid = snapshotOnImage.getParentSnapshotPath();
- String prevSnapshotUuid = snapshotTO.getParentSnapshotPath();
- Map<String, String> options = cmd.getOptions();
+ final String prevBackupUuid = snapshotOnImage.getParentSnapshotPath();
+ final String prevSnapshotUuid = snapshotTO.getParentSnapshotPath();
+ final Map<String, String> options = cmd.getOptions();
// By default assume failure
String details = null;
String snapshotBackupUuid = null;
- boolean fullbackup = Boolean.parseBoolean(options.get("fullSnapshot"));
+ final boolean fullbackup = Boolean.parseBoolean(options.get("fullSnapshot"));
Long physicalSize = null;
try {
- SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
+ final SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
if (primaryStorageSR == null) {
throw new InternalErrorException("Could not backup snapshot because the primary Storage SR could not be created from the name label: " + primaryStorageNameLabel);
}
// String psUuid = primaryStorageSR.getUuid(conn);
- Boolean isISCSI = IsISCSI(primaryStorageSR.getType(conn));
+ final Boolean isISCSI = IsISCSI(primaryStorageSR.getType(conn));
- VDI snapshotVdi = getVDIbyUuid(conn, snapshotUuid);
- String snapshotPaUuid = null;
+ final VDI snapshotVdi = getVDIbyUuid(conn, snapshotUuid);
+ final String snapshotPaUuid = null;
- URI uri = new URI(secondaryStorageUrl);
- String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
- DataStoreTO destStore = destData.getDataStore();
- String folder = destPath;
+ final URI uri = new URI(secondaryStorageUrl);
+ final String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
+ final DataStoreTO destStore = destData.getDataStore();
+ final String folder = destPath;
String finalPath = null;
- String localMountPoint = BaseMountPointOnHost + File.separator + UUID.nameUUIDFromBytes(secondaryStorageUrl.getBytes()).toString();
+ final String localMountPoint = BaseMountPointOnHost + File.separator + UUID.nameUUIDFromBytes(secondaryStorageUrl.getBytes()).toString();
if (fullbackup) {
SR snapshotSr = null;
Task task = null;
try {
- String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(secondaryStorageMountPath.getBytes());
+ final String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(secondaryStorageMountPath.getBytes());
mountNfs(conn, secondaryStorageMountPath, localDir);
- boolean result = makeDirectory(conn, localDir + "/" + folder);
+ final boolean result = makeDirectory(conn, localDir + "/" + folder);
if (!result) {
details = " Filed to create folder " + folder + " in secondary storage";
s_logger.warn(details);
@@ -463,21 +463,21 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
// poll every 1 seconds ,
hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
hypervisorResource.checkForSuccess(conn, task);
- VDI backedVdi = Types.toVDI(task, conn);
+ final VDI backedVdi = Types.toVDI(task, conn);
snapshotBackupUuid = backedVdi.getUuid(conn);
physicalSize = backedVdi.getPhysicalUtilisation(conn);
- if( destStore instanceof SwiftTO) {
+ if (destStore instanceof SwiftTO) {
try {
- String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
- String destSnapshotName = swiftBackupSnapshot(conn, (SwiftTO)destStore, snapshotSr.getUuid(conn), snapshotBackupUuid, container, false, wait);
- String swiftPath = container + File.separator + destSnapshotName;
+ final String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
+ final String destSnapshotName = swiftBackupSnapshot(conn, (SwiftTO) destStore, snapshotSr.getUuid(conn), snapshotBackupUuid, container, false, wait);
+ final String swiftPath = container + File.separator + destSnapshotName;
finalPath = swiftPath;
} finally {
try {
deleteSnapshotBackup(conn, localMountPoint, folder, secondaryStorageMountPath, snapshotBackupUuid);
- } catch (Exception e) {
- s_logger.debug("Failed to delete snapshot on cache storages" ,e);
+ } catch (final Exception e) {
+ s_logger.debug("Failed to delete snapshot on cache storages", e);
}
}
@@ -490,11 +490,12 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
} finally {
try {
deleteSnapshotBackup(conn, localMountPoint, folder, secondaryStorageMountPath, snapshotBackupUuid);
- } catch (Exception e) {
- s_logger.debug("Failed to delete snapshot on cache storages" ,e);
+ } catch (final Exception e) {
+ s_logger.debug("Failed to delete snapshot on cache storages", e);
}
}
- // finalPath = folder + File.separator + snapshotBackupUuid;
+ // finalPath = folder + File.separator +
+ // snapshotBackupUuid;
} else {
finalPath = folder + File.separator + snapshotBackupUuid;
}
@@ -503,38 +504,39 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (task != null) {
try {
task.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("unable to destroy task(" + task.toWireString() + ") due to " + e.toString());
}
}
- if( snapshotSr != null) {
+ if (snapshotSr != null) {
hypervisorResource.removeSR(conn, snapshotSr);
}
}
} else {
- String primaryStorageSRUuid = primaryStorageSR.getUuid(conn);
- if( destStore instanceof SwiftTO ) {
- String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
- snapshotBackupUuid = swiftBackupSnapshot(conn, (SwiftTO)destStore, primaryStorageSRUuid, snapshotPaUuid, "S-" + snapshotTO.getVolume().getVolumeId().toString(), isISCSI, wait);
+ final String primaryStorageSRUuid = primaryStorageSR.getUuid(conn);
+ if (destStore instanceof SwiftTO) {
+ final String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
+ snapshotBackupUuid = swiftBackupSnapshot(conn, (SwiftTO) destStore, primaryStorageSRUuid, snapshotPaUuid, "S-"
+ + snapshotTO.getVolume().getVolumeId().toString(), isISCSI, wait);
finalPath = container + File.separator + snapshotBackupUuid;
- } else if (destStore instanceof S3TO ) {
+ } else if (destStore instanceof S3TO) {
finalPath = backupSnapshotToS3(conn, (S3TO) destStore, primaryStorageSRUuid, folder, snapshotPaUuid, isISCSI, wait);
if (finalPath == null) {
throw new CloudRuntimeException("S3 upload of snapshots " + snapshotPaUuid + " failed");
}
} else {
- String result = backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder,
- secondaryStorageMountPath, snapshotUuid, prevBackupUuid, prevSnapshotUuid, isISCSI, wait);
- String[] tmp = result.split("#");
+ final String result = backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder, secondaryStorageMountPath, snapshotUuid, prevBackupUuid,
+ prevSnapshotUuid, isISCSI, wait);
+ final String[] tmp = result.split("#");
snapshotBackupUuid = tmp[0];
physicalSize = Long.parseLong(tmp[1]);
finalPath = folder + File.separator + snapshotBackupUuid;
}
}
- String volumeUuid = snapshotTO.getVolume().getPath();
+ final String volumeUuid = snapshotTO.getVolume().getPath();
destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid);
- SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
+ final SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
newSnapshot.setPath(finalPath);
newSnapshot.setPhysicalSize(physicalSize);
if (fullbackup) {
@@ -543,10 +545,10 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
newSnapshot.setParentSnapshotPath(prevBackupUuid);
}
return new CopyCmdAnswer(newSnapshot);
- } catch (Types.XenAPIException e) {
+ } catch (final Types.XenAPIException e) {
details = "BackupSnapshot Failed due to " + e.toString();
s_logger.warn(details, e);
- } catch (Exception e) {
+ } catch (final Exception e) {
details = "BackupSnapshot Failed due to " + e.getMessage();
s_logger.warn(details, e);
}
@@ -555,18 +557,17 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
@Override
- public Answer createTemplateFromVolume(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- VolumeObjectTO volume = (VolumeObjectTO)cmd.getSrcTO();
- TemplateObjectTO template = (TemplateObjectTO)cmd.getDestTO();
- NfsTO destStore = (NfsTO)cmd.getDestTO().getDataStore();
- int wait = cmd.getWait();
+ public Answer createTemplateFromVolume(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final VolumeObjectTO volume = (VolumeObjectTO) cmd.getSrcTO();
+ final TemplateObjectTO template = (TemplateObjectTO) cmd.getDestTO();
+ final NfsTO destStore = (NfsTO) cmd.getDestTO().getDataStore();
+ final int wait = cmd.getWait();
- String secondaryStoragePoolURL = destStore.getUrl();
- String volumeUUID = volume.getPath();
-
- String userSpecifiedName = template.getName();
+ final String secondaryStoragePoolURL = destStore.getUrl();
+ final String volumeUUID = volume.getPath();
+ final String userSpecifiedName = template.getName();
String details = null;
SR tmpltSR = null;
@@ -575,16 +576,16 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
String installPath = null;
Task task = null;
try {
- URI uri = new URI(secondaryStoragePoolURL);
+ final URI uri = new URI(secondaryStoragePoolURL);
secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
installPath = template.getPath();
- if( !hypervisorResource.createSecondaryStorageFolder(conn, secondaryStorageMountPath, installPath)) {
+ if (!hypervisorResource.createSecondaryStorageFolder(conn, secondaryStorageMountPath, installPath)) {
details = " Filed to create folder " + installPath + " in secondary storage";
s_logger.warn(details);
return new CopyCmdAnswer(details);
}
- VDI vol = getVDIbyUuid(conn, volumeUUID);
+ final VDI vol = getVDIbyUuid(conn, volumeUUID);
// create template SR
tmpltSR = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), installPath);
@@ -593,39 +594,40 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
// poll every 1 seconds ,
hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
hypervisorResource.checkForSuccess(conn, task);
- VDI tmpltVDI = Types.toVDI(task, conn);
+ final VDI tmpltVDI = Types.toVDI(task, conn);
// scan makes XenServer pick up VDI physicalSize
tmpltSR.scan(conn);
if (userSpecifiedName != null) {
tmpltVDI.setNameLabel(conn, userSpecifiedName);
}
- String tmpltUUID = tmpltVDI.getUuid(conn);
- String tmpltFilename = tmpltUUID + ".vhd";
- long virtualSize = tmpltVDI.getVirtualSize(conn);
- long physicalSize = tmpltVDI.getPhysicalUtilisation(conn);
+ final String tmpltUUID = tmpltVDI.getUuid(conn);
+ final String tmpltFilename = tmpltUUID + ".vhd";
+ final long virtualSize = tmpltVDI.getVirtualSize(conn);
+ final long physicalSize = tmpltVDI.getPhysicalUtilisation(conn);
// create the template.properties file
- String templatePath = secondaryStorageMountPath + "/" + installPath;
- result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, tmpltFilename, tmpltUUID, userSpecifiedName, null, physicalSize, virtualSize, template.getId());
+ final String templatePath = secondaryStorageMountPath + "/" + installPath;
+ result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, tmpltFilename, tmpltUUID, userSpecifiedName, null, physicalSize, virtualSize,
+ template.getId());
if (!result) {
throw new CloudRuntimeException("Could not create the template.properties file on secondary storage dir");
}
installPath = installPath + "/" + tmpltFilename;
hypervisorResource.removeSR(conn, tmpltSR);
tmpltSR = null;
- TemplateObjectTO newTemplate = new TemplateObjectTO();
+ final TemplateObjectTO newTemplate = new TemplateObjectTO();
newTemplate.setPath(installPath);
newTemplate.setFormat(Storage.ImageFormat.VHD);
newTemplate.setSize(virtualSize);
newTemplate.setPhysicalSize(physicalSize);
newTemplate.setName(tmpltUUID);
- CopyCmdAnswer answer = new CopyCmdAnswer(newTemplate);
+ final CopyCmdAnswer answer = new CopyCmdAnswer(newTemplate);
return answer;
- } catch (Exception e) {
+ } catch (final Exception e) {
if (tmpltSR != null) {
hypervisorResource.removeSR(conn, tmpltSR);
}
- if ( secondaryStorageMountPath != null) {
+ if (secondaryStorageMountPath != null) {
hypervisorResource.deleteSecondaryStorageFolder(conn, secondaryStorageMountPath, installPath);
}
details = "Creating template from volume " + volumeUUID + " failed due to " + e.toString();
@@ -634,15 +636,15 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (task != null) {
try {
task.destroy(conn);
- } catch (Exception e) {
- s_logger.warn("unable to destroy task(" + task.toWireString() + ") due to " + e.toString());
+ } catch (final Exception e) {
+ s_logger.warn("unable to destroy task(" + task.toWireString() + ") due to " + e.toString());
}
}
}
return new CopyCmdAnswer(details);
}
- protected String getSnapshotUuid(String snapshotPath) {
+ protected String getSnapshotUuid(final String snapshotPath) {
int index = snapshotPath.lastIndexOf(File.separator);
String snapshotUuid = snapshotPath.substring(index + 1);
index = snapshotUuid.lastIndexOf(".");
@@ -653,14 +655,14 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
@Override
- public Answer createVolumeFromSnapshot(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- SnapshotObjectTO snapshot = (SnapshotObjectTO)srcData;
- DataTO destData = cmd.getDestTO();
- PrimaryDataStoreTO pool = (PrimaryDataStoreTO)destData.getDataStore();
- VolumeObjectTO volume = (VolumeObjectTO)destData;
- DataStoreTO imageStore = srcData.getDataStore();
+ public Answer createVolumeFromSnapshot(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final DataTO srcData = cmd.getSrcTO();
+ final SnapshotObjectTO snapshot = (SnapshotObjectTO) srcData;
+ final DataTO destData = cmd.getDestTO();
+ final PrimaryDataStoreTO pool = (PrimaryDataStoreTO) destData.getDataStore();
+ final VolumeObjectTO volume = (VolumeObjectTO) destData;
+ final DataStoreTO imageStore = srcData.getDataStore();
if (srcData.getDataStore() instanceof PrimaryDataStoreTO && destData.getDataStore() instanceof PrimaryDataStoreTO) {
return createVolumeFromSnapshot2(cmd);
@@ -670,10 +672,10 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
return new CopyCmdAnswer("unsupported protocol");
}
- NfsTO nfsImageStore = (NfsTO)imageStore;
- String primaryStorageNameLabel = pool.getUuid();
- String secondaryStorageUrl = nfsImageStore.getUrl();
- int wait = cmd.getWait();
+ final NfsTO nfsImageStore = (NfsTO) imageStore;
+ final String primaryStorageNameLabel = pool.getUuid();
+ final String secondaryStorageUrl = nfsImageStore.getUrl();
+ final int wait = cmd.getWait();
boolean result = false;
// Generic error message.
String details = null;
@@ -686,38 +688,38 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
SR srcSr = null;
VDI destVdi = null;
try {
- SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
+ final SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
if (primaryStorageSR == null) {
throw new InternalErrorException("Could not create volume from snapshot because the primary Storage SR could not be created from the name label: "
+ primaryStorageNameLabel);
}
- String nameLabel = "cloud-" + UUID.randomUUID().toString();
+ final String nameLabel = "cloud-" + UUID.randomUUID().toString();
destVdi = createVdi(conn, nameLabel, primaryStorageSR, volume.getSize());
volumeUUID = destVdi.getUuid(conn);
- String snapshotInstallPath = snapshot.getPath();
- int index = snapshotInstallPath.lastIndexOf(File.separator);
- String snapshotDirectory = snapshotInstallPath.substring(0, index);
- String snapshotUuid = getSnapshotUuid(snapshotInstallPath);
+ final String snapshotInstallPath = snapshot.getPath();
+ final int index = snapshotInstallPath.lastIndexOf(File.separator);
+ final String snapshotDirectory = snapshotInstallPath.substring(0, index);
+ final String snapshotUuid = getSnapshotUuid(snapshotInstallPath);
- URI uri = new URI(secondaryStorageUrl);
+ final URI uri = new URI(secondaryStorageUrl);
srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), snapshotDirectory);
- String[] parents = snapshot.getParents();
- List<VDI> snapshotChains = new ArrayList<VDI>();
+ final String[] parents = snapshot.getParents();
+ final List<VDI> snapshotChains = new ArrayList<VDI>();
if (parents != null) {
- for(int i = 0; i < parents.length; i++) {
- String snChainPath = parents[i];
- String uuid = getSnapshotUuid(snChainPath);
- VDI chain = VDI.getByUuid(conn, uuid);
+ for (int i = 0; i < parents.length; i++) {
+ final String snChainPath = parents[i];
+ final String uuid = getSnapshotUuid(snChainPath);
+ final VDI chain = VDI.getByUuid(conn, uuid);
snapshotChains.add(chain);
}
}
- VDI snapshotVdi = VDI.getByUuid(conn, snapshotUuid);
+ final VDI snapshotVdi = VDI.getByUuid(conn, snapshotUuid);
snapshotChains.add(snapshotVdi);
- for(VDI snapChain : snapshotChains) {
- Task task = snapChain.copyAsync(conn, null, null, destVdi);
+ for (final VDI snapChain : snapshotChains) {
+ final Task task = snapChain.copyAsync(conn, null, null, destVdi);
// poll every 1 seconds ,
hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
hypervisorResource.checkForSuccess(conn, task);
@@ -726,15 +728,15 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
result = true;
destVdi = VDI.getByUuid(conn, volumeUUID);
- VDI.Record vdir = destVdi.getRecord(conn);
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final VDI.Record vdir = destVdi.getRecord(conn);
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setPath(volumeUUID);
newVol.setSize(vdir.virtualSize);
return new CopyCmdAnswer(newVol);
- } catch (Types.XenAPIException e) {
+ } catch (final Types.XenAPIException e) {
details += " due to " + e.toString();
s_logger.warn(details, e);
- } catch (Exception e) {
+ } catch (final Exception e) {
details += " due to " + e.getMessage();
s_logger.warn(details, e);
} finally {
@@ -744,7 +746,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (!result && destVdi != null) {
try {
destVdi.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("destroy dest vdi failed", e);
}
}
@@ -759,19 +761,19 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
@Override
- public Answer copyVolumeFromPrimaryToSecondary(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- VolumeObjectTO srcVolume = (VolumeObjectTO)cmd.getSrcTO();
- VolumeObjectTO destVolume = (VolumeObjectTO)cmd.getDestTO();
- int wait = cmd.getWait();
- DataStoreTO destStore = destVolume.getDataStore();
+ public Answer copyVolumeFromPrimaryToSecondary(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final VolumeObjectTO srcVolume = (VolumeObjectTO) cmd.getSrcTO();
+ final VolumeObjectTO destVolume = (VolumeObjectTO) cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final DataStoreTO destStore = destVolume.getDataStore();
if (destStore instanceof NfsTO) {
SR secondaryStorage = null;
Task task = null;
try {
- NfsTO nfsStore = (NfsTO)destStore;
- URI uri = new URI(nfsStore.getUrl());
+ final NfsTO nfsStore = (NfsTO) destStore;
+ final URI uri = new URI(nfsStore.getUrl());
// Create the volume folder
if (!hypervisorResource.createSecondaryStorageFolder(conn, uri.getHost() + ":" + uri.getPath(), destVolume.getPath())) {
throw new InternalErrorException("Failed to create the volume folder.");
@@ -780,27 +782,27 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
// Create a SR for the volume UUID folder
secondaryStorage = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), destVolume.getPath());
// Look up the volume on the source primary storage pool
- VDI srcVdi = getVDIbyUuid(conn, srcVolume.getPath());
+ final VDI srcVdi = getVDIbyUuid(conn, srcVolume.getPath());
// Copy the volume to secondary storage
task = srcVdi.copyAsync(conn, secondaryStorage, null, null);
// poll every 1 seconds ,
hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
hypervisorResource.checkForSuccess(conn, task);
- VDI destVdi = Types.toVDI(task, conn);
- String destVolumeUUID = destVdi.getUuid(conn);
+ final VDI destVdi = Types.toVDI(task, conn);
+ final String destVolumeUUID = destVdi.getUuid(conn);
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setPath(destVolume.getPath() + File.separator + destVolumeUUID + ".vhd");
newVol.setSize(srcVolume.getSize());
return new CopyCmdAnswer(newVol);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Failed to copy volume to secondary: " + e.toString());
return new CopyCmdAnswer("Failed to copy volume to secondary: " + e.toString());
} finally {
if (task != null) {
try {
task.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("unable to destroy task(" + task.toWireString() + ") due to " + e.toString());
}
}
@@ -811,21 +813,21 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
@Override
- public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- DataTO destData = cmd.getDestTO();
- int wait = cmd.getWait();
- VolumeObjectTO srcVolume = (VolumeObjectTO)srcData;
- VolumeObjectTO destVolume = (VolumeObjectTO)destData;
- PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)destVolume.getDataStore();
- DataStoreTO srcStore = srcVolume.getDataStore();
+ public Answer copyVolumeFromImageCacheToPrimary(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final DataTO srcData = cmd.getSrcTO();
+ final DataTO destData = cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final VolumeObjectTO srcVolume = (VolumeObjectTO) srcData;
+ final VolumeObjectTO destVolume = (VolumeObjectTO) destData;
+ final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO) destVolume.getDataStore();
+ final DataStoreTO srcStore = srcVolume.getDataStore();
if (srcStore instanceof NfsTO) {
- NfsTO nfsStore = (NfsTO)srcStore;
- String volumePath = srcVolume.getPath();
+ final NfsTO nfsStore = (NfsTO) srcStore;
+ final String volumePath = srcVolume.getPath();
int index = volumePath.lastIndexOf("/");
- String volumeDirectory = volumePath.substring(0, index);
+ final String volumeDirectory = volumePath.substring(0, index);
String volumeUuid = volumePath.substring(index + 1);
index = volumeUuid.indexOf(".");
if (index != -1) {
@@ -834,33 +836,33 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
URI uri = null;
try {
uri = new URI(nfsStore.getUrl());
- } catch (Exception e) {
+ } catch (final Exception e) {
return new CopyCmdAnswer(e.toString());
}
- SR srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory);
+ final SR srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory);
Task task = null;
try {
- SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, primaryStore.getUuid());
- VDI srcVdi = VDI.getByUuid(conn, volumeUuid);
+ final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, primaryStore.getUuid());
+ final VDI srcVdi = VDI.getByUuid(conn, volumeUuid);
task = srcVdi.copyAsync(conn, primaryStoragePool, null, null);
// poll every 1 seconds ,
hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
hypervisorResource.checkForSuccess(conn, task);
- VDI destVdi = Types.toVDI(task, conn);
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final VDI destVdi = Types.toVDI(task, conn);
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setPath(destVdi.getUuid(conn));
newVol.setSize(srcVolume.getSize());
return new CopyCmdAnswer(newVol);
- } catch (Exception e) {
- String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
s_logger.warn(msg, e);
return new CopyCmdAnswer(e.toString());
} finally {
if (task != null) {
try {
task.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("unable to destroy task(" + task.toString() + ") due to " + e.toString());
}
}
@@ -875,23 +877,23 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
@Override
- public Answer createTemplateFromSnapshot(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
+ public Answer createTemplateFromSnapshot(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- DataTO destData = cmd.getDestTO();
+ final DataTO srcData = cmd.getSrcTO();
+ final DataTO destData = cmd.getDestTO();
if (srcData.getDataStore() instanceof PrimaryDataStoreTO && destData.getDataStore() instanceof NfsTO) {
return createTemplateFromSnapshot2(cmd);
}
- int wait = cmd.getWait();
+ final int wait = cmd.getWait();
- SnapshotObjectTO srcObj = (SnapshotObjectTO)srcData;
- TemplateObjectTO destObj = (TemplateObjectTO)destData;
+ final SnapshotObjectTO srcObj = (SnapshotObjectTO) srcData;
+ final TemplateObjectTO destObj = (TemplateObjectTO) destData;
- NfsTO srcStore = (NfsTO)srcObj.getDataStore();
- NfsTO destStore = (NfsTO)destObj.getDataStore();
+ final NfsTO srcStore = (NfsTO) srcObj.getDataStore();
+ final NfsTO destStore = (NfsTO) destObj.getDataStore();
URI srcUri = null;
URI destUri = null;
@@ -899,16 +901,16 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
try {
srcUri = new URI(srcStore.getUrl());
destUri = new URI(destStore.getUrl());
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("incorrect url", e);
return new CopyCmdAnswer("incorrect url" + e.toString());
}
- String srcPath = srcObj.getPath();
- int index = srcPath.lastIndexOf("/");
- String srcDir = srcPath.substring(0, index);
- String destDir = destObj.getPath();
+ final String srcPath = srcObj.getPath();
+ final int index = srcPath.lastIndexOf("/");
+ final String srcDir = srcPath.substring(0, index);
+ final String destDir = destObj.getPath();
SR srcSr = null;
SR destSr = null;
@@ -920,42 +922,42 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
try {
srcSr = createFileSr(conn, srcUri.getHost() + ":" + srcUri.getPath(), srcDir);
- String destNfsPath = destUri.getHost() + ":" + destUri.getPath();
- String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(destNfsPath.getBytes());
+ final String destNfsPath = destUri.getHost() + ":" + destUri.getPath();
+ final String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(destNfsPath.getBytes());
mountNfs(conn, destUri.getHost() + ":" + destUri.getPath(), localDir);
makeDirectory(conn, localDir + "/" + destDir);
destSr = createFileSR(conn, localDir + "/" + destDir);
- String nameLabel = "cloud-" + UUID.randomUUID().toString();
+ final String nameLabel = "cloud-" + UUID.randomUUID().toString();
- String[] parents = srcObj.getParents();
- List<VDI> snapshotChains = new ArrayList<VDI>();
+ final String[] parents = srcObj.getParents();
+ final List<VDI> snapshotChains = new ArrayList<VDI>();
if (parents != null) {
for (int i = 0; i < parents.length; i++) {
- String snChainPath = parents[i];
- String uuid = getSnapshotUuid(snChainPath);
- VDI chain = VDI.getByUuid(conn, uuid);
+ final String snChainPath = parents[i];
+ final String uuid = getSnapshotUuid(snChainPath);
+ final VDI chain = VDI.getByUuid(conn, uuid);
snapshotChains.add(chain);
}
}
- String snapshotUuid = getSnapshotUuid(srcPath);
- VDI snapshotVdi = VDI.getByUuid(conn, snapshotUuid);
+ final String snapshotUuid = getSnapshotUuid(srcPath);
+ final VDI snapshotVdi = VDI.getByUuid(conn, snapshotUuid);
snapshotChains.add(snapshotVdi);
- long templateVirtualSize = snapshotChains.get(0).getVirtualSize(conn);
+ final long templateVirtualSize = snapshotChains.get(0).getVirtualSize(conn);
destVdi = createVdi(conn, nameLabel, destSr, templateVirtualSize);
- String destVdiUuid = destVdi.getUuid(conn);
+ final String destVdiUuid = destVdi.getUuid(conn);
- for (VDI snapChain : snapshotChains) {
- Task task = snapChain.copyAsync(conn, null, null, destVdi);
+ for (final VDI snapChain : snapshotChains) {
+ final Task task = snapChain.copyAsync(conn, null, null, destVdi);
// poll every 1 seconds ,
hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
hypervisorResource.checkForSuccess(conn, task);
@@ -968,23 +970,22 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
// scan makes XenServer pick up VDI physicalSize
destSr.scan(conn);
- String templateUuid = destVdi.getUuid(conn);
- String templateFilename = templateUuid + ".vhd";
- long virtualSize = destVdi.getVirtualSize(conn);
- long physicalSize = destVdi.getPhysicalUtilisation(conn);
+ final String templateUuid = destVdi.getUuid(conn);
+ final String templateFilename = templateUuid + ".vhd";
+ final long virtualSize = destVdi.getVirtualSize(conn);
+ final long physicalSize = destVdi.getPhysicalUtilisation(conn);
String templatePath = destNfsPath + "/" + destDir;
- templatePath = templatePath.replaceAll("//","/");
+ templatePath = templatePath.replaceAll("//", "/");
- result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, templateFilename, templateUuid, nameLabel, null,
- physicalSize, virtualSize, destObj.getId());
+ result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, templateFilename, templateUuid, nameLabel, null, physicalSize, virtualSize, destObj.getId());
if (!result) {
throw new CloudRuntimeException("Could not create the template.properties file on secondary storage dir");
}
- TemplateObjectTO newTemplate = new TemplateObjectTO();
+ final TemplateObjectTO newTemplate = new TemplateObjectTO();
newTemplate.setPath(destDir + "/" + templateFilename);
newTemplate.setFormat(Storage.ImageFormat.VHD);
@@ -995,7 +996,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
result = true;
return new CopyCmdAnswer(newTemplate);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Failed create template from snapshot", e);
return new CopyCmdAnswer("Failed create template from snapshot " + e.toString());
@@ -1004,7 +1005,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (destVdi != null) {
try {
destVdi.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Clean up left over on dest storage failed: ", e);
}
}
@@ -1020,11 +1021,11 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
}
}
- public Answer createTemplateFromSnapshot2(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
+ public Answer createTemplateFromSnapshot2(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
- SnapshotObjectTO snapshotObjTO = (SnapshotObjectTO)cmd.getSrcTO();
- TemplateObjectTO templateObjTO = (TemplateObjectTO)cmd.getDestTO();
+ final SnapshotObjectTO snapshotObjTO = (SnapshotObjectTO) cmd.getSrcTO();
+ final TemplateObjectTO templateObjTO = (TemplateObjectTO) cmd.getDestTO();
if (!(snapshotObjTO.getDataStore() instanceof PrimaryDataStoreTO) || !(templateObjTO.getDataStore() instanceof NfsTO)) {
return null;
@@ -1034,10 +1035,10 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
URI destUri = null;
try {
- destStore = (NfsTO)templateObjTO.getDataStore();
+ destStore = (NfsTO) templateObjTO.getDataStore();
destUri = new URI(destStore.getUrl());
- } catch (Exception ex) {
+ } catch (final Exception ex) {
s_logger.debug("Invalid URI", ex);
return new CopyCmdAnswer("Invalid URI: " + ex.toString());
@@ -1046,23 +1047,23 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
SR srcSr = null;
SR destSr = null;
- String destDir = templateObjTO.getPath();
+ final String destDir = templateObjTO.getPath();
VDI destVdi = null;
boolean result = false;
try {
- Map<String, String> srcDetails = cmd.getOptions();
+ final Map<String, String> srcDetails = cmd.getOptions();
- String iScsiName = srcDetails.get(DiskTO.IQN);
- String storageHost = srcDetails.get(DiskTO.STORAGE_HOST);
- String chapInitiatorUsername = srcDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
- String chapInitiatorSecret = srcDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
+ final String iScsiName = srcDetails.get(DiskTO.IQN);
+ final String storageHost = srcDetails.get(DiskTO.STORAGE_HOST);
+ final String chapInitiatorUsername = srcDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
+ final String chapInitiatorSecret = srcDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
srcSr = hypervisorResource.getIscsiSR(conn, iScsiName, storageHost, iScsiName, chapInitiatorUsername, chapInitiatorSecret, true);
- String destNfsPath = destUri.getHost() + ":" + destUri.getPath();
- String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(destNfsPath.getBytes());
+ final String destNfsPath = destUri.getHost() + ":" + destUri.getPath();
+ final String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(destNfsPath.getBytes());
mountNfs(conn, destNfsPath, localDir);
makeDirectory(conn, localDir + "/" + destDir);
@@ -1070,35 +1071,35 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
destSr = createFileSR(conn, localDir + "/" + destDir);
// there should only be one VDI in this SR
- VDI srcVdi = srcSr.getVDIs(conn).iterator().next();
+ final VDI srcVdi = srcSr.getVDIs(conn).iterator().next();
destVdi = srcVdi.copy(conn, destSr);
- String nameLabel = "cloud-" + UUID.randomUUID().toString();
+ final String nameLabel = "cloud-" + UUID.randomUUID().toString();
destVdi.setNameLabel(conn, nameLabel);
// scan makes XenServer pick up VDI physicalSize
destSr.scan(conn);
- String templateUuid = destVdi.getUuid(conn);
- String templateFilename = templateUuid + ".vhd";
- long virtualSize = destVdi.getVirtualSize(conn);
- long physicalSize = destVdi.getPhysicalUtilisation(conn);
+ final String templateUuid = destVdi.getUuid(conn);
+ final String templateFilename = templateUuid + ".vhd";
+ final long virtualSize = destVdi.getVirtualSize(conn);
+ final long physicalSize = destVdi.getPhysicalUtilisation(conn);
// create the template.properties file
String templatePath = destNfsPath + "/" + destDir;
templatePath = templatePath.replaceAll("//", "/");
- result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, templateFilename, templateUuid, nameLabel, null,
- physicalSize, virtualSize, templateObjTO.getId());
+ result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, templateFilename, templateUuid, nameLabel, null, physicalSize, virtualSize,
+ templateObjTO.getId());
if (!result) {
throw new CloudRuntimeException("Could not create the template.properties file on secondary storage dir");
}
- TemplateObjectTO newTemplate = new TemplateObjectTO();
+ final TemplateObjectTO newTemplate = new TemplateObjectTO();
newTemplate.setPath(destDir + "/" + templateFilename);
newTemplate.setFormat(Storage.ImageFormat.VHD);
@@ -1110,19 +1111,22 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
result = true;
return new CopyCmdAnswer(newTemplate);
-// } catch (Exception ex) {
-// s_logger.error("Failed to create a template from a snapshot", ex);
-//
-// return new CopyCmdAnswer("Failed to create a template from a snapshot: " + ex.toString());
- } catch (BadServerResponse e) {
- s_logger.error("Failed to create a template from a snapshot due to incomprehensible server response", e);
-
- return new CopyCmdAnswer("Failed to create a template from a snapshot: " + e.toString());
- } catch (XenAPIException e) {
- s_logger.error("Failed to create a template from a snapshot due to xenapi error", e);
-
- return new CopyCmdAnswer("Failed to create a template from a snapshot: " + e.toString());
- } catch (XmlRpcException e) {
+ // } catch (Exception ex) {
+ // s_logger.error("Failed to create a template from a snapshot",
+ // ex);
+ //
+ // return new
+ // CopyCmdAnswer("Failed to create a template from a snapshot: " +
+ // ex.toString());
+ } catch (final BadServerResponse e) {
+ s_logger.error("Failed to create a template from a snapshot due to incomprehensible server response", e);
+
+ return new CopyCmdAnswer("Failed to create a template from a snapshot: " + e.toString());
+ } catch (final XenAPIException e) {
+ s_logger.error("Failed to create a template from a snapshot due to xenapi error", e);
+
+ return new CopyCmdAnswer("Failed to create a template from a snapshot: " + e.toString());
+ } catch (final XmlRpcException e) {
s_logger.error("Failed to create a template from a snapshot due to rpc error", e);
return new CopyCmdAnswer("Failed to create a template from a snapshot: " + e.toString());
@@ -1131,7 +1135,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
if (destVdi != null) {
try {
destVdi.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Cleaned up leftover VDI on destination storage due to failure: ", e);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsHost.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsHost.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsHost.java
new file mode 100644
index 0000000..e17a017
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsHost.java
@@ -0,0 +1,212 @@
+// 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;
+
+import com.xensource.xenapi.Network;
+
+/**
+ * A list of UUIDs that are gathered from the XenServer when the resource first
+ * connects to XenServer. These UUIDs do not change over time.
+ */
+public class XsHost {
+
+ private String systemvmisouuid;
+ private String uuid;
+ private String ip;
+ private String publicNetwork;
+ private String privateNetwork;
+ private String linkLocalNetwork;
+ private Network vswitchNetwork;
+ private String storageNetwork1;
+ private String guestNetwork;
+ private String guestPif;
+ private String publicPif;
+ private String privatePif;
+ private String storagePif1;
+ private String storagePif2;
+ private String pool;
+ private int speed;
+ private Integer cpuSockets;
+ private int cpus;
+ private String productVersion;
+ private String localSRuuid;
+
+ public String getSystemvmisouuid() {
+ return systemvmisouuid;
+ }
+
+ public void setSystemvmisouuid(final String systemvmisouuid) {
+ this.systemvmisouuid = systemvmisouuid;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(final String uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(final String ip) {
+ this.ip = ip;
+ }
+
+ public String getPublicNetwork() {
+ return publicNetwork;
+ }
+
+ public void setPublicNetwork(final String publicNetwork) {
+ this.publicNetwork = publicNetwork;
+ }
+
+ public String getPrivateNetwork() {
+ return privateNetwork;
+ }
+
+ public void setPrivateNetwork(final String privateNetwork) {
+ this.privateNetwork = privateNetwork;
+ }
+
+ public String getLinkLocalNetwork() {
+ return linkLocalNetwork;
+ }
+
+ public void setLinkLocalNetwork(final String linkLocalNetwork) {
+ this.linkLocalNetwork = linkLocalNetwork;
+ }
+
+ public Network getVswitchNetwork() {
+ return vswitchNetwork;
+ }
+
+ public void setVswitchNetwork(final Network vswitchNetwork) {
+ this.vswitchNetwork = vswitchNetwork;
+ }
+
+ public String getStorageNetwork1() {
+ return storageNetwork1;
+ }
+
+ public void setStorageNetwork1(final String storageNetwork1) {
+ this.storageNetwork1 = storageNetwork1;
+ }
+
+ public String getGuestNetwork() {
+ return guestNetwork;
+ }
+
+ public void setGuestNetwork(final String guestNetwork) {
+ this.guestNetwork = guestNetwork;
+ }
+
+ public String getGuestPif() {
+ return guestPif;
+ }
+
+ public void setGuestPif(final String guestPif) {
+ this.guestPif = guestPif;
+ }
+
+ public String getPublicPif() {
+ return publicPif;
+ }
+
+ public void setPublicPif(final String publicPif) {
+ this.publicPif = publicPif;
+ }
+
+ public String getPrivatePif() {
+ return privatePif;
+ }
+
+ public void setPrivatePif(final String privatePif) {
+ this.privatePif = privatePif;
+ }
+
+ public String getStoragePif1() {
+ return storagePif1;
+ }
+
+ public void setStoragePif1(final String storagePif1) {
+ this.storagePif1 = storagePif1;
+ }
+
+ public String getStoragePif2() {
+ return storagePif2;
+ }
+
+ public void setStoragePif2(final String storagePif2) {
+ this.storagePif2 = storagePif2;
+ }
+
+ public String getPool() {
+ return pool;
+ }
+
+ public void setPool(final String pool) {
+ this.pool = pool;
+ }
+
+ public int getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(final int speed) {
+ this.speed = speed;
+ }
+
+ public Integer getCpuSockets() {
+ return cpuSockets;
+ }
+
+ public void setCpuSockets(final Integer cpuSockets) {
+ this.cpuSockets = cpuSockets;
+ }
+
+ public int getCpus() {
+ return cpus;
+ }
+
+ public void setCpus(final int cpus) {
+ this.cpus = cpus;
+ }
+
+ public String getProductVersion() {
+ return productVersion;
+ }
+
+ public void setProductVersion(final String productVersion) {
+ this.productVersion = productVersion;
+ }
+
+ public String getLocalSRuuid() {
+ return localSRuuid;
+ }
+
+ public void setLocalSRuuid(final String localSRuuid) {
+ this.localSRuuid = localSRuuid;
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder("XS[").append(uuid).append("-").append(ip).append("]").toString();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixReadyCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixReadyCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixReadyCommandWrapper.java
new file mode 100644
index 0000000..d4c73eb
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixReadyCommandWrapper.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.Set;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ReadyAnswer;
+import com.cloud.agent.api.ReadyCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
+
+public final class CitrixReadyCommandWrapper extends CommandWrapper<ReadyCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixReadyCommandWrapper.class);
+
+ @Override
+ public Answer execute(final ReadyCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final Long dcId = command.getDataCenterId();
+ // Ignore the result of the callHostPlugin. Even if unmounting the
+ // snapshots dir fails, let Ready command
+ // succeed.
+ citrixResourceBase.umountSnapshotDir(conn, dcId);
+
+ citrixResourceBase.setupLinkLocalNetwork(conn);
+ // try to destroy CD-ROM device for all system VMs on this host
+ try {
+ final Host host = Host.getByUuid(conn, citrixResourceBase.getHost().getUuid());
+ final Set<VM> vms = host.getResidentVMs(conn);
+ for (final VM vm : vms) {
+ citrixResourceBase.destroyPatchVbd(conn, vm.getNameLabel(conn));
+ }
+ } catch (final Exception e) {
+ }
+ try {
+ final boolean result = citrixResourceBase.cleanupHaltedVms(conn);
+ if (!result) {
+ return new ReadyAnswer(command, "Unable to cleanup halted vms");
+ }
+ } catch (final XenAPIException e) {
+ s_logger.warn("Unable to cleanup halted vms", e);
+ return new ReadyAnswer(command, "Unable to cleanup halted vms");
+ } catch (final XmlRpcException e) {
+ s_logger.warn("Unable to cleanup halted vms", e);
+ return new ReadyAnswer(command, "Unable to cleanup halted vms");
+ }
+
+ return new ReadyAnswer(command);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/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 5495f60..f2a921c 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
@@ -23,6 +23,7 @@ import java.util.Hashtable;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
+import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootRouterCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
@@ -53,6 +54,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(CreateCommand.class, new CitrixCreateCommandWrapper());
map.put(CheckConsoleProxyLoadCommand.class, new CitrixCheckConsoleProxyLoadCommandWrapper());
map.put(WatchConsoleProxyLoadCommand.class, new CitrixWatchConsoleProxyLoadCommandWrapper());
+ map.put(ReadyCommand.class, new CitrixReadyCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
[12/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Renaming files
- Forgot to add "Citrix" before the new command wrappers
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9e41b805
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9e41b805
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9e41b805
Branch: refs/heads/master
Commit: 9e41b8051e4a0f41e8867b2b311cf7762cf66ad8
Parents: 6b80c79
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 11:20:53 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:26 2015 +0200
----------------------------------------------------------------------
.../wrapper/CheckHealthCommandWrapper.java | 35 ----
.../CitrixCheckHealthCommandWrapper.java | 35 ++++
.../CitrixGetHostStatsCommandWrapper.java | 48 +++++
.../CitrixGetVmDiskStatsCommandWrapper.java | 34 ++++
.../wrapper/CitrixGetVmStatsCommandWrapper.java | 82 +++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 10 +-
.../wrapper/CitrixStopCommandWrapper.java | 173 +++++++++++++++++++
.../wrapper/GetHostStatsCommandWrapper.java | 48 -----
.../wrapper/GetVmDiskStatsCommandWrapper.java | 34 ----
.../wrapper/GetVmStatsCommandWrapper.java | 82 ---------
.../resource/wrapper/StopCommandWrapper.java | 173 -------------------
11 files changed, 377 insertions(+), 377 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java
deleted file mode 100644
index fa2e0ca..0000000
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CheckHealthCommandWrapper.java
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// 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 com.cloud.agent.api.Answer;
-import com.cloud.agent.api.CheckHealthAnswer;
-import com.cloud.agent.api.CheckHealthCommand;
-import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
-import com.cloud.resource.CommandWrapper;
-
-public final class CheckHealthCommandWrapper extends CommandWrapper<CheckHealthCommand, Answer, CitrixResourceBase> {
-
- @Override
- public Answer execute(final CheckHealthCommand command, final CitrixResourceBase citrixResourceBase) {
- final boolean result = citrixResourceBase.pingXAPI();
- return new CheckHealthAnswer(command, result);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckHealthCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckHealthCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckHealthCommandWrapper.java
new file mode 100644
index 0000000..f77e309
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckHealthCommandWrapper.java
@@ -0,0 +1,35 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckHealthAnswer;
+import com.cloud.agent.api.CheckHealthCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixCheckHealthCommandWrapper extends CommandWrapper<CheckHealthCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final CheckHealthCommand command, final CitrixResourceBase citrixResourceBase) {
+ final boolean result = citrixResourceBase.pingXAPI();
+ return new CheckHealthAnswer(command, result);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetHostStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetHostStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetHostStatsCommandWrapper.java
new file mode 100644
index 0000000..21d9d3d
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetHostStatsCommandWrapper.java
@@ -0,0 +1,48 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetHostStatsAnswer;
+import com.cloud.agent.api.GetHostStatsCommand;
+import com.cloud.agent.api.HostStatsEntry;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixGetHostStatsCommandWrapper extends CommandWrapper<GetHostStatsCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixGetHostStatsCommandWrapper.class);
+
+ @Override
+ public Answer execute(final GetHostStatsCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final HostStatsEntry hostStats = citrixResourceBase.getHostStats(conn, command, command.getHostGuid(), command.getHostId());
+ return new GetHostStatsAnswer(command, hostStats);
+ } catch (final Exception e) {
+ final String msg = "Unable to get Host stats" + e.toString();
+ s_logger.warn(msg, e);
+ return new GetHostStatsAnswer(command, null);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmDiskStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmDiskStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmDiskStatsCommandWrapper.java
new file mode 100644
index 0000000..682d202
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmDiskStatsCommandWrapper.java
@@ -0,0 +1,34 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetVmDiskStatsAnswer;
+import com.cloud.agent.api.GetVmDiskStatsCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixGetVmDiskStatsCommandWrapper extends CommandWrapper<GetVmDiskStatsCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final GetVmDiskStatsCommand command, final CitrixResourceBase citrixResourceBase) {
+ return new GetVmDiskStatsAnswer(command, null, null, null);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmStatsCommandWrapper.java
new file mode 100644
index 0000000..2b535ea
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixGetVmStatsCommandWrapper.java
@@ -0,0 +1,82 @@
+//
+// 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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetVmStatsAnswer;
+import com.cloud.agent.api.GetVmStatsCommand;
+import com.cloud.agent.api.VmStatsEntry;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
+
+public final class CitrixGetVmStatsCommandWrapper extends CommandWrapper<GetVmStatsCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixGetVmStatsCommandWrapper.class);
+
+ @Override
+ public Answer execute(final GetVmStatsCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final List<String> vmNames = command.getVmNames();
+ final HashMap<String, VmStatsEntry> vmStatsNameMap = new HashMap<String, VmStatsEntry>();
+ if (vmNames.size() == 0) {
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ }
+ try {
+
+ // Determine the UUIDs of the requested VMs
+ final List<String> vmUUIDs = new ArrayList<String>();
+
+ for (final String vmName : vmNames) {
+ final VM vm = citrixResourceBase.getVM(conn, vmName);
+ vmUUIDs.add(vm.getUuid(conn));
+ }
+
+ final HashMap<String, VmStatsEntry> vmStatsUUIDMap = citrixResourceBase.getVmStats(conn, command, vmUUIDs, command.getHostGuid());
+ if (vmStatsUUIDMap == null) {
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ }
+
+ for (final Map.Entry<String,VmStatsEntry>entry : vmStatsUUIDMap.entrySet()) {
+ vmStatsNameMap.put(vmNames.get(vmUUIDs.indexOf(entry.getKey())), entry.getValue());
+ }
+
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ } catch (final XenAPIException e) {
+ final String msg = "Unable to get VM stats" + e.toString();
+ s_logger.warn(msg, e);
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ } catch (final XmlRpcException e) {
+ final String msg = "Unable to get VM stats" + e.getMessage();
+ s_logger.warn(msg, e);
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/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 5eb3882..5e3e6e4 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
@@ -60,11 +60,11 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(CheckConsoleProxyLoadCommand.class, new CitrixCheckConsoleProxyLoadCommandWrapper());
map.put(WatchConsoleProxyLoadCommand.class, new CitrixWatchConsoleProxyLoadCommandWrapper());
map.put(ReadyCommand.class, new CitrixReadyCommandWrapper());
- map.put(GetHostStatsCommand.class, new GetHostStatsCommandWrapper());
- map.put(GetVmStatsCommand.class, new GetVmStatsCommandWrapper());
- map.put(GetVmDiskStatsCommand.class, new GetVmDiskStatsCommandWrapper());
- map.put(CheckHealthCommand.class, new CheckHealthCommandWrapper());
- map.put(StopCommand.class, new StopCommandWrapper());
+ map.put(GetHostStatsCommand.class, new CitrixGetHostStatsCommandWrapper());
+ map.put(GetVmStatsCommand.class, new CitrixGetVmStatsCommandWrapper());
+ map.put(GetVmDiskStatsCommand.class, new CitrixGetVmDiskStatsCommandWrapper());
+ map.put(CheckHealthCommand.class, new CitrixCheckHealthCommandWrapper());
+ map.put(StopCommand.class, new CitrixStopCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStopCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStopCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStopCommandWrapper.java
new file mode 100644
index 0000000..ce8517f
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStopCommandWrapper.java
@@ -0,0 +1,173 @@
+//
+// 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.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.StopAnswer;
+import com.cloud.agent.api.StopCommand;
+import com.cloud.agent.api.VgpuTypesInfo;
+import com.cloud.agent.api.to.GPUDeviceTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.StringUtils;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types.VmPowerState;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VGPU;
+import com.xensource.xenapi.VIF;
+import com.xensource.xenapi.VM;
+
+public final class CitrixStopCommandWrapper extends CommandWrapper<StopCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixStopCommandWrapper.class);
+
+ @Override
+ public Answer execute(final StopCommand command, final CitrixResourceBase citrixResourceBase) {
+ final String vmName = command.getVmName();
+ String platformstring = null;
+ try {
+ final Connection conn = citrixResourceBase.getConnection();
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+ // stop vm which is running on this host or is in halted state
+ final Iterator<VM> iter = vms.iterator();
+ while (iter.hasNext()) {
+ final VM vm = iter.next();
+ final VM.Record vmr = vm.getRecord(conn);
+ if (vmr.powerState != VmPowerState.RUNNING) {
+ continue;
+ }
+ if (citrixResourceBase.isRefNull(vmr.residentOn)) {
+ continue;
+ }
+ if (vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
+ continue;
+ }
+ iter.remove();
+ }
+
+ if (vms.size() == 0) {
+ return new StopAnswer(command, "VM does not exist", true);
+ }
+ for (final VM vm : vms) {
+ final VM.Record vmr = vm.getRecord(conn);
+ platformstring = StringUtils.mapToString(vmr.platform);
+ if (vmr.isControlDomain) {
+ final String msg = "Tring to Shutdown control domain";
+ s_logger.warn(msg);
+ return new StopAnswer(command, msg, false);
+ }
+
+ if (vmr.powerState == VmPowerState.RUNNING && !citrixResourceBase.isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
+ final String msg = "Stop Vm " + vmName + " failed due to this vm is not running on this host: " + citrixResourceBase.getHost().getUuid() + " but host:" + vmr.residentOn.getUuid(conn);
+ s_logger.warn(msg);
+ return new StopAnswer(command, msg, platformstring, false);
+ }
+
+ if (command.checkBeforeCleanup() && vmr.powerState == VmPowerState.RUNNING) {
+ final String msg = "Vm " + vmName + " is running on host and checkBeforeCleanup flag is set, so bailing out";
+ s_logger.debug(msg);
+ return new StopAnswer(command, msg, false);
+ }
+
+ s_logger.debug("9. The VM " + vmName + " is in Stopping state");
+
+ try {
+ if (vmr.powerState == VmPowerState.RUNNING) {
+ /* when stop a vm, set affinity to current xenserver */
+ vm.setAffinity(conn, vm.getResidentOn(conn));
+
+ if (citrixResourceBase.canBridgeFirewall()) {
+ final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "destroy_network_rules_for_vm", "vmName", command.getVmName());
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ s_logger.warn("Failed to remove network rules for vm " + command.getVmName());
+ } else {
+ s_logger.info("Removed network rules for vm " + command.getVmName());
+ }
+ }
+ citrixResourceBase.shutdownVM(conn, vm, vmName);
+ }
+ } catch (final Exception e) {
+ final String msg = "Catch exception " + e.getClass().getName() + " when stop VM:" + command.getVmName() + " due to " + e.toString();
+ s_logger.debug(msg);
+ return new StopAnswer(command, msg, platformstring, false);
+ } finally {
+
+ try {
+ if (vm.getPowerState(conn) == VmPowerState.HALTED) {
+ Set<VGPU> vGPUs = null;
+ // Get updated GPU details
+ try {
+ vGPUs = vm.getVGPUs(conn);
+ } catch (final XenAPIException e2) {
+ s_logger.debug("VM " + vmName + " does not have GPU support.");
+ }
+ if (vGPUs != null && !vGPUs.isEmpty()) {
+ final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = citrixResourceBase.getGPUGroupDetails(conn);
+ command.setGpuDevice(new GPUDeviceTO(null, null, groupDetails));
+ }
+
+ final Set<VIF> vifs = vm.getVIFs(conn);
+ final List<Network> networks = new ArrayList<Network>();
+ for (final VIF vif : vifs) {
+ networks.add(vif.getNetwork(conn));
+ }
+ vm.destroy(conn);
+ final SR sr = citrixResourceBase.getISOSRbyVmName(conn, command.getVmName());
+ citrixResourceBase.removeSR(conn, sr);
+ // Disable any VLAN networks that aren't used
+ // anymore
+ for (final Network network : networks) {
+ try {
+ if (network.getNameLabel(conn).startsWith("VLAN")) {
+ citrixResourceBase.disableVlanNetwork(conn, network);
+ }
+ } catch (final Exception e) {
+ // network might be destroyed by other host
+ }
+ }
+ return new StopAnswer(command, "Stop VM " + vmName + " Succeed", platformstring, true);
+ }
+ } catch (final Exception e) {
+ final String msg = "VM destroy failed in Stop " + vmName + " Command due to " + e.getMessage();
+ s_logger.warn(msg, e);
+ } finally {
+ s_logger.debug("10. The VM " + vmName + " is in Stopped state");
+ }
+ }
+ }
+
+ } catch (final Exception e) {
+ final String msg = "Stop Vm " + vmName + " fail due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new StopAnswer(command, msg, platformstring, false);
+ }
+ return new StopAnswer(command, "Stop VM failed", platformstring, false);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java
deleted file mode 100644
index d605367..0000000
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetHostStatsCommandWrapper.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// 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 org.apache.log4j.Logger;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.GetHostStatsAnswer;
-import com.cloud.agent.api.GetHostStatsCommand;
-import com.cloud.agent.api.HostStatsEntry;
-import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
-import com.cloud.resource.CommandWrapper;
-import com.xensource.xenapi.Connection;
-
-public final class GetHostStatsCommandWrapper extends CommandWrapper<GetHostStatsCommand, Answer, CitrixResourceBase> {
-
- private static final Logger s_logger = Logger.getLogger(GetHostStatsCommandWrapper.class);
-
- @Override
- public Answer execute(final GetHostStatsCommand command, final CitrixResourceBase citrixResourceBase) {
- final Connection conn = citrixResourceBase.getConnection();
- try {
- final HostStatsEntry hostStats = citrixResourceBase.getHostStats(conn, command, command.getHostGuid(), command.getHostId());
- return new GetHostStatsAnswer(command, hostStats);
- } catch (final Exception e) {
- final String msg = "Unable to get Host stats" + e.toString();
- s_logger.warn(msg, e);
- return new GetHostStatsAnswer(command, null);
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java
deleted file mode 100644
index a403322..0000000
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmDiskStatsCommandWrapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// 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 com.cloud.agent.api.Answer;
-import com.cloud.agent.api.GetVmDiskStatsAnswer;
-import com.cloud.agent.api.GetVmDiskStatsCommand;
-import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
-import com.cloud.resource.CommandWrapper;
-
-public final class GetVmDiskStatsCommandWrapper extends CommandWrapper<GetVmDiskStatsCommand, Answer, CitrixResourceBase> {
-
- @Override
- public Answer execute(final GetVmDiskStatsCommand command, final CitrixResourceBase citrixResourceBase) {
- return new GetVmDiskStatsAnswer(command, null, null, null);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java
deleted file mode 100644
index 1b4863a..0000000
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// 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.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-import org.apache.xmlrpc.XmlRpcException;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.GetVmStatsAnswer;
-import com.cloud.agent.api.GetVmStatsCommand;
-import com.cloud.agent.api.VmStatsEntry;
-import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
-import com.cloud.resource.CommandWrapper;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VM;
-
-public final class GetVmStatsCommandWrapper extends CommandWrapper<GetVmStatsCommand, Answer, CitrixResourceBase> {
-
- private static final Logger s_logger = Logger.getLogger(GetVmStatsCommandWrapper.class);
-
- @Override
- public Answer execute(final GetVmStatsCommand command, final CitrixResourceBase citrixResourceBase) {
- final Connection conn = citrixResourceBase.getConnection();
- final List<String> vmNames = command.getVmNames();
- final HashMap<String, VmStatsEntry> vmStatsNameMap = new HashMap<String, VmStatsEntry>();
- if (vmNames.size() == 0) {
- return new GetVmStatsAnswer(command, vmStatsNameMap);
- }
- try {
-
- // Determine the UUIDs of the requested VMs
- final List<String> vmUUIDs = new ArrayList<String>();
-
- for (final String vmName : vmNames) {
- final VM vm = citrixResourceBase.getVM(conn, vmName);
- vmUUIDs.add(vm.getUuid(conn));
- }
-
- final HashMap<String, VmStatsEntry> vmStatsUUIDMap = citrixResourceBase.getVmStats(conn, command, vmUUIDs, command.getHostGuid());
- if (vmStatsUUIDMap == null) {
- return new GetVmStatsAnswer(command, vmStatsNameMap);
- }
-
- for (final Map.Entry<String,VmStatsEntry>entry : vmStatsUUIDMap.entrySet()) {
- vmStatsNameMap.put(vmNames.get(vmUUIDs.indexOf(entry.getKey())), entry.getValue());
- }
-
- return new GetVmStatsAnswer(command, vmStatsNameMap);
- } catch (final XenAPIException e) {
- final String msg = "Unable to get VM stats" + e.toString();
- s_logger.warn(msg, e);
- return new GetVmStatsAnswer(command, vmStatsNameMap);
- } catch (final XmlRpcException e) {
- final String msg = "Unable to get VM stats" + e.getMessage();
- s_logger.warn(msg, e);
- return new GetVmStatsAnswer(command, vmStatsNameMap);
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9e41b805/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java
deleted file mode 100644
index bca90b5..0000000
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-// 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.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.log4j.Logger;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.StopAnswer;
-import com.cloud.agent.api.StopCommand;
-import com.cloud.agent.api.VgpuTypesInfo;
-import com.cloud.agent.api.to.GPUDeviceTO;
-import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
-import com.cloud.resource.CommandWrapper;
-import com.cloud.utils.StringUtils;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Network;
-import com.xensource.xenapi.SR;
-import com.xensource.xenapi.Types.VmPowerState;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VGPU;
-import com.xensource.xenapi.VIF;
-import com.xensource.xenapi.VM;
-
-public final class StopCommandWrapper extends CommandWrapper<StopCommand, Answer, CitrixResourceBase> {
-
- private static final Logger s_logger = Logger.getLogger(StopCommandWrapper.class);
-
- @Override
- public Answer execute(final StopCommand command, final CitrixResourceBase citrixResourceBase) {
- final String vmName = command.getVmName();
- String platformstring = null;
- try {
- final Connection conn = citrixResourceBase.getConnection();
- final Set<VM> vms = VM.getByNameLabel(conn, vmName);
- // stop vm which is running on this host or is in halted state
- final Iterator<VM> iter = vms.iterator();
- while (iter.hasNext()) {
- final VM vm = iter.next();
- final VM.Record vmr = vm.getRecord(conn);
- if (vmr.powerState != VmPowerState.RUNNING) {
- continue;
- }
- if (citrixResourceBase.isRefNull(vmr.residentOn)) {
- continue;
- }
- if (vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
- continue;
- }
- iter.remove();
- }
-
- if (vms.size() == 0) {
- return new StopAnswer(command, "VM does not exist", true);
- }
- for (final VM vm : vms) {
- final VM.Record vmr = vm.getRecord(conn);
- platformstring = StringUtils.mapToString(vmr.platform);
- if (vmr.isControlDomain) {
- final String msg = "Tring to Shutdown control domain";
- s_logger.warn(msg);
- return new StopAnswer(command, msg, false);
- }
-
- if (vmr.powerState == VmPowerState.RUNNING && !citrixResourceBase.isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
- final String msg = "Stop Vm " + vmName + " failed due to this vm is not running on this host: " + citrixResourceBase.getHost().getUuid() + " but host:" + vmr.residentOn.getUuid(conn);
- s_logger.warn(msg);
- return new StopAnswer(command, msg, platformstring, false);
- }
-
- if (command.checkBeforeCleanup() && vmr.powerState == VmPowerState.RUNNING) {
- final String msg = "Vm " + vmName + " is running on host and checkBeforeCleanup flag is set, so bailing out";
- s_logger.debug(msg);
- return new StopAnswer(command, msg, false);
- }
-
- s_logger.debug("9. The VM " + vmName + " is in Stopping state");
-
- try {
- if (vmr.powerState == VmPowerState.RUNNING) {
- /* when stop a vm, set affinity to current xenserver */
- vm.setAffinity(conn, vm.getResidentOn(conn));
-
- if (citrixResourceBase.canBridgeFirewall()) {
- final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "destroy_network_rules_for_vm", "vmName", command.getVmName());
- if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
- s_logger.warn("Failed to remove network rules for vm " + command.getVmName());
- } else {
- s_logger.info("Removed network rules for vm " + command.getVmName());
- }
- }
- citrixResourceBase.shutdownVM(conn, vm, vmName);
- }
- } catch (final Exception e) {
- final String msg = "Catch exception " + e.getClass().getName() + " when stop VM:" + command.getVmName() + " due to " + e.toString();
- s_logger.debug(msg);
- return new StopAnswer(command, msg, platformstring, false);
- } finally {
-
- try {
- if (vm.getPowerState(conn) == VmPowerState.HALTED) {
- Set<VGPU> vGPUs = null;
- // Get updated GPU details
- try {
- vGPUs = vm.getVGPUs(conn);
- } catch (final XenAPIException e2) {
- s_logger.debug("VM " + vmName + " does not have GPU support.");
- }
- if (vGPUs != null && !vGPUs.isEmpty()) {
- final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = citrixResourceBase.getGPUGroupDetails(conn);
- command.setGpuDevice(new GPUDeviceTO(null, null, groupDetails));
- }
-
- final Set<VIF> vifs = vm.getVIFs(conn);
- final List<Network> networks = new ArrayList<Network>();
- for (final VIF vif : vifs) {
- networks.add(vif.getNetwork(conn));
- }
- vm.destroy(conn);
- final SR sr = citrixResourceBase.getISOSRbyVmName(conn, command.getVmName());
- citrixResourceBase.removeSR(conn, sr);
- // Disable any VLAN networks that aren't used
- // anymore
- for (final Network network : networks) {
- try {
- if (network.getNameLabel(conn).startsWith("VLAN")) {
- citrixResourceBase.disableVlanNetwork(conn, network);
- }
- } catch (final Exception e) {
- // network might be destroyed by other host
- }
- }
- return new StopAnswer(command, "Stop VM " + vmName + " Succeed", platformstring, true);
- }
- } catch (final Exception e) {
- final String msg = "VM destroy failed in Stop " + vmName + " Command due to " + e.getMessage();
- s_logger.warn(msg, e);
- } finally {
- s_logger.debug("10. The VM " + vmName + " is in Stopped state");
- }
- }
- }
-
- } catch (final Exception e) {
- final String msg = "Stop Vm " + vmName + " fail due to " + e.toString();
- s_logger.warn(msg, e);
- return new StopAnswer(command, msg, platformstring, false);
- }
- return new StopAnswer(command, "Stop VM failed", platformstring, false);
- }
-}
\ No newline at end of file
[22/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Make methods in subclasses public.
Remove the if-commands that I have already refactored.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3a70912b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3a70912b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3a70912b
Branch: refs/heads/master
Commit: 3a70912b7cd246a698553d1943218b2ed17e1c4a
Parents: 637a56c
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Wed Mar 25 19:20:04 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:29 2015 +0200
----------------------------------------------------------------------
.../hypervisor/xenserver/resource/CitrixResourceBase.java | 10 ----------
.../hypervisor/xenserver/resource/XcpOssResource.java | 2 +-
.../xenserver/resource/XenServer56Resource.java | 2 +-
3 files changed, 2 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3a70912b/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 6c51fae..8fa9e4c 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
@@ -453,16 +453,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == GetStorageStatsCommand.class) {
- return execute((GetStorageStatsCommand)cmd);
- } else if (clazz == PrimaryStorageDownloadCommand.class) {
- return execute((PrimaryStorageDownloadCommand)cmd);
- } else if (clazz == GetVncPortCommand.class) {
- return execute((GetVncPortCommand)cmd);
- } else if (clazz == SetupCommand.class) {
- return execute((SetupCommand)cmd);
- } else if (clazz == MaintainCommand.class) {
- return execute((MaintainCommand)cmd);
} else if (clazz == PingTestCommand.class) {
return execute((PingTestCommand)cmd);
} else if (clazz == CheckOnHostCommand.class) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3a70912b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
index b5eef7e..312b34c 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
@@ -74,7 +74,7 @@ public class XcpOssResource extends CitrixResourceBase {
}
@Override
- protected boolean launchHeartBeat(final Connection conn) {
+ public boolean launchHeartBeat(final Connection conn) {
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3a70912b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index 1bb2ff4..6b3efb5 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -263,7 +263,7 @@ public class XenServer56Resource extends CitrixResourceBase {
@Override
- 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;
[19/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring AttachIsoCommand, AttachVolumeCommand and UpgradeSnapshotCommand to cope with new design
- Basic tests added
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/ea374b6a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/ea374b6a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/ea374b6a
Branch: refs/heads/master
Commit: ea374b6a2ffba8c5ea2222cf1cffce10dbbdff92
Parents: 6c77595
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 15:26:03 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:28 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 22 +--
.../wrapper/CitrixAttachIsoCommandWrapper.java | 134 +++++++++++++++++
.../CitrixAttachVolumeCommandWrapper.java | 144 +++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 6 +
.../CitrixUpgradeSnapshotCommandWrapper.java | 64 +++++++++
.../wrapper/CitrixRequestWrapperTest.java | 70 ++++++++-
6 files changed, 424 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ea374b6a/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 ec67ee8..3c55a88 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
@@ -441,14 +441,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == CreateStoragePoolCommand.class) {
- return execute((CreateStoragePoolCommand)cmd);
- } else if (clazz == ModifyStoragePoolCommand.class) {
- return execute((ModifyStoragePoolCommand)cmd);
- } else if (clazz == DeleteStoragePoolCommand.class) {
- return execute((DeleteStoragePoolCommand) cmd);
- }else if (clazz == ResizeVolumeCommand.class) {
- return execute((ResizeVolumeCommand) cmd);
} else if (clazz == AttachVolumeCommand.class) {
return execute((AttachVolumeCommand)cmd);
} else if (clazz == AttachIsoCommand.class) {
@@ -2679,7 +2671,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- String upgradeSnapshot(final Connection conn, final String templatePath, final String snapshotPath) {
+ public String upgradeSnapshot(final Connection conn, final String templatePath, final String snapshotPath) {
final String results = callHostPluginAsync(conn, "vmopspremium", "upgrade_snapshot", 2 * 60 * 60, "templatePath", templatePath, "snapshotPath", snapshotPath);
if (results == null || results.isEmpty()) {
@@ -3620,7 +3612,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return connect(conn, vmname, ipAddress, 3922);
}
- protected boolean isDeviceUsed(final Connection conn, final VM vm, final Long deviceId) {
+ public boolean isDeviceUsed(final Connection conn, final VM vm, final Long deviceId) {
// Figure out the disk number to attach the VM to
String msg = null;
@@ -3640,7 +3632,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("When check deviceId " + msg);
}
- protected String getUnusedDeviceNum(final Connection conn, final VM vm) {
+ public String getUnusedDeviceNum(final Connection conn, final VM vm) {
// Figure out the disk number to attach the VM to
try {
final Set<String> allowedVBDDevices = vm.getAllowedVBDDevices(conn);
@@ -5841,7 +5833,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return getVDIbyUuid(conn, uuid, true);
}
- protected VDI getVDIbyUuid(final Connection conn, final String uuid, final boolean throwExceptionIfNotFound) {
+ public VDI getVDIbyUuid(final Connection conn, final String uuid, final boolean throwExceptionIfNotFound) {
try {
return VDI.getByUuid(conn, uuid);
} catch (final Exception e) {
@@ -6099,7 +6091,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new Answer(cmd, true, "Success");
}
- protected VDI createVdi(final SR sr, final String vdiNameLabel, final Long volumeSize) throws Types.XenAPIException, XmlRpcException {
+ public VDI createVdi(final SR sr, final String vdiNameLabel, final Long volumeSize) throws Types.XenAPIException, XmlRpcException {
final Connection conn = getConnection();
final VDI.Record vdir = new VDI.Record();
@@ -6121,7 +6113,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return VDI.create(conn, vdir);
}
- protected void handleSrAndVdiDetach(final String iqn, final Connection conn) throws Exception {
+ public void handleSrAndVdiDetach(final String iqn, final Connection conn) throws Exception {
final SR sr = getStorageRepository(conn, iqn);
removeSR(conn, sr);
@@ -6685,7 +6677,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vms.iterator().next();
}
- protected VDI getIsoVDIByURL(final Connection conn, final String vmName, final String isoURL) {
+ public VDI getIsoVDIByURL(final Connection conn, final String vmName, final String isoURL) {
SR isoSR = null;
String mountpoint = null;
if (isoURL.startsWith("xs-tools")) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ea374b6a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachIsoCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachIsoCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachIsoCommandWrapper.java
new file mode 100644
index 0000000..cc444c5
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachIsoCommandWrapper.java
@@ -0,0 +1,134 @@
+//
+// 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.AttachIsoCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class CitrixAttachIsoCommandWrapper extends CommandWrapper<AttachIsoCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixAttachIsoCommandWrapper.class);
+
+ @Override
+ public Answer execute(final AttachIsoCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final boolean attach = command.isAttach();
+ final String vmName = command.getVmName();
+ final String isoURL = command.getIsoPath();
+
+ String errorMsg;
+ if (attach) {
+ errorMsg = "Failed to attach ISO";
+ } else {
+ errorMsg = "Failed to detach ISO";
+ }
+ try {
+ if (attach) {
+ VBD isoVBD = null;
+
+ // Find the VM
+ final VM vm = citrixResourceBase.getVM(conn, vmName);
+
+ // Find the ISO VDI
+ final VDI isoVDI = citrixResourceBase.getIsoVDIByURL(conn, vmName, isoURL);
+
+ // Find the VM's CD-ROM VBD
+ final Set<VBD> vbds = vm.getVBDs(conn);
+ for (final VBD vbd : vbds) {
+ final String userDevice = vbd.getUserdevice(conn);
+ final Types.VbdType type = vbd.getType(conn);
+
+ if (userDevice.equals("3") && type == Types.VbdType.CD) {
+ isoVBD = vbd;
+ break;
+ }
+ }
+
+ if (isoVBD == null) {
+ throw new CloudRuntimeException("Unable to find CD-ROM VBD for VM: " + vmName);
+ } else {
+ // If an ISO is already inserted, eject it
+ if (isoVBD.getEmpty(conn) == false) {
+ isoVBD.eject(conn);
+ }
+
+ // Insert the new ISO
+ isoVBD.insert(conn, isoVDI);
+ }
+
+ return new Answer(command);
+ } else {
+ // Find the VM
+ final VM vm = citrixResourceBase.getVM(conn, vmName);
+ final String vmUUID = vm.getUuid(conn);
+
+ // Find the ISO VDI
+ final VDI isoVDI = citrixResourceBase.getIsoVDIByURL(conn, vmName, isoURL);
+
+ final SR sr = isoVDI.getSR(conn);
+
+ // Look up all VBDs for this VDI
+ final Set<VBD> vbds = isoVDI.getVBDs(conn);
+
+ // Iterate through VBDs, and if the VBD belongs the VM, eject
+ // the ISO from it
+ for (final VBD vbd : vbds) {
+ final VM vbdVM = vbd.getVM(conn);
+ final String vbdVmUUID = vbdVM.getUuid(conn);
+
+ if (vbdVmUUID.equals(vmUUID)) {
+ // If an ISO is already inserted, eject it
+ if (!vbd.getEmpty(conn)) {
+ vbd.eject(conn);
+ }
+
+ break;
+ }
+ }
+
+ if (!sr.getNameLabel(conn).startsWith("XenServer Tools")) {
+ citrixResourceBase.removeSR(conn, sr);
+ }
+
+ return new Answer(command);
+ }
+ } catch (final XenAPIException e) {
+ s_logger.warn(errorMsg + ": " + e.toString(), e);
+ return new Answer(command, false, e.toString());
+ } catch (final Exception e) {
+ s_logger.warn(errorMsg + ": " + e.toString(), e);
+ return new Answer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ea374b6a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachVolumeCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachVolumeCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachVolumeCommandWrapper.java
new file mode 100644
index 0000000..01fd874
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixAttachVolumeCommandWrapper.java
@@ -0,0 +1,144 @@
+//
+// 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.AttachVolumeAnswer;
+import com.cloud.agent.api.AttachVolumeCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class CitrixAttachVolumeCommandWrapper extends CommandWrapper<AttachVolumeCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixAttachVolumeCommandWrapper.class);
+
+ @Override
+ public Answer execute(final AttachVolumeCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final boolean attach = command.getAttach();
+ final String vmName = command.getVmName();
+ final String vdiNameLabel = vmName + "-DATA";
+ final Long deviceId = command.getDeviceId();
+
+ String errorMsg;
+ if (attach) {
+ errorMsg = "Failed to attach volume";
+ } else {
+ errorMsg = "Failed to detach volume";
+ }
+
+ try {
+ VDI vdi = null;
+
+ if (command.getAttach() && command.isManaged()) {
+ final SR sr = citrixResourceBase.getIscsiSR(conn, command.get_iScsiName(), command.getStorageHost(), command.get_iScsiName(), command.getChapInitiatorUsername(),
+ command.getChapInitiatorPassword(), true);
+
+ vdi = citrixResourceBase.getVDIbyUuid(conn, command.getVolumePath(), false);
+
+ if (vdi == null) {
+ vdi = citrixResourceBase.createVdi(sr, vdiNameLabel, command.getVolumeSize());
+ }
+ } else {
+ vdi = citrixResourceBase.getVDIbyUuid(conn, command.getVolumePath());
+ }
+
+ // Look up the VM
+ final VM vm = citrixResourceBase.getVM(conn, vmName);
+ if (attach) {
+ // Figure out the disk number to attach the VM to
+ String diskNumber = null;
+ if (deviceId != null) {
+ if (deviceId.longValue() == 3) {
+ final String msg = "Device 3 is reserved for CD-ROM, choose other device";
+ return new AttachVolumeAnswer(command, msg);
+ }
+ if (citrixResourceBase.isDeviceUsed(conn, vm, deviceId)) {
+ final String msg = "Device " + deviceId + " is used in VM " + vmName;
+ return new AttachVolumeAnswer(command, msg);
+ }
+ diskNumber = deviceId.toString();
+ } else {
+ diskNumber = citrixResourceBase.getUnusedDeviceNum(conn, vm);
+ }
+ // Create a new VBD
+ final VBD.Record vbdr = new VBD.Record();
+ vbdr.VM = vm;
+ vbdr.VDI = vdi;
+ vbdr.bootable = false;
+ vbdr.userdevice = diskNumber;
+ vbdr.mode = Types.VbdMode.RW;
+ vbdr.type = Types.VbdType.DISK;
+ vbdr.unpluggable = true;
+ final VBD vbd = VBD.create(conn, vbdr);
+
+ // Attach the VBD to the VM
+ vbd.plug(conn);
+
+ // Update the VDI's label to include the VM name
+ vdi.setNameLabel(conn, vdiNameLabel);
+
+ return new AttachVolumeAnswer(command, Long.parseLong(diskNumber), vdi.getUuid(conn));
+ } else {
+ // Look up all VBDs for this VDI
+ final Set<VBD> vbds = vdi.getVBDs(conn);
+
+ // Detach each VBD from its VM, and then destroy it
+ for (final VBD vbd : vbds) {
+ final VBD.Record vbdr = vbd.getRecord(conn);
+
+ if (vbdr.currentlyAttached) {
+ vbd.unplug(conn);
+ }
+
+ vbd.destroy(conn);
+ }
+
+ // Update the VDI's label to be "detached"
+ vdi.setNameLabel(conn, "detached");
+
+ if (command.isManaged()) {
+ citrixResourceBase.handleSrAndVdiDetach(command.get_iScsiName(), conn);
+ }
+
+ return new AttachVolumeAnswer(command);
+ }
+ } catch (final XenAPIException e) {
+ final String msg = errorMsg + " for uuid: " + command.getVolumePath() + " due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new AttachVolumeAnswer(command, msg);
+ } catch (final Exception e) {
+ final String msg = errorMsg + " for uuid: " + command.getVolumePath() + " due to " + e.getMessage();
+ s_logger.warn(msg, e);
+ return new AttachVolumeAnswer(command, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ea374b6a/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 5451601..1deefea 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
@@ -22,6 +22,8 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
import java.util.Hashtable;
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.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
@@ -37,6 +39,7 @@ import com.cloud.agent.api.ReadyCommand;
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.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateCommand;
@@ -83,6 +86,9 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(ModifyStoragePoolCommand.class, new CitrixModifyStoragePoolCommandWrapper());
map.put(DeleteStoragePoolCommand.class, new CitrixDeleteStoragePoolCommandWrapper());
map.put(ResizeVolumeCommand.class, new CitrixResizeVolumeCommandWrapper());
+ map.put(AttachVolumeCommand.class, new CitrixAttachVolumeCommandWrapper());
+ map.put(AttachIsoCommand.class, new CitrixAttachIsoCommandWrapper());
+ map.put(UpgradeSnapshotCommand.class, new CitrixUpgradeSnapshotCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ea374b6a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpgradeSnapshotCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpgradeSnapshotCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpgradeSnapshotCommandWrapper.java
new file mode 100644
index 0000000..a7f3a50
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixUpgradeSnapshotCommandWrapper.java
@@ -0,0 +1,64 @@
+//
+// 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.net.URI;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.UpgradeSnapshotCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixUpgradeSnapshotCommandWrapper extends CommandWrapper<UpgradeSnapshotCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixUpgradeSnapshotCommandWrapper.class);
+
+ @Override
+ public Answer execute(final UpgradeSnapshotCommand command, final CitrixResourceBase citrixResourceBase) {
+ final String secondaryStorageUrl = command.getSecondaryStorageUrl();
+ final String backedUpSnapshotUuid = command.getSnapshotUuid();
+ final Long volumeId = command.getVolumeId();
+ final Long accountId = command.getAccountId();
+ final Long templateId = command.getTemplateId();
+ final Long tmpltAcountId = command.getTmpltAccountId();
+ final String version = command.getVersion();
+
+ if (!version.equals("2.1")) {
+ return new Answer(command, true, "success");
+ }
+ try {
+ final Connection conn = citrixResourceBase.getConnection();
+ final URI uri = new URI(secondaryStorageUrl);
+ final String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
+ final String snapshotPath = secondaryStorageMountPath + "/snapshots/" + accountId + "/" + volumeId + "/" + backedUpSnapshotUuid + ".vhd";
+ final String templatePath = secondaryStorageMountPath + "/template/tmpl/" + tmpltAcountId + "/" + templateId;
+ citrixResourceBase.upgradeSnapshot(conn, templatePath, snapshotPath);
+ return new Answer(command, true, "success");
+ } catch (final Exception e) {
+ final String details = "upgrading snapshot " + backedUpSnapshotUuid + " failed due to " + e.toString();
+ s_logger.error(details, e);
+
+ }
+ return new Answer(command, false, "failure");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ea374b6a/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 9de002e..d5f44e0 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
@@ -17,6 +17,8 @@ import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
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.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
@@ -33,6 +35,7 @@ import com.cloud.agent.api.RebootAnswer;
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.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateAnswer;
@@ -43,6 +46,7 @@ import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
import com.cloud.hypervisor.xenserver.resource.XsHost;
+import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.vm.DiskProfile;
@@ -222,6 +226,7 @@ public class CitrixRequestWrapperTest {
assertNotNull(wrapper);
final Answer answer = wrapper.execute(virtualMachineCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertTrue(answer.getResult());
}
@@ -235,6 +240,7 @@ public class CitrixRequestWrapperTest {
assertNotNull(wrapper);
final Answer answer = wrapper.execute(prepareCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
}
@@ -248,6 +254,7 @@ public class CitrixRequestWrapperTest {
assertNotNull(wrapper);
final Answer answer = wrapper.execute(migrateCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
}
@@ -264,6 +271,7 @@ public class CitrixRequestWrapperTest {
assertNotNull(wrapper);
final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
}
@@ -281,6 +289,7 @@ public class CitrixRequestWrapperTest {
when(citrixResourceBase.getHost()).thenReturn(xsHost);
final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
}
@@ -298,6 +307,7 @@ public class CitrixRequestWrapperTest {
when(citrixResourceBase.getHost()).thenReturn(xsHost);
final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
}
@@ -315,6 +325,7 @@ public class CitrixRequestWrapperTest {
when(citrixResourceBase.getHost()).thenReturn(xsHost);
final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertTrue(answer.getResult());
}
@@ -323,15 +334,72 @@ public class CitrixRequestWrapperTest {
public void testResizeVolumeCommand() {
final StorageFilerTO pool = Mockito.mock(StorageFilerTO.class);
- final ResizeVolumeCommand destroyCommand = new ResizeVolumeCommand("Test", pool, 1l, 3l, false, "Tests-1");
+ final ResizeVolumeCommand resizeCommand = new ResizeVolumeCommand("Test", pool, 1l, 3l, false, "Tests-1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(resizeCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testAttachVolumeCommand() {
+ final AttachVolumeCommand destroyCommand = new AttachVolumeCommand(false, true, "Test", StoragePoolType.LVM, "/", "DATA", 100l, 1l, "123");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testAttachIsoCommand() {
+ final AttachIsoCommand destroyCommand = new AttachIsoCommand("Test", "/", true);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testUpgradeSnapshotCommand() {
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+
+ final UpgradeSnapshotCommand destroyCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "2.1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testUpgradeSnapshotCommandNo21() {
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+
+ final UpgradeSnapshotCommand destroyCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "3.1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(0)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[08/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
index 10a97a2..0cf40f5 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
@@ -92,7 +92,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
protected CitrixResourceBase hypervisorResource;
protected String BaseMountPointOnHost = "/var/run/cloud_mount";
- public XenServerStorageProcessor(CitrixResourceBase resource) {
+ public XenServerStorageProcessor(final CitrixResourceBase resource) {
hypervisorResource = resource;
}
@@ -104,39 +104,39 @@ public class XenServerStorageProcessor implements StorageProcessor {
// detach the new SR
// if we needed to perform an attach to the source SR, detach from it
@Override
- public SnapshotAndCopyAnswer snapshotAndCopy(SnapshotAndCopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
+ public SnapshotAndCopyAnswer snapshotAndCopy(final SnapshotAndCopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
try {
SR sourceSr = null;
- Map<String, String> sourceDetails = cmd.getSourceDetails();
+ final Map<String, String> sourceDetails = cmd.getSourceDetails();
if (sourceDetails != null && sourceDetails.keySet().size() > 0) {
- String iScsiName = sourceDetails.get(DiskTO.IQN);
- String storageHost = sourceDetails.get(DiskTO.STORAGE_HOST);
- String chapInitiatorUsername = sourceDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
- String chapInitiatorSecret = sourceDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
+ final String iScsiName = sourceDetails.get(DiskTO.IQN);
+ final String storageHost = sourceDetails.get(DiskTO.STORAGE_HOST);
+ final String chapInitiatorUsername = sourceDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
+ final String chapInitiatorSecret = sourceDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
sourceSr = hypervisorResource.getIscsiSR(conn, iScsiName, storageHost, iScsiName, chapInitiatorUsername, chapInitiatorSecret, false);
}
- VDI vdiToSnapshot = VDI.getByUuid(conn, cmd.getUuidOfSourceVdi());
+ final VDI vdiToSnapshot = VDI.getByUuid(conn, cmd.getUuidOfSourceVdi());
- VDI vdiSnapshot = vdiToSnapshot.snapshot(conn, new HashMap<String, String>());
+ final VDI vdiSnapshot = vdiToSnapshot.snapshot(conn, new HashMap<String, String>());
- Map<String, String> destDetails = cmd.getDestDetails();
+ final Map<String, String> destDetails = cmd.getDestDetails();
- String iScsiName = destDetails.get(DiskTO.IQN);
- String storageHost = destDetails.get(DiskTO.STORAGE_HOST);
- String chapInitiatorUsername = destDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
- String chapInitiatorSecret = destDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
+ final String iScsiName = destDetails.get(DiskTO.IQN);
+ final String storageHost = destDetails.get(DiskTO.STORAGE_HOST);
+ final String chapInitiatorUsername = destDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
+ final String chapInitiatorSecret = destDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
- SR newSr = hypervisorResource.getIscsiSR(conn, iScsiName, storageHost, iScsiName, chapInitiatorUsername, chapInitiatorSecret, false);
+ final SR newSr = hypervisorResource.getIscsiSR(conn, iScsiName, storageHost, iScsiName, chapInitiatorUsername, chapInitiatorSecret, false);
- VDI vdiCopy = vdiSnapshot.copy(conn, newSr);
+ final VDI vdiCopy = vdiSnapshot.copy(conn, newSr);
- String vdiUuid = vdiCopy.getUuid(conn);
+ final String vdiUuid = vdiCopy.getUuid(conn);
vdiSnapshot.destroy(conn);
@@ -146,13 +146,13 @@ public class XenServerStorageProcessor implements StorageProcessor {
hypervisorResource.removeSR(conn, newSr);
- SnapshotAndCopyAnswer snapshotAndCopyAnswer = new SnapshotAndCopyAnswer();
+ final SnapshotAndCopyAnswer snapshotAndCopyAnswer = new SnapshotAndCopyAnswer();
snapshotAndCopyAnswer.setPath(vdiUuid);
return snapshotAndCopyAnswer;
}
- catch (Exception ex) {
+ catch (final Exception ex) {
s_logger.warn("Failed to take and copy snapshot: " + ex.toString(), ex);
return new SnapshotAndCopyAnswer(ex.getMessage());
@@ -160,40 +160,40 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public AttachAnswer attachIso(AttachCommand cmd) {
- DiskTO disk = cmd.getDisk();
- DataTO data = disk.getData();
- DataStoreTO store = data.getDataStore();
+ public AttachAnswer attachIso(final AttachCommand cmd) {
+ final DiskTO disk = cmd.getDisk();
+ final DataTO data = disk.getData();
+ final DataStoreTO store = data.getDataStore();
String isoURL = null;
if (store == null) {
- TemplateObjectTO iso = (TemplateObjectTO) disk.getData();
+ final TemplateObjectTO iso = (TemplateObjectTO) disk.getData();
isoURL = iso.getName();
} else {
if (!(store instanceof NfsTO)) {
s_logger.debug("Can't attach a iso which is not created on nfs: ");
return new AttachAnswer("Can't attach a iso which is not created on nfs: ");
}
- NfsTO nfsStore = (NfsTO) store;
+ final NfsTO nfsStore = (NfsTO) store;
isoURL = nfsStore.getUrl() + nfsStore.getPathSeparator() + data.getPath();
}
- String vmName = cmd.getVmName();
+ final String vmName = cmd.getVmName();
try {
- Connection conn = hypervisorResource.getConnection();
+ final Connection conn = hypervisorResource.getConnection();
VBD isoVBD = null;
// Find the VM
- VM vm = hypervisorResource.getVM(conn, vmName);
+ final VM vm = hypervisorResource.getVM(conn, vmName);
// Find the ISO VDI
- VDI isoVDI = hypervisorResource.getIsoVDIByURL(conn, vmName, isoURL);
+ final VDI isoVDI = hypervisorResource.getIsoVDIByURL(conn, vmName, isoURL);
// Find the VM's CD-ROM VBD
- Set<VBD> vbds = vm.getVBDs(conn);
- for (VBD vbd : vbds) {
- String userDevice = vbd.getUserdevice(conn);
- Types.VbdType type = vbd.getType(conn);
+ final Set<VBD> vbds = vm.getVBDs(conn);
+ for (final VBD vbd : vbds) {
+ final String userDevice = vbd.getUserdevice(conn);
+ final Types.VbdType type = vbd.getType(conn);
if (userDevice.equals("3") && type == Types.VbdType.CD) {
isoVBD = vbd;
@@ -215,39 +215,39 @@ public class XenServerStorageProcessor implements StorageProcessor {
return new AttachAnswer(disk);
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.warn("Failed to attach iso" + ": " + e.toString(), e);
return new AttachAnswer(e.toString());
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("Failed to attach iso" + ": " + e.toString(), e);
return new AttachAnswer(e.toString());
}
}
@Override
- public AttachAnswer attachVolume(AttachCommand cmd) {
- DiskTO disk = cmd.getDisk();
- DataTO data = disk.getData();
+ public AttachAnswer attachVolume(final AttachCommand cmd) {
+ final DiskTO disk = cmd.getDisk();
+ final DataTO data = disk.getData();
try {
- String vmName = cmd.getVmName();
- String vdiNameLabel = vmName + "-DATA";
+ final String vmName = cmd.getVmName();
+ final String vdiNameLabel = vmName + "-DATA";
- Connection conn = this.hypervisorResource.getConnection();
+ final Connection conn = hypervisorResource.getConnection();
VM vm = null;
boolean vmNotRunning = true;
try {
- vm = this.hypervisorResource.getVM(conn, vmName);
+ vm = hypervisorResource.getVM(conn, vmName);
- VM.Record vmr = vm.getRecord(conn);
+ final VM.Record vmr = vm.getRecord(conn);
vmNotRunning = vmr.powerState != VmPowerState.RUNNING;
- } catch (CloudRuntimeException ex) {
+ } catch (final CloudRuntimeException ex) {
}
- Map<String, String> details = disk.getDetails();
- boolean isManaged = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
+ final Map<String, String> details = disk.getDetails();
+ final boolean isManaged = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
// if the VM is not running and we're not dealing with managed storage, just return success (nothing to do here)
// this should probably never actually happen
@@ -261,7 +261,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
vdi = hypervisorResource.prepareManagedStorage(conn, details, data.getPath(), vdiNameLabel);
if (vmNotRunning) {
- DiskTO newDisk = new DiskTO(disk.getData(), disk.getDiskSeq(), vdi.getUuid(conn), disk.getType());
+ final DiskTO newDisk = new DiskTO(disk.getData(), disk.getDiskSeq(), vdi.getUuid(conn), disk.getType());
return new AttachAnswer(newDisk);
}
@@ -271,17 +271,17 @@ public class XenServerStorageProcessor implements StorageProcessor {
// Figure out the disk number to attach the VM to
String diskNumber = null;
- Long deviceId = disk.getDiskSeq();
+ final Long deviceId = disk.getDiskSeq();
if (deviceId != null) {
if (deviceId.longValue() == 3) {
- String msg = "Device 3 is reserved for CD-ROM, choose other device";
+ final String msg = "Device 3 is reserved for CD-ROM, choose other device";
return new AttachAnswer(msg);
}
if (hypervisorResource.isDeviceUsed(conn, vm, deviceId)) {
- String msg = "Device " + deviceId + " is used in VM " + vmName;
+ final String msg = "Device " + deviceId + " is used in VM " + vmName;
return new AttachAnswer(msg);
}
@@ -291,7 +291,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
diskNumber = hypervisorResource.getUnusedDeviceNum(conn, vm);
}
- VBD.Record vbdr = new VBD.Record();
+ final VBD.Record vbdr = new VBD.Record();
vbdr.VM = vm;
vbdr.VDI = vdi;
@@ -301,66 +301,66 @@ public class XenServerStorageProcessor implements StorageProcessor {
vbdr.type = Types.VbdType.DISK;
vbdr.unpluggable = true;
- VBD vbd = VBD.create(conn, vbdr);
+ final VBD vbd = VBD.create(conn, vbdr);
// Attach the VBD to the VM
try {
vbd.plug(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
vbd.destroy(conn);
throw e;
}
// Update the VDI's label to include the VM name
vdi.setNameLabel(conn, vdiNameLabel);
- DiskTO newDisk = new DiskTO(disk.getData(), Long.parseLong(diskNumber), vdi.getUuid(conn), disk.getType());
+ final DiskTO newDisk = new DiskTO(disk.getData(), Long.parseLong(diskNumber), vdi.getUuid(conn), disk.getType());
return new AttachAnswer(newDisk);
- } catch (Exception e) {
- String msg = "Failed to attach volume" + " for uuid: " + data.getPath() + " due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Failed to attach volume" + " for uuid: " + data.getPath() + " due to " + e.toString();
s_logger.warn(msg, e);
return new AttachAnswer(msg);
}
}
@Override
- public Answer dettachIso(DettachCommand cmd) {
- DiskTO disk = cmd.getDisk();
- DataTO data = disk.getData();
- DataStoreTO store = data.getDataStore();
+ public Answer dettachIso(final DettachCommand cmd) {
+ final DiskTO disk = cmd.getDisk();
+ final DataTO data = disk.getData();
+ final DataStoreTO store = data.getDataStore();
String isoURL = null;
if (store == null) {
- TemplateObjectTO iso = (TemplateObjectTO) disk.getData();
+ final TemplateObjectTO iso = (TemplateObjectTO) disk.getData();
isoURL = iso.getName();
} else {
if (!(store instanceof NfsTO)) {
s_logger.debug("Can't attach a iso which is not created on nfs: ");
return new AttachAnswer("Can't attach a iso which is not created on nfs: ");
}
- NfsTO nfsStore = (NfsTO) store;
+ final NfsTO nfsStore = (NfsTO) store;
isoURL = nfsStore.getUrl() + nfsStore.getPathSeparator() + data.getPath();
}
try {
- Connection conn = hypervisorResource.getConnection();
+ final Connection conn = hypervisorResource.getConnection();
// Find the VM
- VM vm = hypervisorResource.getVM(conn, cmd.getVmName());
- String vmUUID = vm.getUuid(conn);
+ final VM vm = hypervisorResource.getVM(conn, cmd.getVmName());
+ final String vmUUID = vm.getUuid(conn);
// Find the ISO VDI
- VDI isoVDI = hypervisorResource.getIsoVDIByURL(conn, cmd.getVmName(), isoURL);
+ final VDI isoVDI = hypervisorResource.getIsoVDIByURL(conn, cmd.getVmName(), isoURL);
- SR sr = isoVDI.getSR(conn);
+ final SR sr = isoVDI.getSR(conn);
// Look up all VBDs for this VDI
- Set<VBD> vbds = isoVDI.getVBDs(conn);
+ final Set<VBD> vbds = isoVDI.getVBDs(conn);
// Iterate through VBDs, and if the VBD belongs the VM, eject
// the ISO from it
- for (VBD vbd : vbds) {
- VM vbdVM = vbd.getVM(conn);
- String vbdVmUUID = vbdVM.getUuid(conn);
+ for (final VBD vbd : vbds) {
+ final VM vbdVM = vbd.getVM(conn);
+ final String vbdVmUUID = vbdVM.getUuid(conn);
if (vbdVmUUID.equals(vmUUID)) {
// If an ISO is already inserted, eject it
@@ -376,37 +376,37 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
return new DettachAnswer(disk);
- } catch (XenAPIException e) {
- String msg = "Failed to dettach volume" + " for uuid: " + data.getPath() + " due to " + e.toString();
+ } catch (final XenAPIException e) {
+ final String msg = "Failed to dettach volume" + " for uuid: " + data.getPath() + " due to " + e.toString();
s_logger.warn(msg, e);
return new DettachAnswer(msg);
- } catch (Exception e) {
- String msg = "Failed to dettach volume" + " for uuid: " + data.getPath() + " due to " + e.getMessage();
+ } catch (final Exception e) {
+ final String msg = "Failed to dettach volume" + " for uuid: " + data.getPath() + " due to " + e.getMessage();
s_logger.warn(msg, e);
return new DettachAnswer(msg);
}
}
@Override
- public Answer dettachVolume(DettachCommand cmd) {
- DiskTO disk = cmd.getDisk();
- DataTO data = disk.getData();
+ public Answer dettachVolume(final DettachCommand cmd) {
+ final DiskTO disk = cmd.getDisk();
+ final DataTO data = disk.getData();
try {
- Connection conn = this.hypervisorResource.getConnection();
+ final Connection conn = hypervisorResource.getConnection();
- String vmName = cmd.getVmName();
+ final String vmName = cmd.getVmName();
VM vm = null;
boolean vmNotRunning = true;
try {
- vm = this.hypervisorResource.getVM(conn, vmName);
+ vm = hypervisorResource.getVM(conn, vmName);
- VM.Record vmr = vm.getRecord(conn);
+ final VM.Record vmr = vm.getRecord(conn);
vmNotRunning = vmr.powerState != VmPowerState.RUNNING;
- } catch (CloudRuntimeException ex) {
+ } catch (final CloudRuntimeException ex) {
}
// if the VM is not running and we're not dealing with managed storage, just return success (nothing to do here)
@@ -416,14 +416,14 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
if (!vmNotRunning) {
- VDI vdi = this.hypervisorResource.mount(conn, null, null, data.getPath());
+ final VDI vdi = hypervisorResource.mount(conn, null, null, data.getPath());
// Look up all VBDs for this VDI
- Set<VBD> vbds = vdi.getVBDs(conn);
+ final Set<VBD> vbds = vdi.getVBDs(conn);
// Detach each VBD from its VM, and then destroy it
- for (VBD vbd : vbds) {
- VBD.Record vbdr = vbd.getRecord(conn);
+ for (final VBD vbd : vbds) {
+ final VBD.Record vbdr = vbd.getRecord(conn);
if (vbdr.currentlyAttached) {
vbd.unplug(conn);
@@ -435,7 +435,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
// Update the VDI's label to be "detached"
vdi.setNameLabel(conn, "detached");
- this.hypervisorResource.umount(conn, vdi);
+ hypervisorResource.umount(conn, vdi);
}
if (cmd.isManaged()) {
@@ -443,83 +443,83 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
return new DettachAnswer(disk);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("Failed dettach volume: " + data.getPath());
return new DettachAnswer("Failed dettach volume: " + data.getPath() + ", due to " + e.toString());
}
}
- protected SR getSRByNameLabel(Connection conn, String nameLabel) throws BadServerResponse, XenAPIException, XmlRpcException {
- Set<SR> srs = SR.getByNameLabel(conn, nameLabel);
+ protected SR getSRByNameLabel(final Connection conn, final String nameLabel) throws BadServerResponse, XenAPIException, XmlRpcException {
+ final Set<SR> srs = SR.getByNameLabel(conn, nameLabel);
if (srs.size() != 1) {
throw new CloudRuntimeException("storage uuid: " + nameLabel + " is not unique");
}
- SR poolsr = srs.iterator().next();
+ final SR poolsr = srs.iterator().next();
return poolsr;
}
- protected VDI createVdi(Connection conn, String vdiName, SR sr, long size) throws BadServerResponse, XenAPIException, XmlRpcException {
- VDI.Record vdir = new VDI.Record();
+ protected VDI createVdi(final Connection conn, final String vdiName, final SR sr, final long size) throws BadServerResponse, XenAPIException, XmlRpcException {
+ final VDI.Record vdir = new VDI.Record();
vdir.nameLabel = vdiName;
vdir.SR = sr;
vdir.type = Types.VdiType.USER;
vdir.virtualSize = size;
- VDI vdi = VDI.create(conn, vdir);
+ final VDI vdi = VDI.create(conn, vdir);
return vdi;
}
- protected void deleteVDI(Connection conn, VDI vdi) throws BadServerResponse, XenAPIException, XmlRpcException {
+ protected void deleteVDI(final Connection conn, final VDI vdi) throws BadServerResponse, XenAPIException, XmlRpcException {
vdi.destroy(conn);
}
@Override
- public Answer createSnapshot(CreateObjectCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- SnapshotObjectTO snapshotTO = (SnapshotObjectTO) cmd.getData();
- long snapshotId = snapshotTO.getId();
- String snapshotName = snapshotTO.getName();
+ public Answer createSnapshot(final CreateObjectCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final SnapshotObjectTO snapshotTO = (SnapshotObjectTO) cmd.getData();
+ final long snapshotId = snapshotTO.getId();
+ final String snapshotName = snapshotTO.getName();
String details = "create snapshot operation Failed for snapshotId: " + snapshotId;
String snapshotUUID = null;
try {
- String volumeUUID = snapshotTO.getVolume().getPath();
- VDI volume = VDI.getByUuid(conn, volumeUUID);
+ final String volumeUUID = snapshotTO.getVolume().getPath();
+ final VDI volume = VDI.getByUuid(conn, volumeUUID);
- VDI snapshot = volume.snapshot(conn, new HashMap<String, String>());
+ final VDI snapshot = volume.snapshot(conn, new HashMap<String, String>());
if (snapshotName != null) {
snapshot.setNameLabel(conn, snapshotName);
}
snapshotUUID = snapshot.getUuid(conn);
- String preSnapshotUUID = snapshotTO.getParentSnapshotPath();
+ final String preSnapshotUUID = snapshotTO.getParentSnapshotPath();
//check if it is a empty snapshot
if (preSnapshotUUID != null) {
- SR sr = volume.getSR(conn);
- String srUUID = sr.getUuid(conn);
- String type = sr.getType(conn);
- Boolean isISCSI = IsISCSI(type);
- String snapshotParentUUID = getVhdParent(conn, srUUID, snapshotUUID, isISCSI);
+ final SR sr = volume.getSR(conn);
+ final String srUUID = sr.getUuid(conn);
+ final String type = sr.getType(conn);
+ final Boolean isISCSI = IsISCSI(type);
+ final String snapshotParentUUID = getVhdParent(conn, srUUID, snapshotUUID, isISCSI);
try {
- String preSnapshotParentUUID = getVhdParent(conn, srUUID, preSnapshotUUID, isISCSI);
+ final String preSnapshotParentUUID = getVhdParent(conn, srUUID, preSnapshotUUID, isISCSI);
if (snapshotParentUUID != null && snapshotParentUUID.equals(preSnapshotParentUUID)) {
// this is empty snapshot, remove it
snapshot.destroy(conn);
snapshotUUID = preSnapshotUUID;
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Failed to get parent snapshot", e);
}
}
- SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
+ final SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
newSnapshot.setPath(snapshotUUID);
return new CreateObjectAnswer(newSnapshot);
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
details += ", reason: " + e.toString();
s_logger.warn(details, e);
- } catch (Exception e) {
+ } catch (final Exception e) {
details += ", reason: " + e.toString();
s_logger.warn(details, e);
}
@@ -528,47 +528,47 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer deleteVolume(DeleteCommand cmd) {
- DataTO volume = cmd.getData();
- Connection conn = hypervisorResource.getConnection();
+ public Answer deleteVolume(final DeleteCommand cmd) {
+ final DataTO volume = cmd.getData();
+ final Connection conn = hypervisorResource.getConnection();
String errorMsg = null;
try {
- VDI vdi = VDI.getByUuid(conn, volume.getPath());
+ final VDI vdi = VDI.getByUuid(conn, volume.getPath());
deleteVDI(conn, vdi);
return new Answer(null);
- } catch (BadServerResponse e) {
+ } catch (final BadServerResponse e) {
s_logger.debug("Failed to delete volume", e);
errorMsg = e.toString();
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.debug("Failed to delete volume", e);
errorMsg = e.toString();
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
s_logger.debug("Failed to delete volume", e);
errorMsg = e.toString();
}
return new Answer(null, false, errorMsg);
}
- protected SR getNfsSR(Connection conn, StorageFilerTO pool) {
- Map<String, String> deviceConfig = new HashMap<String, String>();
+ protected SR getNfsSR(final Connection conn, final StorageFilerTO pool) {
+ final Map<String, String> deviceConfig = new HashMap<String, String>();
try {
- String server = pool.getHost();
+ final String server = pool.getHost();
String serverpath = pool.getPath();
serverpath = serverpath.replace("//", "/");
- Set<SR> srs = SR.getAll(conn);
- for (SR sr : srs) {
+ final Set<SR> srs = SR.getAll(conn);
+ for (final SR sr : srs) {
if (!SRType.NFS.equals(sr.getType(conn))) {
continue;
}
- Set<PBD> pbds = sr.getPBDs(conn);
+ final Set<PBD> pbds = sr.getPBDs(conn);
if (pbds.isEmpty()) {
continue;
}
- PBD pbd = pbds.iterator().next();
+ final PBD pbd = pbds.iterator().next();
- Map<String, String> dc = pbd.getDeviceConfig(conn);
+ final Map<String, String> dc = pbd.getDeviceConfig(conn);
if (dc == null) {
continue;
@@ -584,27 +584,27 @@ public class XenServerStorageProcessor implements StorageProcessor {
if (server.equals(dc.get("server")) && serverpath.equals(dc.get("serverpath"))) {
throw new CloudRuntimeException("There is a SR using the same configuration server:" + dc.get("server") + ", serverpath:" + dc.get("serverpath") +
- " for pool " + pool.getUuid() + "on host:" + hypervisorResource.getHost().uuid);
+ " for pool " + pool.getUuid() + "on host:" + hypervisorResource.getHost().getUuid());
}
}
deviceConfig.put("server", server);
deviceConfig.put("serverpath", serverpath);
- Host host = Host.getByUuid(conn, hypervisorResource.getHost().uuid);
- Map<String, String> smConfig = new HashMap<String, String>();
+ final Host host = Host.getByUuid(conn, hypervisorResource.getHost().getUuid());
+ final Map<String, String> smConfig = new HashMap<String, String>();
smConfig.put("nosubdir", "true");
- SR sr = SR.create(conn, host, deviceConfig, new Long(0), pool.getUuid(), Long.toString(pool.getId()), SRType.NFS.toString(), "user", true, smConfig);
+ final SR sr = SR.create(conn, host, deviceConfig, new Long(0), pool.getUuid(), Long.toString(pool.getId()), SRType.NFS.toString(), "user", true, smConfig);
sr.scan(conn);
return sr;
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
throw new CloudRuntimeException("Unable to create NFS SR " + pool.toString(), e);
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
throw new CloudRuntimeException("Unable to create NFS SR " + pool.toString(), e);
}
}
- protected Answer directDownloadHttpTemplate(CopyCommand cmd, DecodedDataObject srcObj, DecodedDataObject destObj) {
- Connection conn = hypervisorResource.getConnection();
+ protected Answer directDownloadHttpTemplate(final CopyCommand cmd, final DecodedDataObject srcObj, final DecodedDataObject destObj) {
+ final Connection conn = hypervisorResource.getConnection();
SR poolsr = null;
VDI vdi = null;
boolean result = false;
@@ -617,53 +617,53 @@ public class XenServerStorageProcessor implements StorageProcessor {
if (vdi == null) {
throw new CloudRuntimeException("can't find volume: " + destObj.getPath());
}
- String destStoreUuid = destObj.getStore().getUuid();
- Set<SR> srs = SR.getByNameLabel(conn, destStoreUuid);
+ final String destStoreUuid = destObj.getStore().getUuid();
+ final Set<SR> srs = SR.getByNameLabel(conn, destStoreUuid);
if (srs.size() != 1) {
throw new CloudRuntimeException("storage uuid: " + destStoreUuid + " is not unique");
}
poolsr = srs.iterator().next();
- VDI.Record vdir = vdi.getRecord(conn);
- String vdiLocation = vdir.location;
+ final VDI.Record vdir = vdi.getRecord(conn);
+ final String vdiLocation = vdir.location;
String pbdLocation = null;
if (destObj.getStore().getScheme().equalsIgnoreCase(DataStoreProtocol.NFS.toString())) {
pbdLocation = "/run/sr-mount/" + poolsr.getUuid(conn);
} else {
- Set<PBD> pbds = poolsr.getPBDs(conn);
+ final Set<PBD> pbds = poolsr.getPBDs(conn);
if (pbds.size() != 1) {
throw new CloudRuntimeException("Don't how to handle multiple pbds:" + pbds.size() + " for sr: " + poolsr.getUuid(conn));
}
- PBD pbd = pbds.iterator().next();
- Map<String, String> deviceCfg = pbd.getDeviceConfig(conn);
+ final PBD pbd = pbds.iterator().next();
+ final Map<String, String> deviceCfg = pbd.getDeviceConfig(conn);
pbdLocation = deviceCfg.get("location");
}
if (pbdLocation == null) {
throw new CloudRuntimeException("Can't get pbd location");
}
- String vdiPath = pbdLocation + "/" + vdiLocation + ".vhd";
+ final String vdiPath = pbdLocation + "/" + vdiLocation + ".vhd";
//download a url into vdipath
//downloadHttpToLocalFile(vdiPath, template.getPath());
hypervisorResource.callHostPlugin(conn, "storagePlugin", "downloadTemplateFromUrl", "destPath", vdiPath, "srcUrl", srcObj.getPath());
result = true;
//return new CopyCmdAnswer(cmd, vdi.getUuid(conn));
- } catch (BadServerResponse e) {
+ } catch (final BadServerResponse e) {
s_logger.debug("Failed to download template", e);
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.debug("Failed to download template", e);
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
s_logger.debug("Failed to download template", e);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Failed to download template", e);
} finally {
if (!result && vdi != null) {
try {
vdi.destroy(conn);
- } catch (BadServerResponse e) {
+ } catch (final BadServerResponse e) {
s_logger.debug("Failed to cleanup newly created vdi");
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
s_logger.debug("Failed to cleanup newly created vdi");
- } catch (XmlRpcException e) {
+ } catch (final XmlRpcException e) {
s_logger.debug("Failed to cleanup newly created vdi");
}
}
@@ -671,61 +671,61 @@ public class XenServerStorageProcessor implements StorageProcessor {
return new Answer(cmd, false, "Failed to download template");
}
- protected Answer execute(AttachPrimaryDataStoreCmd cmd) {
- String dataStoreUri = cmd.getDataStore();
- Connection conn = hypervisorResource.getConnection();
+ protected Answer execute(final AttachPrimaryDataStoreCmd cmd) {
+ final String dataStoreUri = cmd.getDataStore();
+ final Connection conn = hypervisorResource.getConnection();
try {
- DecodedDataObject obj = Decoder.decode(dataStoreUri);
+ final DecodedDataObject obj = Decoder.decode(dataStoreUri);
- DecodedDataStore store = obj.getStore();
+ final DecodedDataStore store = obj.getStore();
- SR sr = hypervisorResource.getStorageRepository(conn, store.getUuid());
+ final SR sr = hypervisorResource.getStorageRepository(conn, store.getUuid());
hypervisorResource.setupHeartbeatSr(conn, sr, false);
- long capacity = sr.getPhysicalSize(conn);
- long available = capacity - sr.getPhysicalUtilisation(conn);
+ final long capacity = sr.getPhysicalSize(conn);
+ final long available = capacity - sr.getPhysicalUtilisation(conn);
if (capacity == -1) {
- String msg = "Pool capacity is -1! pool: ";
+ final String msg = "Pool capacity is -1! pool: ";
s_logger.warn(msg);
return new Answer(cmd, false, msg);
}
- AttachPrimaryDataStoreAnswer answer = new AttachPrimaryDataStoreAnswer(cmd);
+ final AttachPrimaryDataStoreAnswer answer = new AttachPrimaryDataStoreAnswer(cmd);
answer.setCapacity(capacity);
answer.setUuid(sr.getUuid(conn));
answer.setAvailable(available);
return answer;
- } catch (XenAPIException e) {
- String msg = "AttachPrimaryDataStoreCmd add XenAPIException:" + e.toString();
+ } catch (final XenAPIException e) {
+ final String msg = "AttachPrimaryDataStoreCmd add XenAPIException:" + e.toString();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
- } catch (Exception e) {
- String msg = "AttachPrimaryDataStoreCmd failed:" + e.getMessage();
+ } catch (final Exception e) {
+ final String msg = "AttachPrimaryDataStoreCmd failed:" + e.getMessage();
s_logger.warn(msg, e);
return new Answer(cmd, false, msg);
}
}
- protected boolean IsISCSI(String type) {
+ protected boolean IsISCSI(final String type) {
return SRType.LVMOHBA.equals(type) || SRType.LVMOISCSI.equals(type) || SRType.LVM.equals(type);
}
- private String copy_vhd_from_secondarystorage(Connection conn, String mountpoint, String sruuid, int wait) {
- String nameLabel = "cloud-" + UUID.randomUUID().toString();
- String results =
+ private String copy_vhd_from_secondarystorage(final Connection conn, final String mountpoint, final String sruuid, final int wait) {
+ final String nameLabel = "cloud-" + UUID.randomUUID().toString();
+ final String results =
hypervisorResource.callHostPluginAsync(conn, "vmopspremium", "copy_vhd_from_secondarystorage", wait, "mountpoint", mountpoint, "sruuid", sruuid, "namelabel",
nameLabel);
String errMsg = null;
if (results == null || results.isEmpty()) {
errMsg = "copy_vhd_from_secondarystorage return null";
} else {
- String[] tmp = results.split("#");
- String status = tmp[0];
+ final String[] tmp = results.split("#");
+ final String status = tmp[0];
if (status.equals("0")) {
return tmp[1];
} else {
errMsg = tmp[1];
}
}
- String source = mountpoint.substring(mountpoint.lastIndexOf('/') + 1);
+ final String source = mountpoint.substring(mountpoint.lastIndexOf('/') + 1);
if (hypervisorResource.killCopyProcess(conn, source)) {
destroyVDIbyNameLabel(conn, nameLabel);
}
@@ -733,35 +733,35 @@ public class XenServerStorageProcessor implements StorageProcessor {
throw new CloudRuntimeException(errMsg);
}
- private void destroyVDIbyNameLabel(Connection conn, String nameLabel) {
+ private void destroyVDIbyNameLabel(final Connection conn, final String nameLabel) {
try {
- Set<VDI> vdis = VDI.getByNameLabel(conn, nameLabel);
+ final Set<VDI> vdis = VDI.getByNameLabel(conn, nameLabel);
if (vdis.size() != 1) {
s_logger.warn("destoryVDIbyNameLabel failed due to there are " + vdis.size() + " VDIs with name " + nameLabel);
return;
}
- for (VDI vdi : vdis) {
+ for (final VDI vdi : vdis) {
try {
vdi.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
}
}
- protected VDI getVDIbyUuid(Connection conn, String uuid) {
+ protected VDI getVDIbyUuid(final Connection conn, final String uuid) {
try {
return VDI.getByUuid(conn, uuid);
- } catch (Exception e) {
- String msg = "Catch Exception " + e.getClass().getName() + " :VDI getByUuid for uuid: " + uuid + " failed due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + " :VDI getByUuid for uuid: " + uuid + " failed due to " + e.toString();
s_logger.debug(msg);
throw new CloudRuntimeException(msg, e);
}
}
- protected String getVhdParent(Connection conn, String primaryStorageSRUuid, String snapshotUuid, Boolean isISCSI) {
- String parentUuid =
+ protected String getVhdParent(final Connection conn, final String primaryStorageSRUuid, final String snapshotUuid, final Boolean isISCSI) {
+ final String parentUuid =
hypervisorResource.callHostPlugin(conn, "vmopsSnapshot", "getVhdParent", "primaryStorageSRUuid", primaryStorageSRUuid, "snapshotUuid", snapshotUuid,
"isISCSI", isISCSI.toString());
@@ -774,20 +774,20 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) {
- DataTO srcDataTo = cmd.getSrcTO();
- DataTO destDataTo = cmd.getDestTO();
- int wait = cmd.getWait();
- DataStoreTO srcDataStoreTo = srcDataTo.getDataStore();
+ public Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) {
+ final DataTO srcDataTo = cmd.getSrcTO();
+ final DataTO destDataTo = cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final DataStoreTO srcDataStoreTo = srcDataTo.getDataStore();
try {
- if ((srcDataStoreTo instanceof NfsTO) && (srcDataTo.getObjectType() == DataObjectType.TEMPLATE)) {
- NfsTO srcImageStore = (NfsTO) srcDataStoreTo;
- TemplateObjectTO srcTemplateObjectTo = (TemplateObjectTO) srcDataTo;
- String storeUrl = srcImageStore.getUrl();
- URI uri = new URI(storeUrl);
- String tmplPath = uri.getHost() + ":" + uri.getPath() + "/" + srcDataTo.getPath();
- DataStoreTO destDataStoreTo = destDataTo.getDataStore();
+ if (srcDataStoreTo instanceof NfsTO && srcDataTo.getObjectType() == DataObjectType.TEMPLATE) {
+ final NfsTO srcImageStore = (NfsTO) srcDataStoreTo;
+ final TemplateObjectTO srcTemplateObjectTo = (TemplateObjectTO) srcDataTo;
+ final String storeUrl = srcImageStore.getUrl();
+ final URI uri = new URI(storeUrl);
+ final String tmplPath = uri.getHost() + ":" + uri.getPath() + "/" + srcDataTo.getPath();
+ final DataStoreTO destDataStoreTo = destDataTo.getDataStore();
boolean managed = false;
String storageHost = null;
@@ -798,9 +798,9 @@ public class XenServerStorageProcessor implements StorageProcessor {
String chapInitiatorSecret = null;
if (destDataStoreTo instanceof PrimaryDataStoreTO) {
- PrimaryDataStoreTO destPrimaryDataStoreTo = (PrimaryDataStoreTO)destDataStoreTo;
+ final PrimaryDataStoreTO destPrimaryDataStoreTo = (PrimaryDataStoreTO)destDataStoreTo;
- Map<String, String> details = destPrimaryDataStoreTo.getDetails();
+ final Map<String, String> details = destPrimaryDataStoreTo.getDetails();
if (details != null) {
managed = Boolean.parseBoolean(details.get(PrimaryDataStoreTO.MANAGED));
@@ -816,12 +816,12 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
}
- Connection conn = hypervisorResource.getConnection();
+ final Connection conn = hypervisorResource.getConnection();
final SR sr;
if (managed) {
- Map<String, String> details = new HashMap<String, String>();
+ final Map<String, String> details = new HashMap<String, String>();
details.put(DiskTO.STORAGE_HOST, storageHost);
details.put(DiskTO.IQN, managedStoragePoolName);
@@ -831,11 +831,11 @@ public class XenServerStorageProcessor implements StorageProcessor {
sr = hypervisorResource.prepareManagedSr(conn, details);
} else {
- String srName = destDataStoreTo.getUuid();
- Set<SR> srs = SR.getByNameLabel(conn, srName);
+ final String srName = destDataStoreTo.getUuid();
+ final Set<SR> srs = SR.getByNameLabel(conn, srName);
if (srs.size() != 1) {
- String msg = "There are " + srs.size() + " SRs with same name: " + srName;
+ final String msg = "There are " + srs.size() + " SRs with same name: " + srName;
s_logger.warn(msg);
@@ -845,19 +845,19 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
}
- String srUuid = sr.getUuid(conn);
- String tmplUuid = copy_vhd_from_secondarystorage(conn, tmplPath, srUuid, wait);
- VDI tmplVdi = getVDIbyUuid(conn, tmplUuid);
+ final String srUuid = sr.getUuid(conn);
+ final String tmplUuid = copy_vhd_from_secondarystorage(conn, tmplPath, srUuid, wait);
+ final VDI tmplVdi = getVDIbyUuid(conn, tmplUuid);
final String uuidToReturn;
- Long physicalSize = tmplVdi.getPhysicalUtilisation(conn);
+ final Long physicalSize = tmplVdi.getPhysicalUtilisation(conn);
if (managed) {
uuidToReturn = tmplUuid;
tmplVdi.setNameLabel(conn, managedStoragePoolRootVolumeName);
} else {
- VDI snapshotVdi = tmplVdi.snapshot(conn, new HashMap<String, String>());
+ final VDI snapshotVdi = tmplVdi.snapshot(conn, new HashMap<String, String>());
uuidToReturn = snapshotVdi.getUuid(conn);
@@ -870,10 +870,10 @@ public class XenServerStorageProcessor implements StorageProcessor {
try {
Thread.sleep(5000);
- } catch (InterruptedException e) {
+ } catch (final InterruptedException e) {
}
- TemplateObjectTO newVol = new TemplateObjectTO();
+ final TemplateObjectTO newVol = new TemplateObjectTO();
newVol.setUuid(uuidToReturn);
newVol.setPath(uuidToReturn);
@@ -884,8 +884,8 @@ public class XenServerStorageProcessor implements StorageProcessor {
return new CopyCmdAnswer(newVol);
}
- } catch (Exception e) {
- String msg = "Catch Exception " + e.getClass().getName() + " for template + " + " due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + " for template + " + " due to " + e.toString();
s_logger.warn(msg, e);
@@ -896,13 +896,13 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer createVolume(CreateObjectCommand cmd) {
- DataTO data = cmd.getData();
- VolumeObjectTO volume = (VolumeObjectTO) data;
+ public Answer createVolume(final CreateObjectCommand cmd) {
+ final DataTO data = cmd.getData();
+ final VolumeObjectTO volume = (VolumeObjectTO) data;
try {
- Connection conn = hypervisorResource.getConnection();
- SR poolSr = hypervisorResource.getStorageRepository(conn, data.getDataStore().getUuid());
+ final Connection conn = hypervisorResource.getConnection();
+ final SR poolSr = hypervisorResource.getStorageRepository(conn, data.getDataStore().getUuid());
VDI.Record vdir = new VDI.Record();
vdir.nameLabel = volume.getName();
vdir.SR = poolSr;
@@ -913,24 +913,24 @@ public class XenServerStorageProcessor implements StorageProcessor {
vdi = VDI.create(conn, vdir);
vdir = vdi.getRecord(conn);
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setName(vdir.nameLabel);
newVol.setSize(vdir.virtualSize);
newVol.setPath(vdir.uuid);
return new CreateObjectAnswer(newVol);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("create volume failed: " + e.toString());
return new CreateObjectAnswer(e.toString());
}
}
@Override
- public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- DataTO destData = cmd.getDestTO();
- VolumeObjectTO volume = (VolumeObjectTO) destData;
+ public Answer cloneVolumeFromBaseTemplate(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final DataTO srcData = cmd.getSrcTO();
+ final DataTO destData = cmd.getDestTO();
+ final VolumeObjectTO volume = (VolumeObjectTO) destData;
VDI vdi = null;
try {
VDI tmpltvdi = null;
@@ -943,43 +943,43 @@ public class XenServerStorageProcessor implements StorageProcessor {
vdir = vdi.getRecord(conn);
s_logger.debug("Succesfully created VDI: Uuid = " + vdir.uuid);
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setName(vdir.nameLabel);
newVol.setSize(vdir.virtualSize);
newVol.setPath(vdir.uuid);
return new CopyCmdAnswer(newVol);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("Unable to create volume; Pool=" + destData + "; Disk: ", e);
return new CopyCmdAnswer(e.toString());
}
}
@Override
- public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- DataTO destData = cmd.getDestTO();
- int wait = cmd.getWait();
- VolumeObjectTO srcVolume = (VolumeObjectTO) srcData;
- VolumeObjectTO destVolume = (VolumeObjectTO) destData;
- DataStoreTO srcStore = srcVolume.getDataStore();
+ public Answer copyVolumeFromImageCacheToPrimary(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final DataTO srcData = cmd.getSrcTO();
+ final DataTO destData = cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final VolumeObjectTO srcVolume = (VolumeObjectTO) srcData;
+ final VolumeObjectTO destVolume = (VolumeObjectTO) destData;
+ final DataStoreTO srcStore = srcVolume.getDataStore();
if (srcStore instanceof NfsTO) {
- NfsTO nfsStore = (NfsTO) srcStore;
+ final NfsTO nfsStore = (NfsTO) srcStore;
try {
- SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, destVolume.getDataStore().getUuid());
- String srUuid = primaryStoragePool.getUuid(conn);
- URI uri = new URI(nfsStore.getUrl());
- String volumePath = uri.getHost() + ":" + uri.getPath() + nfsStore.getPathSeparator() + srcVolume.getPath();
- String uuid = copy_vhd_from_secondarystorage(conn, volumePath, srUuid, wait);
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, destVolume.getDataStore().getUuid());
+ final String srUuid = primaryStoragePool.getUuid(conn);
+ final URI uri = new URI(nfsStore.getUrl());
+ final String volumePath = uri.getHost() + ":" + uri.getPath() + nfsStore.getPathSeparator() + srcVolume.getPath();
+ final String uuid = copy_vhd_from_secondarystorage(conn, volumePath, srUuid, wait);
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setPath(uuid);
newVol.setSize(srcVolume.getSize());
return new CopyCmdAnswer(newVol);
- } catch (Exception e) {
- String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
s_logger.warn(msg, e);
return new CopyCmdAnswer(e.toString());
}
@@ -990,18 +990,18 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer copyVolumeFromPrimaryToSecondary(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- VolumeObjectTO srcVolume = (VolumeObjectTO) cmd.getSrcTO();
- VolumeObjectTO destVolume = (VolumeObjectTO) cmd.getDestTO();
- int wait = cmd.getWait();
- DataStoreTO destStore = destVolume.getDataStore();
+ public Answer copyVolumeFromPrimaryToSecondary(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final VolumeObjectTO srcVolume = (VolumeObjectTO) cmd.getSrcTO();
+ final VolumeObjectTO destVolume = (VolumeObjectTO) cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final DataStoreTO destStore = destVolume.getDataStore();
if (destStore instanceof NfsTO) {
SR secondaryStorage = null;
try {
- NfsTO nfsStore = (NfsTO) destStore;
- URI uri = new URI(nfsStore.getUrl());
+ final NfsTO nfsStore = (NfsTO) destStore;
+ final URI uri = new URI(nfsStore.getUrl());
// Create the volume folder
if (!hypervisorResource.createSecondaryStorageFolder(conn, uri.getHost() + ":" + uri.getPath(), destVolume.getPath())) {
throw new InternalErrorException("Failed to create the volume folder.");
@@ -1010,16 +1010,16 @@ public class XenServerStorageProcessor implements StorageProcessor {
// Create a SR for the volume UUID folder
secondaryStorage = hypervisorResource.createNfsSRbyURI(conn, new URI(nfsStore.getUrl() + nfsStore.getPathSeparator() + destVolume.getPath()), false);
// Look up the volume on the source primary storage pool
- VDI srcVdi = getVDIbyUuid(conn, srcVolume.getPath());
+ final VDI srcVdi = getVDIbyUuid(conn, srcVolume.getPath());
// Copy the volume to secondary storage
- VDI destVdi = hypervisorResource.cloudVDIcopy(conn, srcVdi, secondaryStorage, wait);
- String destVolumeUUID = destVdi.getUuid(conn);
+ final VDI destVdi = hypervisorResource.cloudVDIcopy(conn, srcVdi, secondaryStorage, wait);
+ final String destVolumeUUID = destVdi.getUuid(conn);
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setPath(destVolume.getPath() + nfsStore.getPathSeparator() + destVolumeUUID + ".vhd");
newVol.setSize(srcVolume.getSize());
return new CopyCmdAnswer(newVol);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Failed to copy volume to secondary: " + e.toString());
return new CopyCmdAnswer("Failed to copy volume to secondary: " + e.toString());
} finally {
@@ -1029,7 +1029,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
return new CopyCmdAnswer("unsupported protocol");
}
- boolean swiftUpload(Connection conn, SwiftTO swift, String container, String ldir, String lfilename, Boolean isISCSI, int wait) {
+ boolean swiftUpload(final Connection conn, final SwiftTO swift, final String container, final String ldir, final String lfilename, final Boolean isISCSI, final int wait) {
String result = null;
try {
result =
@@ -1038,23 +1038,23 @@ public class XenServerStorageProcessor implements StorageProcessor {
if (result != null && result.equals("true")) {
return true;
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("swift upload failed due to " + e.toString(), e);
}
return false;
}
- protected String deleteSnapshotBackup(Connection conn, String localMountPoint, String path, String secondaryStorageMountPath, String backupUUID) {
+ protected String deleteSnapshotBackup(final Connection conn, final String localMountPoint, final String path, final String secondaryStorageMountPath, final String backupUUID) {
// If anybody modifies the formatting below again, I'll skin them
- String result =
+ final String result =
hypervisorResource.callHostPlugin(conn, "vmopsSnapshot", "deleteSnapshotBackup", "backupUUID", backupUUID, "path", path, "secondaryStorageMountPath",
secondaryStorageMountPath, "localMountPoint", localMountPoint);
return result;
}
- public String swiftBackupSnapshot(Connection conn, SwiftTO swift, String srUuid, String snapshotUuid, String container, Boolean isISCSI, int wait) {
+ public String swiftBackupSnapshot(final Connection conn, final SwiftTO swift, final String srUuid, final String snapshotUuid, final String container, final Boolean isISCSI, final int wait) {
String lfilename;
String ldir;
if (isISCSI) {
@@ -1069,7 +1069,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
protected String backupSnapshotToS3(final Connection connection, final S3TO s3, final String srUuid, final String folder, final String snapshotUuid,
- final Boolean iSCSIFlag, final int wait) {
+ final Boolean iSCSIFlag, final int wait) {
final String filename = iSCSIFlag ? "VHD-" + snapshotUuid : snapshotUuid + ".vhd";
final String dir = (iSCSIFlag ? "/dev/VG_XenStorage-" : "/var/run/sr-mount/") + srUuid;
@@ -1090,7 +1090,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
return null;
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error(String.format("S3 upload failed of snapshot %1$s due to %2$s.", snapshotUuid, e.toString()), e);
}
@@ -1098,8 +1098,8 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
- protected Long getSnapshotSize(Connection conn, String primaryStorageSRUuid, String snapshotUuid, Boolean isISCSI, int wait) {
- String physicalSize = hypervisorResource.callHostPluginAsync(conn, "vmopsSnapshot", "getSnapshotSize", wait,
+ protected Long getSnapshotSize(final Connection conn, final String primaryStorageSRUuid, final String snapshotUuid, final Boolean isISCSI, final int wait) {
+ final String physicalSize = hypervisorResource.callHostPluginAsync(conn, "vmopsSnapshot", "getSnapshotSize", wait,
"primaryStorageSRUuid", primaryStorageSRUuid, "snapshotUuid", snapshotUuid, "isISCSI", isISCSI.toString());
if (physicalSize == null || physicalSize.isEmpty()) {
return (long) 0;
@@ -1108,8 +1108,8 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
}
- protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, String localMountPoint, String path, String secondaryStorageMountPath,
- String snapshotUuid, String prevBackupUuid, Boolean isISCSI, int wait) {
+ protected String backupSnapshot(final Connection conn, final String primaryStorageSRUuid, final String localMountPoint, final String path, final String secondaryStorageMountPath,
+ final String snapshotUuid, String prevBackupUuid, final Boolean isISCSI, final int wait) {
String backupSnapshotUuid = null;
if (prevBackupUuid == null) {
@@ -1118,8 +1118,8 @@ public class XenServerStorageProcessor implements StorageProcessor {
// Each argument is put in a separate line for readability.
// Using more lines does not harm the environment.
- String backupUuid = UUID.randomUUID().toString();
- String results =
+ final String backupUuid = UUID.randomUUID().toString();
+ final String results =
hypervisorResource.callHostPluginAsync(conn, "vmopsSnapshot", "backupSnapshot", wait, "primaryStorageSRUuid", primaryStorageSRUuid, "path", path,
"secondaryStorageMountPath", secondaryStorageMountPath, "snapshotUuid", snapshotUuid, "prevBackupUuid", prevBackupUuid, "backupUuid", backupUuid,
"isISCSI", isISCSI.toString(), "localMountPoint", localMountPoint);
@@ -1130,8 +1130,8 @@ public class XenServerStorageProcessor implements StorageProcessor {
secondaryStorageMountPath + " due to null";
} else {
- String[] tmp = results.split("#");
- String status = tmp[0];
+ final String[] tmp = results.split("#");
+ final String status = tmp[0];
backupSnapshotUuid = tmp[1];
// status == "1" if and only if backupSnapshotUuid != null
// So we don't rely on status value but return backupSnapshotUuid as an
@@ -1145,45 +1145,45 @@ public class XenServerStorageProcessor implements StorageProcessor {
secondaryStorageMountPath + " due to " + tmp[1];
}
}
- String source = backupUuid + ".vhd";
+ final String source = backupUuid + ".vhd";
hypervisorResource.killCopyProcess(conn, source);
s_logger.warn(errMsg);
throw new CloudRuntimeException(errMsg);
}
- protected boolean destroySnapshotOnPrimaryStorageExceptThis(Connection conn, String volumeUuid, String avoidSnapshotUuid) {
+ protected boolean destroySnapshotOnPrimaryStorageExceptThis(final Connection conn, final String volumeUuid, final String avoidSnapshotUuid) {
try {
- VDI volume = getVDIbyUuid(conn, volumeUuid);
+ final VDI volume = getVDIbyUuid(conn, volumeUuid);
if (volume == null) {
throw new InternalErrorException("Could not destroy snapshot on volume " + volumeUuid + " due to can not find it");
}
- Set<VDI> snapshots = volume.getSnapshots(conn);
- for (VDI snapshot : snapshots) {
+ final Set<VDI> snapshots = volume.getSnapshots(conn);
+ for (final VDI snapshot : snapshots) {
try {
if (!snapshot.getUuid(conn).equals(avoidSnapshotUuid)) {
snapshot.destroy(conn);
}
- } catch (Exception e) {
- String msg = "Destroying snapshot: " + snapshot + " on primary storage failed due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Destroying snapshot: " + snapshot + " on primary storage failed due to " + e.toString();
s_logger.warn(msg, e);
}
}
s_logger.debug("Successfully destroyed snapshot on volume: " + volumeUuid + " execept this current snapshot " + avoidSnapshotUuid);
return true;
- } catch (XenAPIException e) {
- String msg = "Destroying snapshot on volume: " + volumeUuid + " execept this current snapshot " + avoidSnapshotUuid + " failed due to " + e.toString();
+ } catch (final XenAPIException e) {
+ final String msg = "Destroying snapshot on volume: " + volumeUuid + " execept this current snapshot " + avoidSnapshotUuid + " failed due to " + e.toString();
s_logger.error(msg, e);
- } catch (Exception e) {
- String msg = "Destroying snapshot on volume: " + volumeUuid + " execept this current snapshot " + avoidSnapshotUuid + " failed due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Destroying snapshot on volume: " + volumeUuid + " execept this current snapshot " + avoidSnapshotUuid + " failed due to " + e.toString();
s_logger.warn(msg, e);
}
return false;
}
- private boolean destroySnapshotOnPrimaryStorage(Connection conn, String lastSnapshotUuid) {
+ private boolean destroySnapshotOnPrimaryStorage(final Connection conn, final String lastSnapshotUuid) {
try {
- VDI snapshot = getVDIbyUuid(conn, lastSnapshotUuid);
+ final VDI snapshot = getVDIbyUuid(conn, lastSnapshotUuid);
if (snapshot == null) {
// since this is just used to cleanup leftover bad snapshots, no need to throw exception
s_logger.warn("Could not destroy snapshot " + lastSnapshotUuid + " due to can not find it");
@@ -1191,24 +1191,24 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
snapshot.destroy(conn);
return true;
- } catch (XenAPIException e) {
- String msg = "Destroying snapshot: " + lastSnapshotUuid + " failed due to " + e.toString();
+ } catch (final XenAPIException e) {
+ final String msg = "Destroying snapshot: " + lastSnapshotUuid + " failed due to " + e.toString();
s_logger.error(msg, e);
- } catch (Exception e) {
- String msg = "Destroying snapshot: " + lastSnapshotUuid + " failed due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Destroying snapshot: " + lastSnapshotUuid + " failed due to " + e.toString();
s_logger.warn(msg, e);
}
return false;
}
@Override
- public Answer backupSnapshot(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- DataTO cacheData = cmd.getCacheTO();
- DataTO destData = cmd.getDestTO();
- int wait = cmd.getWait();
- String primaryStorageNameLabel = srcData.getDataStore().getUuid();
+ public Answer backupSnapshot(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final DataTO srcData = cmd.getSrcTO();
+ final DataTO cacheData = cmd.getCacheTO();
+ final DataTO destData = cmd.getDestTO();
+ final int wait = cmd.getWait();
+ final String primaryStorageNameLabel = srcData.getDataStore().getUuid();
String secondaryStorageUrl = null;
NfsTO cacheStore = null;
String destPath = null;
@@ -1222,58 +1222,58 @@ public class XenServerStorageProcessor implements StorageProcessor {
destPath = destData.getPath();
}
- SnapshotObjectTO snapshotTO = (SnapshotObjectTO) srcData;
- SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO) destData;
- String snapshotUuid = snapshotTO.getPath();
- String volumeUuid = snapshotTO.getVolume().getPath();
+ final SnapshotObjectTO snapshotTO = (SnapshotObjectTO) srcData;
+ final SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO) destData;
+ final String snapshotUuid = snapshotTO.getPath();
+ final String volumeUuid = snapshotTO.getVolume().getPath();
- String prevBackupUuid = snapshotOnImage.getParentSnapshotPath();
- String prevSnapshotUuid = snapshotTO.getParentSnapshotPath();
+ final String prevBackupUuid = snapshotOnImage.getParentSnapshotPath();
+ final String prevSnapshotUuid = snapshotTO.getParentSnapshotPath();
// By default assume failure
String details = null;
String snapshotBackupUuid = null;
Long physicalSize = null;
- Map<String, String> options = cmd.getOptions();
+ final Map<String, String> options = cmd.getOptions();
boolean fullbackup = Boolean.parseBoolean(options.get("fullSnapshot"));
boolean result = false;
try {
- SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
+ final SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
if (primaryStorageSR == null) {
throw new InternalErrorException("Could not backup snapshot because the primary Storage SR could not be created from the name label: " +
primaryStorageNameLabel);
}
- String psUuid = primaryStorageSR.getUuid(conn);
- Boolean isISCSI = IsISCSI(primaryStorageSR.getType(conn));
+ final String psUuid = primaryStorageSR.getUuid(conn);
+ final Boolean isISCSI = IsISCSI(primaryStorageSR.getType(conn));
- VDI snapshotVdi = getVDIbyUuid(conn, snapshotUuid);
+ final VDI snapshotVdi = getVDIbyUuid(conn, snapshotUuid);
String snapshotPaUuid = null;
if (prevSnapshotUuid != null && !fullbackup) {
try {
snapshotPaUuid = getVhdParent(conn, psUuid, snapshotUuid, isISCSI);
if (snapshotPaUuid != null) {
- String snashotPaPaPaUuid = getVhdParent(conn, psUuid, snapshotPaUuid, isISCSI);
- String prevSnashotPaUuid = getVhdParent(conn, psUuid, prevSnapshotUuid, isISCSI);
+ final String snashotPaPaPaUuid = getVhdParent(conn, psUuid, snapshotPaUuid, isISCSI);
+ final String prevSnashotPaUuid = getVhdParent(conn, psUuid, prevSnapshotUuid, isISCSI);
if (snashotPaPaPaUuid != null && prevSnashotPaUuid != null && prevSnashotPaUuid.equals(snashotPaPaPaUuid)) {
fullbackup = false;
} else {
fullbackup = true;
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Failed to get parent snapshots, take full snapshot", e);
fullbackup = true;
}
}
- URI uri = new URI(secondaryStorageUrl);
- String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
- DataStoreTO destStore = destData.getDataStore();
- String folder = destPath;
+ final URI uri = new URI(secondaryStorageUrl);
+ final String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
+ final DataStoreTO destStore = destData.getDataStore();
+ final String folder = destPath;
String finalPath = null;
- String localMountPoint = BaseMountPointOnHost + File.separator + UUID.nameUUIDFromBytes(secondaryStorageUrl.getBytes()).toString();
+ final String localMountPoint = BaseMountPointOnHost + File.separator + UUID.nameUUIDFromBytes(secondaryStorageUrl.getBytes()).toString();
if (fullbackup) {
// the first snapshot is always a full snapshot
@@ -1282,25 +1282,25 @@ public class XenServerStorageProcessor implements StorageProcessor {
s_logger.warn(details);
return new CopyCmdAnswer(details);
}
- String snapshotMountpoint = secondaryStorageUrl + "/" + folder;
+ final String snapshotMountpoint = secondaryStorageUrl + "/" + folder;
SR snapshotSr = null;
try {
snapshotSr = hypervisorResource.createNfsSRbyURI(conn, new URI(snapshotMountpoint), false);
- VDI backedVdi = hypervisorResource.cloudVDIcopy(conn, snapshotVdi, snapshotSr, wait);
+ final VDI backedVdi = hypervisorResource.cloudVDIcopy(conn, snapshotVdi, snapshotSr, wait);
snapshotBackupUuid = backedVdi.getUuid(conn);
- String primarySRuuid = snapshotSr.getUuid(conn);
+ final String primarySRuuid = snapshotSr.getUuid(conn);
physicalSize = getSnapshotSize(conn, primarySRuuid, snapshotBackupUuid, isISCSI, wait);
if (destStore instanceof SwiftTO) {
try {
- String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
- String destSnapshotName = swiftBackupSnapshot(conn, (SwiftTO) destStore, snapshotSr.getUuid(conn), snapshotBackupUuid, container, false, wait);
- String swiftPath = container + File.separator + destSnapshotName;
+ final String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
+ final String destSnapshotName = swiftBackupSnapshot(conn, (SwiftTO) destStore, snapshotSr.getUuid(conn), snapshotBackupUuid, container, false, wait);
+ final String swiftPath = container + File.separator + destSnapshotName;
finalPath = swiftPath;
} finally {
try {
deleteSnapshotBackup(conn, localMountPoint, folder, secondaryStorageMountPath, snapshotBackupUuid);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Failed to delete snapshot on cache storages", e);
}
}
@@ -1314,7 +1314,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
} finally {
try {
deleteSnapshotBackup(conn, localMountPoint, folder, secondaryStorageMountPath, snapshotBackupUuid);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Failed to delete snapshot on cache storages", e);
}
}
@@ -1329,9 +1329,9 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
}
} else {
- String primaryStorageSRUuid = primaryStorageSR.getUuid(conn);
+ final String primaryStorageSRUuid = primaryStorageSR.getUuid(conn);
if (destStore instanceof SwiftTO) {
- String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
+ final String container = "S-" + snapshotTO.getVolume().getVolumeId().toString();
snapshotBackupUuid =
swiftBackupSnapshot(conn, (SwiftTO) destStore, primaryStorageSRUuid, snapshotPaUuid, "S-" + snapshotTO.getVolume().getVolumeId().toString(),
isISCSI, wait);
@@ -1342,10 +1342,10 @@ public class XenServerStorageProcessor implements StorageProcessor {
throw new CloudRuntimeException("S3 upload of snapshots " + snapshotPaUuid + " failed");
}
} else {
- String results =
+ final String results =
backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder, secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI, wait);
- String[] tmp = results.split("#");
+ final String[] tmp = results.split("#");
snapshotBackupUuid = tmp[1];
physicalSize = Long.parseLong(tmp[2]);
finalPath = folder + cacheStore.getPathSeparator() + snapshotBackupUuid;
@@ -1354,7 +1354,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
// delete primary snapshots with only the last one left
destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid);
- SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
+ final SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
newSnapshot.setPath(finalPath);
newSnapshot.setPhysicalSize(physicalSize);
if (fullbackup) {
@@ -1364,10 +1364,10 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
result = true;
return new CopyCmdAnswer(newSnapshot);
- } catch (XenAPIException e) {
+ } catch (final XenAPIException e) {
details = "BackupSnapshot Failed due to " + e.toString();
s_logger.warn(details, e);
- } catch (Exception e) {
+ } catch (final Exception e) {
details = "BackupSnapshot Failed due to " + e.getMessage();
s_logger.warn(details, e);
} finally {
@@ -1375,7 +1375,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
// remove last bad primary snapshot when exception happens
try {
destroySnapshotOnPrimaryStorage(conn, snapshotUuid);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("clean up snapshot failed", e);
}
}
@@ -1385,17 +1385,17 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer createTemplateFromVolume(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- VolumeObjectTO volume = (VolumeObjectTO) cmd.getSrcTO();
- TemplateObjectTO template = (TemplateObjectTO) cmd.getDestTO();
- NfsTO destStore = (NfsTO) cmd.getDestTO().getDataStore();
- int wait = cmd.getWait();
+ public Answer createTemplateFromVolume(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final VolumeObjectTO volume = (VolumeObjectTO) cmd.getSrcTO();
+ final TemplateObjectTO template = (TemplateObjectTO) cmd.getDestTO();
+ final NfsTO destStore = (NfsTO) cmd.getDestTO().getDataStore();
+ final int wait = cmd.getWait();
- String secondaryStoragePoolURL = destStore.getUrl();
- String volumeUUID = volume.getPath();
+ final String secondaryStoragePoolURL = destStore.getUrl();
+ final String volumeUUID = volume.getPath();
- String userSpecifiedName = template.getName();
+ final String userSpecifiedName = template.getName();
String details = null;
SR tmpltSR = null;
@@ -1403,7 +1403,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
String secondaryStorageMountPath = null;
String installPath = null;
try {
- URI uri = new URI(secondaryStoragePoolURL);
+ final URI uri = new URI(secondaryStoragePoolURL);
secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
installPath = template.getPath();
if (!hypervisorResource.createSecondaryStorageFolder(conn, secondaryStorageMountPath, installPath)) {
@@ -1412,25 +1412,25 @@ public class XenServerStorageProcessor implements StorageProcessor {
return new CopyCmdAnswer(details);
}
- VDI vol = getVDIbyUuid(conn, volumeUUID);
+ final VDI vol = getVDIbyUuid(conn, volumeUUID);
// create template SR
- URI tmpltURI = new URI(secondaryStoragePoolURL + "/" + installPath);
+ final URI tmpltURI = new URI(secondaryStoragePoolURL + "/" + installPath);
tmpltSR = hypervisorResource.createNfsSRbyURI(conn, tmpltURI, false);
// copy volume to template SR
- VDI tmpltVDI = hypervisorResource.cloudVDIcopy(conn, vol, tmpltSR, wait);
+ final VDI tmpltVDI = hypervisorResource.cloudVDIcopy(conn, vol, tmpltSR, wait);
// scan makes XenServer pick up VDI physicalSize
tmpltSR.scan(conn);
if (userSpecifiedName != null) {
tmpltVDI.setNameLabel(conn, userSpecifiedName);
}
- String tmpltUUID = tmpltVDI.getUuid(conn);
- String tmpltFilename = tmpltUUID + ".vhd";
- long virtualSize = tmpltVDI.getVirtualSize(conn);
- long physicalSize = tmpltVDI.getPhysicalUtilisation(conn);
+ final String tmpltUUID = tmpltVDI.getUuid(conn);
+ final String tmpltFilename = tmpltUUID + ".vhd";
+ final long virtualSize = tmpltVDI.getVirtualSize(conn);
+ final long physicalSize = tmpltVDI.getPhysicalUtilisation(conn);
// create the template.properties file
- String templatePath = secondaryStorageMountPath + "/" + installPath;
+ final String templatePath = secondaryStorageMountPath + "/" + installPath;
result =
hypervisorResource.postCreatePrivateTemplate(conn, templatePath, tmpltFilename, tmpltUUID, userSpecifiedName, null, physicalSize, virtualSize,
template.getId());
@@ -1440,15 +1440,15 @@ public class XenServerStorageProcessor implements StorageProcessor {
installPath = installPath + "/" + tmpltFilename;
hypervisorResource.removeSR(conn, tmpltSR);
tmpltSR = null;
- TemplateObjectTO newTemplate = new TemplateObjectTO();
+ final TemplateObjectTO newTemplate = new TemplateObjectTO();
newTemplate.setPath(installPath);
newTemplate.setFormat(ImageFormat.VHD);
newTemplate.setSize(virtualSize);
newTemplate.setPhysicalSize(physicalSize);
newTemplate.setName(tmpltUUID);
- CopyCmdAnswer answer = new CopyCmdAnswer(newTemplate);
+ final CopyCmdAnswer answer = new CopyCmdAnswer(newTemplate);
return answer;
- } catch (Exception e) {
+ } catch (final Exception e) {
if (tmpltSR != null) {
hypervisorResource.removeSR(conn, tmpltSR);
}
@@ -1462,17 +1462,17 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer createTemplateFromSnapshot(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
+ public Answer createTemplateFromSnapshot(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
- SnapshotObjectTO snapshotObjTO = (SnapshotObjectTO)cmd.getSrcTO();
- TemplateObjectTO templateObjTO = (TemplateObjectTO)cmd.getDestTO();
+ final SnapshotObjectTO snapshotObjTO = (SnapshotObjectTO)cmd.getSrcTO();
+ final TemplateObjectTO templateObjTO = (TemplateObjectTO)cmd.getDestTO();
if (!(snapshotObjTO.getDataStore() instanceof PrimaryDataStoreTO) || !(templateObjTO.getDataStore() instanceof NfsTO)) {
return null;
}
- String userSpecifiedTemplateName = templateObjTO.getName();
+ final String userSpecifiedTemplateName = templateObjTO.getName();
NfsTO destStore = null;
URI destUri = null;
@@ -1481,7 +1481,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
destStore = (NfsTO)templateObjTO.getDataStore();
destUri = new URI(destStore.getUrl());
- } catch (Exception ex) {
+ } catch (final Exception ex) {
s_logger.debug("Invalid URI", ex);
return new CopyCmdAnswer("Invalid URI: " + ex.toString());
@@ -1490,37 +1490,37 @@ public class XenServerStorageProcessor implements StorageProcessor {
SR srcSr = null;
SR destSr = null;
- String destDir = templateObjTO.getPath();
+ final String destDir = templateObjTO.getPath();
VDI destVdi = null;
boolean result = false;
try {
- Map<String, String> srcDetails = cmd.getOptions();
+ final Map<String, String> srcDetails = cmd.getOptions();
- String iScsiName = srcDetails.get(DiskTO.IQN);
- String storageHost = srcDetails.get(DiskTO.STORAGE_HOST);
- String chapInitiatorUsername = srcDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
- String chapInitiatorSecret = srcDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
+ final String iScsiName = srcDetails.get(DiskTO.IQN);
+ final String storageHost = srcDetails.get(DiskTO.STORAGE_HOST);
+ final String chapInitiatorUsername = srcDetails.get(DiskTO.CHAP_INITIATOR_USERNAME);
+ final String chapInitiatorSecret = srcDetails.get(DiskTO.CHAP_INITIATOR_SECRET);
srcSr = hypervisorResource.getIscsiSR(conn, iScsiName, storageHost, iScsiName, chapInitiatorUsername, chapInitiatorSecret, true);
- String destNfsPath = destUri.getHost() + ":" + destUri.getPath();
+ final String destNfsPath = destUri.getHost() + ":" + destUri.getPath();
if (!hypervisorResource.createSecondaryStorageFolder(conn, destNfsPath, destDir)) {
- String details = " Failed to create folder " + destDir + " in secondary storage";
+ final String details = " Failed to create folder " + destDir + " in secondary storage";
s_logger.warn(details);
return new CopyCmdAnswer(details);
}
- URI templateUri = new URI(destStore.getUrl() + "/" + destDir);
+ final URI templateUri = new URI(destStore.getUrl() + "/" + destDir);
destSr = hypervisorResource.createNfsSRbyURI(conn, templateUri, false);
// there should only be one VDI in this SR
- VDI srcVdi = srcSr.getVDIs(conn).iterator().next();
+ final VDI srcVdi = srcSr.getVDIs(conn).iterator().next();
destVdi = srcVdi.copy(conn, destSr);
@@ -1531,10 +1531,10 @@ public class XenServerStorageProcessor implements StorageProcessor {
destVdi.setNameLabel(conn, userSpecifiedTemplateName);
}
- String templateUuid = destVdi.getUuid(conn);
- String templateFilename = templateUuid + ".vhd";
- long virtualSize = destVdi.getVirtualSize(conn);
- long physicalSize = destVdi.getPhysicalUtilisation(conn);
+ final String templateUuid = destVdi.getUuid(conn);
+ final String templateFilename = templateUuid + ".vhd";
+ final long virtualSize = destVdi.getVirtualSize(conn);
+ final long physicalSize = destVdi.getPhysicalUtilisation(conn);
// create the template.properties file
String templatePath = destNfsPath + "/" + destDir;
@@ -1548,7 +1548,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
throw new CloudRuntimeException("Could not create the template.properties file on secondary storage dir: " + templateUri);
}
- TemplateObjectTO newTemplate = new TemplateObjectTO();
+ final TemplateObjectTO newTemplate = new TemplateObjectTO();
newTemplate.setPath(destDir + "/" + templateFilename);
newTemplate.setFormat(Storage.ImageFormat.VHD);
@@ -1560,7 +1560,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
result = true;
return new CopyCmdAnswer(newTemplate);
- } catch (Exception ex) {
+ } catch (final Exception ex) {
s_logger.error("Failed to create a template from a snapshot", ex);
return new CopyCmdAnswer("Failed to create a template from a snapshot: " + ex.toString());
@@ -1569,7 +1569,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
if (destVdi != null) {
try {
destVdi.destroy(conn);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("Cleaned up leftover VDI on destination storage due to failure: ", e);
}
}
@@ -1586,12 +1586,12 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer createVolumeFromSnapshot(CopyCommand cmd) {
- Connection conn = hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- SnapshotObjectTO snapshot = (SnapshotObjectTO) srcData;
- DataTO destData = cmd.getDestTO();
- DataStoreTO imageStore = srcData.getDataStore();
+ public Answer createVolumeFromSnapshot(final CopyCommand cmd) {
+ final Connection conn = hypervisorResource.getConnection();
+ final DataTO srcData = cmd.getSrcTO();
+ final SnapshotObjectTO snapshot = (SnapshotObjectTO) srcData;
+ final DataTO destData = cmd.getDestTO();
+ final DataStoreTO imageStore = srcData.getDataStore();
if (srcData.getDataStore() instanceof PrimaryDataStoreTO && destData.getDataStore() instanceof PrimaryDataStoreTO) {
return createVolumeFromSnapshot2(cmd);
@@ -1601,10 +1601,10 @@ public class XenServerStorageProcessor implements StorageProcessor {
return new CopyCmdAnswer("unsupported protocol");
}
- NfsTO nfsImageStore = (NfsTO) imageStore;
<TRUNCATED>
[25/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring CheckSshCommand, OvsFetchInterfaceCommand and SecurityGroupRulesCommand to cope with new design.
- Unit Tests added
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/30b770ae
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/30b770ae
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/30b770ae
Branch: refs/heads/master
Commit: 30b770aeab9c1efeaf84c4f5274ab2cb044a896c
Parents: 74faf73
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Thu Mar 26 16:52:00 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:30 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 95 +++-----------------
.../xenserver/resource/XsLocalNetwork.java | 91 +++++++++++++++++++
.../wrapper/CitrixCheckSshCommandWrapper.java | 63 +++++++++++++
.../CitrixOvsFetchInterfaceCommandWrapper.java | 71 +++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 6 ++
.../CitrixSecurityGroupRulesCommandWrapper.java | 61 +++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 73 +++++++++++++++
7 files changed, 379 insertions(+), 81 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30b770ae/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 c9b05a4..4477a70 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
@@ -461,12 +461,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == CheckSshCommand.class) {
- return execute((CheckSshCommand)cmd);
- } else if (clazz == SecurityGroupRulesCmd.class) {
- return execute((SecurityGroupRulesCmd)cmd);
- } else if (clazz == OvsFetchInterfaceCommand.class) {
- return execute((OvsFetchInterfaceCommand)cmd);
} else if (clazz == OvsCreateGreTunnelCommand.class) {
return execute((OvsCreateGreTunnelCommand)cmd);
} else if (clazz == OvsDeleteFlowCommand.class) {
@@ -847,17 +841,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (type == TrafficType.Guest) {
- return new XsLocalNetwork(Network.getByUuid(conn, _host.getGuestNetwork()), null, PIF.getByUuid(conn, _host.getGuestPif()), null);
+ return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getGuestNetwork()), null, PIF.getByUuid(conn, _host.getGuestPif()), null);
} else if (type == TrafficType.Control) {
setupLinkLocalNetwork(conn);
- return new XsLocalNetwork(Network.getByUuid(conn, _host.getLinkLocalNetwork()));
+ return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getLinkLocalNetwork()));
} else if (type == TrafficType.Management) {
- return new XsLocalNetwork(Network.getByUuid(conn, _host.getPrivateNetwork()), null, PIF.getByUuid(conn, _host.getPrivatePif()), null);
+ return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getPrivateNetwork()), null, PIF.getByUuid(conn, _host.getPrivatePif()), null);
} else if (type == TrafficType.Public) {
- return new XsLocalNetwork(Network.getByUuid(conn, _host.getPublicNetwork()), null, PIF.getByUuid(conn, _host.getPublicPif()), null);
+ return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getPublicNetwork()), null, PIF.getByUuid(conn, _host.getPublicPif()), null);
} else if (type == TrafficType.Storage) {
/* TrafficType.Storage is for secondary storage, while storageNetwork1 is for primary storage, we need better name here */
- return new XsLocalNetwork(Network.getByUuid(conn, _host.getStorageNetwork1()), null, PIF.getByUuid(conn, _host.getStoragePif1()), null);
+ return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getStorageNetwork1()), null, PIF.getByUuid(conn, _host.getStoragePif1()), null);
}
throw new CloudRuntimeException("Unsupported network type: " + type);
@@ -3571,7 +3565,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vdis;
}
- protected String connect(final Connection conn, final String vmName, final String ipAddress, final int port) {
+ public String connect(final Connection conn, final String vmName, final String ipAddress, final int port) {
for (int i = 0; i <= _retry; i++) {
try {
final Set<VM> vms = VM.getByNameLabel(conn, vmName);
@@ -3729,7 +3723,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
final Network nk = mgmtPifRec.network;
final Network.Record nkRec = nk.getRecord(conn);
- return new XsLocalNetwork(nk, nkRec, mgmtPif, mgmtPifRec);
+ return new XsLocalNetwork(this, nk, nkRec, mgmtPif, mgmtPifRec);
}
protected VIF getCorrectVif(final Connection conn, final VM router, final Network network) throws XmlRpcException, XenAPIException {
@@ -3864,10 +3858,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
*
* @see CitrixResourceBase#enableVlanNetwork
*/
- protected XsLocalNetwork getNetworkByName(final Connection conn, final String name) throws XenAPIException, XmlRpcException {
+ public XsLocalNetwork getNetworkByName(final Connection conn, final String name) throws XenAPIException, XmlRpcException {
final Set<Network> networks = Network.getByNameLabel(conn, name);
if (networks.size() == 1) {
- return new XsLocalNetwork(networks.iterator().next(), null, null, null);
+ return new XsLocalNetwork(this, networks.iterator().next(), null, null, null);
}
if (networks.size() == 0) {
@@ -3882,7 +3876,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
long earliestTimestamp = Long.MAX_VALUE;
int earliestRandom = Integer.MAX_VALUE;
for (final Network network : networks) {
- final XsLocalNetwork nic = new XsLocalNetwork(network);
+ final XsLocalNetwork nic = new XsLocalNetwork(this, network);
if (nic.getPif(conn) != null) {
return nic;
@@ -3906,7 +3900,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- return earliestNetwork != null ? new XsLocalNetwork(earliestNetwork, earliestNetworkRecord, null, null) : null;
+ return earliestNetwork != null ? new XsLocalNetwork(this, earliestNetwork, earliestNetworkRecord, null, null) : null;
}
protected String generateTimeStamp() {
@@ -5314,7 +5308,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
String label = cmd.getLabel();
//FIXME: this is a tricky to pass the network checking in XCP. I temporary get default label from Host.
- if (is_xcp()) {
+ if (isXcp()) {
label = getLabel();
}
s_logger.debug("Will look for network with name-label:" + label + " on host " + _host.getIp());
@@ -6894,67 +6888,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new Answer(cmd, true, result);
}
- /**
- * XsNic represents a network and the host's specific PIF.
- */
- protected class XsLocalNetwork {
- private final Network _n;
- private Network.Record _nr;
- private PIF _p;
- private PIF.Record _pr;
-
- public XsLocalNetwork(final Network n) {
- this(n, null, null, null);
- }
-
- public XsLocalNetwork(final Network n, final Network.Record nr, final PIF p, final PIF.Record pr) {
- _n = n;
- _nr = nr;
- _p = p;
- _pr = pr;
- }
-
- public Network getNetwork() {
- return _n;
- }
-
- public Network.Record getNetworkRecord(final Connection conn) throws XenAPIException, XmlRpcException {
- if (_nr == null) {
- _nr = _n.getRecord(conn);
- }
-
- return _nr;
- }
-
- public PIF getPif(final Connection conn) throws XenAPIException, XmlRpcException {
- if (_p == null) {
- final Network.Record nr = getNetworkRecord(conn);
- for (final PIF pif : nr.PIFs) {
- final PIF.Record pr = pif.getRecord(conn);
- if (_host.getUuid().equals(pr.host.getUuid(conn))) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Found a network called " + nr.nameLabel + " on host=" + _host.getIp() + "; Network=" + nr.uuid + "; pif=" + pr.uuid);
- }
- _p = pif;
- _pr = pr;
- break;
- }
- }
- }
- return _p;
- }
-
- public PIF.Record getPifRecord(final Connection conn) throws XenAPIException, XmlRpcException {
- if (_pr == null) {
- final PIF p = getPif(conn);
- if (_pr == null) {
- _pr = p.getRecord(conn);
- }
- }
- return _pr;
- }
- }
-
protected String getGuestOsType(final String stdType, String platformEmulator, final boolean bootFromCD) {
if (platformEmulator == null) {
s_logger.debug("no guest OS type, start it as HVM guest");
@@ -7259,7 +7192,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public void setRunLevel(final int level) {
}
- private boolean is_xcp() {
+ public boolean isXcp() {
final Connection conn = getConnection();
final String result = callHostPlugin(conn, "ovstunnel", "is_xcp");
if (result.equals("XCP")) {
@@ -7268,7 +7201,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return false;
}
- private String getLabel() {
+ public String getLabel() {
final Connection conn = getConnection();
final String result = callHostPlugin(conn, "ovstunnel", "getLabel");
return result;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30b770ae/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsLocalNetwork.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsLocalNetwork.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsLocalNetwork.java
new file mode 100644
index 0000000..c7f4f83
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XsLocalNetwork.java
@@ -0,0 +1,91 @@
+// 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;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.PIF;
+import com.xensource.xenapi.Types.XenAPIException;
+
+/**
+ * XsNic represents a network and the host's specific PIF.
+ */
+public class XsLocalNetwork {
+
+ private static final Logger s_logger = Logger.getLogger(XsLocalNetwork.class);
+
+ private final CitrixResourceBase _citrixResourceBase;
+ private final Network _n;
+ private Network.Record _nr;
+ private PIF _p;
+ private PIF.Record _pr;
+
+ public XsLocalNetwork(final CitrixResourceBase citrixResourceBase, final Network n) {
+ this(citrixResourceBase, n, null, null, null);
+ }
+
+ public XsLocalNetwork(final CitrixResourceBase citrixResourceBase, final Network n, final Network.Record nr, final PIF p, final PIF.Record pr) {
+ _citrixResourceBase = citrixResourceBase;
+ _n = n;
+ _nr = nr;
+ _p = p;
+ _pr = pr;
+ }
+
+ public Network getNetwork() {
+ return _n;
+ }
+
+ public Network.Record getNetworkRecord(final Connection conn) throws XenAPIException, XmlRpcException {
+ if (_nr == null) {
+ _nr = _n.getRecord(conn);
+ }
+
+ return _nr;
+ }
+
+ public PIF getPif(final Connection conn) throws XenAPIException, XmlRpcException {
+ if (_p == null) {
+ final Network.Record nr = getNetworkRecord(conn);
+ for (final PIF pif : nr.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 " + nr.nameLabel + " on host=" + _citrixResourceBase.getHost().getIp() + "; Network=" + nr.uuid + "; pif=" + pr.uuid);
+ }
+ _p = pif;
+ _pr = pr;
+ break;
+ }
+ }
+ }
+ return _p;
+ }
+
+ public PIF.Record getPifRecord(final Connection conn) throws XenAPIException, XmlRpcException {
+ if (_pr == null) {
+ final PIF p = getPif(conn);
+ if (_pr == null) {
+ _pr = p.getRecord(conn);
+ }
+ }
+ return _pr;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30b770ae/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckSshCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckSshCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckSshCommandWrapper.java
new file mode 100644
index 0000000..4437641
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckSshCommandWrapper.java
@@ -0,0 +1,63 @@
+//
+// 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 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.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixCheckSshCommandWrapper extends CommandWrapper<CheckSshCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixCheckSshCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CheckSshCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ 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);
+ }
+
+ try {
+ final String result = citrixResourceBase.connect(conn, command.getName(), privateIp, cmdPort);
+ if (result != null) {
+ return new CheckSshAnswer(command, "Can not ping System vm " + vmName + "due to:" + result);
+ }
+ //Do not destroy the disk here! It will stio the patching process. Please, don't!
+ //destroyPatchVbd(conn, vmName);
+ } catch (final Exception e) {
+ return new CheckSshAnswer(command, e);
+ }
+
+ 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/30b770ae/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsFetchInterfaceCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsFetchInterfaceCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsFetchInterfaceCommandWrapper.java
new file mode 100644
index 0000000..1f211a4
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsFetchInterfaceCommandWrapper.java
@@ -0,0 +1,71 @@
+//
+// 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 org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsFetchInterfaceAnswer;
+import com.cloud.agent.api.OvsFetchInterfaceCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.PIF;
+import com.xensource.xenapi.Types.BadServerResponse;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixOvsFetchInterfaceCommandWrapper extends CommandWrapper<OvsFetchInterfaceCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsFetchInterfaceCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsFetchInterfaceCommand command, final CitrixResourceBase citrixResourceBase) {
+ String label = command.getLabel();
+ //FIXME: this is a tricky to pass the network checking in XCP. I temporary get default label from Host.
+ if (citrixResourceBase.isXcp()) {
+ label = citrixResourceBase.getLabel();
+ }
+ s_logger.debug("Will look for network with name-label:" + label + " on host " + citrixResourceBase.getHost().getIp());
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final XsLocalNetwork nw = citrixResourceBase.getNetworkByName(conn, label);
+ if(nw == null) {
+ throw new CloudRuntimeException("Unable to locate the network with name-label: " + label + " on host: " + citrixResourceBase.getHost().getIp());
+ }
+ s_logger.debug("Network object:" + nw.getNetwork().getUuid(conn));
+ final PIF pif = nw.getPif(conn);
+ final PIF.Record pifRec = pif.getRecord(conn);
+ s_logger.debug("PIF object:" + pifRec.uuid + "(" + pifRec.device + ")");
+ return new OvsFetchInterfaceAnswer(command, true, "Interface " + pifRec.device + " retrieved successfully", pifRec.IP, pifRec.netmask, pifRec.MAC);
+ } catch (final BadServerResponse e) {
+ s_logger.error("An error occurred while fetching the interface for " + label + " on host " + citrixResourceBase.getHost().getIp(), e);
+ return new OvsFetchInterfaceAnswer(command, false, "EXCEPTION:" + e.getMessage());
+ } catch (final XenAPIException e) {
+ s_logger.error("An error occurred while fetching the interface for " + label + " on host " + citrixResourceBase.getHost().getIp(), e);
+ return new OvsFetchInterfaceAnswer(command, false, "EXCEPTION:" + e.getMessage());
+ } catch (final XmlRpcException e) {
+ s_logger.error("An error occurred while fetching the interface for " + label + " on host " + citrixResourceBase.getHost().getIp(), e);
+ return new OvsFetchInterfaceAnswer(command, false, "EXCEPTION:" + e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30b770ae/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 fbb3f27..be7aec6 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
@@ -39,16 +39,19 @@ 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.OvsFetchInterfaceCommand;
import com.cloud.agent.api.OvsSetTagAndFlowCommand;
import com.cloud.agent.api.PingTestCommand;
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.SecurityGroupRulesCmd;
import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StartCommand;
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;
@@ -109,6 +112,9 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(ModifySshKeysCommand.class, new CitrixModifySshKeysCommandWrapper());
map.put(StartCommand.class, new CitrixStartCommandWrapper());
map.put(OvsSetTagAndFlowCommand.class, new CitrixOvsSetTagAndFlowCommandWrapper());
+ map.put(CheckSshCommand.class, new CitrixCheckSshCommandWrapper());
+ map.put(SecurityGroupRulesCmd.class, new CitrixSecurityGroupRulesCommandWrapper());
+ map.put(OvsFetchInterfaceCommand.class, new CitrixOvsFetchInterfaceCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30b770ae/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSecurityGroupRulesCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSecurityGroupRulesCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSecurityGroupRulesCommandWrapper.java
new file mode 100644
index 0000000..0cf4a8a
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixSecurityGroupRulesCommandWrapper.java
@@ -0,0 +1,61 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.SecurityGroupRuleAnswer;
+import com.cloud.agent.api.SecurityGroupRulesCmd;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixSecurityGroupRulesCommandWrapper extends CommandWrapper<SecurityGroupRulesCmd, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixSecurityGroupRulesCommandWrapper.class);
+
+ @Override
+ public Answer execute(final SecurityGroupRulesCmd command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Sending network rules command to " + citrixResourceBase.getHost().getIp());
+ }
+
+ if (!citrixResourceBase.canBridgeFirewall()) {
+ s_logger.warn("Host " + citrixResourceBase.getHost().getIp() + " cannot do bridge firewalling");
+ return new SecurityGroupRuleAnswer(command, false, "Host " + citrixResourceBase.getHost().getIp() + " cannot do bridge firewalling",
+ SecurityGroupRuleAnswer.FailureReason.CANNOT_BRIDGE_FIREWALL);
+ }
+
+ final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "network_rules", "vmName", command.getVmName(), "vmIP", command.getGuestIp(), "vmMAC",
+ command.getGuestMac(), "vmID", Long.toString(command.getVmId()), "signature", command.getSignature(), "seqno", Long.toString(command.getSeqNum()), "deflated",
+ "true", "rules", command.compressStringifiedRules(), "secIps", command.getSecIpsString());
+
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ s_logger.warn("Failed to program network rules for vm " + command.getVmName());
+ return new SecurityGroupRuleAnswer(command, false, "programming network rules failed");
+ } else {
+ s_logger.info("Programmed network rules for vm " + command.getVmName() + " guestIp=" + command.getGuestIp() + ", ingress numrules="
+ + command.getIngressRuleSet().length + ", egress numrules=" + command.getEgressRuleSet().length);
+ return new SecurityGroupRuleAnswer(command);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30b770ae/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 0ffa7f4..75dd051 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
@@ -49,10 +49,12 @@ 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.SecurityGroupRulesCmd;
import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StartCommand;
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.CreateAnswer;
@@ -66,6 +68,7 @@ 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.hypervisor.xenserver.resource.XsLocalNetwork;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
@@ -586,6 +589,7 @@ public class CitrixRequestWrapperTest {
assertNotNull(wrapper);
final Answer answer = wrapper.execute(pingTestCommand, citrixResourceBase);
+
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -627,6 +631,7 @@ public class CitrixRequestWrapperTest {
assertNotNull(wrapper);
final Answer answer = wrapper.execute(startCommand, citrixResourceBase);
+
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -661,6 +666,74 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testCheckSshCommand() {
+ final CheckSshCommand sshCommand = new CheckSshCommand("Test", "127.0.0.1", 22);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(sshCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testSecurityGroupRulesCommand() {
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final SecurityGroupRulesCmd sshCommand = new SecurityGroupRulesCmd();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+
+ final Answer answer = wrapper.execute(sshCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testOvsFetchInterfaceCommand() {
+ final String label = "[abc]";
+
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsLocalNetwork network = Mockito.mock(XsLocalNetwork.class);
+
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final SecurityGroupRulesCmd sshCommand = new SecurityGroupRulesCmd();
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.isXcp()).thenReturn(true);
+ when(citrixResourceBase.getLabel()).thenReturn("[abc]");
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+
+ try {
+ when(citrixResourceBase.getNetworkByName(conn, label)).thenReturn(network);
+ } catch (final XenAPIException e) {
+ fail(e.getMessage());
+ } catch (final XmlRpcException e) {
+ fail(e.getMessage());
+ }
+
+ final Answer answer = wrapper.execute(sshCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[28/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring NetworkRulesSystemVmCommand, OvsCreateTunnelCommand, OvsDestroyBridgeCommand, OvsDestroyTunnelCommand, OvsSetupBridgeCommand in order to
cope with new design.
- Meny unit ests added.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/fbcae54a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/fbcae54a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/fbcae54a
Branch: refs/heads/master
Commit: fbcae54a5b21cdf5c77dc3676415112ecb3b25cd
Parents: 751c14b
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Mon Mar 30 16:05:42 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:31 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 16 +-
...itrixNetworkRulesSystemVmCommandWrapper.java | 45 +++
.../CitrixOvsCreateTunnelCommandWrapper.java | 67 ++++
.../CitrixOvsDestroyBridgeCommandWrapper.java | 53 +++
.../CitrixOvsDestroyTunnelCommandWrapper.java | 58 +++
.../CitrixOvsSetupBridgeCommandWrapper.java | 45 +++
.../resource/wrapper/CitrixRequestWrapper.java | 10 +
.../wrapper/CitrixRequestWrapperTest.java | 357 ++++++++++++++++---
8 files changed, 597 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fbcae54a/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 c1705c0..c495b75 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
@@ -467,16 +467,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == NetworkRulesSystemVmCommand.class) {
- return execute((NetworkRulesSystemVmCommand)cmd);
- } else if (clazz == OvsCreateTunnelCommand.class) {
- return execute((OvsCreateTunnelCommand)cmd);
- } else if (clazz == OvsSetupBridgeCommand.class) {
- return execute((OvsSetupBridgeCommand)cmd);
- } else if (clazz == OvsDestroyBridgeCommand.class) {
- return execute((OvsDestroyBridgeCommand)cmd);
- } else if (clazz == OvsDestroyTunnelCommand.class) {
- return execute((OvsDestroyTunnelCommand)cmd);
} else if (clazz == UpdateHostPasswordCommand.class) {
return execute((UpdateHostPasswordCommand)cmd);
} else if (cmd instanceof ClusterVMMetaDataSyncCommand) {
@@ -917,7 +907,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
/**
* This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
*/
- private synchronized Network configureTunnelNetwork(final Connection conn, final Long networkId, final long hostId, final String bridgeName) {
+ public synchronized Network configureTunnelNetwork(final Connection conn, final Long networkId, final long hostId, final String bridgeName) {
try {
final Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
final String nwName = bridgeName;
@@ -964,7 +954,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- private synchronized void destroyTunnelNetwork(final Connection conn, final Network nw, final long hostId) {
+ public synchronized void destroyTunnelNetwork(final Connection conn, final Network nw, final long hostId) {
try {
final String bridge = nw.getBridge(conn);
final String result = callHostPlugin(conn, "ovstunnel", "destroy_ovs_bridge", "bridge", bridge,
@@ -1617,7 +1607,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return cmd;
}
- private void cleanUpTmpDomVif(final Connection conn, final Network nw) throws XenAPIException, XmlRpcException {
+ public void cleanUpTmpDomVif(final Connection conn, final Network nw) throws XenAPIException, XmlRpcException {
final Pair<VM, VM.Record> vm = getControlDomain(conn);
final VM dom0 = vm.first();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fbcae54a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesSystemVmCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesSystemVmCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesSystemVmCommandWrapper.java
new file mode 100644
index 0000000..cdd93ae
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixNetworkRulesSystemVmCommandWrapper.java
@@ -0,0 +1,45 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.NetworkRulesSystemVmCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.vm.VirtualMachine;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixNetworkRulesSystemVmCommandWrapper extends CommandWrapper<NetworkRulesSystemVmCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final NetworkRulesSystemVmCommand command, final CitrixResourceBase citrixResourceBase) {
+ boolean success = true;
+ final Connection conn = citrixResourceBase.getConnection();
+ if (command.getType() != VirtualMachine.Type.User) {
+
+ final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "default_network_rules_systemvm", "vmName", command.getVmName());
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ success = false;
+ }
+ }
+
+ return new Answer(command, success, "");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fbcae54a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateTunnelCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateTunnelCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateTunnelCommandWrapper.java
new file mode 100644
index 0000000..3e25a74
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateTunnelCommandWrapper.java
@@ -0,0 +1,67 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsCreateTunnelAnswer;
+import com.cloud.agent.api.OvsCreateTunnelCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+
+public final class CitrixOvsCreateTunnelCommandWrapper extends CommandWrapper<OvsCreateTunnelCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsCreateTunnelCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsCreateTunnelCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ String bridge = "unknown";
+ try {
+ final Network nw = citrixResourceBase.findOrCreateTunnelNetwork(conn, command.getNetworkName());
+ if (nw == null) {
+ s_logger.debug("Error during bridge setup");
+ return new OvsCreateTunnelAnswer(command, false, "Cannot create network", bridge);
+ }
+
+ citrixResourceBase.configureTunnelNetwork(conn, command.getNetworkId(), command.getFrom(), command.getNetworkName());
+ bridge = nw.getBridge(conn);
+ final String result =
+ citrixResourceBase.callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", command.getRemoteIp(),
+ "key", command.getKey().toString(), "from",
+ command.getFrom().toString(), "to", command.getTo().toString(), "cloudstack-network-id",
+ command.getNetworkUuid());
+ final String[] res = result.split(":");
+
+ if (res.length == 2 && res[0].equalsIgnoreCase("SUCCESS")) {
+ return new OvsCreateTunnelAnswer(command, true, result, res[1], bridge);
+ } else {
+ return new OvsCreateTunnelAnswer(command, false, result, bridge);
+ }
+ } catch (final Exception e) {
+ s_logger.debug("Error during tunnel setup");
+ s_logger.warn("Caught execption when creating ovs tunnel", e);
+ return new OvsCreateTunnelAnswer(command, false, e.getMessage(), bridge);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fbcae54a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyBridgeCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyBridgeCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyBridgeCommandWrapper.java
new file mode 100644
index 0000000..ee6e4dd
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyBridgeCommandWrapper.java
@@ -0,0 +1,53 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsDestroyBridgeCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+
+public final class CitrixOvsDestroyBridgeCommandWrapper extends CommandWrapper<OvsDestroyBridgeCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsDestroyBridgeCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsDestroyBridgeCommand command, final CitrixResourceBase citrixResourceBase) {
+ try {
+ final Connection conn = citrixResourceBase.getConnection();
+
+ final Network nw = citrixResourceBase.findOrCreateTunnelNetwork(conn, command.getBridgeName());
+ citrixResourceBase.cleanUpTmpDomVif(conn, nw);
+
+ citrixResourceBase.destroyTunnelNetwork(conn, nw, command.getHostId());
+
+ s_logger.debug("OVS Bridge destroyed");
+
+ return new Answer(command, true, null);
+ } catch (final Exception e) {
+ s_logger.warn("caught execption when destroying ovs bridge", e);
+ return new Answer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fbcae54a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyTunnelCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyTunnelCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyTunnelCommandWrapper.java
new file mode 100644
index 0000000..da0fd1f
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDestroyTunnelCommandWrapper.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.xenserver.resource.wrapper;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsDestroyTunnelCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+
+public final class CitrixOvsDestroyTunnelCommandWrapper extends CommandWrapper<OvsDestroyTunnelCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsDestroyTunnelCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsDestroyTunnelCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Network nw = citrixResourceBase.findOrCreateTunnelNetwork(conn, command.getBridgeName());
+ if (nw == null) {
+ s_logger.warn("Unable to find tunnel network for GRE key:" + command.getBridgeName());
+ return new Answer(command, false, "No network found");
+ }
+
+ final String bridge = nw.getBridge(conn);
+ final String result = citrixResourceBase.callHostPlugin(conn, "ovstunnel", "destroy_tunnel", "bridge", bridge, "in_port", command.getInPortName());
+
+ if (result.equalsIgnoreCase("SUCCESS")) {
+ 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/fbcae54a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetupBridgeCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetupBridgeCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetupBridgeCommandWrapper.java
new file mode 100644
index 0000000..0c553b4
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetupBridgeCommandWrapper.java
@@ -0,0 +1,45 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsSetupBridgeCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixOvsSetupBridgeCommandWrapper extends CommandWrapper<OvsSetupBridgeCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsSetupBridgeCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsSetupBridgeCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+
+ citrixResourceBase.findOrCreateTunnelNetwork(conn, command.getBridgeName());
+ citrixResourceBase.configureTunnelNetwork(conn, command.getNetworkId(), command.getHostId(), command.getBridgeName());
+
+ s_logger.debug("OVS Bridge configured");
+
+ return new Answer(command, true, null);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fbcae54a/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 eb179bb..eff580a 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
@@ -40,10 +40,15 @@ 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.OvsCreateGreTunnelCommand;
+import com.cloud.agent.api.OvsCreateTunnelCommand;
import com.cloud.agent.api.OvsDeleteFlowCommand;
+import com.cloud.agent.api.OvsDestroyBridgeCommand;
+import com.cloud.agent.api.OvsDestroyTunnelCommand;
import com.cloud.agent.api.OvsFetchInterfaceCommand;
import com.cloud.agent.api.OvsSetTagAndFlowCommand;
+import com.cloud.agent.api.OvsSetupBridgeCommand;
import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
import com.cloud.agent.api.PingTestCommand;
@@ -125,6 +130,11 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(OvsVpcPhysicalTopologyConfigCommand.class, new CitrixOvsVpcPhysicalTopologyConfigCommandWrapper());
map.put(OvsVpcRoutingPolicyConfigCommand.class, new CitrixOvsVpcRoutingPolicyConfigCommandWrapper());
map.put(CleanupNetworkRulesCmd.class, new CitrixCleanupNetworkRulesCmdWrapper());
+ map.put(NetworkRulesSystemVmCommand.class, new CitrixNetworkRulesSystemVmCommandWrapper());
+ map.put(OvsCreateTunnelCommand.class, new CitrixOvsCreateTunnelCommandWrapper());
+ map.put(OvsSetupBridgeCommand.class, new CitrixOvsSetupBridgeCommandWrapper());
+ map.put(OvsDestroyBridgeCommand.class, new CitrixOvsDestroyBridgeCommandWrapper());
+ map.put(OvsDestroyTunnelCommand.class, new CitrixOvsDestroyTunnelCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fbcae54a/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 5fde596..8b8c9ce 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
@@ -45,10 +45,15 @@ 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.OvsCreateGreTunnelCommand;
+import com.cloud.agent.api.OvsCreateTunnelCommand;
import com.cloud.agent.api.OvsDeleteFlowCommand;
+import com.cloud.agent.api.OvsDestroyBridgeCommand;
+import com.cloud.agent.api.OvsDestroyTunnelCommand;
import com.cloud.agent.api.OvsFetchInterfaceCommand;
import com.cloud.agent.api.OvsSetTagAndFlowCommand;
+import com.cloud.agent.api.OvsSetupBridgeCommand;
import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
import com.cloud.agent.api.PingTestCommand;
@@ -81,6 +86,7 @@ import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.vm.DiskProfile;
+import com.cloud.vm.VirtualMachine;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.Marshalling;
@@ -90,7 +96,7 @@ import com.xensource.xenapi.Types.BadServerResponse;
import com.xensource.xenapi.Types.XenAPIException;
@RunWith(PowerMockRunner.class)
-@PrepareForTest({Connection.class, Host.Record.class})
+@PrepareForTest({ Connection.class, Host.Record.class })
public class CitrixRequestWrapperTest {
@Mock
@@ -415,7 +421,8 @@ public class CitrixRequestWrapperTest {
public void testUpgradeSnapshotCommand() {
final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
- final UpgradeSnapshotCommand upgradeSnapshotCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "2.1");
+ final UpgradeSnapshotCommand upgradeSnapshotCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test",
+ "2.1");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
@@ -430,7 +437,8 @@ public class CitrixRequestWrapperTest {
public void testUpgradeSnapshotCommandNo21() {
final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
- final UpgradeSnapshotCommand upgradeSnapshotCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "3.1");
+ final UpgradeSnapshotCommand upgradeSnapshotCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test",
+ "3.1");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
@@ -518,8 +526,8 @@ public class CitrixRequestWrapperTest {
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 Host.Record hr = PowerMockito.mock(Host.Record.class);
+ // final Host host = PowerMockito.mock(Host.class);
final MaintainCommand maintainCommand = new MaintainCommand();
@@ -537,40 +545,42 @@ public class CitrixRequestWrapperTest {
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);
+ 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());
- // }
+ // 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));
+ // 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());
- // }
+ // 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(maintainCommand, citrixResourceBase);
@@ -771,8 +781,9 @@ public class CitrixRequestWrapperTest {
when(citrixResourceBase.setupvSwitchNetwork(conn)).thenReturn(network);
try {
when(network.getBridge(conn)).thenReturn(bridge);
- when(citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_create_gre", "bridge", bridge, "remoteIP", createGreCommand.getRemoteIp(), "greKey",
- createGreCommand.getKey(), "from", Long.toString(createGreCommand.getFrom()), "to", Long.toString(createGreCommand.getTo()))).thenReturn("1:2");
+ when(
+ citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_create_gre", "bridge", bridge, "remoteIP", createGreCommand.getRemoteIp(), "greKey",
+ createGreCommand.getKey(), "from", Long.toString(createGreCommand.getFrom()), "to", Long.toString(createGreCommand.getTo()))).thenReturn("1:2");
} catch (final BadServerResponse e) {
fail(e.getMessage());
@@ -876,9 +887,9 @@ public class CitrixRequestWrapperTest {
when(citrixResourceBase.findOrCreateTunnelNetwork(conn, physicalTopology.getBridgeName())).thenReturn(network);
when(network.getBridge(conn)).thenReturn(bridge);
- when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
- bridge, "config", physicalTopology.getVpcConfigInJson(), "host-id", ((Long)physicalTopology.getHostId()).toString(),
- "seq-no", Long.toString(1))).thenReturn("SUCCESS");
+ when(
+ citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge", bridge, "config",
+ physicalTopology.getVpcConfigInJson(), "host-id", ((Long) physicalTopology.getHostId()).toString(), "seq-no", Long.toString(1))).thenReturn("SUCCESS");
} catch (final BadServerResponse e) {
fail(e.getMessage());
@@ -914,9 +925,9 @@ public class CitrixRequestWrapperTest {
when(citrixResourceBase.findOrCreateTunnelNetwork(conn, routingPolicy.getBridgeName())).thenReturn(network);
when(network.getBridge(conn)).thenReturn(bridge);
- when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge",
- bridge, "host-id", ((Long)routingPolicy.getHostId()).toString(), "config",
- routingPolicy.getVpcConfigInJson(), "seq-no", Long.toString(1))).thenReturn("SUCCESS");
+ when(
+ citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge", bridge, "host-id",
+ ((Long) routingPolicy.getHostId()).toString(), "config", routingPolicy.getVpcConfigInJson(), "seq-no", Long.toString(1))).thenReturn("SUCCESS");
} catch (final BadServerResponse e) {
fail(e.getMessage());
@@ -994,6 +1005,270 @@ public class CitrixRequestWrapperTest {
assertTrue(answer.getResult());
assertNull(answer.getDetails());
}
+
+ @Test
+ public void testNetworkRulesSystemVmCommand() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final NetworkRulesSystemVmCommand netRules = new NetworkRulesSystemVmCommand("Test", VirtualMachine.Type.User);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+
+ final Answer answer = wrapper.execute(netRules, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testNetworkRulesSystemVmCommandNonUser() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final NetworkRulesSystemVmCommand netRules = new NetworkRulesSystemVmCommand("Test", VirtualMachine.Type.DomainRouter);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.callHostPlugin(conn, "vmops", "default_network_rules_systemvm", "vmName", netRules.getVmName())).thenReturn("true");
+
+ final Answer answer = wrapper.execute(netRules, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testNetworkRulesSystemVmCommandNonUserFalse() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final NetworkRulesSystemVmCommand netRules = new NetworkRulesSystemVmCommand("Test", VirtualMachine.Type.DomainRouter);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.callHostPlugin(conn, "vmops", "default_network_rules_systemvm", "vmName", netRules.getVmName())).thenReturn("false");
+
+ final Answer answer = wrapper.execute(netRules, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testOvsCreateTunnelCommandSuccess() {
+ final String bridge = "tunnel";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsCreateTunnelCommand createTunnel = new OvsCreateTunnelCommand("127.0.0.1", 1, 1l, 2l, 1l, "127.0.1.1", "net01", "cd84c713-f448-48c9-ba25-e6740d4a9003");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, createTunnel.getNetworkName())).thenReturn(network);
+ when(network.getBridge(conn)).thenReturn(bridge);
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", createTunnel.getRemoteIp(),
+ "key", createTunnel.getKey().toString(), "from",
+ createTunnel.getFrom().toString(), "to", createTunnel.getTo().toString(), "cloudstack-network-id",
+ createTunnel.getNetworkUuid())).thenReturn("SUCCESS:0");
+
+ } 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(createTunnel, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ verify(citrixResourceBase, times(1)).configureTunnelNetwork(conn, createTunnel.getNetworkId(), createTunnel.getFrom(), createTunnel.getNetworkName());
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testOvsCreateTunnelCommandFail() {
+ final String bridge = "tunnel";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsCreateTunnelCommand createTunnel = new OvsCreateTunnelCommand("127.0.0.1", 1, 1l, 2l, 1l, "127.0.1.1", "net01", "cd84c713-f448-48c9-ba25-e6740d4a9003");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, createTunnel.getNetworkName())).thenReturn(network);
+ when(network.getBridge(conn)).thenReturn(bridge);
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", createTunnel.getRemoteIp(),
+ "key", createTunnel.getKey().toString(), "from",
+ createTunnel.getFrom().toString(), "to", createTunnel.getTo().toString(), "cloudstack-network-id",
+ createTunnel.getNetworkUuid())).thenReturn("FAIL:1");
+
+ } 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(createTunnel, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ verify(citrixResourceBase, times(1)).configureTunnelNetwork(conn, createTunnel.getNetworkId(), createTunnel.getFrom(), createTunnel.getNetworkName());
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testOvsCreateTunnelCommandNoNet() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final OvsCreateTunnelCommand createTunnel = new OvsCreateTunnelCommand("127.0.0.1", 1, 1l, 2l, 1l, "127.0.1.1", "net01", "cd84c713-f448-48c9-ba25-e6740d4a9003");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, createTunnel.getNetworkName())).thenReturn(null);
+
+ final Answer answer = wrapper.execute(createTunnel, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testOvsSetupBridgeCommand() {
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final OvsSetupBridgeCommand setupBridge = new OvsSetupBridgeCommand("Test", 1l, 1l);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+
+
+ final Answer answer = wrapper.execute(setupBridge, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ verify(citrixResourceBase, times(1)).findOrCreateTunnelNetwork(conn, setupBridge.getBridgeName());
+ verify(citrixResourceBase, times(1)).configureTunnelNetwork(conn, setupBridge.getNetworkId(), setupBridge.getHostId(), setupBridge.getBridgeName());
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testOvsDestroyBridgeCommand() {
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsDestroyBridgeCommand destroyBridge = new OvsDestroyBridgeCommand(1l, "bridge", 1l);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, destroyBridge.getBridgeName())).thenReturn(network);
+
+ final Answer answer = wrapper.execute(destroyBridge, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ try {
+ verify(citrixResourceBase, times(1)).cleanUpTmpDomVif(conn, network);
+ } catch (final XenAPIException e) {
+ fail(e.getMessage());
+ } catch (final XmlRpcException e) {
+ fail(e.getMessage());
+ }
+ verify(citrixResourceBase, times(1)).destroyTunnelNetwork(conn, network, destroyBridge.getHostId());
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testOvsDestroyTunnelCommandSuccess() {
+ final String bridge = "tunnel";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsDestroyTunnelCommand destroyTunnel = new OvsDestroyTunnelCommand(1l, "net01", "port11");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, destroyTunnel.getBridgeName())).thenReturn(network);
+ when(network.getBridge(conn)).thenReturn(bridge);
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "destroy_tunnel", "bridge", bridge, "in_port", destroyTunnel.getInPortName())).thenReturn("SUCCESS");
+
+ } 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(destroyTunnel, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testOvsDestroyTunnelCommandFailed() {
+ final String bridge = "tunnel";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsDestroyTunnelCommand destroyTunnel = new OvsDestroyTunnelCommand(1l, "net01", "port11");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, destroyTunnel.getBridgeName())).thenReturn(network);
+ when(network.getBridge(conn)).thenReturn(bridge);
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "destroy_tunnel", "bridge", bridge, "in_port", destroyTunnel.getInPortName())).thenReturn("FAILED");
+
+ } 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(destroyTunnel, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[26/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring PingTestCommand to cope with new design
- Basic tests added
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/18470a48
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/18470a48
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/18470a48
Branch: refs/heads/master
Commit: 18470a48d0db69e4bd97d22c023f7a5ae3bcbd97
Parents: 3a70912
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Thu Mar 26 11:10:35 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:30 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 6 +--
.../wrapper/CitrixPingTestCommandWrapper.java | 47 ++++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../wrapper/CitrixRequestWrapperTest.java | 14 ++++++
4 files changed, 65 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/18470a48/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 8fa9e4c..50859af 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
@@ -453,8 +453,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == PingTestCommand.class) {
- return execute((PingTestCommand)cmd);
} else if (clazz == CheckOnHostCommand.class) {
return execute((CheckOnHostCommand)cmd);
} else if (clazz == ModifySshKeysCommand.class) {
@@ -1945,7 +1943,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new Answer(cmd);
}
- private boolean doPingTest(final Connection conn, final String computingHostIp) {
+ public boolean doPingTest(final Connection conn, final String computingHostIp) {
final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
try {
sshConnection.connect(null, 60000, 60000);
@@ -1970,7 +1968,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new CheckOnHostAnswer(cmd, null, "Not Implmeneted");
}
- private boolean doPingTest(final Connection conn, final String domRIp, final String vmIp) {
+ public boolean doPingTest(final Connection conn, final String domRIp, final String vmIp) {
final String args = "-i " + domRIp + " -p " + vmIp;
final String result = callHostPlugin(conn, "vmops", "pingtest", "args", args);
if (result == null || result.isEmpty()) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/18470a48/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPingTestCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPingTestCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPingTestCommandWrapper.java
new file mode 100644
index 0000000..8a7a01c
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixPingTestCommandWrapper.java
@@ -0,0 +1,47 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.PingTestCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixPingTestCommandWrapper extends CommandWrapper<PingTestCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final PingTestCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ boolean result = false;
+ final String computingHostIp = command.getComputingHostIp();
+
+ if (computingHostIp != null) {
+ result = citrixResourceBase.doPingTest(conn, computingHostIp);
+ } else {
+ result = citrixResourceBase.doPingTest(conn, command.getRouterIp(), command.getPrivateIp());
+ }
+
+ if (!result) {
+ return new Answer(command, false, "PingTestCommand failed");
+ }
+ return new Answer(command);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/18470a48/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 6d262ee..badc892 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
@@ -37,6 +37,7 @@ 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.PingTestCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootCommand;
@@ -99,6 +100,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(GetVncPortCommand.class, new CitrixGetVncPortCommandWrapper());
map.put(SetupCommand.class, new CitrixSetupCommandWrapper());
map.put(MaintainCommand.class, new CitrixMaintainCommandWrapper());
+ map.put(PingTestCommand.class, new CitrixPingTestCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/18470a48/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 45bdea1..0ba9d1a 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
@@ -38,6 +38,7 @@ 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.PingTestCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootAnswer;
@@ -554,6 +555,19 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testPingTestCommandHostIp() {
+ final PingTestCommand storageDownloadCommand = new PingTestCommand("127.0.0.1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[27/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring CleanupNetworkRulesCmd, OvsCreateGreTunnelCommand, OvsDeleteFlowCommand, OvsVpcPhysicalTopologyConfigCommand and OvsVpcRoutingPolicyConfigCommand
in order to cope with the new design.
- Meny new unit tests added that cover more than the basics!
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/751c14b9
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/751c14b9
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/751c14b9
Branch: refs/heads/master
Commit: 751c14b929c1f9a7e703f2a1fa0d46ca0ca8fe6f
Parents: 30b770a
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Mon Mar 30 15:18:46 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:31 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 22 +-
.../CitrixCleanupNetworkRulesCmdWrapper.java | 54 ++++
.../CitrixOvsCreateGreTunnelCommandWrapper.java | 67 +++++
.../CitrixOvsDeleteFlowCommandWrapper.java | 62 +++++
...VpcPhysicalTopologyConfigCommandWrapper.java | 57 ++++
...OvsVpcRoutingPolicyConfigCommandWrapper.java | 57 ++++
.../resource/wrapper/CitrixRequestWrapper.java | 10 +
.../wrapper/CitrixRequestWrapperTest.java | 264 ++++++++++++++++++-
8 files changed, 578 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/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 4477a70..c1705c0 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
@@ -259,8 +259,12 @@ import com.xensource.xenapi.XenAPIObject;
*/
@Local(value = ServerResource.class)
public abstract class CitrixResourceBase implements ServerResource, HypervisorResource, VirtualRouterDeployer {
+
private static final Logger s_logger = Logger.getLogger(CitrixResourceBase.class);
+
+ static final Random Rand = new Random(System.currentTimeMillis());
protected static final XenServerConnectionPool ConnPool = XenServerConnectionPool.getInstance();
+
protected String _name;
protected String _username;
protected Queue<String> _password = new LinkedList<String>();
@@ -278,9 +282,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected int _wait;
protected int _migratewait;
protected String _instance; //instance name (default is usually "VM")
- static final Random Rand = new Random(System.currentTimeMillis());
protected boolean _securityGroupEnabled;
-
protected IAgentControl _agentControl;
final int _maxWeight = 256;
@@ -340,6 +342,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return _host;
}
+ public String getVMInstanceName() {
+ return _instance;
+ }
+
public boolean isOvs() {
return _isOvs;
}
@@ -461,16 +467,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == OvsCreateGreTunnelCommand.class) {
- return execute((OvsCreateGreTunnelCommand)cmd);
- } else if (clazz == OvsDeleteFlowCommand.class) {
- return execute((OvsDeleteFlowCommand)cmd);
- } else if (clazz == OvsVpcPhysicalTopologyConfigCommand.class) {
- return execute((OvsVpcPhysicalTopologyConfigCommand) cmd);
- } else if (clazz == OvsVpcRoutingPolicyConfigCommand.class) {
- return execute((OvsVpcRoutingPolicyConfigCommand) cmd);
- } else if (clazz == CleanupNetworkRulesCmd.class) {
- return execute((CleanupNetworkRulesCmd)cmd);
} else if (clazz == NetworkRulesSystemVmCommand.class) {
return execute((NetworkRulesSystemVmCommand)cmd);
} else if (clazz == OvsCreateTunnelCommand.class) {
@@ -889,7 +885,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
/**
* This method just creates a XenServer network following the tunnel network naming convention
*/
- private synchronized Network findOrCreateTunnelNetwork(final Connection conn, final String nwName) {
+ public synchronized Network findOrCreateTunnelNetwork(final Connection conn, final String nwName) {
try {
Network nw = null;
final Network.Record rec = new Network.Record();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCleanupNetworkRulesCmdWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCleanupNetworkRulesCmdWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCleanupNetworkRulesCmdWrapper.java
new file mode 100644
index 0000000..471c1e8
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCleanupNetworkRulesCmdWrapper.java
@@ -0,0 +1,54 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CleanupNetworkRulesCmd;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class CitrixCleanupNetworkRulesCmdWrapper extends CommandWrapper<CleanupNetworkRulesCmd, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixCleanupNetworkRulesCmdWrapper.class);
+
+ @Override
+ public Answer execute(final CleanupNetworkRulesCmd command, final CitrixResourceBase citrixResourceBase) {
+ if (!citrixResourceBase.canBridgeFirewall()) {
+ return new Answer(command, true, null);
+ }
+ final Connection conn = citrixResourceBase.getConnection();
+
+ final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "cleanup_rules", "instance", citrixResourceBase.getVMInstanceName());
+ final int numCleaned = Integer.parseInt(result);
+
+ if (result == null || result.isEmpty() || numCleaned < 0) {
+ s_logger.warn("Failed to cleanup rules for host " + citrixResourceBase.getHost().getIp());
+ return new Answer(command, false, result);
+ }
+
+ if (numCleaned > 0) {
+ s_logger.info("Cleaned up rules for " + result + " vms on host " + citrixResourceBase.getHost().getIp());
+ }
+ return new Answer(command, true, result);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateGreTunnelCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateGreTunnelCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateGreTunnelCommandWrapper.java
new file mode 100644
index 0000000..c944e9a
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsCreateGreTunnelCommandWrapper.java
@@ -0,0 +1,67 @@
+//
+// 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 org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsCreateGreTunnelAnswer;
+import com.cloud.agent.api.OvsCreateGreTunnelCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.Types.BadServerResponse;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixOvsCreateGreTunnelCommandWrapper extends CommandWrapper<OvsCreateGreTunnelCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsCreateGreTunnelCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsCreateGreTunnelCommand command, final CitrixResourceBase citrixResourceBase) {
+ citrixResourceBase.setIsOvs(true);
+
+ final Connection conn = citrixResourceBase.getConnection();
+ String bridge = "unkonwn";
+ try {
+ final Network nw = citrixResourceBase.setupvSwitchNetwork(conn);
+ bridge = nw.getBridge(conn);
+
+ final String result = citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_create_gre", "bridge", bridge, "remoteIP", command.getRemoteIp(), "greKey",
+ command.getKey(), "from", Long.toString(command.getFrom()), "to", Long.toString(command.getTo()));
+ final String[] res = result.split(":");
+ if (res.length != 2 || res.length == 2 && res[1].equalsIgnoreCase("[]")) {
+ return new OvsCreateGreTunnelAnswer(command, false, result, citrixResourceBase.getHost().getIp(), bridge);
+ } else {
+ return new OvsCreateGreTunnelAnswer(command, true, result, citrixResourceBase.getHost().getIp(), bridge, Integer.parseInt(res[1]));
+ }
+ } catch (final BadServerResponse e) {
+ s_logger.error("An error occurred while creating a GRE tunnel to " + command.getRemoteIp() + " on host " + citrixResourceBase.getHost().getIp(), e);
+ } catch (final XenAPIException e) {
+ s_logger.error("An error occurred while creating a GRE tunnel to " + command.getRemoteIp() + " on host " + citrixResourceBase.getHost().getIp(), e);
+ } catch (final XmlRpcException e) {
+ s_logger.error("An error occurred while creating a GRE tunnel to " + command.getRemoteIp() + " on host " + citrixResourceBase.getHost().getIp(), e);
+ }
+
+ return new OvsCreateGreTunnelAnswer(command, false, "EXCEPTION", citrixResourceBase.getHost().getIp(), bridge);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDeleteFlowCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDeleteFlowCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDeleteFlowCommandWrapper.java
new file mode 100644
index 0000000..e96f136
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsDeleteFlowCommandWrapper.java
@@ -0,0 +1,62 @@
+//
+// 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 org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsDeleteFlowCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.Types.BadServerResponse;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixOvsDeleteFlowCommandWrapper extends CommandWrapper<OvsDeleteFlowCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsDeleteFlowCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsDeleteFlowCommand command, final CitrixResourceBase citrixResourceBase) {
+ citrixResourceBase.setIsOvs(true);
+
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Network nw = citrixResourceBase.setupvSwitchNetwork(conn);
+ final String bridge = nw.getBridge(conn);
+ final String result = citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_delete_flow", "bridge", bridge, "vmName", command.getVmName());
+
+ if (result.equalsIgnoreCase("SUCCESS")) {
+ return new Answer(command, true, "success to delete flows for " + command.getVmName());
+ } else {
+ return new Answer(command, false, result);
+ }
+ } catch (final BadServerResponse e) {
+ s_logger.error("Failed to delete flow", e);
+ } catch (final XenAPIException e) {
+ s_logger.error("Failed to delete flow", e);
+ } catch (final XmlRpcException e) {
+ s_logger.error("Failed to delete flow", e);
+ }
+ return new Answer(command, false, "failed to delete flow for " + command.getVmName());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcPhysicalTopologyConfigCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcPhysicalTopologyConfigCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcPhysicalTopologyConfigCommandWrapper.java
new file mode 100644
index 0000000..0dc4fb6
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcPhysicalTopologyConfigCommandWrapper.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.xenserver.resource.wrapper;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+
+public final class CitrixOvsVpcPhysicalTopologyConfigCommandWrapper extends CommandWrapper<OvsVpcPhysicalTopologyConfigCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsVpcPhysicalTopologyConfigCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsVpcPhysicalTopologyConfigCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Network nw = citrixResourceBase.findOrCreateTunnelNetwork(conn, command.getBridgeName());
+ final String bridgeName = nw.getBridge(conn);
+ final long sequenceNo = command.getSequenceNumber();
+
+ final String result = citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
+ bridgeName, "config", command.getVpcConfigInJson(), "host-id", ((Long)command.getHostId()).toString(),
+ "seq-no", Long.toString(sequenceNo));
+
+ if (result.startsWith("SUCCESS")) {
+ return new Answer(command, true, result);
+ } else {
+ return new Answer(command, false, result);
+ }
+ } catch (final Exception e) {
+ s_logger.warn("caught exception while updating host with latest VPC topology", e);
+ return new Answer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcRoutingPolicyConfigCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcRoutingPolicyConfigCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcRoutingPolicyConfigCommandWrapper.java
new file mode 100644
index 0000000..4b1e56d
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsVpcRoutingPolicyConfigCommandWrapper.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.xenserver.resource.wrapper;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+
+public final class CitrixOvsVpcRoutingPolicyConfigCommandWrapper extends CommandWrapper<OvsVpcRoutingPolicyConfigCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsVpcRoutingPolicyConfigCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsVpcRoutingPolicyConfigCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Network nw = citrixResourceBase.findOrCreateTunnelNetwork(conn, command.getBridgeName());
+ final String bridgeName = nw.getBridge(conn);
+ final long sequenceNo = command.getSequenceNumber();
+
+ final String result = citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge",
+ bridgeName, "host-id", ((Long)command.getHostId()).toString(), "config",
+ command.getVpcConfigInJson(), "seq-no", Long.toString(sequenceNo));
+
+ if (result.startsWith("SUCCESS")) {
+ return new Answer(command, true, result);
+ } else {
+ return new Answer(command, false, result);
+ }
+ } catch (final Exception e) {
+ s_logger.warn("caught exception while updating host with latest routing policies", e);
+ return new Answer(command, false, e.getMessage());
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/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 be7aec6..eb179bb 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
@@ -27,6 +27,7 @@ import com.cloud.agent.api.AttachVolumeCommand;
import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.CheckOnHostCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
+import com.cloud.agent.api.CleanupNetworkRulesCmd;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.DeleteStoragePoolCommand;
@@ -39,8 +40,12 @@ 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.OvsCreateGreTunnelCommand;
+import com.cloud.agent.api.OvsDeleteFlowCommand;
import com.cloud.agent.api.OvsFetchInterfaceCommand;
import com.cloud.agent.api.OvsSetTagAndFlowCommand;
+import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
+import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
import com.cloud.agent.api.PingTestCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
@@ -115,6 +120,11 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(CheckSshCommand.class, new CitrixCheckSshCommandWrapper());
map.put(SecurityGroupRulesCmd.class, new CitrixSecurityGroupRulesCommandWrapper());
map.put(OvsFetchInterfaceCommand.class, new CitrixOvsFetchInterfaceCommandWrapper());
+ map.put(OvsCreateGreTunnelCommand.class, new CitrixOvsCreateGreTunnelCommandWrapper());
+ map.put(OvsDeleteFlowCommand.class, new CitrixOvsDeleteFlowCommandWrapper());
+ map.put(OvsVpcPhysicalTopologyConfigCommand.class, new CitrixOvsVpcPhysicalTopologyConfigCommandWrapper());
+ map.put(OvsVpcRoutingPolicyConfigCommand.class, new CitrixOvsVpcRoutingPolicyConfigCommandWrapper());
+ map.put(CleanupNetworkRulesCmd.class, new CitrixCleanupNetworkRulesCmdWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/751c14b9/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 75dd051..5fde596 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
@@ -1,7 +1,9 @@
package com.cloud.hypervisor.xenserver.resource.wrapper;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.spy;
@@ -30,6 +32,7 @@ import com.cloud.agent.api.AttachVolumeCommand;
import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.CheckOnHostCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
+import com.cloud.agent.api.CleanupNetworkRulesCmd;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
import com.cloud.agent.api.DeleteStoragePoolCommand;
@@ -42,7 +45,12 @@ 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.OvsCreateGreTunnelCommand;
+import com.cloud.agent.api.OvsDeleteFlowCommand;
+import com.cloud.agent.api.OvsFetchInterfaceCommand;
import com.cloud.agent.api.OvsSetTagAndFlowCommand;
+import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
+import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
import com.cloud.agent.api.PingTestCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
@@ -77,6 +85,7 @@ import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.Marshalling;
import com.xensource.xenapi.Network;
+import com.xensource.xenapi.PIF;
import com.xensource.xenapi.Types.BadServerResponse;
import com.xensource.xenapi.Types.XenAPIException;
@@ -663,6 +672,7 @@ public class CitrixRequestWrapperTest {
verify(citrixResourceBase, times(1)).getConnection();
verify(citrixResourceBase, times(1)).setupvSwitchNetwork(conn);
+ verify(citrixResourceBase, times(1)).setIsOvs(true);
assertFalse(answer.getResult());
}
@@ -704,13 +714,17 @@ public class CitrixRequestWrapperTest {
@Test
public void testOvsFetchInterfaceCommand() {
final String label = "[abc]";
+ final String uuid = "befc4dcd-f5c6-4015-8791-3c18622b7c7f";
final Connection conn = Mockito.mock(Connection.class);
final XsLocalNetwork network = Mockito.mock(XsLocalNetwork.class);
+ final Network network2 = Mockito.mock(Network.class);
+ final PIF pif = Mockito.mock(PIF.class);
+ final PIF.Record pifRec = Mockito.mock(PIF.Record.class);
final XsHost xsHost = Mockito.mock(XsHost.class);
- final SecurityGroupRulesCmd sshCommand = new SecurityGroupRulesCmd();
+ final OvsFetchInterfaceCommand fetchInterCommand = new OvsFetchInterfaceCommand(label);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
@@ -721,6 +735,11 @@ public class CitrixRequestWrapperTest {
when(citrixResourceBase.getHost()).thenReturn(xsHost);
try {
+ when(network.getNetwork()).thenReturn(network2);
+ when(network.getPif(conn)).thenReturn(pif);
+ when(network.getPif(conn)).thenReturn(pif);
+ when(pif.getRecord(conn)).thenReturn(pifRec);
+ when(network.getNetwork().getUuid(conn)).thenReturn(uuid);
when(citrixResourceBase.getNetworkByName(conn, label)).thenReturn(network);
} catch (final XenAPIException e) {
fail(e.getMessage());
@@ -728,12 +747,253 @@ public class CitrixRequestWrapperTest {
fail(e.getMessage());
}
- final Answer answer = wrapper.execute(sshCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(fetchInterCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testOvsCreateGreTunnelCommand() {
+ final String bridge = "gre";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final OvsCreateGreTunnelCommand createGreCommand = new OvsCreateGreTunnelCommand("172.0.0.1", "KEY", 1l, 2l);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+ when(citrixResourceBase.setupvSwitchNetwork(conn)).thenReturn(network);
+ try {
+ when(network.getBridge(conn)).thenReturn(bridge);
+ when(citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_create_gre", "bridge", bridge, "remoteIP", createGreCommand.getRemoteIp(), "greKey",
+ createGreCommand.getKey(), "from", Long.toString(createGreCommand.getFrom()), "to", Long.toString(createGreCommand.getTo()))).thenReturn("1:2");
+
+ } 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(createGreCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ verify(citrixResourceBase, times(1)).setIsOvs(true);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testOvsDeleteFlowCommandSuccess() {
+ final String bridge = "gre";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsDeleteFlowCommand deleteFlowCommand = new OvsDeleteFlowCommand("Test");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.setupvSwitchNetwork(conn)).thenReturn(network);
+ try {
+ when(network.getBridge(conn)).thenReturn(bridge);
+ when(citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_delete_flow", "bridge", bridge, "vmName", deleteFlowCommand.getVmName())).thenReturn("SUCCESS");
+
+ } 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(deleteFlowCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ verify(citrixResourceBase, times(1)).setIsOvs(true);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testOvsDeleteFlowCommandFailure() {
+ final String bridge = "gre";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsDeleteFlowCommand deleteFlowCommand = new OvsDeleteFlowCommand("Test");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.setupvSwitchNetwork(conn)).thenReturn(network);
+ try {
+ when(network.getBridge(conn)).thenReturn(bridge);
+ when(citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_delete_flow", "bridge", bridge, "vmName", deleteFlowCommand.getVmName())).thenReturn("FAILED");
+
+ } 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(deleteFlowCommand, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ verify(citrixResourceBase, times(1)).setIsOvs(true);
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testOvsVpcPhysicalTopologyConfigCommand() {
+ final String bridge = "gre";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsVpcPhysicalTopologyConfigCommand.Host[] hosts = new OvsVpcPhysicalTopologyConfigCommand.Host[0];
+ final OvsVpcPhysicalTopologyConfigCommand.Tier[] tiers = new OvsVpcPhysicalTopologyConfigCommand.Tier[0];
+ final OvsVpcPhysicalTopologyConfigCommand.Vm[] vms = new OvsVpcPhysicalTopologyConfigCommand.Vm[0];
+
+ final OvsVpcPhysicalTopologyConfigCommand physicalTopology = new OvsVpcPhysicalTopologyConfigCommand(hosts, tiers, vms, "10.0.0.1/24");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, physicalTopology.getBridgeName())).thenReturn(network);
+ when(network.getBridge(conn)).thenReturn(bridge);
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
+ bridge, "config", physicalTopology.getVpcConfigInJson(), "host-id", ((Long)physicalTopology.getHostId()).toString(),
+ "seq-no", Long.toString(1))).thenReturn("SUCCESS");
+
+ } 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(physicalTopology, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testOvsVpcRoutingPolicyConfigCommand() {
+ final String bridge = "gre";
+ final Connection conn = Mockito.mock(Connection.class);
+ final Network network = Mockito.mock(Network.class);
+
+ final OvsVpcRoutingPolicyConfigCommand.Acl[] acls = new OvsVpcRoutingPolicyConfigCommand.Acl[0];
+ final OvsVpcRoutingPolicyConfigCommand.Tier[] tiers = new OvsVpcRoutingPolicyConfigCommand.Tier[0];
+
+ final OvsVpcRoutingPolicyConfigCommand routingPolicy = new OvsVpcRoutingPolicyConfigCommand("v1", "10.0.0.1/24", acls, tiers);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ try {
+ when(citrixResourceBase.findOrCreateTunnelNetwork(conn, routingPolicy.getBridgeName())).thenReturn(network);
+ when(network.getBridge(conn)).thenReturn(bridge);
+
+ when(citrixResourceBase.callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge",
+ bridge, "host-id", ((Long)routingPolicy.getHostId()).toString(), "config",
+ routingPolicy.getVpcConfigInJson(), "seq-no", Long.toString(1))).thenReturn("SUCCESS");
+
+ } 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(routingPolicy, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testCleanupNetworkRulesCmd() {
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final CleanupNetworkRulesCmd cleanupNets = new CleanupNetworkRulesCmd(20);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.canBridgeFirewall()).thenReturn(true);
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+ when(citrixResourceBase.getVMInstanceName()).thenReturn("VM");
+ when(citrixResourceBase.callHostPlugin(conn, "vmops", "cleanup_rules", "instance", citrixResourceBase.getVMInstanceName())).thenReturn("1");
+
+ final Answer answer = wrapper.execute(cleanupNets, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testCleanupNetworkRulesCmdLTZ() {
+ final Connection conn = Mockito.mock(Connection.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final CleanupNetworkRulesCmd cleanupNets = new CleanupNetworkRulesCmd(20);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.canBridgeFirewall()).thenReturn(true);
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+ when(citrixResourceBase.getVMInstanceName()).thenReturn("VM");
+ when(citrixResourceBase.callHostPlugin(conn, "vmops", "cleanup_rules", "instance", citrixResourceBase.getVMInstanceName())).thenReturn("-1");
+
+ final Answer answer = wrapper.execute(cleanupNets, citrixResourceBase);
+
+ verify(citrixResourceBase, times(1)).getConnection();
+ verify(xsHost, times(1)).getIp();
+
+ assertFalse(answer.getResult());
+ assertEquals(answer.getDetails(), "-1");
+ }
+
+ @Test
+ public void testCleanupNetworkRulesCmdNullDetails() {
+ final CleanupNetworkRulesCmd cleanupNets = new CleanupNetworkRulesCmd(20);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.canBridgeFirewall()).thenReturn(false);
+ final Answer answer = wrapper.execute(cleanupNets, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ assertNull(answer.getDetails());
+ }
}
class NotAValidCommand extends Command {
[32/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4600eef8/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 6ef756c..ee9fd2b 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
@@ -19,7 +19,6 @@ package com.cloud.hypervisor.xenserver.resource;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
@@ -32,7 +31,6 @@ import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -61,87 +59,19 @@ import org.xml.sax.SAXException;
import com.cloud.agent.IAgentControl;
import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.AttachIsoCommand;
-import com.cloud.agent.api.AttachVolumeAnswer;
-import com.cloud.agent.api.AttachVolumeCommand;
-import com.cloud.agent.api.CheckHealthAnswer;
-import com.cloud.agent.api.CheckHealthCommand;
-import com.cloud.agent.api.CheckNetworkAnswer;
-import com.cloud.agent.api.CheckNetworkCommand;
-import com.cloud.agent.api.CheckOnHostAnswer;
-import com.cloud.agent.api.CheckOnHostCommand;
-import com.cloud.agent.api.CheckVirtualMachineAnswer;
-import com.cloud.agent.api.CheckVirtualMachineCommand;
-import com.cloud.agent.api.CleanupNetworkRulesCmd;
-import com.cloud.agent.api.ClusterVMMetaDataSyncAnswer;
-import com.cloud.agent.api.ClusterVMMetaDataSyncCommand;
import com.cloud.agent.api.Command;
-import com.cloud.agent.api.CreateStoragePoolCommand;
-import com.cloud.agent.api.CreateVMSnapshotAnswer;
-import com.cloud.agent.api.CreateVMSnapshotCommand;
-import com.cloud.agent.api.DeleteStoragePoolCommand;
-import com.cloud.agent.api.DeleteVMSnapshotAnswer;
-import com.cloud.agent.api.DeleteVMSnapshotCommand;
-import com.cloud.agent.api.GetHostStatsAnswer;
import com.cloud.agent.api.GetHostStatsCommand;
-import com.cloud.agent.api.GetStorageStatsAnswer;
-import com.cloud.agent.api.GetStorageStatsCommand;
-import com.cloud.agent.api.GetVmDiskStatsAnswer;
-import com.cloud.agent.api.GetVmDiskStatsCommand;
-import com.cloud.agent.api.GetVmStatsAnswer;
import com.cloud.agent.api.GetVmStatsCommand;
-import com.cloud.agent.api.GetVncPortAnswer;
-import com.cloud.agent.api.GetVncPortCommand;
import com.cloud.agent.api.HostStatsEntry;
import com.cloud.agent.api.HostVmStateReportEntry;
-import com.cloud.agent.api.MaintainAnswer;
-import com.cloud.agent.api.MaintainCommand;
-import com.cloud.agent.api.MigrateAnswer;
-import com.cloud.agent.api.MigrateCommand;
-import com.cloud.agent.api.ModifySshKeysCommand;
-import com.cloud.agent.api.ModifyStoragePoolAnswer;
-import com.cloud.agent.api.ModifyStoragePoolCommand;
-import com.cloud.agent.api.NetworkRulesSystemVmCommand;
-import com.cloud.agent.api.NetworkRulesVmSecondaryIpCommand;
-import com.cloud.agent.api.OvsCreateGreTunnelAnswer;
-import com.cloud.agent.api.OvsCreateGreTunnelCommand;
-import com.cloud.agent.api.OvsCreateTunnelAnswer;
-import com.cloud.agent.api.OvsCreateTunnelCommand;
-import com.cloud.agent.api.OvsDeleteFlowCommand;
-import com.cloud.agent.api.OvsDestroyBridgeCommand;
-import com.cloud.agent.api.OvsDestroyTunnelCommand;
-import com.cloud.agent.api.OvsFetchInterfaceAnswer;
-import com.cloud.agent.api.OvsFetchInterfaceCommand;
import com.cloud.agent.api.OvsSetTagAndFlowAnswer;
import com.cloud.agent.api.OvsSetTagAndFlowCommand;
-import com.cloud.agent.api.OvsSetupBridgeCommand;
-import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
-import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
-import com.cloud.agent.api.PerformanceMonitorAnswer;
-import com.cloud.agent.api.PerformanceMonitorCommand;
import com.cloud.agent.api.PingCommand;
import com.cloud.agent.api.PingRoutingCommand;
import com.cloud.agent.api.PingRoutingWithNwGroupsCommand;
import com.cloud.agent.api.PingRoutingWithOvsCommand;
-import com.cloud.agent.api.PingTestCommand;
-import com.cloud.agent.api.PlugNicAnswer;
-import com.cloud.agent.api.PlugNicCommand;
-import com.cloud.agent.api.PrepareForMigrationAnswer;
-import com.cloud.agent.api.PrepareForMigrationCommand;
-import com.cloud.agent.api.PvlanSetupCommand;
-import com.cloud.agent.api.ReadyAnswer;
-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.RevertToVMSnapshotAnswer;
-import com.cloud.agent.api.RevertToVMSnapshotCommand;
-import com.cloud.agent.api.ScaleVmAnswer;
-import com.cloud.agent.api.ScaleVmCommand;
-import com.cloud.agent.api.SecurityGroupRuleAnswer;
-import com.cloud.agent.api.SecurityGroupRulesCmd;
-import com.cloud.agent.api.SetupAnswer;
-import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.SetupGuestNetworkCommand;
import com.cloud.agent.api.StartAnswer;
import com.cloud.agent.api.StartCommand;
@@ -151,29 +81,13 @@ import com.cloud.agent.api.StartupStorageCommand;
import com.cloud.agent.api.StopAnswer;
import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.agent.api.UnPlugNicAnswer;
-import com.cloud.agent.api.UnPlugNicCommand;
-import com.cloud.agent.api.UpdateHostPasswordCommand;
-import com.cloud.agent.api.UpgradeSnapshotCommand;
import com.cloud.agent.api.VgpuTypesInfo;
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.proxy.CheckConsoleProxyLoadCommand;
-import com.cloud.agent.api.proxy.ConsoleProxyLoadAnswer;
-import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.routing.IpAssocCommand;
import com.cloud.agent.api.routing.IpAssocVpcCommand;
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.agent.api.routing.SetNetworkACLCommand;
import com.cloud.agent.api.routing.SetSourceNatCommand;
-import com.cloud.agent.api.storage.CreateAnswer;
-import com.cloud.agent.api.storage.CreateCommand;
-import com.cloud.agent.api.storage.DestroyCommand;
-import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
-import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
-import com.cloud.agent.api.storage.ResizeVolumeAnswer;
-import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.agent.api.to.DataStoreTO;
import com.cloud.agent.api.to.DataTO;
import com.cloud.agent.api.to.DiskTO;
@@ -181,9 +95,7 @@ import com.cloud.agent.api.to.GPUDeviceTO;
import com.cloud.agent.api.to.IpAddressTO;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.NicTO;
-import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.resource.virtualnetwork.VirtualRouterDeployer;
import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
import com.cloud.exception.InternalErrorException;
@@ -194,7 +106,6 @@ import com.cloud.network.Networks;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.PhysicalNetworkSetupInfo;
import com.cloud.resource.ServerResource;
import com.cloud.resource.hypervisor.HypervisorResource;
import com.cloud.storage.Storage;
@@ -203,7 +114,6 @@ import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.resource.StorageSubsystemCommandHandler;
import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
-import com.cloud.storage.template.TemplateProp;
import com.cloud.template.VirtualMachineTemplate.BootloaderType;
import com.cloud.utils.ExecutionResult;
import com.cloud.utils.NumbersUtil;
@@ -215,10 +125,8 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.utils.ssh.SSHCmdHelper;
import com.cloud.utils.ssh.SshHelper;
-import com.cloud.vm.DiskProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.PowerState;
-import com.cloud.vm.snapshot.VMSnapshot;
import com.trilead.ssh2.SCPClient;
import com.xensource.xenapi.Bond;
import com.xensource.xenapi.Connection;
@@ -260,57 +168,8 @@ import com.xensource.xenapi.XenAPIObject;
@Local(value = ServerResource.class)
public abstract class CitrixResourceBase implements ServerResource, HypervisorResource, VirtualRouterDeployer {
- private static final Logger s_logger = Logger.getLogger(CitrixResourceBase.class);
-
- static final Random Rand = new Random(System.currentTimeMillis());
- protected static final XenServerConnectionPool ConnPool = XenServerConnectionPool.getInstance();
-
- protected String _name;
- protected String _username;
- protected Queue<String> _password = new LinkedList<String>();
- protected final int _retry = 100;
- protected final int _sleep = 10000;
- protected long _dcId;
- protected String _pod;
- protected String _cluster;
- protected String _privateNetworkName;
- protected String _linkLocalPrivateNetworkName;
- protected String _publicNetworkName;
- protected String _storageNetworkName1;
- protected String _storageNetworkName2;
- protected String _guestNetworkName;
- protected int _wait;
- protected int _migratewait;
- protected String _instance; //instance name (default is usually "VM")
- protected boolean _securityGroupEnabled;
- protected IAgentControl _agentControl;
-
- final int _maxWeight = 256;
- protected int _heartbeatTimeout = 120;
- protected int _heartbeatInterval = 60;
- protected final XsHost _host = new XsHost();
-
- // Guest and Host Performance Statistics
- protected String _consolidationFunction = "AVERAGE";
- protected int _pollingIntervalInSeconds = 60;
-
- //Hypervisor specific params with generic value, may need to be overridden for specific versions
- long _xsMemoryUsed = 128 * 1024 * 1024L; // xenserver hypervisor used 128 M
- double _xsVirtualizationFactor = 63.0 / 64.0; // 1 - virtualization overhead
-
- //static min values for guests on xenserver
- private static final long mem_128m = 134217728L;
-
- protected boolean _canBridgeFirewall = false;
- protected boolean _isOvs = false;
- protected List<VIF> _tmpDom0Vif = new ArrayList<VIF>();
- protected StorageSubsystemCommandHandler storageHandler;
- protected int _maxNics = 7;
-
- protected VirtualRoutingResource _vrResource;
-
public enum SRType {
- NFS, LVM, ISCSI, ISO, LVMOISCSI, LVMOHBA, EXT, FILE;
+ EXT, FILE, ISCSI, ISO, LVM, LVMOHBA, LVMOISCSI, NFS;
String _str;
@@ -318,17 +177,24 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
_str = super.toString().toLowerCase();
}
+ public boolean equals(final String type) {
+ return _str.equalsIgnoreCase(type);
+ }
+
@Override
public String toString() {
return _str;
}
-
- public boolean equals(final String type) {
- return _str.equalsIgnoreCase(type);
- }
}
+ protected static final XenServerConnectionPool ConnPool = XenServerConnectionPool.getInstance();
+ //static min values for guests on xenserver
+ private static final long mem_128m = 134217728L;
+
+ static final Random Rand = new Random(System.currentTimeMillis());
+ private static final Logger s_logger = Logger.getLogger(CitrixResourceBase.class);
protected static final HashMap<VmPowerState, PowerState> s_powerStatesTable;
+
static {
s_powerStatesTable = new HashMap<VmPowerState, PowerState>();
s_powerStatesTable.put(VmPowerState.HALTED, PowerState.PowerOff);
@@ -338,44 +204,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
s_powerStatesTable.put(VmPowerState.UNRECOGNIZED, PowerState.PowerUnknown);
}
- public XsHost getHost() {
- return _host;
- }
-
- public String getVMInstanceName() {
- return _instance;
- }
-
- public void addToPwdQueue(final String password) {
- _password.add(password);
- }
-
- public VirtualRoutingResource getVirtualRoutingResource() {
- return _vrResource;
- }
-
- public boolean isOvs() {
- return _isOvs;
- }
-
- public void setIsOvs(final boolean isOvs) {
- _isOvs = isOvs;
- }
-
- 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 PowerState convertToPowerState(final VmPowerState ps) {
+ final PowerState powerState = s_powerStatesTable.get(ps);
+ return powerState == null ? PowerState.PowerUnknown : powerState;
}
private static boolean isAlienVm(final VM vm, final Connection conn) throws XenAPIException, XmlRpcException {
@@ -388,184 +219,89 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return true;
}
- public boolean cleanupHaltedVms(final Connection conn) throws XenAPIException, XmlRpcException {
- final Host host = Host.getByUuid(conn, _host.getUuid());
- final Map<VM, VM.Record> vms = VM.getAllRecords(conn);
- boolean success = true;
- if(vms != null && !vms.isEmpty()) {
- for (final Map.Entry<VM, VM.Record> entry : vms.entrySet()) {
- final VM vm = entry.getKey();
- final VM.Record vmRec = entry.getValue();
- if (vmRec.isATemplate || vmRec.isControlDomain) {
- continue;
- }
-
- if (VmPowerState.HALTED.equals(vmRec.powerState) && vmRec.affinity.equals(host) && !isAlienVm(vm, conn)) {
- try {
- vm.destroy(conn);
- } catch (final Exception e) {
- s_logger.warn("Catch Exception " + e.getClass().getName() + ": unable to destroy VM " + vmRec.nameLabel + " due to ", e);
- success = false;
- }
- }
- }
- }
- return success;
- }
-
- public boolean isRefNull(final XenAPIObject object) {
- return object == null || object.toWireString().equals("OpaqueRef:NULL") || object.toWireString().equals("<not in database>");
- }
+ protected IAgentControl _agentControl;
+ protected boolean _canBridgeFirewall = false;
+ protected String _cluster;
+ // Guest and Host Performance Statistics
+ protected String _consolidationFunction = "AVERAGE";
+ protected long _dcId;
+ protected String _guestNetworkName;
+ protected int _heartbeatInterval = 60;
+ protected int _heartbeatTimeout = 120;
+ protected final XsHost _host = new XsHost();
+ protected String _instance; //instance name (default is usually "VM")
+ protected boolean _isOvs = false;
+ protected String _linkLocalPrivateNetworkName;
+ protected int _maxNics = 7;
- @Override
- public void disconnected() {
- }
+ final int _maxWeight = 256;
+ protected int _migratewait;
+ protected String _name;
+ protected Queue<String> _password = new LinkedList<String>();
- protected boolean pingdomr(final Connection conn, final String host, final String port) {
- String status;
- status = callHostPlugin(conn, "vmops", "pingdomr", "host", host, "port", port);
+ protected String _pod;
+ protected int _pollingIntervalInSeconds = 60;
- if (status == null || status.isEmpty()) {
- return false;
- }
+ protected String _privateNetworkName;
+ protected String _publicNetworkName;
- return true;
+ protected final int _retry = 100;
- }
+ protected boolean _securityGroupEnabled;
+ protected final int _sleep = 10000;
+ protected String _storageNetworkName1;
+ protected String _storageNetworkName2;
+ protected List<VIF> _tmpDom0Vif = new ArrayList<VIF>();
- public boolean pingXAPI() {
- final Connection conn = getConnection();
- try {
- final Host host = Host.getByUuid(conn, _host.getUuid());
- if( !host.getEnabled(conn) ) {
- s_logger.debug("Host " + _host.getIp() + " is not enabled!");
- return false;
- }
- } catch (final Exception e) {
- s_logger.debug("cannot get host enabled status, host " + _host.getIp() + " due to " + e.toString(), e);
- return false;
- }
- try {
- callHostPlugin(conn, "echo", "main");
- } catch (final Exception e) {
- s_logger.debug("cannot ping host " + _host.getIp() + " due to " + e.toString(), e);
- return false;
- }
- return true;
- }
+ protected String _username;
+ protected VirtualRoutingResource _vrResource;
- protected String logX(final XenAPIObject obj, final String msg) {
- return new StringBuilder("Host ").append(_host.getIp()).append(" ").append(obj.toWireString()).append(": ").append(msg).toString();
- }
+ protected int _wait;
+ //Hypervisor specific params with generic value, may need to be overridden for specific versions
+ long _xsMemoryUsed = 128 * 1024 * 1024L; // xenserver hypervisor used 128 M
- @Override
- public Answer executeRequest(final Command cmd) {
+ double _xsVirtualizationFactor = 63.0 / 64.0; // 1 - virtualization overhead
- // We need this one because the StorageSubSystemCommand is from another hierarchy.
- if (cmd instanceof StorageSubSystemCommand) {
- return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
- }
+ protected StorageSubsystemCommandHandler storageHandler;
- final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
- try {
- return wrapper.execute(cmd, this);
- } catch (final Exception e) {
- return Answer.createUnsupportedCommandAnswer(cmd);
- }
+ public CitrixResourceBase() {
}
- @Override
- public ExecutionResult executeInVR(final String routerIP, final String script, final String args, final int timeout) {
- Pair<Boolean, String> result;
- String cmdline = "/opt/cloud/bin/router_proxy.sh " + script + " " + routerIP + " " + args;
- // semicolon need to be escape for bash
- cmdline = cmdline.replaceAll(";", "\\\\;");
- try {
- s_logger.debug("Executing command in VR: " + cmdline);
- result = SshHelper.sshExecute(_host.getIp(), 22, _username, null, _password.peek(), cmdline,
- 60000, 60000, timeout * 1000);
- } catch (final Exception e) {
- return new ExecutionResult(false, e.getMessage());
- }
- return new ExecutionResult(result.first(), result.second());
+ public void addToPwdQueue(final String password) {
+ _password.add(password);
}
- @Override
- public ExecutionResult executeInVR(final String routerIP, final String script, final String args) {
- // Timeout is 120 seconds by default
- return executeInVR(routerIP, script, args, 120);
+ protected StorageSubsystemCommandHandler buildStorageHandler() {
+ final XenServerStorageProcessor processor = new XenServerStorageProcessor(this);
+ return new StorageSubsystemCommandHandlerBase(processor);
}
- @Override
- public ExecutionResult createFileInVR(final String routerIp, final String path, final String filename, final String content) {
- final Connection conn = getConnection();
- final String hostPath = "/tmp/";
-
- s_logger.debug("Copying VR with ip " + routerIp +" config file into host "+ _host.getIp() );
+ public String callHostPlugin(final Connection conn, final String plugin, final String cmd, final String... params) {
+ final Map<String, String> args = new HashMap<String, String>();
+ String msg;
try {
- SshHelper.scpTo(_host.getIp(), 22, _username, null, _password.peek(), hostPath, content.getBytes(Charset.defaultCharset()), filename, null);
- } catch (final Exception e) {
- s_logger.warn("scp VR config file into host " + _host.getIp() + " failed with exception " + e.getMessage().toString());
- }
+ for (int i = 0; i < params.length; i += 2) {
+ args.put(params[i], params[i + 1]);
+ }
- final String rc = callHostPlugin(conn, "vmops", "createFileInDomr", "domrip", routerIp, "srcfilepath", hostPath + filename, "dstfilepath", path);
- s_logger.debug ("VR Config file " + filename + " got created in VR, ip " + routerIp + " with content \n" + content);
-
- return new ExecutionResult(rc.startsWith("succ#"), rc.substring(5));
- }
-
- @Override
- public ExecutionResult prepareCommand(final NetworkElementCommand cmd) {
- //Update IP used to access router
- cmd.setRouterAccessIp(cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP));
- assert cmd.getRouterAccessIp() != null;
-
- if (cmd instanceof IpAssocVpcCommand) {
- return prepareNetworkElementCommand((IpAssocVpcCommand)cmd);
- } else if (cmd instanceof IpAssocCommand) {
- return prepareNetworkElementCommand((IpAssocCommand)cmd);
- } else if (cmd instanceof SetupGuestNetworkCommand) {
- return prepareNetworkElementCommand((SetupGuestNetworkCommand)cmd);
- } else if (cmd instanceof SetSourceNatCommand) {
- return prepareNetworkElementCommand((SetSourceNatCommand)cmd);
- } else if (cmd instanceof SetNetworkACLCommand) {
- return prepareNetworkElementCommand((SetNetworkACLCommand)cmd);
- }
- return new ExecutionResult(true, null);
- }
-
- @Override
- public ExecutionResult cleanupCommand(final NetworkElementCommand cmd) {
- if (cmd instanceof IpAssocCommand && !(cmd instanceof IpAssocVpcCommand)) {
- return cleanupNetworkElementCommand((IpAssocCommand)cmd);
- }
- return new ExecutionResult(true, null);
- }
-
- private Answer execute(final PerformanceMonitorCommand cmd) {
- final Connection conn = getConnection();
- final String perfMon = getPerfMon(conn, cmd.getParams(), cmd.getWait());
- if (perfMon == null) {
- return new PerformanceMonitorAnswer(cmd, false, perfMon);
- } else {
- return new PerformanceMonitorAnswer(cmd, true, perfMon);
- }
- }
-
- public String getPerfMon(final Connection conn, final Map<String, String> params,
- final int wait) {
- String result = null;
- try {
- result = callHostPluginAsync(conn, "vmopspremium", "asmonitor", 60,
- params);
- if (result != null) {
- return result;
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
}
- } catch (final Exception e) {
- s_logger.error("Can not get performance monitor for AS due to ", e);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ final String result = host.callPlugin(conn, plugin, cmd, args);
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("callHostPlugin Result: " + result);
+ }
+ return result.replace("\n", "");
+ } catch (final XenAPIException e) {
+ msg = "callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString();
+ s_logger.warn(msg);
+ } catch (final XmlRpcException e) {
+ msg = "callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.getMessage();
+ s_logger.debug(msg);
}
- return null;
+ throw new CloudRuntimeException(msg);
}
protected String callHostPluginAsync(final Connection conn, final String plugin,
@@ -614,866 +350,662 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- public void scaleVM(final Connection conn, final VM vm, final VirtualMachineTO vmSpec, final Host host) throws XenAPIException, XmlRpcException {
-
- final Long staticMemoryMax = vm.getMemoryStaticMax(conn);
- final Long staticMemoryMin = vm.getMemoryStaticMin(conn);
- final Long newDynamicMemoryMin = vmSpec.getMinRam();
- final Long newDynamicMemoryMax = vmSpec.getMaxRam();
- if (staticMemoryMin > newDynamicMemoryMin || newDynamicMemoryMax > staticMemoryMax) {
- throw new CloudRuntimeException("Cannot scale up the vm because of memory constraint violation: " + "0 <= memory-static-min(" + staticMemoryMin +
- ") <= memory-dynamic-min(" + newDynamicMemoryMin + ") <= memory-dynamic-max(" + newDynamicMemoryMax + ") <= memory-static-max(" + staticMemoryMax + ")");
- }
-
- vm.setMemoryDynamicRange(conn, newDynamicMemoryMin, newDynamicMemoryMax);
- vm.setVCPUsNumberLive(conn, (long)vmSpec.getCpus());
-
- final Integer speed = vmSpec.getMinSpeed();
- if (speed != null) {
-
- int cpuWeight = _maxWeight; //cpu_weight
-
- // weight based allocation
-
- cpuWeight = (int)(speed * 0.99 / _host.getSpeed() * _maxWeight);
- if (cpuWeight > _maxWeight) {
- cpuWeight = _maxWeight;
- }
-
- if (vmSpec.getLimitCpuUse()) {
- long utilization = 0; // max CPU cap, default is unlimited
- utilization = (int)(vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.getSpeed() * 100);
- //vm.addToVCPUsParamsLive(conn, "cap", Long.toString(utilization)); currently xenserver doesnot support Xapi to add VCPUs params live.
- callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", Long.toString(utilization), "vmname", vmSpec.getName());
- }
- //vm.addToVCPUsParamsLive(conn, "weight", Integer.toString(cpuWeight));
- callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", Integer.toString(cpuWeight), "vmname", vmSpec.getName());
- }
- }
-
- public ScaleVmAnswer execute(final ScaleVmCommand cmd) {
- final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
- final String vmName = vmSpec.getName();
+ protected String callHostPluginAsync(final Connection conn, final String plugin, final String cmd, final int wait, final String... params) {
+ final int timeout = wait * 1000;
+ final Map<String, String> args = new HashMap<String, String>();
+ Task task = null;
try {
- final Connection conn = getConnection();
- final Set<VM> vms = VM.getByNameLabel(conn, vmName);
- final Host host = Host.getByUuid(conn, _host.getUuid());
-
- // If DMC is not enable then don't execute this command.
- if (!isDmcEnabled(conn, host)) {
- throw new CloudRuntimeException("Unable to scale the vm: " + vmName + " as DMC - Dynamic memory control is not enabled for the XenServer:" + _host.getUuid() +
- " ,check your license and hypervisor version.");
+ for (int i = 0; i < params.length; i += 2) {
+ args.put(params[i], params[i + 1]);
}
-
- // stop vm which is running on this host or is in halted state
- final Iterator<VM> iter = vms.iterator();
- while (iter.hasNext()) {
- final VM vm = iter.next();
- final VM.Record vmr = vm.getRecord(conn);
-
- if (vmr.powerState == VmPowerState.HALTED ||
- vmr.powerState == VmPowerState.RUNNING && !isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(_host.getUuid())) {
- iter.remove();
- }
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
}
-
- if (vms.size() == 0) {
- s_logger.info("No running VM " + vmName + " exists on XenServer" + _host.getUuid());
- return new ScaleVmAnswer(cmd, false, "VM does not exist");
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ task = host.callPluginAsync(conn, plugin, cmd, args);
+ // poll every 1 seconds
+ waitForTask(conn, task, 1000, timeout);
+ checkForSuccess(conn, task);
+ final String result = task.getResult(conn);
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("callHostPlugin Result: " + result);
}
-
- for (final VM vm : vms) {
- vm.getRecord(conn);
+ return result.replace("<value>", "").replace("</value>", "").replace("\n", "");
+ } catch (final Types.HandleInvalid e) {
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to HandleInvalid clazz:" + e.clazz + ", handle:" +
+ e.handle);
+ } catch (final XenAPIException e) {
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString(), e);
+ } catch (final Exception e) {
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.getMessage(), e);
+ } finally {
+ if (task != null) {
try {
- scaleVM(conn, vm, vmSpec, host);
- } catch (final Exception e) {
- final String msg = "Catch exception " + e.getClass().getName() + " when scaling VM:" + vmName + " due to " + e.toString();
- s_logger.debug(msg);
- return new ScaleVmAnswer(cmd, false, msg);
+ task.destroy(conn);
+ } catch (final Exception e1) {
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e1.toString());
}
-
}
- final String msg = "scaling VM " + vmName + " is successful on host " + host;
- s_logger.debug(msg);
- return new ScaleVmAnswer(cmd, true, msg);
-
- } catch (final XenAPIException e) {
- final String msg = "Upgrade Vm " + vmName + " fail due to " + e.toString();
- s_logger.warn(msg, e);
- return new ScaleVmAnswer(cmd, false, msg);
- } catch (final XmlRpcException e) {
- final String msg = "Upgrade Vm " + vmName + " fail due to " + e.getMessage();
- s_logger.warn(msg, e);
- return new ScaleVmAnswer(cmd, false, msg);
- } catch (final Exception e) {
- final String msg = "Unable to upgrade " + vmName + " due to " + e.getMessage();
- s_logger.warn(msg, e);
- return new ScaleVmAnswer(cmd, false, msg);
}
+ return null;
}
- private Answer execute(final RevertToVMSnapshotCommand cmd) {
- final String vmName = cmd.getVmName();
- final List<VolumeObjectTO> listVolumeTo = cmd.getVolumeTOs();
- final VMSnapshot.Type vmSnapshotType = cmd.getTarget().getType();
- final Boolean snapshotMemory = vmSnapshotType == VMSnapshot.Type.DiskAndMemory;
- final Connection conn = getConnection();
- PowerState vmState = null;
- VM vm = null;
- try {
-
- final Set<VM> vmSnapshots = VM.getByNameLabel(conn, cmd.getTarget().getSnapshotName());
- if (vmSnapshots.size() == 0) {
- return new RevertToVMSnapshotAnswer(cmd, false, "Cannot find vmSnapshot with name: " + cmd.getTarget().getSnapshotName());
- }
-
- final VM vmSnapshot = vmSnapshots.iterator().next();
+ public String callHostPluginPremium(final Connection conn, final String cmd, final String... params) {
+ return callHostPlugin(conn, "vmopspremium", cmd, params);
+ }
- // find target VM or creating a work VM
- try {
- vm = getVM(conn, vmName);
- } catch (final Exception e) {
- vm = createWorkingVM(conn, vmName, cmd.getGuestOSType(), cmd.getPlatformEmulator(), listVolumeTo);
- }
+ protected String callHostPluginThroughMaster(final Connection conn, final String plugin, final String cmd, final String... params) {
+ final Map<String, String> args = new HashMap<String, String>();
- if (vm == null) {
- return new RevertToVMSnapshotAnswer(cmd, false, "Revert to VM Snapshot Failed due to can not find vm: " + vmName);
+ try {
+ final Map<Pool, Pool.Record> poolRecs = Pool.getAllRecords(conn);
+ if (poolRecs.size() != 1) {
+ throw new CloudRuntimeException("There are " + poolRecs.size() + " pool for host :" + _host.getUuid());
}
-
- // call plugin to execute revert
- revertToSnapshot(conn, vmSnapshot, vmName, vm.getUuid(conn), snapshotMemory, _host.getUuid());
- vm = getVM(conn, vmName);
- final Set<VBD> vbds = vm.getVBDs(conn);
- final Map<String, VDI> vdiMap = new HashMap<String, VDI>();
- // get vdi:vbdr to a map
- for (final VBD vbd : vbds) {
- final VBD.Record vbdr = vbd.getRecord(conn);
- if (vbdr.type == Types.VbdType.DISK) {
- final VDI vdi = vbdr.VDI;
- vdiMap.put(vbdr.userdevice, vdi);
- }
+ final Host master = poolRecs.values().iterator().next().master;
+ for (int i = 0; i < params.length; i += 2) {
+ args.put(params[i], params[i + 1]);
}
- if (!snapshotMemory) {
- vm.destroy(conn);
- vmState = PowerState.PowerOff;
- } else {
- vmState = PowerState.PowerOn;
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
}
-
- // after revert, VM's volumes path have been changed, need to report to manager
- for (final VolumeObjectTO volumeTo : listVolumeTo) {
- final Long deviceId = volumeTo.getDeviceId();
- final VDI vdi = vdiMap.get(deviceId.toString());
- volumeTo.setPath(vdi.getUuid(conn));
+ final String result = master.callPlugin(conn, plugin, cmd, args);
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("callHostPlugin Result: " + result);
}
-
- return new RevertToVMSnapshotAnswer(cmd, listVolumeTo, vmState);
- } catch (final Exception e) {
- s_logger.error("revert vm " + vmName + " to snapshot " + cmd.getTarget().getSnapshotName() + " failed due to " + e.getMessage());
- return new RevertToVMSnapshotAnswer(cmd, false, e.getMessage());
+ return result.replace("\n", "");
+ } catch (final Types.HandleInvalid e) {
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to HandleInvalid clazz:" + e.clazz + ", handle:" +
+ e.handle);
+ } catch (final XenAPIException e) {
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString(), e);
+ } catch (final XmlRpcException e) {
+ s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.getMessage(), e);
}
+ return null;
}
- public String revertToSnapshot(final Connection conn, final VM vmSnapshot, final String vmName, final String oldVmUuid, final Boolean snapshotMemory, final String hostUUID) throws XenAPIException,
- XmlRpcException {
+ public boolean canBridgeFirewall() {
+ return _canBridgeFirewall;
+ }
- final String results =
- callHostPluginAsync(conn, "vmopsSnapshot", "revert_memory_snapshot", 10 * 60 * 1000, "snapshotUUID", vmSnapshot.getUuid(conn), "vmName", vmName, "oldVmUuid",
- oldVmUuid, "snapshotMemory", snapshotMemory.toString(), "hostUUID", hostUUID);
- String errMsg = null;
- if (results == null || results.isEmpty()) {
- errMsg = "revert_memory_snapshot return null";
- } else {
- if (results.equals("0")) {
- return results;
- } else {
- errMsg = "revert_memory_snapshot exception";
- }
- }
- s_logger.warn(errMsg);
- throw new CloudRuntimeException(errMsg);
+ public boolean canBridgeFirewall(final Connection conn) {
+ return Boolean.valueOf(callHostPlugin(conn, "vmops", "can_bridge_firewall", "host_uuid", _host.getUuid(), "instance", _instance));
}
- public XsLocalNetwork getNativeNetworkForTraffic(final Connection conn, final TrafficType type, final String name) throws XenAPIException, XmlRpcException {
- if (name != null) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Looking for network named " + name);
+ public void checkForSuccess(final Connection c, final Task task) throws XenAPIException, XmlRpcException {
+ if (task.getStatus(c) == Types.TaskStatusType.SUCCESS) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Task " + task.getNameLabel(c) + " (" + task.getUuid(c) + ") completed");
}
- return getNetworkByName(conn, name);
- }
-
- if (type == TrafficType.Guest) {
- return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getGuestNetwork()), null, PIF.getByUuid(conn, _host.getGuestPif()), null);
- } else if (type == TrafficType.Control) {
- setupLinkLocalNetwork(conn);
- return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getLinkLocalNetwork()));
- } else if (type == TrafficType.Management) {
- return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getPrivateNetwork()), null, PIF.getByUuid(conn, _host.getPrivatePif()), null);
- } else if (type == TrafficType.Public) {
- return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getPublicNetwork()), null, PIF.getByUuid(conn, _host.getPublicPif()), null);
- } else if (type == TrafficType.Storage) {
- /* TrafficType.Storage is for secondary storage, while storageNetwork1 is for primary storage, we need better name here */
- return new XsLocalNetwork(this, Network.getByUuid(conn, _host.getStorageNetwork1()), null, PIF.getByUuid(conn, _host.getStoragePif1()), null);
+ return;
+ } else {
+ final String msg = "Task failed! Task record: " + task.getRecord(c);
+ s_logger.warn(msg);
+ task.cancel(c);
+ task.destroy(c);
+ throw new Types.BadAsyncResult(msg);
}
-
- throw new CloudRuntimeException("Unsupported network type: " + type);
}
- public synchronized Network setupvSwitchNetwork(final Connection conn) {
+ protected boolean checkSR(final Connection conn, final SR sr) {
try {
- if (_host.getVswitchNetwork() == null) {
- Network vswitchNw = null;
- final Network.Record rec = new Network.Record();
- final String nwName = Networks.BroadcastScheme.VSwitch.toString();
- final Set<Network> networks = Network.getByNameLabel(conn, nwName);
-
- if (networks.size() == 0) {
- rec.nameDescription = "vswitch network for " + nwName;
- rec.nameLabel = nwName;
- vswitchNw = Network.create(conn, rec);
- } else {
- vswitchNw = networks.iterator().next();
- }
- _host.setVswitchNetwork(vswitchNw);
+ final SR.Record srr = sr.getRecord(conn);
+ final Set<PBD> pbds = sr.getPBDs(conn);
+ if (pbds.size() == 0) {
+ final String msg = "There is no PBDs for this SR: " + srr.nameLabel + " on host:" + _host.getUuid();
+ s_logger.warn(msg);
+ return false;
}
- return _host.getVswitchNetwork();
- } catch (final BadServerResponse e) {
- s_logger.error("Failed to setup vswitch network", e);
- } catch (final XenAPIException e) {
- s_logger.error("Failed to setup vswitch network", e);
- } catch (final XmlRpcException e) {
- s_logger.error("Failed to setup vswitch network", e);
- }
-
- return null;
- }
-
- /**
- * This method just creates a XenServer network following the tunnel network naming convention
- */
- public synchronized Network findOrCreateTunnelNetwork(final Connection conn, final String nwName) {
- try {
- Network nw = null;
- final Network.Record rec = new Network.Record();
- final Set<Network> networks = Network.getByNameLabel(conn, nwName);
-
- if (networks.size() == 0) {
- rec.nameDescription = "tunnel network id# " + nwName;
- rec.nameLabel = nwName;
- //Initialize the ovs-host-setup to avoid error when doing get-param in plugin
- final Map<String, String> otherConfig = new HashMap<String, String>();
- otherConfig.put("ovs-host-setup", "");
- // Mark 'internal network' as shared so bridge gets automatically created on each host in the cluster
- // when VM with vif connected to this internal network is started
- otherConfig.put("assume_network_is_shared", "true");
- rec.otherConfig = otherConfig;
- nw = Network.create(conn, rec);
- s_logger.debug("### XenServer network for tunnels created:" + nwName);
- } else {
- nw = networks.iterator().next();
- s_logger.debug("XenServer network for tunnels found:" + nwName);
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Checking " + srr.nameLabel + " or SR " + srr.uuid + " on " + _host);
}
- return nw;
- } catch (final Exception e) {
- s_logger.warn("createTunnelNetwork failed", e);
- return null;
- }
- }
+ if (srr.shared) {
+ if (SRType.NFS.equals(srr.type) ){
+ final Map<String, String> smConfig = srr.smConfig;
+ if( !smConfig.containsKey("nosubdir")) {
+ smConfig.put("nosubdir", "true");
+ sr.setSmConfig(conn,smConfig);
+ }
+ }
- /**
- * This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
- */
- public synchronized Network configureTunnelNetwork(final Connection conn, final Long networkId, final long hostId, final String bridgeName) {
- try {
- final Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
- final String nwName = bridgeName;
- //Invoke plugin to setup the bridge which will be used by this network
- final String bridge = nw.getBridge(conn);
- final Map<String, String> nwOtherConfig = nw.getOtherConfig(conn);
- final String configuredHosts = nwOtherConfig.get("ovs-host-setup");
- boolean configured = false;
- if (configuredHosts != null) {
- final String hostIdsStr[] = configuredHosts.split(",");
- for (final String hostIdStr : hostIdsStr) {
- if (hostIdStr.equals(((Long)hostId).toString())) {
- configured = true;
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ boolean found = false;
+ for (final PBD pbd : pbds) {
+ final PBD.Record pbdr = pbd.getRecord(conn);
+ if (host.equals(pbdr.host)) {
+ if (!pbdr.currentlyAttached) {
+ pbdPlug(conn, pbd, pbdr.uuid);
+ }
+ found = true;
break;
}
}
- }
-
- if (!configured) {
- String result;
- if (bridgeName.startsWith("OVS-DR-VPC-Bridge")) {
- result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge_for_distributed_routing", "bridge", bridge,
- "key", bridgeName,
- "xs_nw_uuid", nw.getUuid(conn),
- "cs_host_id", ((Long)hostId).toString());
- } else {
- result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge", "bridge", bridge,
- "key", bridgeName,
- "xs_nw_uuid", nw.getUuid(conn),
- "cs_host_id", ((Long)hostId).toString());
+ if (!found) {
+ final PBD.Record pbdr = srr.PBDs.iterator().next().getRecord(conn);
+ pbdr.host = host;
+ pbdr.uuid = "";
+ final PBD pbd = PBD.create(conn, pbdr);
+ pbdPlug(conn, pbd, pbd.getUuid(conn));
}
-
- //Note down the fact that the ovs bridge has been setup
- final String[] res = result.split(":");
- if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
- //TODO: Should make this error not fatal?
- throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge );
+ } else {
+ for (final PBD pbd : pbds) {
+ final PBD.Record pbdr = pbd.getRecord(conn);
+ if (!pbdr.currentlyAttached) {
+ pbdPlug(conn, pbd, pbdr.uuid);
+ }
}
}
- return nw;
- } catch (final Exception e) {
- s_logger.warn("createandConfigureTunnelNetwork failed", e);
- return null;
- }
- }
- public synchronized void destroyTunnelNetwork(final Connection conn, final Network nw, final long hostId) {
- try {
- final String bridge = nw.getBridge(conn);
- final String result = callHostPlugin(conn, "ovstunnel", "destroy_ovs_bridge", "bridge", bridge,
- "cs_host_id", ((Long)hostId).toString());
- final String[] res = result.split(":");
- if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
- //TODO: Should make this error not fatal?
- //Can Concurrent VM shutdown/migration/reboot events can cause this method
- //to be executed on a bridge which has already been removed?
- throw new CloudRuntimeException("Unable to remove OVS bridge " + bridge + ":" + result);
- }
- return;
} catch (final Exception e) {
- s_logger.warn("destroyTunnelNetwork failed:", e);
- return;
+ final String msg = "checkSR failed host:" + _host + " due to " + e.toString();
+ s_logger.warn(msg, e);
+ return false;
}
+ return true;
}
- public Network getNetwork(final Connection conn, final NicTO nic) throws XenAPIException, XmlRpcException {
- final String name = nic.getName();
- final XsLocalNetwork network = getNativeNetworkForTraffic(conn, nic.getType(), name);
- if (network == null) {
- s_logger.error("Network is not configured on the backend for nic " + nic.toString());
- throw new CloudRuntimeException("Network for the backend is not configured correctly for network broadcast domain: " + nic.getBroadcastUri());
+ private void CheckXenHostInfo() throws ConfigurationException {
+ final Connection conn = ConnPool.getConnect(_host.getIp(), _username, _password);
+ if( conn == null ) {
+ throw new ConfigurationException("Can not create connection to " + _host.getIp());
}
- final URI uri = nic.getBroadcastUri();
- final BroadcastDomainType type = nic.getBroadcastType();
- if (uri != null && uri.toString().contains("untagged")) {
- return network.getNetwork();
- } else if (uri != null && type == BroadcastDomainType.Vlan) {
- assert BroadcastDomainType.getSchemeValue(uri) == BroadcastDomainType.Vlan;
- final long vlan = Long.parseLong(BroadcastDomainType.getValue(uri));
- return enableVlanNetwork(conn, vlan, network);
- } else if (type == BroadcastDomainType.Native || type == BroadcastDomainType.LinkLocal ||
- type == BroadcastDomainType.Vsp) {
- return network.getNetwork();
- } else if (uri != null && type == BroadcastDomainType.Vswitch) {
- final String header = uri.toString().substring(Networks.BroadcastDomainType.Vswitch.scheme().length() + "://".length());
- if (header.startsWith("vlan")) {
- _isOvs = true;
- return setupvSwitchNetwork(conn);
- } else {
- return findOrCreateTunnelNetwork(conn, getOvsTunnelNetworkName(uri.getAuthority()));
+ try {
+ Host.Record hostRec = null;
+ try {
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ hostRec = host.getRecord(conn);
+ final Pool.Record poolRec = Pool.getAllRecords(conn).values().iterator().next();
+ _host.setPool(poolRec.uuid);
+
+ } catch (final Exception e) {
+ throw new ConfigurationException("Can not get host information from " + _host.getIp());
}
- } else if (type == BroadcastDomainType.Storage) {
- if (uri == null) {
- return network.getNetwork();
- } else {
- final long vlan = Long.parseLong(BroadcastDomainType.getValue(uri));
- return enableVlanNetwork(conn, vlan, network);
+ if (!hostRec.address.equals(_host.getIp())) {
+ final String msg = "Host " + _host.getIp() + " seems be reinstalled, please remove this host and readd";
+ s_logger.error(msg);
+ throw new ConfigurationException(msg);
}
- } else if (type == BroadcastDomainType.Lswitch) {
- // Nicira Logical Switch
- return network.getNetwork();
- } else if (uri != null && type == BroadcastDomainType.Pvlan) {
- assert BroadcastDomainType.getSchemeValue(uri) == BroadcastDomainType.Pvlan;
- // should we consider moving this NetUtils method to BroadcastDomainType?
- final long vlan = Long.parseLong(NetUtils.getPrimaryPvlanFromUri(uri));
- return enableVlanNetwork(conn, vlan, network);
- }
-
- throw new CloudRuntimeException("Unable to support this type of network broadcast domain: " + nic.getBroadcastUri());
- }
-
- private String getOvsTunnelNetworkName(final String broadcastUri) {
- if (broadcastUri.contains(".")) {
- final String[] parts = broadcastUri.split("\\.");
- return "OVS-DR-VPC-Bridge"+parts[0];
- } else {
+ } finally {
try {
- return "OVSTunnel" + broadcastUri;
+ Session.logout(conn);
} catch (final Exception e) {
- return null;
}
}
}
- public VIF createVif(final Connection conn, final String vmName, final VM vm, final VirtualMachineTO vmSpec, final NicTO nic) throws XmlRpcException, XenAPIException {
- assert nic.getUuid() != null : "Nic should have a uuid value";
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Creating VIF for " + vmName + " on nic " + nic);
- }
- VIF.Record vifr = new VIF.Record();
- vifr.VM = vm;
- vifr.device = Integer.toString(nic.getDeviceId());
- vifr.MAC = nic.getMac();
-
- // Nicira needs these IDs to find the NIC
- vifr.otherConfig = new HashMap<String, String>();
- vifr.otherConfig.put("nicira-iface-id", nic.getUuid());
- vifr.otherConfig.put("nicira-vm-id", vm.getUuid(conn));
- // Provide XAPI with the cloudstack vm and nic uids.
- vifr.otherConfig.put("cloudstack-nic-id", nic.getUuid());
- if (vmSpec != null) {
- vifr.otherConfig.put("cloudstack-vm-id", vmSpec.getUuid());
+ @Override
+ public ExecutionResult cleanupCommand(final NetworkElementCommand cmd) {
+ if (cmd instanceof IpAssocCommand && !(cmd instanceof IpAssocVpcCommand)) {
+ return cleanupNetworkElementCommand((IpAssocCommand)cmd);
}
+ return new ExecutionResult(true, null);
+ }
- // OVS plugin looks at network UUID in the vif 'otherconfig' details to group VIF's & tunnel ports as part of tier
- // when bridge is setup for distributed routing
- vifr.otherConfig.put("cloudstack-network-id", nic.getNetworkUuid());
- // Nuage Vsp needs Virtual Router IP to be passed in the otherconfig
- // get the virtual router IP information from broadcast uri
- final URI broadcastUri = nic.getBroadcastUri();
- if (broadcastUri != null && broadcastUri.getScheme().equalsIgnoreCase(Networks.BroadcastDomainType.Vsp.scheme())) {
- final String path = broadcastUri.getPath();
- vifr.otherConfig.put("vsp-vr-ip", path.substring(1));
- }
- vifr.network = getNetwork(conn, nic);
-
- if (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) {
- vifr.qosAlgorithmType = "ratelimit";
- vifr.qosAlgorithmParams = new HashMap<String, String>();
- // convert mbs to kilobyte per second
- vifr.qosAlgorithmParams.put("kbps", Integer.toString(nic.getNetworkRateMbps() * 128));
- }
+ public boolean cleanupHaltedVms(final Connection conn) throws XenAPIException, XmlRpcException {
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ final Map<VM, VM.Record> vms = VM.getAllRecords(conn);
+ boolean success = true;
+ if(vms != null && !vms.isEmpty()) {
+ for (final Map.Entry<VM, VM.Record> entry : vms.entrySet()) {
+ final VM vm = entry.getKey();
+ final VM.Record vmRec = entry.getValue();
+ if (vmRec.isATemplate || vmRec.isControlDomain) {
+ continue;
+ }
- vifr.lockingMode = Types.VifLockingMode.NETWORK_DEFAULT;
- final VIF vif = VIF.create(conn, vifr);
- if (s_logger.isDebugEnabled()) {
- vifr = vif.getRecord(conn);
- if(vifr != null) {
- s_logger.debug("Created a vif " + vifr.uuid + " on " + nic.getDeviceId());
+ if (VmPowerState.HALTED.equals(vmRec.powerState) && vmRec.affinity.equals(host) && !isAlienVm(vm, conn)) {
+ try {
+ vm.destroy(conn);
+ } catch (final Exception e) {
+ s_logger.warn("Catch Exception " + e.getClass().getName() + ": unable to destroy VM " + vmRec.nameLabel + " due to ", e);
+ success = false;
+ }
+ }
}
}
-
- return vif;
+ return success;
}
- public void prepareISO(final Connection conn, final String vmName) throws XmlRpcException, XenAPIException {
+ protected ExecutionResult cleanupNetworkElementCommand(final IpAssocCommand cmd) {
+ final Connection conn = getConnection();
+ final String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
+ final String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
+ try {
+ final IpAddressTO[] ips = cmd.getIpAddresses();
+ final int ipsCount = ips.length;
+ for (final IpAddressTO ip : ips) {
- final Set<VM> vms = VM.getByNameLabel(conn, vmName);
- if (vms == null || vms.size() != 1) {
- throw new CloudRuntimeException("There are " + (vms == null ? "0" : vms.size()) + " VMs named " + vmName);
- }
- final VM vm = vms.iterator().next();
- final Set<VBD> vbds = vm.getVBDs(conn);
- for (final VBD vbd : vbds) {
- final VBD.Record vbdr = vbd.getRecord(conn);
- if (vbdr.type == Types.VbdType.CD && vbdr.empty == false) {
- final VDI vdi = vbdr.VDI;
- final SR sr = vdi.getSR(conn);
- final Set<PBD> pbds = sr.getPBDs(conn);
- if (pbds == null) {
- throw new CloudRuntimeException("There is no pbd for sr " + sr);
+ final VM router = getVM(conn, routerName);
+
+ final NicTO nic = new NicTO();
+ nic.setMac(ip.getVifMacAddress());
+ nic.setType(ip.getTrafficType());
+ if (ip.getBroadcastUri()== null) {
+ nic.setBroadcastType(BroadcastDomainType.Native);
+ } else {
+ final URI uri = BroadcastDomainType.fromString(ip.getBroadcastUri());
+ nic.setBroadcastType(BroadcastDomainType.getSchemeValue(uri));
+ nic.setBroadcastUri(uri);
}
- for (final PBD pbd : pbds) {
- final PBD.Record pbdr = pbd.getRecord(conn);
- if (pbdr.host.getUuid(conn).equals(_host.getUuid())) {
- return;
+ nic.setDeviceId(0);
+ nic.setNetworkRateMbps(ip.getNetworkRate());
+ nic.setName(ip.getNetworkName());
+
+ Network network = getNetwork(conn, nic);
+
+
+ // If we are disassociating the last IP address in the VLAN, we need
+ // to remove a VIF
+ boolean removeVif = false;
+
+ //there is only one ip in this public vlan and removing it, so remove the nic
+ if (ipsCount == 1 && !ip.isAdd()) {
+ removeVif = true;
+ }
+
+ if (removeVif) {
+
+ // Determine the correct VIF on DomR to associate/disassociate the
+ // IP address with
+ final VIF correctVif = getCorrectVif(conn, router, network);
+ if (correctVif != null) {
+ network = correctVif.getNetwork(conn);
+
+ // Mark this vif to be removed from network usage
+ networkUsage(conn, routerIp, "deleteVif", "eth" + correctVif.getDevice(conn));
+
+ // Remove the VIF from DomR
+ correctVif.unplug(conn);
+ correctVif.destroy(conn);
+
+ // Disable the VLAN network if necessary
+ disableVlanNetwork(conn, network);
}
}
- sr.setShared(conn, true);
- final Host host = Host.getByUuid(conn, _host.getUuid());
- final PBD.Record pbdr = pbds.iterator().next().getRecord(conn);
- pbdr.host = host;
- pbdr.uuid = "";
- final PBD pbd = PBD.create(conn, pbdr);
- pbdPlug(conn, pbd, pbd.getUuid(conn));
- break;
}
+ } catch (final Exception e) {
+ s_logger.debug("Ip Assoc failure on applying one ip due to exception: ", e);
+ return new ExecutionResult(false, e.getMessage());
}
+ return new ExecutionResult(true, null);
}
- protected VDI mount(final Connection conn, final String vmName, final DiskTO volume) throws XmlRpcException, XenAPIException {
- final DataTO data = volume.getData();
- final Volume.Type type = volume.getType();
- if (type == Volume.Type.ISO) {
- final TemplateObjectTO iso = (TemplateObjectTO)data;
- final DataStoreTO store = iso.getDataStore();
-
- if (store == null) {
- //It's a fake iso
- return null;
+ public void cleanupTemplateSR(final Connection conn) {
+ Set<PBD> pbds = null;
+ try {
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ pbds = host.getPBDs(conn);
+ } catch (final XenAPIException e) {
+ s_logger.warn("Unable to get the SRs " + e.toString(), e);
+ throw new CloudRuntimeException("Unable to get SRs " + e.toString(), e);
+ } catch (final Exception e) {
+ throw new CloudRuntimeException("Unable to get SRs " + e.getMessage(), e);
+ }
+ for (final PBD pbd : pbds) {
+ SR sr = null;
+ SR.Record srRec = null;
+ try {
+ sr = pbd.getSR(conn);
+ srRec = sr.getRecord(conn);
+ } catch (final Exception e) {
+ s_logger.warn("pbd.getSR get Exception due to ", e);
+ continue;
}
-
- //corer case, xenserver pv driver iso
- final String templateName = iso.getName();
- if (templateName.startsWith("xs-tools")) {
+ final String type = srRec.type;
+ if (srRec.shared) {
+ continue;
+ }
+ if (SRType.NFS.equals(type) || SRType.ISO.equals(type) && srRec.nameDescription.contains("template")) {
try {
- final Set<VDI> vdis = VDI.getByNameLabel(conn, templateName);
- if (vdis.isEmpty()) {
- throw new CloudRuntimeException("Could not find ISO with URL: " + templateName);
- }
- return vdis.iterator().next();
- } catch (final XenAPIException e) {
- throw new CloudRuntimeException("Unable to get pv iso: " + templateName + " due to " + e.toString());
+ pbd.unplug(conn);
+ pbd.destroy(conn);
+ sr.forget(conn);
} catch (final Exception e) {
- throw new CloudRuntimeException("Unable to get pv iso: " + templateName + " due to " + e.toString());
+ s_logger.warn("forget SR catch Exception due to ", e);
}
}
+ }
+ }
- if (!(store instanceof NfsTO)) {
- throw new CloudRuntimeException("only support mount iso on nfs");
- }
- final NfsTO nfsStore = (NfsTO)store;
- final String isoPath = nfsStore.getUrl() + File.separator + iso.getPath();
- final int index = isoPath.lastIndexOf("/");
+ public void cleanUpTmpDomVif(final Connection conn, final Network nw) throws XenAPIException, XmlRpcException {
- final String mountpoint = isoPath.substring(0, index);
- URI uri;
+ final Pair<VM, VM.Record> vm = getControlDomain(conn);
+ final VM dom0 = vm.first();
+ final Set<VIF> dom0Vifs = dom0.getVIFs(conn);
+ for (final VIF v : dom0Vifs) {
+ String vifName = "unknown";
try {
- uri = new URI(mountpoint);
- } catch (final URISyntaxException e) {
- throw new CloudRuntimeException("Incorrect uri " + mountpoint, e);
- }
- final SR isoSr = createIsoSRbyURI(conn, uri, vmName, false);
-
- final String isoname = isoPath.substring(index + 1);
-
- final VDI isoVdi = getVDIbyLocationandSR(conn, isoname, isoSr);
-
- if (isoVdi == null) {
- throw new CloudRuntimeException("Unable to find ISO " + isoPath);
+ final VIF.Record vifr = v.getRecord(conn);
+ if (v.getNetwork(conn).getUuid(conn).equals(nw.getUuid(conn))) {
+ if(vifr != null) {
+ final Map<String, String> config = vifr.otherConfig;
+ vifName = config.get("nameLabel");
+ }
+ s_logger.debug("A VIF in dom0 for the network is found - so destroy the vif");
+ v.destroy(conn);
+ s_logger.debug("Destroy temp dom0 vif" + vifName + " success");
+ }
+ } catch (final Exception e) {
+ s_logger.warn("Destroy temp dom0 vif " + vifName + "failed", e);
}
- return isoVdi;
- } else {
- final VolumeObjectTO vol = (VolumeObjectTO)data;
- return VDI.getByUuid(conn, vol.getPath());
}
}
- public VBD createVbd(final Connection conn, final DiskTO volume, final String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi) throws XmlRpcException, XenAPIException {
- final Volume.Type type = volume.getType();
-
- if (vdi == null) {
- vdi = mount(conn, vmName, volume);
+ protected VDI cloudVDIcopy(final Connection conn, final VDI vdi, final SR sr, int wait) throws Exception {
+ Task task = null;
+ if (wait == 0) {
+ wait = 2 * 60 * 60;
}
-
- if (vdi != null) {
- if ("detached".equals(vdi.getNameLabel(conn))) {
- vdi.setNameLabel(conn, vmName + "-DATA");
- }
-
- final Map<String, String> smConfig = vdi.getSmConfig(conn);
- for (final String key : smConfig.keySet()) {
- if (key.startsWith("host_")) {
- vdi.removeFromSmConfig(conn, key);
- break;
+ try {
+ task = vdi.copyAsync(conn, sr);
+ // poll every 1 seconds , timeout after 2 hours
+ waitForTask(conn, task, 1000, (long)wait * 1000);
+ checkForSuccess(conn, task);
+ final VDI dvdi = Types.toVDI(task, conn);
+ return dvdi;
+ } finally {
+ if (task != null) {
+ try {
+ task.destroy(conn);
+ } catch (final Exception e) {
+ s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.getUuid() + ") due to " + e.toString());
}
}
}
- final VBD.Record vbdr = new VBD.Record();
- vbdr.VM = vm;
- if (vdi != null) {
- vbdr.VDI = vdi;
- } else {
- vbdr.empty = true;
- }
- if (type == Volume.Type.ROOT && bootLoaderType == BootloaderType.PyGrub) {
- vbdr.bootable = true;
- } else if (type == Volume.Type.ISO && bootLoaderType == BootloaderType.CD) {
- vbdr.bootable = true;
- }
-
- vbdr.userdevice = Long.toString(volume.getDiskSeq());
- if (volume.getType() == Volume.Type.ISO) {
- vbdr.mode = Types.VbdMode.RO;
- vbdr.type = Types.VbdType.CD;
- } else if (volume.getType() == Volume.Type.ROOT) {
- vbdr.mode = Types.VbdMode.RW;
- vbdr.type = Types.VbdType.DISK;
- vbdr.unpluggable = false;
- } else {
- vbdr.mode = Types.VbdMode.RW;
- vbdr.type = Types.VbdType.DISK;
- vbdr.unpluggable = true;
- }
- final VBD vbd = VBD.create(conn, vbdr);
+ }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("VBD " + vbd.getUuid(conn) + " created for " + volume);
+ public HashMap<String, String> clusterVMMetaDataSync(final Connection conn) {
+ final HashMap<String, String> vmMetaDatum = new HashMap<String, String>();
+ try {
+ final Map<VM, VM.Record> vm_map = VM.getAllRecords(conn); //USE THIS TO GET ALL VMS FROM A CLUSTER
+ if(vm_map != null) {
+ for (final VM.Record record : vm_map.values()) {
+ if (record.isControlDomain || record.isASnapshot || record.isATemplate) {
+ continue; // Skip DOM0
+ }
+ vmMetaDatum.put(record.nameLabel, StringUtils.mapToString(record.platform));
+ }
+ }
+ } catch (final Throwable e) {
+ final String msg = "Unable to get vms through host " + _host.getUuid() + " due to to " + e.toString();
+ s_logger.warn(msg, e);
+ throw new CloudRuntimeException(msg);
}
-
- return vbd;
+ return vmMetaDatum;
}
+ @Override
+ public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
+ _name = name;
- private long getStaticMax(final String os, final boolean b, final long dynamicMinRam, final long dynamicMaxRam){
- final long recommendedValue = CitrixHelper.getXenServerStaticMax(os, b);
- if(recommendedValue == 0){
- s_logger.warn("No recommended value found for dynamic max, setting static max and dynamic max equal");
- return dynamicMaxRam;
- }
- final long staticMax = Math.min(recommendedValue, 4l * dynamicMinRam); // XS constraint for stability
- if (dynamicMaxRam > staticMax){ // XS contraint that dynamic max <= static max
- s_logger.warn("dynamixMax " + dynamicMaxRam + " cant be greater than static max " + staticMax + ", can lead to stability issues. Setting static max as much as dynamic max ");
- return dynamicMaxRam;
+ try {
+ _dcId = Long.parseLong((String)params.get("zone"));
+ } catch (final NumberFormatException e) {
+ throw new ConfigurationException("Unable to get the zone " + params.get("zone"));
}
- return staticMax;
- }
+ _host.setUuid((String)params.get("guid"));
- private long getStaticMin(final String os, final boolean b, final long dynamicMinRam, final long dynamicMaxRam) {
- final long recommendedValue = CitrixHelper.getXenServerStaticMin(os, b);
- if (recommendedValue == 0) {
- s_logger.warn("No recommended value found for dynamic min");
- return dynamicMinRam;
- }
+ _name = _host.getUuid();
+ _host.setIp((String)params.get("ipaddress"));
- if (dynamicMinRam < recommendedValue) { // XS contraint that dynamic min > static min
- s_logger.warn("Vm is set to dynamixMin " + dynamicMinRam + " less than the recommended static min " + recommendedValue + ", could lead to stability issues");
+ _username = (String)params.get("username");
+ _password.add((String)params.get("password"));
+ _pod = (String)params.get("pod");
+ _cluster = (String)params.get("cluster");
+ _privateNetworkName = (String)params.get("private.network.device");
+ _publicNetworkName = (String)params.get("public.network.device");
+ _guestNetworkName = (String)params.get("guest.network.device");
+ _instance = (String)params.get("instance.name");
+ _securityGroupEnabled = Boolean.parseBoolean((String)params.get("securitygroupenabled"));
+
+ _linkLocalPrivateNetworkName = (String)params.get("private.linkLocal.device");
+ if (_linkLocalPrivateNetworkName == null) {
+ _linkLocalPrivateNetworkName = "cloud_link_local_network";
}
- return dynamicMinRam;
- }
+ _storageNetworkName1 = (String)params.get("storage.network.device1");
+ _storageNetworkName2 = (String)params.get("storage.network.device2");
- public HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUGroupDetails(final Connection conn) throws XenAPIException, XmlRpcException {
- return null;
- }
+ _heartbeatTimeout = NumbersUtil.parseInt((String)params.get("xenserver.heartbeat.timeout"), 120);
+ _heartbeatInterval = NumbersUtil.parseInt((String)params.get("xenserver.heartbeat.interval"), 60);
- public void createVGPU(final Connection conn, final StartCommand cmd, final VM vm, final GPUDeviceTO gpuDevice) throws XenAPIException, XmlRpcException {
- }
+ String value = (String)params.get("wait");
+ _wait = NumbersUtil.parseInt(value, 600);
- public VM createVmFromTemplate(final Connection conn, final VirtualMachineTO vmSpec, final Host host) throws XenAPIException, XmlRpcException {
- final String guestOsTypeName = getGuestOsType(vmSpec.getOs(), vmSpec.getPlatformEmulator(), vmSpec.getBootloader() == BootloaderType.CD);
- final Set<VM> templates = VM.getByNameLabel(conn, guestOsTypeName);
- if ( templates == null || templates.isEmpty()) {
- throw new CloudRuntimeException("Cannot find template " + guestOsTypeName + " on XenServer host");
- }
- assert templates.size() == 1 : "Should only have 1 template but found " + templates.size();
- final VM template = templates.iterator().next();
+ value = (String)params.get("migratewait");
+ _migratewait = NumbersUtil.parseInt(value, 3600);
- final VM.Record vmr = template.getRecord(conn);
- vmr.affinity = host;
- vmr.otherConfig.remove("disks");
- vmr.otherConfig.remove("default_template");
- vmr.otherConfig.remove("mac_seed");
- vmr.isATemplate = false;
- vmr.nameLabel = vmSpec.getName();
- vmr.actionsAfterCrash = Types.OnCrashBehaviour.DESTROY;
- vmr.actionsAfterShutdown = Types.OnNormalExit.DESTROY;
- vmr.otherConfig.put("vm_uuid", vmSpec.getUuid());
- vmr.VCPUsMax = (long) vmSpec.getCpus(); // FIX ME: In case of dynamic scaling this VCPU max should be the minumum of
- // recommended value for that template and capacity remaining on host
+ _maxNics = NumbersUtil.parseInt((String)params.get("xenserver.nics.max"), 7);
- if (isDmcEnabled(conn, host) && vmSpec.isEnableDynamicallyScaleVm()) {
- //scaling is allowed
- vmr.memoryStaticMin = getStaticMin(vmSpec.getOs(), vmSpec.getBootloader() == BootloaderType.CD, vmSpec.getMinRam(), vmSpec.getMaxRam());
- vmr.memoryStaticMax = getStaticMax(vmSpec.getOs(), vmSpec.getBootloader() == BootloaderType.CD, vmSpec.getMinRam(), vmSpec.getMaxRam());
- vmr.memoryDynamicMin = vmSpec.getMinRam();
- vmr.memoryDynamicMax = vmSpec.getMaxRam();
- if (guestOsTypeName.toLowerCase().contains("windows")) {
- vmr.VCPUsMax = (long) vmSpec.getCpus();
- } else {
- if (vmSpec.getVcpuMaxLimit() != null) {
- vmr.VCPUsMax = (long) vmSpec.getVcpuMaxLimit();
- }
- }
- } else {
- //scaling disallowed, set static memory target
- if (vmSpec.isEnableDynamicallyScaleVm() && !isDmcEnabled(conn, host)) {
- s_logger.warn("Host " + host.getHostname(conn) + " does not support dynamic scaling, so the vm " + vmSpec.getName() + " is not dynamically scalable");
- }
- vmr.memoryStaticMin = vmSpec.getMinRam();
- vmr.memoryStaticMax = vmSpec.getMaxRam();
- vmr.memoryDynamicMin = vmSpec.getMinRam();;
- vmr.memoryDynamicMax = vmSpec.getMaxRam();
+ if (_pod == null) {
+ throw new ConfigurationException("Unable to get the pod");
+ }
- vmr.VCPUsMax = (long) vmSpec.getCpus();
+ if (_host.getIp() == null) {
+ throw new ConfigurationException("Unable to get the host address");
}
- vmr.VCPUsAtStartup = (long) vmSpec.getCpus();
- vmr.consoles.clear();
+ if (_username == null) {
+ throw new ConfigurationException("Unable to get the username");
+ }
- final VM vm = VM.create(conn, vmr);
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Created VM " + vm.getUuid(conn) + " for " + vmSpec.getName());
+ if (_password.peek() == null) {
+ throw new ConfigurationException("Unable to get the password");
}
- final Map<String, String> vcpuParams = new HashMap<String, String>();
+ if (_host.getUuid() == null) {
+ throw new ConfigurationException("Unable to get the uuid");
+ }
- final Integer speed = vmSpec.getMinSpeed();
- if (speed != null) {
+ CheckXenHostInfo();
- int cpuWeight = _maxWeight; // cpu_weight
- int utilization = 0; // max CPU cap, default is unlimited
+ storageHandler = buildStorageHandler();
- // weight based allocation, CPU weight is calculated per VCPU
- cpuWeight = (int)(speed * 0.99 / _host.getSpeed() * _maxWeight);
- if (cpuWeight > _maxWeight) {
- cpuWeight = _maxWeight;
- }
+ _vrResource = new VirtualRoutingResource(this);
+ if (!_vrResource.configure(name, params)) {
+ throw new ConfigurationException("Unable to configure VirtualRoutingResource");
+ }
+ return true;
+ }
- if (vmSpec.getLimitCpuUse()) {
- // CPU cap is per VM, so need to assign cap based on the number of vcpus
- utilization = (int)(vmSpec.getMaxSpeed() * 0.99 * vmSpec.getCpus() / _host.getSpeed() * 100);
+ /**
+ * This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
+ */
+ public synchronized Network configureTunnelNetwork(final Connection conn, final Long networkId, final long hostId, final String bridgeName) {
+ try {
+ final Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
+ //Invoke plugin to setup the bridge which will be used by this network
+ final String bridge = nw.getBridge(conn);
+ final Map<String, String> nwOtherConfig = nw.getOtherConfig(conn);
+ final String configuredHosts = nwOtherConfig.get("ovs-host-setup");
+ boolean configured = false;
+ if (configuredHosts != null) {
+ final String hostIdsStr[] = configuredHosts.split(",");
+ for (final String hostIdStr : hostIdsStr) {
+ if (hostIdStr.equals(((Long)hostId).toString())) {
+ configured = true;
+ break;
+ }
+ }
}
- vcpuParams.put("weight", Integer.toString(cpuWeight));
- vcpuParams.put("cap", Integer.toString(utilization));
+ if (!configured) {
+ String result;
+ if (bridgeName.startsWith("OVS-DR-VPC-Bridge")) {
+ result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge_for_distributed_routing", "bridge", bridge,
+ "key", bridgeName,
+ "xs_nw_uuid", nw.getUuid(conn),
+ "cs_host_id", ((Long)hostId).toString());
+ } else {
+ result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge", "bridge", bridge,
+ "key", bridgeName,
+ "xs_nw_uuid", nw.getUuid(conn),
+ "cs_host_id", ((Long)hostId).toString());
+ }
+ //Note down the fact that the ovs bridge has been setup
+ final String[] res = result.split(":");
+ if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
+ //TODO: Should make this error not fatal?
+ throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge );
+ }
+ }
+ return nw;
+ } catch (final Exception e) {
+ s_logger.warn("createandConfigureTunnelNetwork failed", e);
+ return null;
}
+ }
- if (vcpuParams.size() > 0) {
- vm.setVCPUsParams(conn, vcpuParams);
- }
+ public String connect(final Connection conn, final String vmname, final String ipAddress) {
+ return connect(conn, vmname, ipAddress, 3922);
+ }
- final String bootArgs = vmSpec.getBootArgs();
- if (bootArgs != null && bootArgs.length() > 0) {
- String pvargs = vm.getPVArgs(conn);
- pvargs = pvargs + vmSpec.getBootArgs().replaceAll(" ", "%");
+ public String connect(final Connection conn, final String vmName, final String ipAddress, final int port) {
+ for (int i = 0; i <= _retry; i++) {
+ try {
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+ if (vms.size() < 1) {
+ final String msg = "VM " + vmName + " is not running";
+ s_logger.warn(msg);
+ return msg;
+ }
+ } catch (final Exception e) {
+ final String msg = "VM.getByNameLabel " + vmName + " failed due to " + e.toString();
+ s_logger.warn(msg, e);
+ return msg;
+ }
if (s_logger.isDebugEnabled()) {
- s_logger.debug("PV args are " + pvargs);
+ s_logger.debug("Trying to connect to " + ipAddress + " attempt " + i + " of " + _retry);
+ }
+ if (pingdomr(conn, ipAddress, Integer.toString(port))) {
+ return null;
+ }
+ try {
+ Thread.sleep(_sleep);
+ } catch (final InterruptedException e) {
}
- vm.setPVArgs(conn, pvargs);
}
+ final String msg = "Timeout, Unable to logon to " + ipAddress;
+ s_logger.debug(msg);
- if (!(guestOsTypeName.startsWith("Windows") || guestOsTypeName.startsWith("Citrix") || guestOsTypeName.startsWith("Other"))) {
- if (vmSpec.getBootloader() == BootloaderType.CD) {
- final DiskTO[] disks = vmSpec.getDisks();
- for (final DiskTO disk : disks) {
- if (disk.getType() == Volume.Type.ISO) {
- final TemplateObjectTO iso = (TemplateObjectTO)disk.getData();
- final String osType = iso.getGuestOsType();
- if (osType != null) {
- final String isoGuestOsName = getGuestOsType(osType, vmSpec.getPlatformEmulator(), vmSpec.getBootloader() == BootloaderType.CD);
- if (!isoGuestOsName.equals(guestOsTypeName)) {
- vmSpec.setBootloader(BootloaderType.PyGrub);
- }
- }
- }
- }
- }
- if (vmSpec.getBootloader() == BootloaderType.CD) {
- vm.setPVBootloader(conn, "eliloader");
- if (!vm.getOtherConfig(conn).containsKey("install-repository")) {
- vm.addToOtherConfig(conn, "install-repository", "cdrom");
- }
- } else if (vmSpec.getBootloader() == BootloaderType.PyGrub) {
- vm.setPVBootloader(conn, "pygrub");
+ return msg;
+ }
+
+ public String copyVhdFromSecondaryStorage(final Connection conn, final String mountpoint, final String sruuid, final int wait) {
+ final String nameLabel = "cloud-" + UUID.randomUUID().toString();
+ final String results =
+ callHostPluginAsync(conn, "vmopspremium", "copy_vhd_from_secondarystorage", wait, "mountpoint", mountpoint, "sruuid", sruuid, "namelabel", nameLabel);
+ String errMsg = null;
+ if (results == null || results.isEmpty()) {
+ errMsg = "copy_vhd_from_secondarystorage return null";
+ } else {
+ final String[] tmp = results.split("#");
+ final String status = tmp[0];
+ if (status.equals("0")) {
+ return tmp[1];
} else {
- vm.destroy(conn);
- throw new CloudRuntimeException("Unable to handle boot loader type: " + vmSpec.getBootloader());
+ errMsg = tmp[1];
}
}
- try {
- finalizeVmMetaData(vm, conn, vmSpec);
- } catch (final Exception e) {
- throw new CloudRuntimeException("Unable to finalize VM MetaData: " + vmSpec);
+ final String source = mountpoint.substring(mountpoint.lastIndexOf('/') + 1);
+ if (killCopyProcess(conn, source)) {
+ destroyVDIbyNameLabel(conn, nameLabel);
}
- return vm;
+ s_logger.warn(errMsg);
+ throw new CloudRuntimeException(errMsg);
}
+ @Override
+ public ExecutionResult createFileInVR(final String routerIp, final String path, final String filename, final String content) {
+ final Connection conn = getConnection();
+ final String hostPath = "/tmp/";
- protected void finalizeVmMetaData(final VM vm, final Connection conn, final VirtualMachineTO vmSpec) throws Exception {
-
- final Map<String, String> details = vmSpec.getDetails();
- if (details != null) {
- final String platformstring = details.get("platform");
- if (platformstring != null && !platformstring.isEmpty()) {
- final Map<String, String> platform = StringUtils.stringToMap(platformstring);
- vm.setPlatform(conn, platform);
- } else {
- final String timeoffset = details.get("timeoffset");
- if (timeoffset != null) {
- final Map<String, String> platform = vm.getPlatform(conn);
- platform.put("timeoffset", timeoffset);
- vm.setPlatform(conn, platform);
- }
- final String coresPerSocket = details.get("cpu.corespersocket");
- if (coresPerSocket != null) {
- final Map<String, String> platform = vm.getPlatform(conn);
- platform.put("cores-per-socket", coresPerSocket);
- vm.setPlatform(conn, platform);
- }
- }
- if ( !BootloaderType.CD.equals(vmSpec.getBootloader())) {
- final String xenservertoolsversion = details.get("hypervisortoolsversion");
- if ((xenservertoolsversion == null || !xenservertoolsversion.equalsIgnoreCase("xenserver61")) && vmSpec.getGpuDevice() == null) {
- final Map<String, String> platform = vm.getPlatform(conn);
- platform.remove("device_id");
- vm.setPlatform(conn, platform);
- }
- }
+ s_logger.debug("Copying VR with ip " + routerIp +" config file into host "+ _host.getIp() );
+ try {
+ SshHelper.scpTo(_host.getIp(), 22, _username, null, _password.peek(), hostPath, content.getBytes(Charset.defaultCharset()), filename, null);
+ } catch (final Exception e) {
+ s_logger.warn("scp VR config file into host " + _host.getIp() + " failed with exception " + e.getMessage().toString());
}
+
+ final String rc = callHostPlugin(conn, "vmops", "createFileInDomr", "domrip", routerIp, "srcfilepath", hostPath + filename, "dstfilepath", path);
+ s_logger.debug ("VR Config file " + filename + " got created in VR, ip " + routerIp + " with content \n" + content);
+
+ return new ExecutionResult(
<TRUNCATED>
[24/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring CheckOnHostCommand, ModifySshKeysCommand, OvsSetTagAndFlowCommand and StartCommand to cope with new design
- Unit tests added
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/74faf734
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/74faf734
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/74faf734
Branch: refs/heads/master
Commit: 74faf73408f805af7ac64a081c711f1ceac0a144
Parents: 18470a4
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Thu Mar 26 15:56:18 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:30 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 36 ++--
.../xenserver/resource/XcpOssResource.java | 2 +-
.../resource/XenServer620SP1Resource.java | 2 +-
.../CitrixCheckOnHostCommandWrapper.java | 34 +++
.../CitrixModifySshKeysCommandWrapper.java | 33 +++
.../CitrixOvsSetTagAndFlowCommandWrapper.java | 72 +++++++
.../resource/wrapper/CitrixRequestWrapper.java | 8 +
.../wrapper/CitrixStartCommandWrapper.java | 210 +++++++++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 149 ++++++++++---
9 files changed, 498 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/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 50859af..c9b05a4 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,6 +340,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return _host;
}
+ public boolean isOvs() {
+ return _isOvs;
+ }
+
+ public void setIsOvs(final boolean isOvs) {
+ _isOvs = isOvs;
+ }
+
public boolean isSecurityGroupEnabled() {
return _securityGroupEnabled;
}
@@ -453,12 +461,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
if (cmd instanceof NetworkElementCommand) {
return _vrResource.executeRequest((NetworkElementCommand)cmd);
- } else if (clazz == CheckOnHostCommand.class) {
- return execute((CheckOnHostCommand)cmd);
- } else if (clazz == ModifySshKeysCommand.class) {
- return execute((ModifySshKeysCommand)cmd);
- } else if (clazz == StartCommand.class) {
- return execute((StartCommand)cmd);
} else if (clazz == CheckSshCommand.class) {
return execute((CheckSshCommand)cmd);
} else if (clazz == SecurityGroupRulesCmd.class) {
@@ -467,8 +469,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return execute((OvsFetchInterfaceCommand)cmd);
} else if (clazz == OvsCreateGreTunnelCommand.class) {
return execute((OvsCreateGreTunnelCommand)cmd);
- } else if (clazz == OvsSetTagAndFlowCommand.class) {
- return execute((OvsSetTagAndFlowCommand)cmd);
} else if (clazz == OvsDeleteFlowCommand.class) {
return execute((OvsDeleteFlowCommand)cmd);
} else if (clazz == OvsVpcPhysicalTopologyConfigCommand.class) {
@@ -863,7 +863,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("Unsupported network type: " + type);
}
- private synchronized Network setupvSwitchNetwork(final Connection conn) {
+ public synchronized Network setupvSwitchNetwork(final Connection conn) {
try {
if (_host.getVswitchNetwork() == null) {
Network vswitchNw = null;
@@ -1052,7 +1052,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected VIF createVif(final Connection conn, final String vmName, final VM vm, final VirtualMachineTO vmSpec, final NicTO nic) throws XmlRpcException, XenAPIException {
+ public VIF createVif(final Connection conn, final String vmName, final VM vm, final VirtualMachineTO vmSpec, final NicTO nic) throws XmlRpcException, XenAPIException {
assert nic.getUuid() != null : "Nic should have a uuid value";
if (s_logger.isDebugEnabled()) {
@@ -1198,7 +1198,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected VBD createVbd(final Connection conn, final DiskTO volume, final String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi) throws XmlRpcException, XenAPIException {
+ public VBD createVbd(final Connection conn, final DiskTO volume, final String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi) throws XmlRpcException, XenAPIException {
final Volume.Type type = volume.getType();
if (vdi == null) {
@@ -1287,10 +1287,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- protected void createVGPU(final Connection conn, final StartCommand cmd, final VM vm, final GPUDeviceTO gpuDevice) throws XenAPIException, XmlRpcException {
+ public void createVGPU(final Connection conn, final StartCommand cmd, final VM vm, final GPUDeviceTO gpuDevice) throws XenAPIException, XmlRpcException {
}
- protected VM createVmFromTemplate(final Connection conn, final VirtualMachineTO vmSpec, final Host host) throws XenAPIException, XmlRpcException {
+ public VM createVmFromTemplate(final Connection conn, final VirtualMachineTO vmSpec, final Host host) throws XenAPIException, XmlRpcException {
final String guestOsTypeName = getGuestOsType(vmSpec.getOs(), vmSpec.getPlatformEmulator(), vmSpec.getBootloader() == BootloaderType.CD);
final Set<VM> templates = VM.getByNameLabel(conn, guestOsTypeName);
if ( templates == null || templates.isEmpty()) {
@@ -1454,7 +1454,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected String handleVmStartFailure(final Connection conn, final String vmName, final VM vm, final String message, final Throwable th) {
+ public String handleVmStartFailure(final Connection conn, final String vmName, final VM vm, final String message, final Throwable th) {
final String msg = "Unable to start " + vmName + " due to " + message;
s_logger.warn(msg, th);
@@ -1519,7 +1519,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return msg;
}
- protected VBD createPatchVbd(final Connection conn, final String vmName, final VM vm) throws XmlRpcException, XenAPIException {
+ public VBD createPatchVbd(final Connection conn, final String vmName, final VM vm) throws XmlRpcException, XenAPIException {
if (_host.getSystemvmisouuid() == null) {
final Set<SR> srs = SR.getByNameLabel(conn, "XenServer Tools");
@@ -1607,7 +1607,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return new CheckSshAnswer(cmd);
}
- private HashMap<String, String> parseDefaultOvsRuleComamnd(final String str) {
+ public HashMap<String, String> parseDefaultOvsRuleComamnd(final String str) {
final HashMap<String, String> cmd = new HashMap<String, String>();
final String[] sarr = str.split("/");
for (int i = 0; i < sarr.length; i++) {
@@ -1864,7 +1864,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
// the idea here is to see if the DiskTO in question is from managed storage and
// does not yet have an SR
// if no SR, create it and create a VDI in it
- private VDI prepareManagedDisk(final Connection conn, final DiskTO disk, final String vmName) throws Exception {
+ public VDI prepareManagedDisk(final Connection conn, final DiskTO disk, final String vmName) throws Exception {
final Map<String, String> details = disk.getDetails();
if (details == null) {
@@ -3297,7 +3297,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- void startVM(final Connection conn, final Host host, final VM vm, final String vmName) throws Exception {
+ public void startVM(final Connection conn, final Host host, final VM vm, final String vmName) throws Exception {
Task task = null;
try {
task = vm.startOnAsync(conn, host, false, true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
index 312b34c..540044e 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
@@ -123,7 +123,7 @@ public class XcpOssResource extends CitrixResourceBase {
}
@Override
- protected synchronized VBD createPatchVbd(final Connection conn, final String vmName, final VM vm) throws XmlRpcException, XenAPIException {
+ public synchronized VBD createPatchVbd(final Connection conn, final String vmName, final VM vm) throws XmlRpcException, XenAPIException {
if (_host.getLocalSRuuid() != null) {
//create an iso vdi on it
final String result = callHostPlugin(conn, "vmops", "createISOVHD", "uuid", _host.getLocalSRuuid());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
index e6c66a4..0704e8e 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
@@ -136,7 +136,7 @@ public class XenServer620SP1Resource extends XenServer620Resource {
}
@Override
- protected void createVGPU(final Connection conn, final StartCommand cmd, final VM vm, final GPUDeviceTO gpuDevice) throws XenAPIException, XmlRpcException {
+ public void createVGPU(final Connection conn, final StartCommand cmd, final VM vm, final GPUDeviceTO gpuDevice) throws XenAPIException, XmlRpcException {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Creating VGPU of VGPU type [ " + gpuDevice.getVgpuType() + " ] in gpu group" + gpuDevice.getGpuGroup()
+ " for VM " + cmd.getVirtualMachine().getName());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckOnHostCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckOnHostCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckOnHostCommandWrapper.java
new file mode 100644
index 0000000..aaee57b
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixCheckOnHostCommandWrapper.java
@@ -0,0 +1,34 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckOnHostAnswer;
+import com.cloud.agent.api.CheckOnHostCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixCheckOnHostCommandWrapper extends CommandWrapper<CheckOnHostCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final CheckOnHostCommand command, final CitrixResourceBase citrixResourceBase) {
+ return new CheckOnHostAnswer(command, "Not Implmeneted");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifySshKeysCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifySshKeysCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifySshKeysCommandWrapper.java
new file mode 100644
index 0000000..8ea852d
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifySshKeysCommandWrapper.java
@@ -0,0 +1,33 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ModifySshKeysCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+
+public final class CitrixModifySshKeysCommandWrapper extends CommandWrapper<ModifySshKeysCommand, Answer, CitrixResourceBase> {
+
+ @Override
+ public Answer execute(final ModifySshKeysCommand command, final CitrixResourceBase citrixResourceBase) {
+ return new Answer(command);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetTagAndFlowCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetTagAndFlowCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetTagAndFlowCommandWrapper.java
new file mode 100644
index 0000000..2048f4d
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixOvsSetTagAndFlowCommandWrapper.java
@@ -0,0 +1,72 @@
+//
+// 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 org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsSetTagAndFlowAnswer;
+import com.cloud.agent.api.OvsSetTagAndFlowCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.Types.BadServerResponse;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixOvsSetTagAndFlowCommandWrapper extends CommandWrapper<OvsSetTagAndFlowCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixOvsSetTagAndFlowCommandWrapper.class);
+
+ @Override
+ public Answer execute(final OvsSetTagAndFlowCommand command, final CitrixResourceBase citrixResourceBase) {
+ citrixResourceBase.setIsOvs(true);
+
+ final Connection conn = citrixResourceBase.getConnection();
+ try {
+ final Network nw = citrixResourceBase.setupvSwitchNetwork(conn);
+ final String bridge = nw.getBridge(conn);
+
+ /*
+ * If VM is domainRouter, this will try to set flow and tag on its
+ * none guest network nic. don't worry, it will fail silently at
+ * host plugin side
+ */
+ final String result = citrixResourceBase.callHostPlugin(conn, "ovsgre", "ovs_set_tag_and_flow", "bridge", bridge, "vmName", command.getVmName(), "tag",
+ command.getTag(), "vlans", command.getVlans(), "seqno", command.getSeqNo());
+ s_logger.debug("set flow for " + command.getVmName() + " " + result);
+
+ if (result != null && result.equalsIgnoreCase("SUCCESS")) {
+ return new OvsSetTagAndFlowAnswer(command, true, result);
+ } else {
+ return new OvsSetTagAndFlowAnswer(command, false, result);
+ }
+ } catch (final BadServerResponse e) {
+ s_logger.error("Failed to set tag and flow", e);
+ } catch (final XenAPIException e) {
+ s_logger.error("Failed to set tag and flow", e);
+ } catch (final XmlRpcException e) {
+ s_logger.error("Failed to set tag and flow", e);
+ }
+
+ return new OvsSetTagAndFlowAnswer(command, false, "EXCEPTION");
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/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 badc892..fbb3f27 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
@@ -25,6 +25,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.CheckOnHostCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
@@ -36,13 +37,16 @@ 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.ModifySshKeysCommand;
import com.cloud.agent.api.ModifyStoragePoolCommand;
+import com.cloud.agent.api.OvsSetTagAndFlowCommand;
import com.cloud.agent.api.PingTestCommand;
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.StartCommand;
import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.UpgradeSnapshotCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -101,6 +105,10 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(SetupCommand.class, new CitrixSetupCommandWrapper());
map.put(MaintainCommand.class, new CitrixMaintainCommandWrapper());
map.put(PingTestCommand.class, new CitrixPingTestCommandWrapper());
+ map.put(CheckOnHostCommand.class, new CitrixCheckOnHostCommandWrapper());
+ map.put(ModifySshKeysCommand.class, new CitrixModifySshKeysCommandWrapper());
+ map.put(StartCommand.class, new CitrixStartCommandWrapper());
+ map.put(OvsSetTagAndFlowCommand.class, new CitrixOvsSetTagAndFlowCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStartCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStartCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStartCommandWrapper.java
new file mode 100644
index 0000000..ceaaf34
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixStartCommandWrapper.java
@@ -0,0 +1,210 @@
+//
+// 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.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.OvsSetTagAndFlowAnswer;
+import com.cloud.agent.api.OvsSetTagAndFlowCommand;
+import com.cloud.agent.api.StartAnswer;
+import com.cloud.agent.api.StartCommand;
+import com.cloud.agent.api.to.DiskTO;
+import com.cloud.agent.api.to.GPUDeviceTO;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.network.Networks;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.IsolationType;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.vm.VirtualMachine;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Types.VmPowerState;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class CitrixStartCommandWrapper extends CommandWrapper<StartCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixStartCommandWrapper.class);
+
+ @Override
+ public Answer execute(final StartCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final VirtualMachineTO vmSpec = command.getVirtualMachine();
+ final String vmName = vmSpec.getName();
+ VmPowerState state = VmPowerState.HALTED;
+ VM vm = null;
+ // if a VDI is created, record its UUID to send back to the CS MS
+ final Map<String, String> iqnToPath = new HashMap<String, String>();
+ try {
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+ if (vms != null) {
+ for (final VM v : vms) {
+ final VM.Record vRec = v.getRecord(conn);
+ if (vRec.powerState == VmPowerState.HALTED) {
+ v.destroy(conn);
+ } else if (vRec.powerState == VmPowerState.RUNNING) {
+ final String host = vRec.residentOn.getUuid(conn);
+ final String msg = "VM " + vmName + " is runing on host " + host;
+ s_logger.debug(msg);
+ return new StartAnswer(command, msg, host);
+ } else {
+ final String msg = "There is already a VM having the same name " + vmName + " vm record " + vRec.toString();
+ s_logger.warn(msg);
+ return new StartAnswer(command, msg);
+ }
+ }
+ }
+ s_logger.debug("1. The VM " + vmName + " is in Starting state.");
+
+ final Host host = Host.getByUuid(conn, citrixResourceBase.getHost().getUuid());
+ vm = citrixResourceBase.createVmFromTemplate(conn, vmSpec, host);
+
+ final GPUDeviceTO gpuDevice = vmSpec.getGpuDevice();
+ if (gpuDevice != null) {
+ s_logger.debug("Creating VGPU for of VGPU type: " + gpuDevice.getVgpuType() + " in GPU group " + gpuDevice.getGpuGroup() + " for VM " + vmName);
+ citrixResourceBase.createVGPU(conn, command, vm, gpuDevice);
+ }
+
+ for (final DiskTO disk : vmSpec.getDisks()) {
+ final VDI newVdi = citrixResourceBase.prepareManagedDisk(conn, disk, vmName);
+
+ if (newVdi != null) {
+ final String path = newVdi.getUuid(conn);
+
+ iqnToPath.put(disk.getDetails().get(DiskTO.IQN), path);
+ }
+
+ citrixResourceBase.createVbd(conn, disk, vmName, vm, vmSpec.getBootloader(), newVdi);
+ }
+
+ if (vmSpec.getType() != VirtualMachine.Type.User) {
+ citrixResourceBase.createPatchVbd(conn, vmName, vm);
+ }
+
+ for (final NicTO nic : vmSpec.getNics()) {
+ citrixResourceBase.createVif(conn, vmName, vm, vmSpec, nic);
+ }
+
+ citrixResourceBase.startVM(conn, host, vm, vmName);
+
+ if (citrixResourceBase.isOvs()) {
+ // TODO(Salvatore-orlando): This code should go
+ for (final NicTO nic : vmSpec.getNics()) {
+ if (nic.getBroadcastType() == Networks.BroadcastDomainType.Vswitch) {
+ final HashMap<String, String> args = citrixResourceBase.parseDefaultOvsRuleComamnd(BroadcastDomainType.getValue(nic.getBroadcastUri()));
+ final OvsSetTagAndFlowCommand flowCmd = new OvsSetTagAndFlowCommand(args.get("vmName"), args.get("tag"), args.get("vlans"), args.get("seqno"),
+ Long.parseLong(args.get("vmId")));
+
+ final CitrixRequestWrapper citrixRequestWrapper = CitrixRequestWrapper.getInstance();
+
+ final OvsSetTagAndFlowAnswer r = (OvsSetTagAndFlowAnswer) citrixRequestWrapper.execute(flowCmd, citrixResourceBase);
+
+ if (!r.getResult()) {
+ s_logger.warn("Failed to set flow for VM " + r.getVmId());
+ } else {
+ s_logger.info("Success to set flow for VM " + r.getVmId());
+ }
+ }
+ }
+ }
+
+ if (citrixResourceBase.canBridgeFirewall()) {
+ String result = null;
+ if (vmSpec.getType() != VirtualMachine.Type.User) {
+ final NicTO[] nics = vmSpec.getNics();
+ boolean secGrpEnabled = false;
+ for (final NicTO nic : nics) {
+ if (nic.isSecurityGroupEnabled() || nic.getIsolationUri() != null && nic.getIsolationUri().getScheme().equalsIgnoreCase(IsolationType.Ec2.toString())) {
+ secGrpEnabled = true;
+ break;
+ }
+ }
+ if (secGrpEnabled) {
+ result = citrixResourceBase.callHostPlugin(conn, "vmops", "default_network_rules_systemvm", "vmName", vmName);
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ s_logger.warn("Failed to program default network rules for " + vmName);
+ } else {
+ s_logger.info("Programmed default network rules for " + vmName);
+ }
+ }
+
+ } else {
+ // For user vm, program the rules for each nic if the
+ // isolation uri scheme is ec2
+ final NicTO[] nics = vmSpec.getNics();
+ for (final NicTO nic : nics) {
+ if (nic.isSecurityGroupEnabled() || nic.getIsolationUri() != null && nic.getIsolationUri().getScheme().equalsIgnoreCase(IsolationType.Ec2.toString())) {
+ final List<String> nicSecIps = nic.getNicSecIps();
+ String secIpsStr;
+ final StringBuilder sb = new StringBuilder();
+ if (nicSecIps != null) {
+ for (final String ip : nicSecIps) {
+ sb.append(ip).append(":");
+ }
+ secIpsStr = sb.toString();
+ } else {
+ secIpsStr = "0:";
+ }
+ result = citrixResourceBase.callHostPlugin(conn, "vmops", "default_network_rules", "vmName", vmName, "vmIP", nic.getIp(), "vmMAC", nic.getMac(),
+ "vmID", Long.toString(vmSpec.getId()), "secIps", secIpsStr);
+
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ s_logger.warn("Failed to program default network rules for " + vmName + " on nic with ip:" + nic.getIp() + " mac:" + nic.getMac());
+ } else {
+ s_logger.info("Programmed default network rules for " + vmName + " on nic with ip:" + nic.getIp() + " mac:" + nic.getMac());
+ }
+ }
+ }
+ }
+ }
+
+ state = VmPowerState.RUNNING;
+
+ final StartAnswer startAnswer = new StartAnswer(command);
+
+ startAnswer.setIqnToPath(iqnToPath);
+
+ return startAnswer;
+ } catch (final Exception e) {
+ s_logger.warn("Catch Exception: " + e.getClass().toString() + " due to " + e.toString(), e);
+ final String msg = citrixResourceBase.handleVmStartFailure(conn, vmName, vm, "", e);
+
+ final StartAnswer startAnswer = new StartAnswer(command, msg);
+
+ startAnswer.setIqnToPath(iqnToPath);
+
+ return startAnswer;
+ } finally {
+ if (state != VmPowerState.HALTED) {
+ s_logger.debug("2. The VM " + vmName + " is in " + state + " state.");
+ } else {
+ s_logger.debug("The VM is in stopped state, detected problem during startup : " + vmName);
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74faf734/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 0ba9d1a..0ffa7f4 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,6 +3,7 @@ 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.junit.Assert.fail;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -13,6 +14,7 @@ import java.util.Hashtable;
import java.util.Map;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -26,6 +28,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.CheckOnHostCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
@@ -37,7 +40,9 @@ 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.ModifySshKeysCommand;
import com.cloud.agent.api.ModifyStoragePoolCommand;
+import com.cloud.agent.api.OvsSetTagAndFlowCommand;
import com.cloud.agent.api.PingTestCommand;
import com.cloud.agent.api.PrepareForMigrationCommand;
import com.cloud.agent.api.ReadyCommand;
@@ -45,6 +50,7 @@ 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.StartCommand;
import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.UpgradeSnapshotCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -67,6 +73,9 @@ import com.cloud.vm.DiskProfile;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.Marshalling;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.Types.BadServerResponse;
+import com.xensource.xenapi.Types.XenAPIException;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Connection.class, Host.Record.class})
@@ -189,36 +198,36 @@ public class CitrixRequestWrapperTest {
@Test
public void testGetVmDiskStatsCommand() {
- final GetVmDiskStatsCommand statsCommand = new GetVmDiskStatsCommand(new ArrayList<String>(), null, null);
+ final GetVmDiskStatsCommand diskStatsCommand = new GetVmDiskStatsCommand(new ArrayList<String>(), null, null);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(diskStatsCommand, citrixResourceBase);
assertTrue(answer.getResult());
}
@Test
public void testCheckHealthCommand() {
- final CheckHealthCommand statsCommand = new CheckHealthCommand();
+ final CheckHealthCommand checkHealthCommand = new CheckHealthCommand();
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(checkHealthCommand, citrixResourceBase);
assertFalse(answer.getResult());
}
@Test
public void testStopCommandCommand() {
- final StopCommand statsCommand = new StopCommand("Test", false, false);
+ final StopCommand stopCommand = new StopCommand("Test", false, false);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(stopCommand, citrixResourceBase);
assertFalse(answer.getResult());
}
@@ -300,14 +309,14 @@ public class CitrixRequestWrapperTest {
final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
final XsHost xsHost = Mockito.mock(XsHost.class);
- final CreateStoragePoolCommand destroyCommand = new CreateStoragePoolCommand(false, poolVO);
+ final CreateStoragePoolCommand createStorageCommand = new CreateStoragePoolCommand(false, poolVO);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
when(citrixResourceBase.getHost()).thenReturn(xsHost);
- final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(createStorageCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -318,14 +327,14 @@ public class CitrixRequestWrapperTest {
final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
final XsHost xsHost = Mockito.mock(XsHost.class);
- final ModifyStoragePoolCommand destroyCommand = new ModifyStoragePoolCommand(false, poolVO);
+ final ModifyStoragePoolCommand modifyStorageCommand = new ModifyStoragePoolCommand(false, poolVO);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
when(citrixResourceBase.getHost()).thenReturn(xsHost);
- final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(modifyStorageCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -336,14 +345,14 @@ public class CitrixRequestWrapperTest {
final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
final XsHost xsHost = Mockito.mock(XsHost.class);
- final DeleteStoragePoolCommand destroyCommand = new DeleteStoragePoolCommand(poolVO);
+ final DeleteStoragePoolCommand deleteStorageCommand = new DeleteStoragePoolCommand(poolVO);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
when(citrixResourceBase.getHost()).thenReturn(xsHost);
- final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(deleteStorageCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertTrue(answer.getResult());
@@ -366,12 +375,12 @@ public class CitrixRequestWrapperTest {
@Test
public void testAttachVolumeCommand() {
- final AttachVolumeCommand destroyCommand = new AttachVolumeCommand(false, true, "Test", StoragePoolType.LVM, "/", "DATA", 100l, 1l, "123");
+ final AttachVolumeCommand attachCommand = new AttachVolumeCommand(false, true, "Test", StoragePoolType.LVM, "/", "DATA", 100l, 1l, "123");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(attachCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -379,12 +388,12 @@ public class CitrixRequestWrapperTest {
@Test
public void testAttachIsoCommand() {
- final AttachIsoCommand destroyCommand = new AttachIsoCommand("Test", "/", true);
+ final AttachIsoCommand attachCommand = new AttachIsoCommand("Test", "/", true);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(attachCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -394,12 +403,12 @@ public class CitrixRequestWrapperTest {
public void testUpgradeSnapshotCommand() {
final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
- final UpgradeSnapshotCommand destroyCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "2.1");
+ final UpgradeSnapshotCommand upgradeSnapshotCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "2.1");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(upgradeSnapshotCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertTrue(answer.getResult());
@@ -409,12 +418,12 @@ public class CitrixRequestWrapperTest {
public void testUpgradeSnapshotCommandNo21() {
final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
- final UpgradeSnapshotCommand destroyCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "3.1");
+ final UpgradeSnapshotCommand upgradeSnapshotCommand = new UpgradeSnapshotCommand(poolVO, "http", 1l, 1l, 1l, 1l, 1l, "/", "58c5778b-7dd1-47cc-a7b5-f768541bf278", "Test", "3.1");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(upgradeSnapshotCommand, citrixResourceBase);
verify(citrixResourceBase, times(0)).getConnection();
assertTrue(answer.getResult());
@@ -458,12 +467,12 @@ public class CitrixRequestWrapperTest {
@Test
public void testGetVncPortCommand() {
- final GetVncPortCommand storageDownloadCommand = new GetVncPortCommand(1l, "Test");
+ final GetVncPortCommand vncPortCommand = new GetVncPortCommand(1l, "Test");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(vncPortCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -474,14 +483,14 @@ public class CitrixRequestWrapperTest {
final XsHost xsHost = Mockito.mock(XsHost.class);
final HostEnvironment env = Mockito.mock(HostEnvironment.class);
- final SetupCommand storageDownloadCommand = new SetupCommand(env);
+ final SetupCommand setupCommand = new SetupCommand(env);
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
when(citrixResourceBase.getHost()).thenReturn(xsHost);
- final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(setupCommand, citrixResourceBase);
verify(citrixResourceBase, times(1)).getConnection();
assertFalse(answer.getResult());
@@ -500,7 +509,7 @@ public class CitrixRequestWrapperTest {
// final Host.Record hr = PowerMockito.mock(Host.Record.class);
// final Host host = PowerMockito.mock(Host.class);
- final MaintainCommand storageDownloadCommand = new MaintainCommand();
+ final MaintainCommand maintainCommand = new MaintainCommand();
final Map<String, Object> map = new Hashtable<String, Object>();
map.put("Value", "Xen");
@@ -551,20 +560,104 @@ public class CitrixRequestWrapperTest {
// fail(e.getMessage());
// }
- final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(maintainCommand, citrixResourceBase);
assertFalse(answer.getResult());
}
@Test
public void testPingTestCommandHostIp() {
- final PingTestCommand storageDownloadCommand = new PingTestCommand("127.0.0.1");
+ final PingTestCommand pingTestCommand = new PingTestCommand("127.0.0.1");
final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
assertNotNull(wrapper);
- final Answer answer = wrapper.execute(storageDownloadCommand, citrixResourceBase);
+ final Answer answer = wrapper.execute(pingTestCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testPingTestCommandRouterPvtIps() {
+ final PingTestCommand pingTestCommand = new PingTestCommand("127.0.0.1", "192.168.0.1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(pingTestCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testCheckOnHostCommand() {
+ final com.cloud.host.Host host = Mockito.mock(com.cloud.host.Host.class);
+ final CheckOnHostCommand onHostCommand = new CheckOnHostCommand(host);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(onHostCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testModifySshKeysCommand() {
+ final ModifySshKeysCommand sshKeysCommand = new ModifySshKeysCommand("", "");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(sshKeysCommand, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testStartCommand() {
+ final VirtualMachineTO vm = Mockito.mock(VirtualMachineTO.class);
+ final com.cloud.host.Host host = Mockito.mock(com.cloud.host.Host.class);
+
+ final StartCommand startCommand = new StartCommand(vm, host, false);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(startCommand, citrixResourceBase);
+ verify(citrixResourceBase, times(1)).getConnection();
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testOvsSetTagAndFlowCommand() {
+ final Network network = Mockito.mock(Network.class);
+ final Connection conn = Mockito.mock(Connection.class);
+
+ final OvsSetTagAndFlowCommand tagAndFlowCommand = new OvsSetTagAndFlowCommand("Test", "tag", "vlan://1", "123", 1l);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getConnection()).thenReturn(conn);
+ when(citrixResourceBase.setupvSwitchNetwork(conn)).thenReturn(network);
+ try {
+ when(network.getBridge(conn)).thenReturn("br0");
+ } 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(tagAndFlowCommand, citrixResourceBase);
+
verify(citrixResourceBase, times(1)).getConnection();
+ verify(citrixResourceBase, times(1)).setupvSwitchNetwork(conn);
assertFalse(answer.getResult());
}
[04/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring the GetVmStatsCommand
- Added basic tests
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8f04108e
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8f04108e
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8f04108e
Branch: refs/heads/master
Commit: 8f04108e23dffc3f7930bdbe111eb11f2653b453
Parents: 0e51379
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 10:52:31 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:25 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 4 +-
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../wrapper/GetVmStatsCommandWrapper.java | 82 ++++++++++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 15 ++++
4 files changed, 101 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f04108e/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 42d37d5..024307d 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
@@ -2358,7 +2358,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected HashMap<String, VmStatsEntry> getVmStats(final Connection conn, final GetVmStatsCommand cmd, final List<String> vmUUIDs, final String hostGuid) {
+ public HashMap<String, VmStatsEntry> getVmStats(final Connection conn, final GetVmStatsCommand cmd, final List<String> vmUUIDs, final String hostGuid) {
final HashMap<String, VmStatsEntry> vmResponseMap = new HashMap<String, VmStatsEntry>();
for (final String vmUUID : vmUUIDs) {
@@ -6674,7 +6674,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return false;
}
- protected VM getVM(final Connection conn, final String vmName) {
+ public VM getVM(final Connection conn, final String vmName) {
// Look up VMs with the specified name
Set<VM> vms;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f04108e/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 98989ab..9c2f08d 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
@@ -24,6 +24,7 @@ import java.util.Hashtable;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
+import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootRouterCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
@@ -57,6 +58,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(WatchConsoleProxyLoadCommand.class, new CitrixWatchConsoleProxyLoadCommandWrapper());
map.put(ReadyCommand.class, new CitrixReadyCommandWrapper());
map.put(GetHostStatsCommand.class, new GetHostStatsCommandWrapper());
+ map.put(GetVmStatsCommand.class, new GetVmStatsCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f04108e/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java
new file mode 100644
index 0000000..1b4863a
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/GetVmStatsCommandWrapper.java
@@ -0,0 +1,82 @@
+//
+// 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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetVmStatsAnswer;
+import com.cloud.agent.api.GetVmStatsCommand;
+import com.cloud.agent.api.VmStatsEntry;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
+
+public final class GetVmStatsCommandWrapper extends CommandWrapper<GetVmStatsCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(GetVmStatsCommandWrapper.class);
+
+ @Override
+ public Answer execute(final GetVmStatsCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final List<String> vmNames = command.getVmNames();
+ final HashMap<String, VmStatsEntry> vmStatsNameMap = new HashMap<String, VmStatsEntry>();
+ if (vmNames.size() == 0) {
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ }
+ try {
+
+ // Determine the UUIDs of the requested VMs
+ final List<String> vmUUIDs = new ArrayList<String>();
+
+ for (final String vmName : vmNames) {
+ final VM vm = citrixResourceBase.getVM(conn, vmName);
+ vmUUIDs.add(vm.getUuid(conn));
+ }
+
+ final HashMap<String, VmStatsEntry> vmStatsUUIDMap = citrixResourceBase.getVmStats(conn, command, vmUUIDs, command.getHostGuid());
+ if (vmStatsUUIDMap == null) {
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ }
+
+ for (final Map.Entry<String,VmStatsEntry>entry : vmStatsUUIDMap.entrySet()) {
+ vmStatsNameMap.put(vmNames.get(vmUUIDs.indexOf(entry.getKey())), entry.getValue());
+ }
+
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ } catch (final XenAPIException e) {
+ final String msg = "Unable to get VM stats" + e.toString();
+ s_logger.warn(msg, e);
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ } catch (final XmlRpcException e) {
+ final String msg = "Unable to get VM stats" + e.getMessage();
+ s_logger.warn(msg, e);
+ return new GetVmStatsAnswer(command, vmStatsNameMap);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f04108e/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 027a5fd..e54e809 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
@@ -8,6 +8,8 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import java.util.ArrayList;
+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -17,6 +19,7 @@ import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetHostStatsCommand;
+import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootAnswer;
import com.cloud.agent.api.RebootCommand;
@@ -136,6 +139,18 @@ public class CitrixRequestWrapperTest {
assertTrue(answer.getResult());
}
+
+ @Test
+ public void testGetVmStatsCommandCommand() {
+ final GetVmStatsCommand statsCommand = new GetVmStatsCommand(new ArrayList<String>(), null, null);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[11/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring the whole XsHost thing
Refactor the ReadyCommand
Fixing the old test
Adding basic tests for ReadyCommandWrapper
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/30e72e4a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/30e72e4a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/30e72e4a
Branch: refs/heads/master
Commit: 30e72e4a156a224f109f67b277e1e439bdcc9158
Parents: c3ae8c7
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Mar 20 13:51:46 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:25 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixHelper.java | 28 +-
.../xenserver/resource/CitrixResourceBase.java | 472 +++++-----
.../xenserver/resource/XcpOssResource.java | 103 ++-
.../xenserver/resource/XenServer56Resource.java | 8 +-
.../resource/XenServer610Resource.java | 226 +++--
.../resource/XenServer620Resource.java | 33 +-
.../resource/XenServer620SP1Resource.java | 82 +-
.../resource/XenServerStorageProcessor.java | 864 +++++++++----------
.../resource/Xenserver625Resource.java | 57 +-
.../resource/Xenserver625StorageProcessor.java | 576 +++++++------
.../hypervisor/xenserver/resource/XsHost.java | 212 +++++
.../wrapper/CitrixReadyCommandWrapper.java | 75 ++
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../xenserver/XenServerResourceNewBase.java | 75 +-
.../resource/CitrixResourceBaseTest.java | 38 +-
.../wrapper/CitrixRequestWrapperTest.java | 13 +
16 files changed, 1558 insertions(+), 1306 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java
index 5bc8036..265573d 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixHelper.java
@@ -16,11 +16,8 @@
// under the License.
package com.cloud.hypervisor.xenserver.resource;
-import java.util.ArrayList;
import java.util.HashMap;
-import org.apache.log4j.Logger;
-
import com.xensource.xenapi.Host;
/**
@@ -28,18 +25,13 @@ import com.xensource.xenapi.Host;
*
*/
public class CitrixHelper {
- private static final Logger s_logger = Logger.getLogger(CitrixHelper.class);
-
-
private static final HashMap<String, MemoryValues> XenServerGuestOsMemoryMap = new HashMap<String, MemoryValues>(70);
- private static final ArrayList<String> GuestOsList = new ArrayList<String>(70);
-
public static class MemoryValues {
long max;
long min;
- public MemoryValues(long min, long max) {
+ public MemoryValues(final long min, final long max) {
this.min = min * 1024 * 1024;
this.max = max * 1024 * 1024;
}
@@ -53,8 +45,6 @@ public class CitrixHelper {
}
}
-
-
static {
XenServerGuestOsMemoryMap.put("CentOS 4.5 (32-bit)", new MemoryValues(256l, 16 * 1024l));
XenServerGuestOsMemoryMap.put("CentOS 4.6 (32-bit)", new MemoryValues(256l, 16 * 1024l));
@@ -207,37 +197,37 @@ public class CitrixHelper {
XenServerGuestOsMemoryMap.put("Windows XP SP3 (32-bit)", new MemoryValues(256l, 4 * 1024l));
XenServerGuestOsMemoryMap.put("Ubuntu 10.04 (32-bit)", new MemoryValues(128l, 512l));
XenServerGuestOsMemoryMap.put("Ubuntu 10.04 (64-bit)", new MemoryValues(128l, 32 * 1024l));
- XenServerGuestOsMemoryMap.put("Ubuntu 10.10 (32-bit)", new MemoryValues(512l, 16*1024l));
- XenServerGuestOsMemoryMap.put("Ubuntu 10.10 (64-bit)", new MemoryValues(512l, 16*1024l));
+ XenServerGuestOsMemoryMap.put("Ubuntu 10.10 (32-bit)", new MemoryValues(512l, 16 * 1024l));
+ XenServerGuestOsMemoryMap.put("Ubuntu 10.10 (64-bit)", new MemoryValues(512l, 16 * 1024l));
XenServerGuestOsMemoryMap.put("Ubuntu 12.04 (32-bit)", new MemoryValues(512l, 32 * 1024l));
XenServerGuestOsMemoryMap.put("Ubuntu 12.04 (64-bit)", new MemoryValues(512l, 128 * 1024l));
XenServerGuestOsMemoryMap.put("Ubuntu 14.04 (32-bit)", new MemoryValues(512l, 32 * 1024l));
XenServerGuestOsMemoryMap.put("Ubuntu 14.04 (64-bit)", new MemoryValues(512l, 128 * 1024l));
}
- public static long getXenServerStaticMax(String stdType, boolean bootFromCD) {
- MemoryValues recommendedMaxMinMemory = XenServerGuestOsMemoryMap.get(stdType);
+ public static long getXenServerStaticMax(final String stdType, final boolean bootFromCD) {
+ final MemoryValues recommendedMaxMinMemory = XenServerGuestOsMemoryMap.get(stdType);
if (recommendedMaxMinMemory == null) {
return 0l;
}
return recommendedMaxMinMemory.getMax();
}
- public static long getXenServerStaticMin(String stdType, boolean bootFromCD) {
- MemoryValues recommendedMaxMinMemory = XenServerGuestOsMemoryMap.get(stdType);
+ public static long getXenServerStaticMin(final String stdType, final boolean bootFromCD) {
+ final MemoryValues recommendedMaxMinMemory = XenServerGuestOsMemoryMap.get(stdType);
if (recommendedMaxMinMemory == null) {
return 0l;
}
return recommendedMaxMinMemory.getMin();
}
- public static String getProductVersion(Host.Record record) {
+ public static String getProductVersion(final Host.Record record) {
String prodVersion = record.softwareVersion.get("product_version");
if (prodVersion == null) {
prodVersion = record.softwareVersion.get("platform_version").trim();
} else {
prodVersion = prodVersion.trim();
- String[] items = prodVersion.split("\\.");
+ final String[] items = prodVersion.split("\\.");
if (Integer.parseInt(items[0]) > 6) {
prodVersion = "6.5.0";
} else if (Integer.parseInt(items[0]) == 6 && Integer.parseInt(items[1]) >= 4) {
[13/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring the StopCommand on CitrixResourceBase to cope with new design
- Added basic tests
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6b80c799
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6b80c799
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6b80c799
Branch: refs/heads/master
Commit: 6b80c79986cf5012ea951bb88040a747dd8f2556
Parents: c7830ef
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 11:15:37 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:26 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 18 +-
.../resource/wrapper/CitrixRequestWrapper.java | 2 +
.../resource/wrapper/StopCommandWrapper.java | 173 +++++++++++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 13 ++
4 files changed, 199 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6b80c799/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 c7405fc..7c80f64 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
@@ -339,6 +339,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return _host;
}
+ public boolean canBridgeFirewall() {
+ return _canBridgeFirewall;
+ }
+
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);
@@ -374,7 +378,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return success;
}
- protected boolean isRefNull(final XenAPIObject object) {
+ public boolean isRefNull(final XenAPIObject object) {
return object == null || object.toWireString().equals("OpaqueRef:NULL") || object.toWireString().equals("<not in database>");
}
@@ -1311,7 +1315,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
- protected HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUGroupDetails(final Connection conn) throws XenAPIException, XmlRpcException {
+ public HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUGroupDetails(final Connection conn) throws XenAPIException, XmlRpcException {
return null;
}
@@ -2877,7 +2881,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
- protected void removeSR(final Connection conn, final SR sr) {
+ public void removeSR(final Connection conn, final SR sr) {
if (sr == null) {
return;
}
@@ -3272,7 +3276,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- void shutdownVM(final Connection conn, final VM vm, final String vmName) throws XmlRpcException {
+ public void shutdownVM(final Connection conn, final VM vm, final String vmName) throws XmlRpcException {
Task task = null;
try {
task = vm.cleanShutdownAsync(conn);
@@ -3672,7 +3676,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException("Could not find an available slot in VM with name to attach a new disk.");
}
- protected String callHostPlugin(final Connection conn, final String plugin, final String cmd, final String... params) {
+ public String callHostPlugin(final Connection conn, final String plugin, final String cmd, final String... params) {
final Map<String, String> args = new HashMap<String, String>();
String msg;
try {
@@ -4056,7 +4060,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return vlanNetwork;
}
- protected void disableVlanNetwork(final Connection conn, final Network network) {
+ public void disableVlanNetwork(final Connection conn, final Network network) {
}
protected SR getLocalLVMSR(final Connection conn) {
@@ -5736,7 +5740,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
}
- protected SR getISOSRbyVmName(final Connection conn, final String vmName) {
+ public SR getISOSRbyVmName(final Connection conn, final String vmName) {
try {
final Set<SR> srs = SR.getByNameLabel(conn, vmName + "-ISO");
if (srs.size() == 0) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6b80c799/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 b3996c1..5eb3882 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
@@ -29,6 +29,7 @@ import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.agent.api.RebootRouterCommand;
+import com.cloud.agent.api.StopCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateCommand;
@@ -63,6 +64,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(GetVmStatsCommand.class, new GetVmStatsCommandWrapper());
map.put(GetVmDiskStatsCommand.class, new GetVmDiskStatsCommandWrapper());
map.put(CheckHealthCommand.class, new CheckHealthCommandWrapper());
+ map.put(StopCommand.class, new StopCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6b80c799/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java
new file mode 100644
index 0000000..bca90b5
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/StopCommandWrapper.java
@@ -0,0 +1,173 @@
+//
+// 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.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.StopAnswer;
+import com.cloud.agent.api.StopCommand;
+import com.cloud.agent.api.VgpuTypesInfo;
+import com.cloud.agent.api.to.GPUDeviceTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.StringUtils;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types.VmPowerState;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VGPU;
+import com.xensource.xenapi.VIF;
+import com.xensource.xenapi.VM;
+
+public final class StopCommandWrapper extends CommandWrapper<StopCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(StopCommandWrapper.class);
+
+ @Override
+ public Answer execute(final StopCommand command, final CitrixResourceBase citrixResourceBase) {
+ final String vmName = command.getVmName();
+ String platformstring = null;
+ try {
+ final Connection conn = citrixResourceBase.getConnection();
+ final Set<VM> vms = VM.getByNameLabel(conn, vmName);
+ // stop vm which is running on this host or is in halted state
+ final Iterator<VM> iter = vms.iterator();
+ while (iter.hasNext()) {
+ final VM vm = iter.next();
+ final VM.Record vmr = vm.getRecord(conn);
+ if (vmr.powerState != VmPowerState.RUNNING) {
+ continue;
+ }
+ if (citrixResourceBase.isRefNull(vmr.residentOn)) {
+ continue;
+ }
+ if (vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
+ continue;
+ }
+ iter.remove();
+ }
+
+ if (vms.size() == 0) {
+ return new StopAnswer(command, "VM does not exist", true);
+ }
+ for (final VM vm : vms) {
+ final VM.Record vmr = vm.getRecord(conn);
+ platformstring = StringUtils.mapToString(vmr.platform);
+ if (vmr.isControlDomain) {
+ final String msg = "Tring to Shutdown control domain";
+ s_logger.warn(msg);
+ return new StopAnswer(command, msg, false);
+ }
+
+ if (vmr.powerState == VmPowerState.RUNNING && !citrixResourceBase.isRefNull(vmr.residentOn) && !vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
+ final String msg = "Stop Vm " + vmName + " failed due to this vm is not running on this host: " + citrixResourceBase.getHost().getUuid() + " but host:" + vmr.residentOn.getUuid(conn);
+ s_logger.warn(msg);
+ return new StopAnswer(command, msg, platformstring, false);
+ }
+
+ if (command.checkBeforeCleanup() && vmr.powerState == VmPowerState.RUNNING) {
+ final String msg = "Vm " + vmName + " is running on host and checkBeforeCleanup flag is set, so bailing out";
+ s_logger.debug(msg);
+ return new StopAnswer(command, msg, false);
+ }
+
+ s_logger.debug("9. The VM " + vmName + " is in Stopping state");
+
+ try {
+ if (vmr.powerState == VmPowerState.RUNNING) {
+ /* when stop a vm, set affinity to current xenserver */
+ vm.setAffinity(conn, vm.getResidentOn(conn));
+
+ if (citrixResourceBase.canBridgeFirewall()) {
+ final String result = citrixResourceBase.callHostPlugin(conn, "vmops", "destroy_network_rules_for_vm", "vmName", command.getVmName());
+ if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
+ s_logger.warn("Failed to remove network rules for vm " + command.getVmName());
+ } else {
+ s_logger.info("Removed network rules for vm " + command.getVmName());
+ }
+ }
+ citrixResourceBase.shutdownVM(conn, vm, vmName);
+ }
+ } catch (final Exception e) {
+ final String msg = "Catch exception " + e.getClass().getName() + " when stop VM:" + command.getVmName() + " due to " + e.toString();
+ s_logger.debug(msg);
+ return new StopAnswer(command, msg, platformstring, false);
+ } finally {
+
+ try {
+ if (vm.getPowerState(conn) == VmPowerState.HALTED) {
+ Set<VGPU> vGPUs = null;
+ // Get updated GPU details
+ try {
+ vGPUs = vm.getVGPUs(conn);
+ } catch (final XenAPIException e2) {
+ s_logger.debug("VM " + vmName + " does not have GPU support.");
+ }
+ if (vGPUs != null && !vGPUs.isEmpty()) {
+ final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = citrixResourceBase.getGPUGroupDetails(conn);
+ command.setGpuDevice(new GPUDeviceTO(null, null, groupDetails));
+ }
+
+ final Set<VIF> vifs = vm.getVIFs(conn);
+ final List<Network> networks = new ArrayList<Network>();
+ for (final VIF vif : vifs) {
+ networks.add(vif.getNetwork(conn));
+ }
+ vm.destroy(conn);
+ final SR sr = citrixResourceBase.getISOSRbyVmName(conn, command.getVmName());
+ citrixResourceBase.removeSR(conn, sr);
+ // Disable any VLAN networks that aren't used
+ // anymore
+ for (final Network network : networks) {
+ try {
+ if (network.getNameLabel(conn).startsWith("VLAN")) {
+ citrixResourceBase.disableVlanNetwork(conn, network);
+ }
+ } catch (final Exception e) {
+ // network might be destroyed by other host
+ }
+ }
+ return new StopAnswer(command, "Stop VM " + vmName + " Succeed", platformstring, true);
+ }
+ } catch (final Exception e) {
+ final String msg = "VM destroy failed in Stop " + vmName + " Command due to " + e.getMessage();
+ s_logger.warn(msg, e);
+ } finally {
+ s_logger.debug("10. The VM " + vmName + " is in Stopped state");
+ }
+ }
+ }
+
+ } catch (final Exception e) {
+ final String msg = "Stop Vm " + vmName + " fail due to " + e.toString();
+ s_logger.warn(msg, e);
+ return new StopAnswer(command, msg, platformstring, false);
+ }
+ return new StopAnswer(command, "Stop VM failed", platformstring, false);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6b80c799/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 69071c0..74f7cdc 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
@@ -26,6 +26,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.StopCommand;
import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateAnswer;
@@ -177,6 +178,18 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testStopCommandCommand() {
+ final StopCommand statsCommand = new StopCommand("Test", false, false);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(statsCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[20/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
Refactoring DeleteStoragePoolCommand, ModifyStoragePoolCommand and ResizeVolumeCommand to cope with new design
- Basic tests added.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6c775951
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6c775951
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6c775951
Branch: refs/heads/master
Commit: 6c775951c7d749877605474b1ba2c43d14464f7d
Parents: a06958f
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 24 14:51:20 2015 +0100
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:28 2015 +0200
----------------------------------------------------------------------
.../xenserver/resource/CitrixResourceBase.java | 4 +-
.../CitrixDeleteStoragePoolCommandWrapper.java | 52 +++++++++++
.../CitrixModifyStoragePoolCommandWrapper.java | 96 ++++++++++++++++++++
.../resource/wrapper/CitrixRequestWrapper.java | 6 ++
.../CitrixResizeVolumeCommandWrapper.java | 52 +++++++++++
.../wrapper/CitrixRequestWrapperTest.java | 52 +++++++++++
6 files changed, 260 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c775951/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 e935303..ec67ee8 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
@@ -5033,11 +5033,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return null;
}
- protected String callHostPluginPremium(final Connection conn, final String cmd, final String... params) {
+ public String callHostPluginPremium(final Connection conn, final String cmd, final String... params) {
return callHostPlugin(conn, "vmopspremium", cmd, params);
}
- protected String setupHeartbeatSr(final Connection conn, final SR sr, final boolean force) throws XenAPIException, XmlRpcException {
+ public String setupHeartbeatSr(final Connection conn, final SR sr, final boolean force) throws XenAPIException, XmlRpcException {
final SR.Record srRec = sr.getRecord(conn);
final String srUuid = srRec.uuid;
if (!srRec.shared || !SRType.LVMOHBA.equals(srRec.type) && !SRType.LVMOISCSI.equals(srRec.type) && !SRType.NFS.equals(srRec.type)) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c775951/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteStoragePoolCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteStoragePoolCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteStoragePoolCommandWrapper.java
new file mode 100644
index 0000000..e95a272
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixDeleteStoragePoolCommandWrapper.java
@@ -0,0 +1,52 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.DeleteStoragePoolCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+
+public final class CitrixDeleteStoragePoolCommandWrapper extends CommandWrapper<DeleteStoragePoolCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixDeleteStoragePoolCommandWrapper.class);
+
+ @Override
+ public Answer execute(final DeleteStoragePoolCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final StorageFilerTO poolTO = command.getPool();
+ try {
+ final SR sr = citrixResourceBase.getStorageRepository(conn, poolTO.getUuid());
+ citrixResourceBase.removeSR(conn, sr);
+ final Answer answer = new Answer(command, true, "success");
+ return answer;
+ } catch (final Exception e) {
+ final String msg = "DeleteStoragePoolCommand XenAPIException:" + e.getMessage() + " host:" + citrixResourceBase.getHost().getUuid() + " pool: " + poolTO.getHost()
+ + poolTO.getPath();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c775951/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifyStoragePoolCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifyStoragePoolCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifyStoragePoolCommandWrapper.java
new file mode 100644
index 0000000..1a6fb27
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixModifyStoragePoolCommandWrapper.java
@@ -0,0 +1,96 @@
+//
+// 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.HashMap;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ModifyStoragePoolAnswer;
+import com.cloud.agent.api.ModifyStoragePoolCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.storage.template.TemplateProp;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types.XenAPIException;
+
+public final class CitrixModifyStoragePoolCommandWrapper extends CommandWrapper<ModifyStoragePoolCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixModifyStoragePoolCommandWrapper.class);
+
+ @Override
+ public Answer execute(final ModifyStoragePoolCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final StorageFilerTO pool = command.getPool();
+ final boolean add = command.getAdd();
+ if (add) {
+ try {
+ final SR sr = citrixResourceBase.getStorageRepository(conn, pool.getUuid());
+ citrixResourceBase.setupHeartbeatSr(conn, sr, false);
+ final long capacity = sr.getPhysicalSize(conn);
+ final long available = capacity - sr.getPhysicalUtilisation(conn);
+ if (capacity == -1) {
+ final String msg = "Pool capacity is -1! pool: " + pool.getHost() + pool.getPath();
+ s_logger.warn(msg);
+ return new Answer(command, false, msg);
+ }
+ final Map<String, TemplateProp> tInfo = new HashMap<String, TemplateProp>();
+ final ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(command, capacity, available, tInfo);
+ return answer;
+ } catch (final XenAPIException e) {
+ final String msg = "ModifyStoragePoolCommand add XenAPIException:" + e.toString() + " host:" + citrixResourceBase.getHost().getUuid() + " pool: " + pool.getHost()
+ + pool.getPath();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ } catch (final Exception e) {
+ final String msg = "ModifyStoragePoolCommand add XenAPIException:" + e.getMessage() + " host:" + citrixResourceBase.getHost().getUuid() + " pool: "
+ + pool.getHost() + pool.getPath();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ }
+ } else {
+ try {
+ final SR sr = citrixResourceBase.getStorageRepository(conn, pool.getUuid());
+ final String srUuid = sr.getUuid(conn);
+ final String result = citrixResourceBase.callHostPluginPremium(conn, "setup_heartbeat_file", "host", citrixResourceBase.getHost().getUuid(), "sr", srUuid, "add",
+ "false");
+ if (result == null || !result.split("#")[1].equals("0")) {
+ throw new CloudRuntimeException("Unable to remove heartbeat file entry for SR " + srUuid + " due to " + result);
+ }
+ return new Answer(command, true, "seccuss");
+ } catch (final XenAPIException e) {
+ final String msg = "ModifyStoragePoolCommand remove XenAPIException:" + e.toString() + " host:" + citrixResourceBase.getHost().getUuid() + " pool: "
+ + pool.getHost() + pool.getPath();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ } catch (final Exception e) {
+ final String msg = "ModifyStoragePoolCommand remove XenAPIException:" + e.getMessage() + " host:" + citrixResourceBase.getHost().getUuid() + " pool: "
+ + pool.getHost() + pool.getPath();
+ s_logger.warn(msg, e);
+ return new Answer(command, false, msg);
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c775951/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 af5e5b4..5451601 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
@@ -26,10 +26,12 @@ import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
+import com.cloud.agent.api.DeleteStoragePoolCommand;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
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;
@@ -39,6 +41,7 @@ import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand;
import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
+import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.RequestWrapper;
import com.cloud.resource.ServerResource;
@@ -77,6 +80,9 @@ public class CitrixRequestWrapper extends RequestWrapper {
map.put(MigrateCommand.class, new CitrixMigrateCommandWrapper());
map.put(DestroyCommand.class, new CitrixDestroyCommandWrapper());
map.put(CreateStoragePoolCommand.class, new CitrixCreateStoragePoolCommandWrapper());
+ map.put(ModifyStoragePoolCommand.class, new CitrixModifyStoragePoolCommandWrapper());
+ map.put(DeleteStoragePoolCommand.class, new CitrixDeleteStoragePoolCommandWrapper());
+ map.put(ResizeVolumeCommand.class, new CitrixResizeVolumeCommandWrapper());
}
public static CitrixRequestWrapper getInstance() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c775951/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixResizeVolumeCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixResizeVolumeCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixResizeVolumeCommandWrapper.java
new file mode 100644
index 0000000..62f9093
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixResizeVolumeCommandWrapper.java
@@ -0,0 +1,52 @@
+//
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.ResizeVolumeAnswer;
+import com.cloud.agent.api.storage.ResizeVolumeCommand;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.VDI;
+
+public final class CitrixResizeVolumeCommandWrapper extends CommandWrapper<ResizeVolumeCommand, Answer, CitrixResourceBase> {
+
+ private static final Logger s_logger = Logger.getLogger(CitrixResizeVolumeCommandWrapper.class);
+
+ @Override
+ public Answer execute(final ResizeVolumeCommand command, final CitrixResourceBase citrixResourceBase) {
+ final Connection conn = citrixResourceBase.getConnection();
+ final String volid = command.getPath();
+ final long newSize = command.getNewSize();
+
+ try {
+ final VDI vdi = citrixResourceBase.getVDIbyUuid(conn, volid);
+ vdi.resize(conn, newSize);
+ return new ResizeVolumeAnswer(command, true, "success", newSize);
+ } catch (final Exception e) {
+ s_logger.warn("Unable to resize volume", e);
+ final String error = "failed to resize volume:" + e;
+ return new ResizeVolumeAnswer(command, false, error);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c775951/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 baf7a55..9de002e 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
@@ -21,10 +21,12 @@ import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.CheckVirtualMachineCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.CreateStoragePoolCommand;
+import com.cloud.agent.api.DeleteStoragePoolCommand;
import com.cloud.agent.api.GetHostStatsCommand;
import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsCommand;
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.RebootAnswer;
@@ -36,6 +38,8 @@ import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
+import com.cloud.agent.api.storage.ResizeVolumeCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
import com.cloud.hypervisor.xenserver.resource.XsHost;
@@ -280,6 +284,54 @@ public class CitrixRequestWrapperTest {
assertFalse(answer.getResult());
}
+
+ @Test
+ public void testModifyStoragePoolCommand() {
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final ModifyStoragePoolCommand destroyCommand = new ModifyStoragePoolCommand(false, poolVO);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
+
+ @Test
+ public void testDeleteStoragePoolCommand() {
+ final StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+ final XsHost xsHost = Mockito.mock(XsHost.class);
+
+ final DeleteStoragePoolCommand destroyCommand = new DeleteStoragePoolCommand(poolVO);
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ when(citrixResourceBase.getHost()).thenReturn(xsHost);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+
+ assertTrue(answer.getResult());
+ }
+
+ @Test
+ public void testResizeVolumeCommand() {
+ final StorageFilerTO pool = Mockito.mock(StorageFilerTO.class);
+
+ final ResizeVolumeCommand destroyCommand = new ResizeVolumeCommand("Test", pool, 1l, 3l, false, "Tests-1");
+
+ final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+ assertNotNull(wrapper);
+
+ final Answer answer = wrapper.execute(destroyCommand, citrixResourceBase);
+
+ assertFalse(answer.getResult());
+ }
}
class NotAValidCommand extends Command {
[09/39] git commit: updated refs/heads/master to 3e28747
Posted by bh...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
index 1a6de1f..b5eef7e 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
@@ -27,15 +27,6 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.SR;
-import com.xensource.xenapi.Types;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VBD;
-import com.xensource.xenapi.VDI;
-import com.xensource.xenapi.VM;
-
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.NetworkUsageAnswer;
@@ -49,6 +40,14 @@ import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
@Local(value = ServerResource.class)
public class XcpOssResource extends CitrixResourceBase {
@@ -57,55 +56,55 @@ public class XcpOssResource extends CitrixResourceBase {
@Override
protected List<File> getPatchFiles() {
- List<File> files = new ArrayList<File>();
- String patch = "scripts/vm/hypervisor/xenserver/xcposs/patch";
- String patchfilePath = Script.findScript("", patch);
+ final List<File> files = new ArrayList<File>();
+ final String patch = "scripts/vm/hypervisor/xenserver/xcposs/patch";
+ final String patchfilePath = Script.findScript("", patch);
if (patchfilePath == null) {
throw new CloudRuntimeException("Unable to find patch file " + patch);
}
- File file = new File(patchfilePath);
+ final File file = new File(patchfilePath);
files.add(file);
return files;
}
@Override
- protected void fillHostInfo(Connection conn, StartupRoutingCommand cmd) {
+ protected void fillHostInfo(final Connection conn, final StartupRoutingCommand cmd) {
super.fillHostInfo(conn, cmd);
cmd.setCaps(cmd.getCapabilities() + " , hvm");
}
@Override
- protected boolean launchHeartBeat(Connection conn) {
+ protected boolean launchHeartBeat(final Connection conn) {
return true;
}
@Override
- protected StartupStorageCommand initializeLocalSR(Connection conn) {
- SR extsr = getLocalEXTSR(conn);
+ protected StartupStorageCommand initializeLocalSR(final Connection conn) {
+ final SR extsr = getLocalEXTSR(conn);
if (extsr != null) {
try {
- String extuuid = extsr.getUuid(conn);
- _host.localSRuuid = extuuid;
- long cap = extsr.getPhysicalSize(conn);
+ final String extuuid = extsr.getUuid(conn);
+ _host.setLocalSRuuid(extuuid);
+ final long cap = extsr.getPhysicalSize(conn);
if (cap > 0) {
- long avail = cap - extsr.getPhysicalUtilisation(conn);
- String name = "Cloud Stack Local EXT Storage Pool for " + _host.uuid;
+ final long avail = cap - extsr.getPhysicalUtilisation(conn);
+ final String name = "Cloud Stack Local EXT Storage Pool for " + _host.getUuid();
extsr.setNameDescription(conn, name);
- Host host = Host.getByUuid(conn, _host.uuid);
- String address = host.getAddress(conn);
- StoragePoolInfo pInfo = new StoragePoolInfo(extsr.getNameLabel(conn), address, SRType.EXT.toString(), SRType.EXT.toString(), Storage.StoragePoolType.EXT, cap, avail);
- StartupStorageCommand cmd = new StartupStorageCommand();
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ final String address = host.getAddress(conn);
+ final StoragePoolInfo pInfo = new StoragePoolInfo(extsr.getNameLabel(conn), address, SRType.EXT.toString(), SRType.EXT.toString(), Storage.StoragePoolType.EXT, cap, avail);
+ final StartupStorageCommand cmd = new StartupStorageCommand();
cmd.setPoolInfo(pInfo);
- cmd.setGuid(_host.uuid);
+ cmd.setGuid(_host.getUuid());
cmd.setDataCenter(Long.toString(_dcId));
cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL);
return cmd;
}
- } catch (XenAPIException e) {
- String msg = "build local EXT info err in host:" + _host.uuid + e.toString();
+ } catch (final XenAPIException e) {
+ final String msg = "build local EXT info err in host:" + _host.getUuid() + e.toString();
s_logger.warn(msg);
- } catch (XmlRpcException e) {
- String msg = "build local EXT info err in host:" + _host.uuid + e.getMessage();
+ } catch (final XmlRpcException e) {
+ final String msg = "build local EXT info err in host:" + _host.getUuid() + e.getMessage();
s_logger.warn(msg);
}
}
@@ -113,7 +112,7 @@ public class XcpOssResource extends CitrixResourceBase {
}
@Override
- protected String getGuestOsType(String stdType, String platformEmulator, boolean bootFromCD) {
+ protected String getGuestOsType(final String stdType, final String platformEmulator, final boolean bootFromCD) {
if (stdType.equalsIgnoreCase("Debian GNU/Linux 6(64-bit)")) {
return "Debian Squeeze 6.0 (64-bit)";
} else if (stdType.equalsIgnoreCase("CentOS 5.6 (64-bit)")) {
@@ -124,21 +123,21 @@ public class XcpOssResource extends CitrixResourceBase {
}
@Override
- protected synchronized VBD createPatchVbd(Connection conn, String vmName, VM vm) throws XmlRpcException, XenAPIException {
- if (_host.localSRuuid != null) {
+ protected synchronized VBD createPatchVbd(final Connection conn, final String vmName, final VM vm) throws XmlRpcException, XenAPIException {
+ if (_host.getLocalSRuuid() != null) {
//create an iso vdi on it
- String result = callHostPlugin(conn, "vmops", "createISOVHD", "uuid", _host.localSRuuid);
+ final String result = callHostPlugin(conn, "vmops", "createISOVHD", "uuid", _host.getLocalSRuuid());
if (result == null || result.equalsIgnoreCase("Failed")) {
throw new CloudRuntimeException("can not create systemvm vdi");
}
- Set<VDI> vdis = VDI.getByNameLabel(conn, "systemvm-vdi");
+ final Set<VDI> vdis = VDI.getByNameLabel(conn, "systemvm-vdi");
if (vdis.size() != 1) {
throw new CloudRuntimeException("can not find systemvmiso");
}
- VDI systemvmVDI = vdis.iterator().next();
+ final VDI systemvmVDI = vdis.iterator().next();
- VBD.Record cdromVBDR = new VBD.Record();
+ final VBD.Record cdromVBDR = new VBD.Record();
cdromVBDR.VM = vm;
cdromVBDR.empty = false;
cdromVBDR.bootable = false;
@@ -146,32 +145,32 @@ public class XcpOssResource extends CitrixResourceBase {
cdromVBDR.mode = Types.VbdMode.RO;
cdromVBDR.type = Types.VbdType.DISK;
cdromVBDR.VDI = systemvmVDI;
- VBD cdromVBD = VBD.create(conn, cdromVBDR);
+ final VBD cdromVBD = VBD.create(conn, cdromVBDR);
return cdromVBD;
} else {
throw new CloudRuntimeException("can not find local sr");
}
}
- protected NetworkUsageAnswer execute(NetworkUsageCommand cmd) {
+ protected NetworkUsageAnswer execute(final NetworkUsageCommand cmd) {
try {
- Connection conn = getConnection();
+ final Connection conn = getConnection();
if (cmd.getOption() != null && cmd.getOption().equals("create")) {
- String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
- NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
+ final String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
return answer;
}
- long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
- NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
+ final long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
+ final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
return answer;
- } catch (Exception ex) {
+ } catch (final Exception ex) {
s_logger.warn("Failed to get network usage stats due to ", ex);
return new NetworkUsageAnswer(cmd, ex);
}
}
@Override
- public Answer executeRequest(Command cmd) {
+ public Answer executeRequest(final Command cmd) {
if (cmd instanceof NetworkUsageCommand) {
return execute((NetworkUsageCommand) cmd);
} else {
@@ -180,18 +179,18 @@ public class XcpOssResource extends CitrixResourceBase {
}
@Override
- public StopAnswer execute(StopCommand cmd) {
- StopAnswer answer = super.execute(cmd);
- String vmName = cmd.getVmName();
+ public StopAnswer execute(final StopCommand cmd) {
+ final StopAnswer answer = super.execute(cmd);
+ final String vmName = cmd.getVmName();
if (vmName.startsWith("v-")) {
- Connection conn = getConnection();
+ final Connection conn = getConnection();
callHostPlugin(conn, "vmops", "setDNATRule", "add", "false");
}
return answer;
}
@Override
- protected void setMemory(Connection conn, VM vm, long minMemsize, long maxMemsize) throws XmlRpcException, XenAPIException {
+ protected void setMemory(final Connection conn, final VM vm, final long minMemsize, final long maxMemsize) throws XmlRpcException, XenAPIException {
vm.setMemoryLimits(conn, mem_32m, maxMemsize, minMemsize, maxMemsize);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index a8e9efa..1de7b96 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -89,7 +89,7 @@ public class XenServer56Resource extends CitrixResourceBase {
final String bridge = networkr.bridge.trim();
for (final PIF pif : networkr.PIFs) {
final PIF.Record pifr = pif.getRecord(conn);
- if (!pifr.host.getUuid(conn).equalsIgnoreCase(_host.uuid)) {
+ if (!pifr.host.getUuid(conn).equalsIgnoreCase(_host.getUuid())) {
continue;
}
@@ -102,13 +102,13 @@ public class XenServer56Resource extends CitrixResourceBase {
}
try {
vlan.destroy(conn);
- final Host host = Host.getByUuid(conn, _host.uuid);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
host.forgetDataSourceArchives(conn, "pif_" + bridge + "_tx");
host.forgetDataSourceArchives(conn, "pif_" + bridge + "_rx");
host.forgetDataSourceArchives(conn, "pif_" + device + "." + vlannum + "_tx");
host.forgetDataSourceArchives(conn, "pif_" + device + "." + vlannum + "_rx");
} catch (final XenAPIException e) {
- s_logger.trace("Catch " + e.getClass().getName() + ": failed to destory VLAN " + device + " on host " + _host.uuid + " due to " + e.toString());
+ s_logger.trace("Catch " + e.getClass().getName() + ": failed to destory VLAN " + device + " on host " + _host.getUuid() + " due to " + e.toString());
}
}
return;
@@ -210,7 +210,7 @@ public class XenServer56Resource extends CitrixResourceBase {
}
protected Boolean check_heartbeat(final String hostuuid) {
- final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
+ final com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
try {
sshConnection.connect(null, 60000, 60000);
if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
index 2283477..3c5caf0 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
@@ -24,23 +24,10 @@ import java.util.Set;
import javax.ejb.Local;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Network;
-import com.xensource.xenapi.SR;
-import com.xensource.xenapi.Task;
-import com.xensource.xenapi.Types;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VBD;
-import com.xensource.xenapi.VDI;
-import com.xensource.xenapi.VIF;
-import com.xensource.xenapi.VM;
-
-import org.apache.cloudstack.storage.to.VolumeObjectTO;
-
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.MigrateWithStorageAnswer;
@@ -62,6 +49,17 @@ import com.cloud.network.Networks.TrafficType;
import com.cloud.resource.ServerResource;
import com.cloud.storage.Volume;
import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Task;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VIF;
+import com.xensource.xenapi.VM;
@Local(value = ServerResource.class)
public class XenServer610Resource extends XenServer600Resource {
@@ -72,7 +70,7 @@ public class XenServer610Resource extends XenServer600Resource {
}
@Override
- public Answer executeRequest(Command cmd) {
+ public Answer executeRequest(final Command cmd) {
if (cmd instanceof MigrateWithStorageCommand) {
return execute((MigrateWithStorageCommand)cmd);
} else if (cmd instanceof MigrateWithStorageReceiveCommand) {
@@ -88,34 +86,34 @@ public class XenServer610Resource extends XenServer600Resource {
}
}
- private List<VolumeObjectTO> getUpdatedVolumePathsOfMigratedVm(Connection connection, VM migratedVm, DiskTO[] volumes) throws CloudRuntimeException {
- List<VolumeObjectTO> volumeToList = new ArrayList<VolumeObjectTO>();
+ private List<VolumeObjectTO> getUpdatedVolumePathsOfMigratedVm(final Connection connection, final VM migratedVm, final DiskTO[] volumes) throws CloudRuntimeException {
+ final List<VolumeObjectTO> volumeToList = new ArrayList<VolumeObjectTO>();
try {
// Volume paths would have changed. Return that information.
- Set<VBD> vbds = migratedVm.getVBDs(connection);
- Map<String, VDI> deviceIdToVdiMap = new HashMap<String, VDI>();
+ final Set<VBD> vbds = migratedVm.getVBDs(connection);
+ final Map<String, VDI> deviceIdToVdiMap = new HashMap<String, VDI>();
// get vdi:vbdr to a map
- for (VBD vbd : vbds) {
- VBD.Record vbdr = vbd.getRecord(connection);
+ for (final VBD vbd : vbds) {
+ final VBD.Record vbdr = vbd.getRecord(connection);
if (vbdr.type == Types.VbdType.DISK) {
- VDI vdi = vbdr.VDI;
+ final VDI vdi = vbdr.VDI;
deviceIdToVdiMap.put(vbdr.userdevice, vdi);
}
}
- for (DiskTO volumeTo : volumes) {
+ for (final DiskTO volumeTo : volumes) {
if (volumeTo.getType() != Volume.Type.ISO) {
- VolumeObjectTO vol = (VolumeObjectTO)volumeTo.getData();
- Long deviceId = volumeTo.getDiskSeq();
- VDI vdi = deviceIdToVdiMap.get(deviceId.toString());
- VolumeObjectTO newVol = new VolumeObjectTO();
+ final VolumeObjectTO vol = (VolumeObjectTO)volumeTo.getData();
+ final Long deviceId = volumeTo.getDiskSeq();
+ final VDI vdi = deviceIdToVdiMap.get(deviceId.toString());
+ final VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setPath(vdi.getUuid(connection));
newVol.setId(vol.getId());
volumeToList.add(newVol);
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Unable to get the updated VDI paths of the migrated vm " + e.toString(), e);
throw new CloudRuntimeException("Unable to get the updated VDI paths of the migrated vm " + e.toString(), e);
}
@@ -123,10 +121,10 @@ public class XenServer610Resource extends XenServer600Resource {
return volumeToList;
}
- protected MigrateWithStorageAnswer execute(MigrateWithStorageCommand cmd) {
- Connection connection = getConnection();
- VirtualMachineTO vmSpec = cmd.getVirtualMachine();
- Map<VolumeTO, StorageFilerTO> volumeToFiler = cmd.getVolumeToFiler();
+ protected MigrateWithStorageAnswer execute(final MigrateWithStorageCommand cmd) {
+ final Connection connection = getConnection();
+ final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
+ final Map<VolumeTO, StorageFilerTO> volumeToFiler = cmd.getVolumeToFiler();
final String vmName = vmSpec.getName();
Task task = null;
@@ -134,24 +132,24 @@ public class XenServer610Resource extends XenServer600Resource {
prepareISO(connection, vmSpec.getName());
// Get the list of networks and recreate VLAN, if required.
- for (NicTO nicTo : vmSpec.getNics()) {
+ for (final NicTO nicTo : vmSpec.getNics()) {
getNetwork(connection, nicTo);
}
- Map<String, String> other = new HashMap<String, String>();
+ final Map<String, String> other = new HashMap<String, String>();
other.put("live", "true");
- Network networkForSm = getNativeNetworkForTraffic(connection, TrafficType.Storage, null).getNetwork();
- Host host = Host.getByUuid(connection, _host.uuid);
- Map<String, String> token = host.migrateReceive(connection, networkForSm, other);
+ final Network networkForSm = getNativeNetworkForTraffic(connection, TrafficType.Storage, null).getNetwork();
+ final Host host = Host.getByUuid(connection, _host.getUuid());
+ final Map<String, String> token = host.migrateReceive(connection, networkForSm, other);
// Get the vm to migrate.
- Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
- VM vmToMigrate = vms.iterator().next();
+ final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
+ final VM vmToMigrate = vms.iterator().next();
// Create the vif map. The vm stays in the same cluster so we have to pass an empty vif map.
- Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
- Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
- for (Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
+ final Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
+ final Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
+ for (final Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
vdiMap.put(getVDIbyUuid(connection, entry.getKey().getPath()), getStorageRepository(connection, entry.getValue().getUuid()));
}
@@ -159,10 +157,10 @@ public class XenServer610Resource extends XenServer600Resource {
task = vmToMigrate.assertCanMigrateAsync(connection, token, true, vdiMap, vifMap, other);
try {
// poll every 1 seconds
- long timeout = (_migratewait) * 1000L;
+ final long timeout = _migratewait * 1000L;
waitForTask(connection, task, 1000, timeout);
checkForSuccess(connection, task);
- } catch (Types.HandleInvalid e) {
+ } catch (final Types.HandleInvalid e) {
s_logger.error("Error while checking if vm " + vmName + " can be migrated to the destination host " + host, e);
throw new CloudRuntimeException("Error while checking if vm " + vmName + " can be migrated to the " + "destination host " + host, e);
}
@@ -171,90 +169,90 @@ public class XenServer610Resource extends XenServer600Resource {
task = vmToMigrate.migrateSendAsync(connection, token, true, vdiMap, vifMap, other);
try {
// poll every 1 seconds.
- long timeout = (_migratewait) * 1000L;
+ final long timeout = _migratewait * 1000L;
waitForTask(connection, task, 1000, timeout);
checkForSuccess(connection, task);
- } catch (Types.HandleInvalid e) {
+ } catch (final Types.HandleInvalid e) {
s_logger.error("Error while migrating vm " + vmName + " to the destination host " + host, e);
throw new CloudRuntimeException("Error while migrating vm " + vmName + " to the destination host " + host, e);
}
// Volume paths would have changed. Return that information.
- List<VolumeObjectTO> volumeToList = getUpdatedVolumePathsOfMigratedVm(connection, vmToMigrate, vmSpec.getDisks());
+ final List<VolumeObjectTO> volumeToList = getUpdatedVolumePathsOfMigratedVm(connection, vmToMigrate, vmSpec.getDisks());
vmToMigrate.setAffinity(connection, host);
return new MigrateWithStorageAnswer(cmd, volumeToList);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("Catch Exception " + e.getClass().getName() + ". Storage motion failed due to " + e.toString(), e);
return new MigrateWithStorageAnswer(cmd, e);
} finally {
if (task != null) {
try {
task.destroy(connection);
- } catch (Exception e) {
- s_logger.debug("Unable to destroy task " + task.toString() + " on host " + _host.uuid + " due to " + e.toString());
+ } catch (final Exception e) {
+ s_logger.debug("Unable to destroy task " + task.toString() + " on host " + _host.getUuid() + " due to " + e.toString());
}
}
}
}
- protected MigrateWithStorageReceiveAnswer execute(MigrateWithStorageReceiveCommand cmd) {
- Connection connection = getConnection();
- VirtualMachineTO vmSpec = cmd.getVirtualMachine();
- Map<VolumeTO, StorageFilerTO> volumeToFiler = cmd.getVolumeToFiler();
+ protected MigrateWithStorageReceiveAnswer execute(final MigrateWithStorageReceiveCommand cmd) {
+ final Connection connection = getConnection();
+ final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
+ final Map<VolumeTO, StorageFilerTO> volumeToFiler = cmd.getVolumeToFiler();
try {
// Get a map of all the SRs to which the vdis will be migrated.
- Map<VolumeTO, Object> volumeToSr = new HashMap<VolumeTO, Object>();
- for (Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
- SR sr = getStorageRepository(connection, entry.getValue().getUuid());
+ final Map<VolumeTO, Object> volumeToSr = new HashMap<VolumeTO, Object>();
+ for (final Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
+ final SR sr = getStorageRepository(connection, entry.getValue().getUuid());
volumeToSr.put(entry.getKey(), sr);
}
// Get the list of networks to which the vifs will attach.
- Map<NicTO, Object> nicToNetwork = new HashMap<NicTO, Object>();
- for (NicTO nicTo : vmSpec.getNics()) {
- Network network = getNetwork(connection, nicTo);
+ final Map<NicTO, Object> nicToNetwork = new HashMap<NicTO, Object>();
+ for (final NicTO nicTo : vmSpec.getNics()) {
+ final Network network = getNetwork(connection, nicTo);
nicToNetwork.put(nicTo, network);
}
- Map<String, String> other = new HashMap<String, String>();
+ final Map<String, String> other = new HashMap<String, String>();
other.put("live", "true");
- Network network = getNativeNetworkForTraffic(connection, TrafficType.Storage, null).getNetwork();
- Host host = Host.getByUuid(connection, _host.uuid);
- Map<String, String> token = host.migrateReceive(connection, network, other);
+ final Network network = getNativeNetworkForTraffic(connection, TrafficType.Storage, null).getNetwork();
+ final Host host = Host.getByUuid(connection, _host.getUuid());
+ final Map<String, String> token = host.migrateReceive(connection, network, other);
return new MigrateWithStorageReceiveAnswer(cmd, volumeToSr, nicToNetwork, token);
- } catch (CloudRuntimeException e) {
+ } catch (final CloudRuntimeException e) {
s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
return new MigrateWithStorageReceiveAnswer(cmd, e);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
return new MigrateWithStorageReceiveAnswer(cmd, e);
}
}
- protected MigrateWithStorageSendAnswer execute(MigrateWithStorageSendCommand cmd) {
- Connection connection = getConnection();
- VirtualMachineTO vmSpec = cmd.getVirtualMachine();
- Map<VolumeTO, Object> volumeToSr = cmd.getVolumeToSr();
- Map<NicTO, Object> nicToNetwork = cmd.getNicToNetwork();
- Map<String, String> token = cmd.getToken();
+ protected MigrateWithStorageSendAnswer execute(final MigrateWithStorageSendCommand cmd) {
+ final Connection connection = getConnection();
+ final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
+ final Map<VolumeTO, Object> volumeToSr = cmd.getVolumeToSr();
+ final Map<NicTO, Object> nicToNetwork = cmd.getNicToNetwork();
+ final Map<String, String> token = cmd.getToken();
final String vmName = vmSpec.getName();
- Set<VolumeTO> volumeToSet = null;
+ final Set<VolumeTO> volumeToSet = null;
boolean migrated = false;
Task task = null;
try {
- Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
- VM vmToMigrate = vms.iterator().next();
- Map<String, String> other = new HashMap<String, String>();
+ final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
+ final VM vmToMigrate = vms.iterator().next();
+ final Map<String, String> other = new HashMap<String, String>();
other.put("live", "true");
// Create the vdi map which tells what volumes of the vm need to go on which sr on the destination.
- Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
- for (Map.Entry<VolumeTO, Object> entry : volumeToSr.entrySet()) {
+ final Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
+ for (final Map.Entry<VolumeTO, Object> entry : volumeToSr.entrySet()) {
if (entry.getValue() instanceof SR) {
- SR sr = (SR)entry.getValue();
- VDI vdi = getVDIbyUuid(connection, entry.getKey().getPath());
+ final SR sr = (SR)entry.getValue();
+ final VDI vdi = getVDIbyUuid(connection, entry.getKey().getPath());
vdiMap.put(vdi, sr);
} else {
throw new CloudRuntimeException("The object " + entry.getValue() + " passed is not of type SR.");
@@ -262,11 +260,11 @@ public class XenServer610Resource extends XenServer600Resource {
}
// Create the vif map.
- Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
- for (Map.Entry<NicTO, Object> entry : nicToNetwork.entrySet()) {
+ final Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
+ for (final Map.Entry<NicTO, Object> entry : nicToNetwork.entrySet()) {
if (entry.getValue() instanceof Network) {
- Network network = (Network)entry.getValue();
- VIF vif = getVifByMac(connection, vmToMigrate, entry.getKey().getMac());
+ final Network network = (Network)entry.getValue();
+ final VIF vif = getVifByMac(connection, vmToMigrate, entry.getKey().getMac());
vifMap.put(vif, network);
} else {
throw new CloudRuntimeException("The object " + entry.getValue() + " passed is not of type Network.");
@@ -277,10 +275,10 @@ public class XenServer610Resource extends XenServer600Resource {
task = vmToMigrate.assertCanMigrateAsync(connection, token, true, vdiMap, vifMap, other);
try {
// poll every 1 seconds.
- long timeout = (_migratewait) * 1000L;
+ final long timeout = _migratewait * 1000L;
waitForTask(connection, task, 1000, timeout);
checkForSuccess(connection, task);
- } catch (Types.HandleInvalid e) {
+ } catch (final Types.HandleInvalid e) {
s_logger.error("Error while checking if vm " + vmName + " can be migrated.", e);
throw new CloudRuntimeException("Error while checking if vm " + vmName + " can be migrated.", e);
}
@@ -289,41 +287,41 @@ public class XenServer610Resource extends XenServer600Resource {
task = vmToMigrate.migrateSendAsync(connection, token, true, vdiMap, vifMap, other);
try {
// poll every 1 seconds.
- long timeout = (_migratewait) * 1000L;
+ final long timeout = _migratewait * 1000L;
waitForTask(connection, task, 1000, timeout);
checkForSuccess(connection, task);
- } catch (Types.HandleInvalid e) {
+ } catch (final Types.HandleInvalid e) {
s_logger.error("Error while migrating vm " + vmName, e);
throw new CloudRuntimeException("Error while migrating vm " + vmName, e);
}
migrated = true;
return new MigrateWithStorageSendAnswer(cmd, volumeToSet);
- } catch (CloudRuntimeException e) {
+ } catch (final CloudRuntimeException e) {
s_logger.error("Migration of vm " + vmName + " with storage failed due to " + e.toString(), e);
return new MigrateWithStorageSendAnswer(cmd, e);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Migration of vm " + vmName + " with storage failed due to " + e.toString(), e);
return new MigrateWithStorageSendAnswer(cmd, e);
} finally {
if (task != null) {
try {
task.destroy(connection);
- } catch (Exception e) {
- s_logger.debug("Unable to destroy task " + task.toString() + " on host " + _host.uuid + " due to " + e.toString());
+ } catch (final Exception e) {
+ s_logger.debug("Unable to destroy task " + task.toString() + " on host " + _host.getUuid() + " due to " + e.toString());
}
}
}
}
- protected MigrateWithStorageCompleteAnswer execute(MigrateWithStorageCompleteCommand cmd) {
- Connection connection = getConnection();
- VirtualMachineTO vmSpec = cmd.getVirtualMachine();
+ protected MigrateWithStorageCompleteAnswer execute(final MigrateWithStorageCompleteCommand cmd) {
+ final Connection connection = getConnection();
+ final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
try {
- Host host = Host.getByUuid(connection, _host.uuid);
- Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
- VM migratedVm = vms.iterator().next();
+ final Host host = Host.getByUuid(connection, _host.getUuid());
+ final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
+ final VM migratedVm = vms.iterator().next();
// Check the vm is present on the new host.
if (migratedVm == null) {
@@ -331,47 +329,47 @@ public class XenServer610Resource extends XenServer600Resource {
}
// Volume paths would have changed. Return that information.
- List<VolumeObjectTO> volumeToSet = getUpdatedVolumePathsOfMigratedVm(connection, migratedVm, vmSpec.getDisks());
+ final List<VolumeObjectTO> volumeToSet = getUpdatedVolumePathsOfMigratedVm(connection, migratedVm, vmSpec.getDisks());
migratedVm.setAffinity(connection, host);
return new MigrateWithStorageCompleteAnswer(cmd, volumeToSet);
- } catch (CloudRuntimeException e) {
+ } catch (final CloudRuntimeException e) {
s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
return new MigrateWithStorageCompleteAnswer(cmd, e);
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
return new MigrateWithStorageCompleteAnswer(cmd, e);
}
}
- protected MigrateVolumeAnswer execute(MigrateVolumeCommand cmd) {
- Connection connection = getConnection();
- String volumeUUID = cmd.getVolumePath();
- StorageFilerTO poolTO = cmd.getPool();
+ protected MigrateVolumeAnswer execute(final MigrateVolumeCommand cmd) {
+ final Connection connection = getConnection();
+ final String volumeUUID = cmd.getVolumePath();
+ final StorageFilerTO poolTO = cmd.getPool();
try {
- SR destinationPool = getStorageRepository(connection, poolTO.getUuid());
- VDI srcVolume = getVDIbyUuid(connection, volumeUUID);
- Map<String, String> other = new HashMap<String, String>();
+ final SR destinationPool = getStorageRepository(connection, poolTO.getUuid());
+ final VDI srcVolume = getVDIbyUuid(connection, volumeUUID);
+ final Map<String, String> other = new HashMap<String, String>();
other.put("live", "true");
// Live migrate the vdi across pool.
- Task task = srcVolume.poolMigrateAsync(connection, destinationPool, other);
- long timeout = (_migratewait) * 1000L;
+ final Task task = srcVolume.poolMigrateAsync(connection, destinationPool, other);
+ final long timeout = _migratewait * 1000L;
waitForTask(connection, task, 1000, timeout);
checkForSuccess(connection, task);
- VDI dvdi = Types.toVDI(task, connection);
+ final VDI dvdi = Types.toVDI(task, connection);
return new MigrateVolumeAnswer(cmd, true, null, dvdi.getUuid(connection));
- } catch (Exception e) {
- String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
s_logger.error(msg, e);
return new MigrateVolumeAnswer(cmd, false, msg, null);
}
}
@Override
- protected void plugDom0Vif(Connection conn, VIF dom0Vif) throws XmlRpcException, XenAPIException {
+ protected void plugDom0Vif(final Connection conn, final VIF dom0Vif) throws XmlRpcException, XenAPIException {
// do nothing. In xenserver 6.1 and beyond this step isn't needed.
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
index ecc3089..858fc15 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
@@ -20,18 +20,16 @@ import java.util.Set;
import javax.ejb.Local;
+import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs;
import org.apache.log4j.Logger;
+import com.cloud.agent.api.StartupRoutingCommand;
+import com.cloud.resource.ServerResource;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.HostPatch;
import com.xensource.xenapi.PoolPatch;
-import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs;
-
-import com.cloud.agent.api.StartupRoutingCommand;
-import com.cloud.resource.ServerResource;
-
@Local(value = ServerResource.class)
public class XenServer620Resource extends XenServer610Resource {
private static final Logger s_logger = Logger.getLogger(XenServer620Resource.class);
@@ -40,34 +38,33 @@ public class XenServer620Resource extends XenServer610Resource {
super();
}
-
- protected boolean hostHasHotFix(Connection conn, String hotFixUuid) {
+ protected boolean hostHasHotFix(final Connection conn, final String hotFixUuid) {
try {
- Host host = Host.getByUuid(conn, _host.uuid);
- Host.Record re = host.getRecord(conn);
- Set<HostPatch> patches = re.patches;
- PoolPatch poolPatch = PoolPatch.getByUuid(conn, hotFixUuid);
- for(HostPatch patch : patches) {
- PoolPatch pp = patch.getPoolPatch(conn);
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ final Host.Record re = host.getRecord(conn);
+ final Set<HostPatch> patches = re.patches;
+ final PoolPatch poolPatch = PoolPatch.getByUuid(conn, hotFixUuid);
+ for(final HostPatch patch : patches) {
+ final PoolPatch pp = patch.getPoolPatch(conn);
if (pp.equals(poolPatch) && patch.getApplied(conn)) {
return true;
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.debug("can't get patches information for hotFix: " + hotFixUuid);
}
return false;
}
@Override
- protected void fillHostInfo(Connection conn, StartupRoutingCommand cmd) {
+ protected void fillHostInfo(final Connection conn, final StartupRoutingCommand cmd) {
super.fillHostInfo(conn, cmd);
- Map<String, String> details = cmd.getHostDetails();
- Boolean hotFix62ESP1004 = hostHasHotFix(conn, XenserverConfigs.XSHotFix62ESP1004);
+ final Map<String, String> details = cmd.getHostDetails();
+ final Boolean hotFix62ESP1004 = hostHasHotFix(conn, XenserverConfigs.XSHotFix62ESP1004);
if( hotFix62ESP1004 != null && hotFix62ESP1004 ) {
details.put(XenserverConfigs.XS620HotFix , XenserverConfigs.XSHotFix62ESP1004);
} else {
- Boolean hotFix62ESP1 = hostHasHotFix(conn, XenserverConfigs.XSHotFix62ESP1);
+ final Boolean hotFix62ESP1 = hostHasHotFix(conn, XenserverConfigs.XSHotFix62ESP1);
if( hotFix62ESP1 != null && hotFix62ESP1 ) {
details.put(XenserverConfigs.XS620HotFix , XenserverConfigs.XSHotFix62ESP1);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30e72e4a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
index 5553553..ac2b2a6 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
@@ -28,16 +28,6 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.GPUGroup;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.PGPU;
-import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VGPU;
-import com.xensource.xenapi.VGPUType;
-import com.xensource.xenapi.VGPUType.Record;
-import com.xensource.xenapi.VM;
-
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetGPUStatsAnswer;
@@ -47,6 +37,15 @@ import com.cloud.agent.api.StartupRoutingCommand;
import com.cloud.agent.api.VgpuTypesInfo;
import com.cloud.agent.api.to.GPUDeviceTO;
import com.cloud.resource.ServerResource;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.GPUGroup;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.PGPU;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VGPU;
+import com.xensource.xenapi.VGPUType;
+import com.xensource.xenapi.VGPUType.Record;
+import com.xensource.xenapi.VM;
@Local(value=ServerResource.class)
public class XenServer620SP1Resource extends XenServer620Resource {
@@ -57,8 +56,8 @@ public class XenServer620SP1Resource extends XenServer620Resource {
}
@Override
- public Answer executeRequest(Command cmd) {
- Class<? extends Command> clazz = cmd.getClass();
+ public Answer executeRequest(final Command cmd) {
+ final Class<? extends Command> clazz = cmd.getClass();
if (clazz == GetGPUStatsCommand.class) {
return execute((GetGPUStatsCommand) cmd);
} else {
@@ -66,28 +65,28 @@ public class XenServer620SP1Resource extends XenServer620Resource {
}
}
- protected GetGPUStatsAnswer execute(GetGPUStatsCommand cmd) {
- Connection conn = getConnection();
+ protected GetGPUStatsAnswer execute(final GetGPUStatsCommand cmd) {
+ final Connection conn = getConnection();
HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = new HashMap<String, HashMap<String, VgpuTypesInfo>>();
try {
groupDetails = getGPUGroupDetails(conn);
- } catch (Exception e) {
- String msg = "Unable to get GPU stats" + e.toString();
+ } catch (final Exception e) {
+ final String msg = "Unable to get GPU stats" + e.toString();
s_logger.warn(msg, e);
}
return new GetGPUStatsAnswer(cmd, groupDetails);
}
@Override
- protected void fillHostInfo(Connection conn, StartupRoutingCommand cmd) {
+ protected void fillHostInfo(final Connection conn, final StartupRoutingCommand cmd) {
super.fillHostInfo(conn, cmd);
try {
- HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = getGPUGroupDetails(conn);
+ final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = getGPUGroupDetails(conn);
cmd.setGpuGroupDetails(groupDetails);
if (groupDetails != null && !groupDetails.isEmpty()) {
cmd.setHostTags("GPU");
}
- } catch (Exception e) {
+ } catch (final Exception e) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Error while getting GPU device info from host " + cmd.getName(), e);
}
@@ -95,26 +94,26 @@ public class XenServer620SP1Resource extends XenServer620Resource {
}
@Override
- protected HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUGroupDetails(Connection conn) throws XenAPIException, XmlRpcException {
- HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = new HashMap<String, HashMap<String, VgpuTypesInfo>>();
- Host host = Host.getByUuid(conn, _host.uuid);
- Set<PGPU> pgpus = host.getPGPUs(conn);
- Iterator<PGPU> iter = pgpus.iterator();
+ protected HashMap<String, HashMap<String, VgpuTypesInfo>> getGPUGroupDetails(final Connection conn) throws XenAPIException, XmlRpcException {
+ final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = new HashMap<String, HashMap<String, VgpuTypesInfo>>();
+ final Host host = Host.getByUuid(conn, _host.getUuid());
+ final Set<PGPU> pgpus = host.getPGPUs(conn);
+ final Iterator<PGPU> iter = pgpus.iterator();
while (iter.hasNext()) {
- PGPU pgpu = iter.next();
- GPUGroup gpuGroup = pgpu.getGPUGroup(conn);
- Set<VGPUType> enabledVGPUTypes = gpuGroup.getEnabledVGPUTypes(conn);
- String groupName = gpuGroup.getNameLabel(conn);
+ final PGPU pgpu = iter.next();
+ final GPUGroup gpuGroup = pgpu.getGPUGroup(conn);
+ final Set<VGPUType> enabledVGPUTypes = gpuGroup.getEnabledVGPUTypes(conn);
+ final String groupName = gpuGroup.getNameLabel(conn);
HashMap<String, VgpuTypesInfo> gpuCapacity = new HashMap<String, VgpuTypesInfo>();
if (groupDetails.get(groupName) != null) {
gpuCapacity = groupDetails.get(groupName);
}
// Get remaining capacity of all the enabled VGPU in a PGPU
if(enabledVGPUTypes != null) {
- Iterator<VGPUType> it = enabledVGPUTypes.iterator();
+ final Iterator<VGPUType> it = enabledVGPUTypes.iterator();
while (it.hasNext()) {
- VGPUType type = it.next();
- Record record = type.getRecord(conn);
+ final VGPUType type = it.next();
+ final Record record = type.getRecord(conn);
Long remainingCapacity = pgpu.getRemainingCapacity(conn, type);
Long maxCapacity = pgpu.getSupportedVGPUMaxCapacities(conn).get(type);
VgpuTypesInfo entry;
@@ -125,7 +124,7 @@ public class XenServer620SP1Resource extends XenServer620Resource {
entry.setMaxVmCapacity(maxCapacity);
gpuCapacity.put(record.modelName, entry);
} else {
- VgpuTypesInfo vgpuTypeRecord = new VgpuTypesInfo(null, record.modelName, record.framebufferSize, record.maxHeads,
+ final VgpuTypesInfo vgpuTypeRecord = new VgpuTypesInfo(null, record.modelName, record.framebufferSize, record.maxHeads,
record.maxResolutionX, record.maxResolutionY, maxCapacity, remainingCapacity, maxCapacity);
gpuCapacity.put(record.modelName, vgpuTypeRecord);
}
@@ -137,27 +136,27 @@ public class XenServer620SP1Resource extends XenServer620Resource {
}
@Override
- protected void createVGPU(Connection conn, StartCommand cmd, VM vm, GPUDeviceTO gpuDevice) throws XenAPIException, XmlRpcException {
+ protected void createVGPU(final Connection conn, final StartCommand cmd, final VM vm, final GPUDeviceTO gpuDevice) throws XenAPIException, XmlRpcException {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Creating VGPU of VGPU type [ " + gpuDevice.getVgpuType() + " ] in gpu group" + gpuDevice.getGpuGroup()
+ " for VM " + cmd.getVirtualMachine().getName());
}
- Set<GPUGroup> groups = GPUGroup.getByNameLabel(conn, gpuDevice.getGpuGroup());
+ final Set<GPUGroup> groups = GPUGroup.getByNameLabel(conn, gpuDevice.getGpuGroup());
assert groups.size() == 1 : "Should only have 1 group but found " + groups.size();
- GPUGroup gpuGroup = groups.iterator().next();
+ final GPUGroup gpuGroup = groups.iterator().next();
- Set<VGPUType> vgpuTypes = gpuGroup.getEnabledVGPUTypes(conn);
- Iterator<VGPUType> iter = vgpuTypes.iterator();
+ final Set<VGPUType> vgpuTypes = gpuGroup.getEnabledVGPUTypes(conn);
+ final Iterator<VGPUType> iter = vgpuTypes.iterator();
VGPUType vgpuType = null;
while (iter.hasNext()) {
- VGPUType entry = iter.next();
+ final VGPUType entry = iter.next();
if (entry.getModelName(conn).equals(gpuDevice.getVgpuType())) {
vgpuType = entry;
}
}
- String device = "0"; // Only allow device = "0" for now, as XenServer supports just a single vGPU per VM.
- Map<String, String> other_config = new HashMap<String, String>();
+ final String device = "0"; // Only allow device = "0" for now, as XenServer supports just a single vGPU per VM.
+ final Map<String, String> other_config = new HashMap<String, String>();
VGPU.create(conn, vm, gpuGroup, device, other_config, vgpuType);
if (s_logger.isDebugEnabled()) {
@@ -166,5 +165,4 @@ public class XenServer620SP1Resource extends XenServer620Resource {
// Calculate and set remaining GPU capacity in the host.
cmd.getVirtualMachine().getGpuDevice().setGroupDetails(getGPUGroupDetails(conn));
}
-
-}
+}
\ No newline at end of file