/* * Copyright (c) 2012-2015 iWave Software LLC * All Rights Reserved */ package com.iwave.ext.windows.winrm.wmi; import java.util.List; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.text.StrBuilder; import com.google.common.collect.Lists; import org.w3c.dom.Element; import com.iwave.ext.windows.model.wmi.FibreChannelTargetMapping; import com.iwave.ext.windows.winrm.WinRMConstants; import com.iwave.ext.windows.winrm.WinRMInvokeOperation; import com.iwave.ext.windows.winrm.WinRMTarget; import com.iwave.ext.xml.XmlStringBuilder; import com.iwave.ext.xml.XmlUtils; public class GetFcpTargetMappingMethod extends WinRMInvokeOperation<List<FibreChannelTargetMapping>> { private static final String HBA_FCP_INFO_URI = WinRMConstants.WMI_BASE_URI + "root/wmi/MSFC_HBAFCPInfo"; private static final String GET_FCP_TARGET_MAPPING = "GetFcpTargetMapping"; private static final String GET_FCP_TARGET_MAPPING_URI = HBA_FCP_INFO_URI + "/" + GET_FCP_TARGET_MAPPING; private static final String HBA_FCP_SCSI_ENTRY = "root/wmi/HBAFCPScsiEntry"; private static final String HBA_FCP_ID = "root/wmi/HBAFCPID"; private static final String HBA_SCSI_ID = "root/wmi/HBAScsiID"; private static final XPath XPATH = XmlUtils.createXPath( String.format("ns=%s", HBA_FCP_INFO_URI), String.format("ns1=%s%s", WinRMConstants.WMI_BASE_URI, HBA_FCP_SCSI_ENTRY), String.format("ns2=%s%s", WinRMConstants.WMI_BASE_URI, HBA_FCP_ID), String.format("ns3=%s%s", WinRMConstants.WMI_BASE_URI, HBA_SCSI_ID)); private static final XPathExpression ENTRY_EXPR = XmlUtils.compileXPath(XPATH, "ns:Entry"); private static final XPathExpression NODE_WWNS_EXPR = XmlUtils.compileXPath(XPATH, "ns1:FCPId/ns2:NodeWWN"); private static final XPathExpression PORT_WWNS_EXPR = XmlUtils.compileXPath(XPATH, "ns1:FCPId/ns2:PortWWN"); private static final XPathExpression FCP_LUN_EXPR = XmlUtils.compileXPath(XPATH, "ns1:FCPId/ns2:FcpLun"); private static final XPathExpression SCSI_BUS_EXPR = XmlUtils.compileXPath(XPATH, "ns1:ScsiId/ns3:ScsiBusNumber"); private static final XPathExpression SCSI_TARGET_EXPR = XmlUtils.compileXPath(XPATH, "ns1:ScsiId/ns3:ScsiTargetNumber"); private static final XPathExpression SCSI_LUN_EXPR = XmlUtils.compileXPath(XPATH, "ns1:ScsiId/ns3:ScsiOSLun"); private String portWWN; public GetFcpTargetMappingMethod(WinRMTarget target) { super(target, HBA_FCP_INFO_URI, GET_FCP_TARGET_MAPPING_URI); } public GetFcpTargetMappingMethod(WinRMTarget target, String instanceName, String portWWN) { this(target); setInstanceName(instanceName); setPortWWN(portWWN); } public void setInstanceName(String instanceName) { setSelector("InstanceName", instanceName); } public void setPortWWN(String portWWN) { this.portWWN = portWWN; } @Override protected String createInput() { XmlStringBuilder xml = new XmlStringBuilder(); xml.start(GET_FCP_TARGET_MAPPING + "_INPUT").attr("xmlns", getResourceUri()); for (String part : StringUtils.split(portWWN, ":")) { int value = Integer.parseInt(part, 16); xml.element("HbaPortWWN", String.valueOf(value)); } xml.element("InEntryCount", "50"); xml.end(); return xml.toString(); } @Override protected List<FibreChannelTargetMapping> processOutput(Element output) { List<FibreChannelTargetMapping> results = Lists.newArrayList(); for (Element entry : XmlUtils.selectElements(ENTRY_EXPR, output)) { FibreChannelTargetMapping mapping = new FibreChannelTargetMapping(); mapping.setNodeWWN(getNodeWWN(entry)); mapping.setPortWWN(getPortWWN(entry)); mapping.setFcpLun(getFcpLun(entry)); mapping.setScsiBus(getScsiBus(entry)); mapping.setScsiTarget(getScsiTarget(entry)); mapping.setScsiLun(getScsiLun(entry)); results.add(mapping); } return results; } protected String getPortWWN(Element entry) { StrBuilder portWWN = new StrBuilder(); for (Element e : XmlUtils.selectElements(PORT_WWNS_EXPR, entry)) { portWWN.appendSeparator(":"); int value = Integer.parseInt(XmlUtils.getText(e)); portWWN.append(String.format("%02x", value)); } return portWWN.toString(); } protected String getNodeWWN(Element entry) { StrBuilder nodeWWN = new StrBuilder(); for (Element e : XmlUtils.selectElements(NODE_WWNS_EXPR, entry)) { nodeWWN.appendSeparator(":"); int value = Integer.parseInt(XmlUtils.getText(e)); nodeWWN.append(String.format("%02x", value)); } return nodeWWN.toString(); } protected Integer getFcpLun(Element entry) { return Integer.parseInt(XmlUtils.selectText(FCP_LUN_EXPR, entry)); } protected Integer getScsiBus(Element entry) { return Integer.parseInt(XmlUtils.selectText(SCSI_BUS_EXPR, entry)); } protected Integer getScsiTarget(Element entry) { return Integer.parseInt(XmlUtils.selectText(SCSI_TARGET_EXPR, entry)); } protected Integer getScsiLun(Element entry) { return Integer.parseInt(XmlUtils.selectText(SCSI_LUN_EXPR, entry)); } }