blob: 21ccd86d856065180404d58ad2fd34ca7cad5e73 [file] [log] [blame]
//
// 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.utils.cisco.n1kv.vsm;
import java.util.StringTokenizer;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.BindingType;
import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.PortProfileType;
import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.SwitchPortMode;
public class VsmPortProfileResponse extends VsmResponse {
private static final String s_portProfileDetails = "__XML__OPT_Cmd_show_port_profile___readonly__";
private PortProfile _portProfile = new PortProfile();
VsmPortProfileResponse(String response) {
super(response);
initialize();
}
public PortProfile getPortProfile() {
return _portProfile;
}
@Override
protected void parse(Element root) {
NodeList list = root.getElementsByTagName("nf:rpc-error");
if (list.getLength() == 0) {
// No rpc-error tag; means response was ok.
NodeList dataList = root.getElementsByTagName("nf:data");
if (dataList.getLength() > 0) {
parseData(dataList.item(0));
_responseOk = true;
}
} else {
super.parseError(list.item(0));
_responseOk = false;
}
}
protected void parseData(Node data) {
try {
NodeList list = ((Element)data).getElementsByTagName(s_portProfileDetails);
if (list.getLength() > 0) {
NodeList readOnlyList = ((Element)list.item(0)).getElementsByTagName("__readonly__");
Element readOnly = (Element)readOnlyList.item(0);
for (Node node = readOnly.getFirstChild(); node != null; node = node.getNextSibling()) {
String currentNode = node.getNodeName();
String value = node.getTextContent();
if ("port_binding".equalsIgnoreCase(currentNode)) {
setPortBinding(value);
} else if ("profile_name".equalsIgnoreCase(currentNode)) {
// Set the port profile name.
_portProfile.profileName = value;
} else if ("profile_cfg".equalsIgnoreCase(currentNode)) {
setProfileConfiguration(value);
} else if ("type".equalsIgnoreCase(currentNode)) {
setPortType(value);
} else if ("status".equalsIgnoreCase(currentNode)) {
// Has the profile been enabled.
if (value.equalsIgnoreCase("1")) {
_portProfile.status = true;
}
} else if ("max_ports".equalsIgnoreCase(currentNode)) {
// Has the profile been enabled.
_portProfile.maxPorts = Integer.parseInt(value.trim());
}
}
}
} catch (DOMException e) {
logger.error("Error parsing the response : " + e.toString());
}
}
private void setProfileConfiguration(String value) {
StringTokenizer tokens = new StringTokenizer(value.trim());
if (tokens.hasMoreTokens()) {
String currentToken = tokens.nextToken();
if ("switchport".equalsIgnoreCase(currentToken)) {
parseProfileMode(tokens);
} else if ("service-policy".equalsIgnoreCase(currentToken)) {
String ioType = tokens.nextToken();
if ("input".equalsIgnoreCase(ioType)) {
_portProfile.inputPolicyMap = tokens.nextToken();
} else if ("output".equalsIgnoreCase(ioType)) {
_portProfile.outputPolicyMap = tokens.nextToken();
}
}
}
}
private void parseProfileMode(StringTokenizer tokens) {
if (tokens.hasMoreTokens()) {
String firstToken = tokens.nextToken();
if ("mode".equalsIgnoreCase(firstToken)) {
setPortMode(tokens.nextToken());
} else if ("access".equalsIgnoreCase(firstToken)) {
if (tokens.hasMoreTokens()) {
String secondToken = tokens.nextToken();
assert ("vlan".equalsIgnoreCase(secondToken));
if (tokens.hasMoreTokens()) {
_portProfile.vlan = tokens.nextToken();
}
}
}
}
}
private void setPortMode(String value) {
// Set the mode for port profile.
if ("access".equalsIgnoreCase(value)) {
_portProfile.mode = SwitchPortMode.access;
} else if ("trunk".equalsIgnoreCase(value)) {
_portProfile.mode = SwitchPortMode.trunk;
} else if ("privatevlanhost".equalsIgnoreCase(value)) {
_portProfile.mode = SwitchPortMode.privatevlanhost;
} else if ("privatevlanpromiscuous".equalsIgnoreCase(value)) {
_portProfile.mode = SwitchPortMode.privatevlanpromiscuous;
}
}
private void setPortBinding(String value) {
// Set the binding type for the port profile.
if ("static".equalsIgnoreCase(value)) {
_portProfile.binding = BindingType.portbindingstatic;
} else if ("dynamic".equalsIgnoreCase(value)) {
_portProfile.binding = BindingType.portbindingdynamic;
} else if ("ephermal".equalsIgnoreCase(value)) {
_portProfile.binding = BindingType.portbindingephermal;
}
}
private void setPortType(String value) {
// Set the type field (vethernet/ethernet).
if ("vethernet".equalsIgnoreCase(value)) {
_portProfile.type = PortProfileType.vethernet;
} else if ("ethernet".equalsIgnoreCase(value)) {
_portProfile.type = PortProfileType.ethernet;
}
}
}