// 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 javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.agent.api.StartupCommand; import com.cloud.resource.ServerResource; import com.cloud.utils.exception.CloudRuntimeException; 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.XenAPIException; import com.xensource.xenapi.VLAN; @Local(value = ServerResource.class) public class XenServer56Resource extends CitrixResourceBase { private final static Logger s_logger = Logger.getLogger(XenServer56Resource.class); @Override protected String getPatchFilePath() { return "scripts/vm/hypervisor/xenserver/xenserver56/patch"; } @Override public void disableVlanNetwork(final Connection conn, final Network network) { try { final Network.Record networkr = network.getRecord(conn); if (!networkr.nameLabel.startsWith("VLAN")) { return; } 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.getUuid())) { continue; } final VLAN vlan = pifr.VLANMasterOf; if (vlan != null) { final String vlannum = pifr.VLAN.toString(); final String device = pifr.device.trim(); if (vlannum.equals("-1")) { return; } try { vlan.destroy(conn); 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.getUuid() + " due to " + e.toString()); } } return; } } catch (final XenAPIException e) { final String msg = "Unable to disable VLAN network due to " + e.toString(); s_logger.warn(msg, e); } catch (final Exception e) { final String msg = "Unable to disable VLAN network due to " + e.getMessage(); s_logger.warn(msg, e); } } @Override public String networkUsage(final Connection conn, final String privateIpAddress, final String option, final String vif) { String args = ""; if (option.equals("get")) { args += "-g"; } else if (option.equals("create")) { args += "-c"; } else if (option.equals("reset")) { args += "-r"; } else if (option.equals("addVif")) { args += "-a "; args += vif; } else if (option.equals("deleteVif")) { args += "-d "; args += vif; } return executeInVR(privateIpAddress, "netusage.sh", args).getDetails(); } 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); if (!sshConnection.authenticateWithPassword(_username, _password.peek())) { throw new CloudRuntimeException("Unable to authenticate"); } 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) { s_logger.debug("health check failed due to catch exception " + e.toString()); return null; } finally { sshConnection.close(); } } @Override public StartupCommand[] initialize() { pingXAPI(); final StartupCommand[] cmds = super.initialize(); return cmds; } }