package org.opennaas.extensions.router.junos.actionssets.actions; import java.util.List; import java.util.Map; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.opennaas.core.resources.action.Action; import org.opennaas.core.resources.action.ActionException; import org.opennaas.core.resources.action.ActionResponse; import org.opennaas.core.resources.command.Response; import org.opennaas.core.resources.protocol.IProtocolSession; import org.opennaas.core.resources.protocol.IProtocolSessionManager; import org.opennaas.core.resources.protocol.ProtocolException; import org.opennaas.extensions.router.junos.commandsets.commands.JunosCommand; import org.opennaas.extensions.router.junos.commandsets.velocity.VelocityEngine; public abstract class JunosAction extends Action { protected VelocityEngine velocityEngine; protected String template = null; protected String protocolName = null; protected String velocityMessage; public JunosAction() { velocityEngine = new VelocityEngine(); } public String prepareVelocityCommand(Object params, String template) throws ResourceNotFoundException, ParseErrorException, Exception { return prepareVelocityCommand(params, template, null); } public String prepareVelocityCommand(Object params, String template, Map<String, Object> extraParams) throws ResourceNotFoundException, ParseErrorException, Exception { velocityEngine.setParam(params); velocityEngine.setTemplate(template); if (extraParams != null) { for (String name : extraParams.keySet()) velocityEngine.addExtraParam(name, extraParams.get(name)); } return velocityEngine.mergeTemplate(); } public void validateAction(ActionResponse actionResponse) throws ActionException { for (Response response : actionResponse.getResponses()) { if (response.getStatus() == Response.Status.ERROR) { actionResponse.setStatus(ActionResponse.STATUS.ERROR); actionResponse.setInformation(concatenateErrors(response.getErrors())); return; } } } public Response sendCommandToProtocol(JunosCommand command, IProtocolSession generalProtocol) throws ProtocolException, ActionException { IProtocolSession protocol = generalProtocol; Object messageResp = protocol.sendReceive(command.message()); Response response = command.checkResponse(messageResp); if (response.getStatus().equals(Response.Status.OK)) parseResponse(messageResp, modelToUpdate); return response; } @Override public ActionResponse execute(IProtocolSessionManager protocolSessionManager) throws ActionException { ActionResponse actionResponse = new ActionResponse(); try { // TODO WHY THE PROTOCOL NAME, WE ALWAYS USE A NETCONFPROTOCOLSESSION PROTOCOL IProtocolSession protocol = protocolSessionManager.obtainSessionByProtocol(protocolName, false); /* call commands */ prepareMessage(); actionResponse.setStatus(ActionResponse.STATUS.OK); actionResponse.setActionID(this.getActionID()); executeListCommand(actionResponse, protocol); // protocolSessionManager.releaseSession(protocol); return actionResponse; } catch (ProtocolException e) { throw new ActionException(e); } } private String concatenateErrors(List<String> errors) { String listErrors = ""; for (String error : errors) { listErrors += "- " + error + '\n'; } return listErrors; } public String getVelocityMessage() { return velocityMessage; } public void setVelocityMessage(String velocityMessage) { this.velocityMessage = velocityMessage; } public String getTemplate() { return template; } protected void setTemplate(String template) { this.template = template; } public abstract void executeListCommand(ActionResponse actionResponse, IProtocolSession protocol) throws ActionException; public abstract void parseResponse(Object responseMessage, Object model) throws ActionException; @Override public abstract boolean checkParams(Object params) throws ActionException; public abstract void prepareMessage() throws ActionException; }