/*
* Copyright (c) 2008-2012 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.metering.vnxfile;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.bind.Unmarshaller;
import com.emc.nas.vnxfile.xmlapi.Response;
import com.emc.nas.vnxfile.xmlapi.ResponseEx;
import com.emc.nas.vnxfile.xmlapi.ResponsePacket;
import com.emc.nas.vnxfile.xmlapi.Status;
import com.emc.nas.vnxfile.xmlapi.Status.Problem;
import com.emc.storageos.plugins.common.Processor;
import com.emc.storageos.plugins.metering.vnxfile.VNXFileConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Processor responsible to do VNXFile related activities.
*/
public abstract class VNXFileProcessor extends Processor {
private final Logger _logger = LoggerFactory.getLogger(VNXFileProcessor.class);
/**
* Unmarshaller instance.
*/
protected Unmarshaller _unmarshaller = null;
/**
* Fetches the QueryStats response from ResponsePacket.
*
* @param responsePacket
* @return
*/
protected List<Object> getQueryStatsResponse(ResponsePacket responsePacket) {
List<Object> responseList = responsePacket.getResponseOrResponseEx();
Iterator<Object> responseListItr = responseList.iterator();
List<Object> queryResponse = new ArrayList<Object>();
while (responseListItr.hasNext()) {
Response response = (Response) responseListItr.next();
queryResponse.addAll(response.getQueryStatsResponseChoice());
}
return queryResponse;
}
/**
* Fetches the Query response from ResponsePacket.
*
* @param responsePacket
* @return
*/
protected List<Object> getQueryResponse(ResponsePacket responsePacket) {
List<Object> responseList = responsePacket.getResponseOrResponseEx();
Iterator<Object> responseListItr = responseList.iterator();
List<Object> queryResponse = new ArrayList<Object>();
while (responseListItr.hasNext()) {
Response response = (Response) responseListItr.next();
queryResponse.addAll(response.getQueryResponseChoice());
}
return queryResponse;
}
/**
* Fetches the Query response (ResponseEx in this case) from the ResponsePacket.
*
* @param responsePacket
* @return
*/
protected List<Object> getQueryResponseEx(ResponsePacket responsePacket) {
List<Object> responseList = responsePacket.getResponseOrResponseEx();
Iterator<Object> responseListItr = responseList.iterator();
List<Object> queryResponse = new ArrayList<Object>();
while (responseListItr.hasNext()) {
ResponseEx response = (ResponseEx) responseListItr.next();
queryResponse.addAll(response.getQueryResponseChoiceEx());
}
return queryResponse;
}
protected List<Object> getTaskResponse(ResponsePacket responsePacket) {
List<Object> responseList = responsePacket.getResponseOrResponseEx();
Iterator<Object> responseListItr = responseList.iterator();
List<Object> taskResponse = new ArrayList<Object>();
while (responseListItr.hasNext()) {
Response response = (Response) responseListItr.next();
if (null != response.getFault()) {
Status status = response.getFault();
List<Problem> problems = status.getProblem();
Iterator<Problem> problemsItr = problems.iterator();
while (problemsItr.hasNext()) {
Problem prob = problemsItr.next();
_logger.error("Respone fault: {} cause: {}", prob.getDescription(), prob.getDiagnostics());
}
}
taskResponse.add(response.getTaskResponse());
}
return taskResponse;
}
/**
* Retrieve the description and diagnostics information from the error status.
*
* @param status status of the response returned by the XML API Server
* @param keyMap map used to returned values to upper layers.
*/
protected void processErrorStatus(Status status, Map<String, Object> keyMap) {
List<Problem> problems = status.getProblem();
// Only retrieve the first problem.
if (null != problems && !problems.isEmpty()) {
Problem problem = problems.get(0);
String desc = problem.getDescription();
String message = problem.getMessage();
String diags = problem.getDiagnostics();
keyMap.put(VNXFileConstants.CMD_RESULT, VNXFileConstants.CMD_FAILURE);
// These fields are optional in the response packet.
if (null != desc) {
keyMap.put(VNXFileConstants.FAULT_DESC, desc);
}
if (null != diags) {
keyMap.put(VNXFileConstants.FAULT_DIAG, diags);
}
if (null != message) {
keyMap.put(VNXFileConstants.FAULT_MSG, message);
}
if ((desc != null) && (!desc.isEmpty())) {
_logger.error("Fault response received due to {} possible cause {}", desc, diags);
} else {
_logger.error("Fault response received due to {} possible cause {}", message, diags);
}
}
}
/**
* Utility to get the FileshareNativeId from NativeGuid.
*
* @param nativeGuid
* @return
*/
protected String fetchNativeId(String nativeGuid) {
String[] token = nativeGuid.split(VNXFileConstants.PLUS_SEPERATOR);
return token[token.length - 1];
}
/**
* Set unmarshaller instance.
*
* @param unmarshaller
*/
public void setUnmarshaller(Unmarshaller unmarshaller) {
_unmarshaller = unmarshaller;
}
}