blob: 90597d7b1e19363da302c6b0e58f79fa9fba8589 [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.network.cisco;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.utils.security.ParserUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import com.cloud.utils.exception.ExecutionException;
import com.cloud.utils.script.Script;
public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
private final String _ip;
private final String _username;
private final String _password;
private String _cookie;
protected static Logger LOGGER = LogManager.getLogger(CiscoVnmcConnectionImpl.class);
private enum VnmcXml {
LOGIN("login.xml", "mgmt-controller"),
CREATE_TENANT("create-tenant.xml", "service-reg"),
DELETE_TENANT("delete-tenant.xml", "service-reg"),
CREATE_VDC("create-vdc.xml", "service-reg"),
DELETE_VDC("delete-vdc.xml", "service-reg"),
CREATE_EDGE_DEVICE_PROFILE("create-edge-device-profile.xml", "policy-mgr"),
CREATE_EDGE_ROUTE_POLICY("create-edge-device-route-policy.xml", "policy-mgr"),
CREATE_EDGE_ROUTE("create-edge-device-route.xml", "policy-mgr"),
RESOLVE_EDGE_ROUTE_POLICY("associate-route-policy.xml", "policy-mgr"),
CREATE_DHCP_POLICY("create-dhcp-policy.xml", "policy-mgr"),
RESOLVE_EDGE_DHCP_POLICY("associate-dhcp-policy.xml", "policy-mgr"),
RESOLVE_EDGE_DHCP_SERVER_POLICY("associate-dhcp-server.xml", "policy-mgr"),
CREATE_EDGE_SECURITY_PROFILE("create-edge-security-profile.xml", "policy-mgr"),
DELETE_EDGE_SECURITY_PROFILE("delete-edge-security-profile.xml", "policy-mgr"),
CREATE_NAT_POLICY_SET("create-nat-policy-set.xml", "policy-mgr"),
DELETE_NAT_POLICY_SET("delete-nat-policy-set.xml", "policy-mgr"),
RESOLVE_NAT_POLICY_SET("associate-nat-policy-set.xml", "policy-mgr"),
CREATE_NAT_POLICY("create-nat-policy.xml", "policy-mgr"),
DELETE_NAT_POLICY("delete-nat-policy.xml", "policy-mgr"),
LIST_NAT_POLICIES("list-nat-policies.xml", "policy-mgr"),
CREATE_NAT_POLICY_REF("create-nat-policy-ref.xml", "policy-mgr"),
CREATE_PORT_POOL("create-port-pool.xml", "policy-mgr"),
CREATE_IP_POOL("create-ip-pool.xml", "policy-mgr"),
CREATE_PF_RULE("create-pf-rule.xml", "policy-mgr"),
CREATE_ACL_RULE_FOR_PF("create-acl-rule-for-pf.xml", "policy-mgr"),
CREATE_DNAT_RULE("create-dnat-rule.xml", "policy-mgr"),
CREATE_ACL_RULE_FOR_DNAT("create-acl-rule-for-dnat.xml", "policy-mgr"),
CREATE_SOURCE_NAT_RULE("create-source-nat-rule.xml", "policy-mgr"),
CREATE_ACL_POLICY_SET("create-acl-policy-set.xml", "policy-mgr"),
DELETE_ACL_POLICY_SET("delete-acl-policy-set.xml", "policy-mgr"),
RESOLVE_ACL_POLICY_SET("associate-acl-policy-set.xml", "policy-mgr"),
CREATE_ACL_POLICY("create-acl-policy.xml", "policy-mgr"),
DELETE_ACL_POLICY("delete-acl-policy.xml", "policy-mgr"),
LIST_ACL_POLICIES("list-acl-policies.xml", "policy-mgr"),
CREATE_ACL_POLICY_REF("create-acl-policy-ref.xml", "policy-mgr"),
CREATE_INGRESS_ACL_RULE("create-ingress-acl-rule.xml", "policy-mgr"),
CREATE_EGRESS_ACL_RULE("create-egress-acl-rule.xml", "policy-mgr"),
CREATE_GENERIC_INGRESS_ACL_RULE("create-generic-ingress-acl-rule.xml", "policy-mgr"),
CREATE_GENERIC_EGRESS_ACL_RULE("create-generic-egress-acl-rule.xml", "policy-mgr"),
CREATE_GENERIC_EGRESS_ACL_NO_PROTOCOL_RULE("create-generic-egress-acl-no-protocol-rule.xml", "policy-mgr"),
DELETE_RULE("delete-rule.xml", "policy-mgr"),
LIST_CHILDREN("list-children.xml", "policy-mgr"),
CREATE_EDGE_FIREWALL("create-edge-firewall.xml", "resource-mgr"),
DELETE_EDGE_FIREWALL("delete-edge-firewall.xml", "resource-mgr"),
LIST_UNASSOC_ASA1000V("list-unassigned-asa1000v.xml", "resource-mgr"),
ASSIGN_ASA1000V("assoc-asa1000v.xml", "resource-mgr"),
UNASSIGN_ASA1000V("disassoc-asa1000v.xml", "resource-mgr");
private final String scriptsDir = "scripts/network/cisco";
private String xml;
private String service;
private VnmcXml(String filename, String service) {
xml = getXml(filename);
this.service = service;
}
public String getXml() {
return xml;
}
private String getXml(String filename) {
try {
String xmlFilePath = Script.findScript(scriptsDir, filename);
if (xmlFilePath == null) {
throw new Exception("Failed to find Cisco VNMC XML file: " + filename);
}
InputStreamReader fr = new InputStreamReader(new FileInputStream(xmlFilePath),"UTF-8");
BufferedReader br = new BufferedReader(fr);
String xml = "";
String line;
while ((line = br.readLine()) != null) {
//xml += line.replaceAll("\n"," ");
xml += line;
}
return xml;
} catch (Exception e) {
LOGGER.debug(e);
return null;
}
}
public String getService() {
return service;
}
}
public CiscoVnmcConnectionImpl(String hostIp, String userName, String password) {
_ip = hostIp;
_username = userName;
_password = password;
}
public boolean login() throws ExecutionException {
String xml = VnmcXml.LOGIN.getXml();
String service = VnmcXml.LOGIN.getService();
xml = replaceXmlValue(xml, "username", _username);
xml = replaceXmlValue(xml, "password", _password);
String response = sendRequest(service, xml);
Map<String, String> checked = checkResponse(response, "outCookie", "errorCode", "response");
if (checked.get("errorCode") != null)
return false;
_cookie = checked.get("outCookie");
if (_cookie == null) {
return false;
}
return true;
}
private String getDnForTenant(String tenantName) {
return "org-root/org-" + tenantName;
}
private String getDnForTenantVDC(String tenantName) {
return getDnForTenant(tenantName) + "/org-VDC-" + tenantName;
}
private String getDnForTenantVDCEdgeDeviceProfile(String tenantName) {
return getDnForTenantVDC(tenantName) + "/edsp-" + getNameForEdgeDeviceServiceProfile(tenantName);
}
private String getDnForTenantVDCEdgeSecurityProfile(String tenantName) {
return getDnForTenantVDC(tenantName) + "/vnep-" + getNameForEdgeDeviceSecurityProfile(tenantName);
}
private String getDnForEdgeDeviceRoutingPolicy(String tenantName) {
return getDnForTenantVDC(tenantName) + "/routing-policy-" + getNameForEdgeDeviceRoutePolicy(tenantName);
//FIXME: any other construct is unreliable. why?
}
private String getDnForDhcpPolicy(String tenantName, String intfName) {
return getDnForTenantVDCEdgeDeviceProfile(tenantName) + "/dhcp-" + intfName;
}
private String getNameForDhcpPolicy(String tenantName) {
return tenantName + "-Dhcp-Policy";
}
private String getNameForDhcpServer(String tenantName) {
return tenantName + "-Dhcp-Server";
}
private String getDnForDhcpServerPolicy(String tenantName) {
return getDnForTenantVDC(tenantName) + "/dhcp-server-" + getNameForDhcpPolicy(tenantName);
}
private String getNameForIpRange() {
return "iprange";
}
private String getDnForDhcpIpRange(String tenantName) {
return getDnForDhcpServerPolicy(tenantName) + "/ip-range-" + getNameForIpRange();
}
private String getNameForDNSService(String tenantName) {
return tenantName + "-DNS";
}
private String getDnForDnsService(String tenantName) {
return getDnForDhcpServerPolicy(tenantName) + "/dns-svc-" + getNameForDNSService(tenantName);
}
private String getDnForDnsServer(String tenantName, String dnsip) {
return getDnForDnsService(tenantName) + "/dns-" + dnsip;
}
private String getNameForTenantVDC(String tenantName) {
return "VDC-" + tenantName;
}
private String getNameForEdgeDeviceServiceProfile(String tenantName) {
return "EDSP-" + tenantName;
}
private String getNameForEdgeDeviceSecurityProfile(String tenantName) {
return "ESP-" + tenantName;
}
private String getNameForEdgeDeviceRoutePolicy(String tenantName) {
return "EDSP-" + tenantName + "-Routes";
}
@Override
public boolean createTenant(String tenantName) throws ExecutionException {
String xml = VnmcXml.CREATE_TENANT.getXml();
String service = VnmcXml.CREATE_TENANT.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "Tenant for account " + tenantName);
xml = replaceXmlValue(xml, "name", tenantName);
xml = replaceXmlValue(xml, "dn", getDnForTenant(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenant(String tenantName) throws ExecutionException {
String xml = VnmcXml.DELETE_TENANT.getXml();
String service = VnmcXml.DELETE_TENANT.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "name", tenantName);
xml = replaceXmlValue(xml, "dn", getDnForTenant(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDC(String tenantName) throws ExecutionException {
String xml = VnmcXml.CREATE_VDC.getXml();
String service = VnmcXml.CREATE_VDC.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "VDC for Tenant " + tenantName);
xml = replaceXmlValue(xml, "name", getNameForTenantVDC(tenantName));
xml = replaceXmlValue(xml, "dn", getDnForTenantVDC(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDC(String tenantName) throws ExecutionException {
String xml = VnmcXml.DELETE_VDC.getXml();
String service = VnmcXml.DELETE_VDC.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "name", getNameForTenantVDC(tenantName));
xml = replaceXmlValue(xml, "dn", getDnForTenantVDC(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCEdgeDeviceProfile(String tenantName) throws ExecutionException {
String xml = VnmcXml.CREATE_EDGE_DEVICE_PROFILE.getXml();
String service = VnmcXml.CREATE_EDGE_DEVICE_PROFILE.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "Edge Device Profile for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceServiceProfile(tenantName));
xml = replaceXmlValue(xml, "dn", getDnForTenantVDCEdgeDeviceProfile(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCEdgeStaticRoutePolicy(String tenantName) throws ExecutionException {
String xml = VnmcXml.CREATE_EDGE_ROUTE_POLICY.getXml();
String service = VnmcXml.CREATE_EDGE_ROUTE_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceRoutePolicy(tenantName));
xml = replaceXmlValue(xml, "routepolicydn", getDnForEdgeDeviceRoutingPolicy(tenantName));
xml = replaceXmlValue(xml, "descr", "Routing Policy for Edge Device for Tenant " + tenantName);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCEdgeStaticRoute(String tenantName, String nextHopIp, String destination, String netmask) throws ExecutionException {
String xml = VnmcXml.CREATE_EDGE_ROUTE.getXml();
String service = VnmcXml.CREATE_EDGE_ROUTE.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "routepolicydn", getDnForEdgeDeviceRoutingPolicy(tenantName));
xml = replaceXmlValue(xml, "nexthop", nextHopIp);
xml = replaceXmlValue(xml, "nexthopintf", getNameForEdgeOutsideIntf(tenantName));
xml = replaceXmlValue(xml, "destination", destination);
xml = replaceXmlValue(xml, "netmask", netmask);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean associateTenantVDCEdgeStaticRoutePolicy(String tenantName) throws ExecutionException {
String xml = VnmcXml.RESOLVE_EDGE_ROUTE_POLICY.getXml();
String service = VnmcXml.RESOLVE_EDGE_ROUTE_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceServiceProfile(tenantName));
xml = replaceXmlValue(xml, "dn", getDnForTenantVDCEdgeDeviceProfile(tenantName));
xml = replaceXmlValue(xml, "routepolicyname", getNameForEdgeDeviceRoutePolicy(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean associateTenantVDCEdgeDhcpPolicy(String tenantName, String intfName) throws ExecutionException {
String xml = VnmcXml.RESOLVE_EDGE_DHCP_POLICY.getXml();
String service = VnmcXml.RESOLVE_EDGE_DHCP_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "dhcpdn", getDnForDhcpPolicy(tenantName, intfName));
xml = replaceXmlValue(xml, "insideintf", intfName);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCEdgeDhcpPolicy(String tenantName, String startIp, String endIp, String subnet, String nameServerIp, String domain)
throws ExecutionException {
String xml = VnmcXml.CREATE_DHCP_POLICY.getXml();
String service = VnmcXml.CREATE_DHCP_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "dhcpserverdn", getDnForDhcpServerPolicy(tenantName));
xml = replaceXmlValue(xml, "dhcpserverdescr", "DHCP server for " + tenantName);
xml = replaceXmlValue(xml, "dhcpservername", getNameForDhcpPolicy(tenantName));
xml = replaceXmlValue(xml, "iprangedn", getDnForDhcpIpRange(tenantName));
xml = replaceXmlValue(xml, "startip", startIp);
xml = replaceXmlValue(xml, "endip", endIp);
xml = replaceXmlValue(xml, "subnet", subnet);
xml = replaceXmlValue(xml, "domain", domain);
xml = replaceXmlValue(xml, "dnsservicedn", getDnForDnsService(tenantName));
xml = replaceXmlValue(xml, "dnsservicename", getNameForDNSService(tenantName));
xml = replaceXmlValue(xml, "nameserverip", nameServerIp);
xml = replaceXmlValue(xml, "nameserverdn", getDnForDnsServer(tenantName, nameServerIp));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean associateTenantVDCEdgeDhcpServerPolicy(String tenantName, String intfName) throws ExecutionException {
String xml = VnmcXml.RESOLVE_EDGE_DHCP_SERVER_POLICY.getXml();
String service = VnmcXml.RESOLVE_EDGE_DHCP_SERVER_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "dhcpdn", getDnForDhcpPolicy(tenantName, intfName));
xml = replaceXmlValue(xml, "insideintf", intfName);
xml = replaceXmlValue(xml, "dhcpserverpolicyname", getNameForDhcpServer(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCEdgeSecurityProfile(String tenantName) throws ExecutionException {
String xml = VnmcXml.CREATE_EDGE_SECURITY_PROFILE.getXml();
String service = VnmcXml.CREATE_EDGE_SECURITY_PROFILE.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "egressref", "default-egress");
xml = replaceXmlValue(xml, "ingressref", "default-ingress"); //FIXME: allows everything
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDCEdgeSecurityProfile(String tenantName) throws ExecutionException {
String xml = VnmcXml.DELETE_EDGE_SECURITY_PROFILE.getXml();
String service = VnmcXml.DELETE_EDGE_SECURITY_PROFILE.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private String getNameForSourceNatIpPool(String tenantName) {
return "SNATIp-" + tenantName;
}
private String getDnForSourceNatPool(String tenantName) {
return getDnForTenantVDC(tenantName) + "/objgrp-" + getNameForSourceNatIpPool(tenantName);
}
@Override
public boolean createTenantVDCSourceNatIpPool(String tenantName, String identifier, String publicIp) throws ExecutionException {
return createTenantVDCIpPool(getDnForSourceNatPool(tenantName), getNameForSourceNatIpPool(tenantName), "Source NAT ip pool for Tenant VDC " + tenantName,
publicIp);
}
private String getNameForSourceNatPolicy(String tenantName) {
return "SNAT-Policy-" + tenantName;
}
private String getDnForSourceNatPolicy(String tenantName) {
return getDnForTenantVDC(tenantName) + "/natpol-" + getNameForSourceNatPolicy(tenantName);
}
private String getNameForSourceNatRule(String tenantName) {
return "SNAT-Rule-" + tenantName;
}
private String getDnForSourceNatRule(String tenantName) {
return getDnForSourceNatPolicy(tenantName) + "/rule-" + getNameForSourceNatRule(tenantName);
}
private String getNameForNatPolicySet(String tenantName) {
return "NAT-PolicySet-" + tenantName;
}
private String getDnForNatPolicySet(String tenantName) {
return getDnForTenantVDC(tenantName) + "/natpset-" + getNameForNatPolicySet(tenantName);
}
private String getDnForSourceNatPolicyRef(String tenantName) {
return getDnForNatPolicySet(tenantName) + "/polref-" + getNameForSourceNatPolicy(tenantName);
}
@Override
public boolean createTenantVDCSourceNatRule(String tenantName, String identifier, String startSourceIp, String endSourceIp) throws ExecutionException {
String xml = VnmcXml.CREATE_SOURCE_NAT_RULE.getXml();
String service = VnmcXml.CREATE_SOURCE_NAT_RULE.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "natruledn", getDnForSourceNatRule(tenantName));
xml = replaceXmlValue(xml, "natrulename", getNameForSourceNatRule(tenantName));
xml = replaceXmlValue(xml, "descr", "Source NAT rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "srcstartip", startSourceIp);
xml = replaceXmlValue(xml, "srcendip", endSourceIp);
xml = replaceXmlValue(xml, "ippoolname", getNameForSourceNatIpPool(tenantName));
long order = 100;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCSourceNatPolicyRef(String tenantName, String identifier) throws ExecutionException {
return createTenantVDCNatPolicyRef(getDnForSourceNatPolicyRef(tenantName), getNameForSourceNatPolicy(tenantName), tenantName, true);
}
@Override
public boolean createTenantVDCSourceNatPolicy(String tenantName, String identifier) throws ExecutionException {
return createTenantVDCNatPolicy(getDnForSourceNatPolicy(tenantName), getNameForSourceNatPolicy(tenantName));
}
@Override
public boolean createTenantVDCNatPolicySet(String tenantName) throws ExecutionException {
String xml = VnmcXml.CREATE_NAT_POLICY_SET.getXml();
String service = VnmcXml.CREATE_NAT_POLICY_SET.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "NAT policy set for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "natpolicysetname", getNameForNatPolicySet(tenantName));
xml = replaceXmlValue(xml, "natpolicysetdn", getDnForNatPolicySet(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDCNatPolicySet(String tenantName) throws ExecutionException {
String xml = VnmcXml.DELETE_NAT_POLICY_SET.getXml();
String service = VnmcXml.DELETE_NAT_POLICY_SET.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "natpolicysetname", getNameForNatPolicySet(tenantName));
xml = replaceXmlValue(xml, "natpolicysetdn", getDnForNatPolicySet(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean associateNatPolicySet(String tenantName) throws ExecutionException {
String xml = VnmcXml.RESOLVE_NAT_POLICY_SET.getXml();
String service = VnmcXml.RESOLVE_NAT_POLICY_SET.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "natpolicysetname", getNameForNatPolicySet(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private String getNameForAclPolicySet(String tenantName, boolean ingress) {
return (ingress ? "Ingress-" : "Egress-") + "ACL-PolicySet-" + tenantName;
}
private String getDnForAclPolicySet(String tenantName, boolean ingress) {
return getDnForTenantVDC(tenantName) + "/pset-" + getNameForAclPolicySet(tenantName, ingress);
}
private String getNameForAclPolicy(String tenantName, String identifier) {
return "ACL-" + tenantName + "-" + identifier;
}
private String getDnForAclPolicy(String tenantName, String identifier) {
return getDnForTenantVDC(tenantName) + "/pol-" + getNameForAclPolicy(tenantName, identifier);
}
private String getDnForAclPolicyRef(String tenantName, String identifier, boolean ingress) {
return getDnForAclPolicySet(tenantName, ingress) + "/polref-" + getNameForAclPolicy(tenantName, identifier);
}
private String getNameForAclRule(String tenantName, String identifier) {
return "Rule-" + tenantName + "-" + identifier;
}
private String getDnForAclRule(String tenantName, String identifier, String policyIdentifier) {
return getDnForAclPolicy(tenantName, policyIdentifier) + "/rule-" + getNameForAclRule(tenantName, identifier);
}
@Override
public boolean createTenantVDCAclPolicy(String tenantName, String identifier) throws ExecutionException {
String xml = VnmcXml.CREATE_ACL_POLICY.getXml();
String service = VnmcXml.CREATE_ACL_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclpolicyname", getNameForAclPolicy(tenantName, identifier));
xml = replaceXmlValue(xml, "aclpolicydn", getDnForAclPolicy(tenantName, identifier));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDCAclPolicy(String tenantName, String identifier) throws ExecutionException {
String xml = VnmcXml.DELETE_ACL_POLICY.getXml();
String service = VnmcXml.DELETE_ACL_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclpolicyname", getNameForAclPolicy(tenantName, identifier));
xml = replaceXmlValue(xml, "aclpolicydn", getDnForAclPolicy(tenantName, identifier));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCAclPolicyRef(String tenantName, String identifier, boolean ingress) throws ExecutionException {
String xml = VnmcXml.CREATE_ACL_POLICY_REF.getXml();
String service = VnmcXml.CREATE_ACL_POLICY_REF.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclpolicyname", getNameForAclPolicy(tenantName, identifier));
xml = replaceXmlValue(xml, "aclpolicydn", getDnForAclPolicy(tenantName, identifier));
xml = replaceXmlValue(xml, "aclpolicyrefdn", getDnForAclPolicyRef(tenantName, identifier, ingress));
List<String> policies = listAclPolicies(tenantName);
int order = 100;
if (policies != null) {
order += policies.size();
}
xml = replaceXmlValue(xml, "order", Integer.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCAclPolicySet(String tenantName, boolean ingress) throws ExecutionException {
String xml = VnmcXml.CREATE_ACL_POLICY_SET.getXml();
String service = VnmcXml.CREATE_ACL_POLICY_SET.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "ACL policy set for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "aclpolicysetname", getNameForAclPolicySet(tenantName, ingress));
xml = replaceXmlValue(xml, "aclpolicysetdn", getDnForAclPolicySet(tenantName, ingress));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDCAclPolicySet(String tenantName, boolean ingress) throws ExecutionException {
String xml = VnmcXml.DELETE_ACL_POLICY_SET.getXml();
String service = VnmcXml.DELETE_ACL_POLICY_SET.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclpolicysetname", getNameForAclPolicySet(tenantName, ingress));
xml = replaceXmlValue(xml, "aclpolicysetdn", getDnForAclPolicySet(tenantName, ingress));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean associateAclPolicySet(String tenantName) throws ExecutionException {
String xml = VnmcXml.RESOLVE_ACL_POLICY_SET.getXml();
String service = VnmcXml.RESOLVE_ACL_POLICY_SET.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "egresspolicysetname", getNameForAclPolicySet(tenantName, false));
xml = replaceXmlValue(xml, "ingresspolicysetname", getNameForAclPolicySet(tenantName, true));
xml = replaceXmlValue(xml, "natpolicysetname", getNameForNatPolicySet(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCIngressAclRule(String tenantName, long ruleId, String policyIdentifier, String protocol, String sourceStartIp, String sourceEndIp,
String destStartPort, String destEndPort) throws ExecutionException {
String xml = VnmcXml.CREATE_INGRESS_ACL_RULE.getXml();
String service = VnmcXml.CREATE_INGRESS_ACL_RULE.getService();
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclruledn", getDnForAclRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "aclrulename", getNameForAclRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "Ingress ACL rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "actiontype", "permit");
xml = replaceXmlValue(xml, "protocolvalue", protocol);
xml = replaceXmlValue(xml, "sourcestartip", sourceStartIp);
xml = replaceXmlValue(xml, "sourceendip", sourceEndIp);
xml = replaceXmlValue(xml, "deststartport", destStartPort);
xml = replaceXmlValue(xml, "destendport", destEndPort);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCIngressAclRule(String tenantName, long ruleId, String policyIdentifier, String protocol, String sourceStartIp, String sourceEndIp)
throws ExecutionException {
String xml = VnmcXml.CREATE_GENERIC_INGRESS_ACL_RULE.getXml();
String service = VnmcXml.CREATE_GENERIC_INGRESS_ACL_RULE.getService();
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclruledn", getDnForAclRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "aclrulename", getNameForAclRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "Ingress ACL rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "actiontype", "permit");
xml = replaceXmlValue(xml, "protocolvalue", protocol);
xml = replaceXmlValue(xml, "sourcestartip", sourceStartIp);
xml = replaceXmlValue(xml, "sourceendip", sourceEndIp);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCEgressAclRule(String tenantName, long ruleId, String policyIdentifier, String protocol, String sourceStartIp, String sourceEndIp,
String destStartPort, String destEndPort) throws ExecutionException {
String xml = VnmcXml.CREATE_EGRESS_ACL_RULE.getXml();
String service = VnmcXml.CREATE_EGRESS_ACL_RULE.getService();
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclruledn", getDnForAclRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "aclrulename", getNameForAclRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "Egress ACL rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "actiontype", "permit");
xml = replaceXmlValue(xml, "protocolvalue", protocol);
xml = replaceXmlValue(xml, "sourcestartip", sourceStartIp);
xml = replaceXmlValue(xml, "sourceendip", sourceEndIp);
xml = replaceXmlValue(xml, "deststartport", destStartPort);
xml = replaceXmlValue(xml, "destendport", destEndPort);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCEgressAclRule(String tenantName, long ruleId, String policyIdentifier, String protocol, String sourceStartIp, String sourceEndIp)
throws ExecutionException {
String xml = VnmcXml.CREATE_GENERIC_EGRESS_ACL_RULE.getXml();
String service = VnmcXml.CREATE_GENERIC_EGRESS_ACL_RULE.getService();
if (protocol.equalsIgnoreCase("all")) { // any protocol
xml = VnmcXml.CREATE_GENERIC_EGRESS_ACL_NO_PROTOCOL_RULE.getXml();
service = VnmcXml.CREATE_GENERIC_EGRESS_ACL_NO_PROTOCOL_RULE.getService();
} else { // specific protocol
xml = replaceXmlValue(xml, "protocolvalue", protocol);
}
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclruledn", getDnForAclRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "aclrulename", getNameForAclRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "Egress ACL rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "actiontype", "permit");
xml = replaceXmlValue(xml, "sourcestartip", sourceStartIp);
xml = replaceXmlValue(xml, "sourceendip", sourceEndIp);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDCAclRule(String tenantName, long ruleId, String policyIdentifier) throws ExecutionException {
String identifier = Long.toString(ruleId);
return deleteTenantVDCRule(getDnForAclRule(tenantName, identifier, policyIdentifier), getNameForAclRule(tenantName, identifier));
}
private String getNameForPFPortPool(String tenantName, String identifier) {
return "PortPool-" + tenantName + "-" + identifier;
}
private String getDnForPFPortPool(String tenantName, String identifier) {
return getDnForTenantVDC(tenantName) + "/objgrp-" + getNameForPFPortPool(tenantName, identifier);
}
private String getNameForPFIpPool(String tenantName, String identifier) {
return "IpPool-" + tenantName + "-" + identifier;
}
private String getDnForPFIpPool(String tenantName, String identifier) {
return getDnForTenantVDC(tenantName) + "/objgrp-" + getNameForPFIpPool(tenantName, identifier);
}
private boolean createTenantVDCPortPool(String poolDn, String name, String description, String startPort, String endPort) throws ExecutionException {
String xml = VnmcXml.CREATE_PORT_POOL.getXml();
String service = VnmcXml.CREATE_PORT_POOL.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "portpooldn", poolDn);
xml = replaceXmlValue(xml, "portpoolname", name);
xml = replaceXmlValue(xml, "descr", description);
xml = replaceXmlValue(xml, "startport", startPort);
xml = replaceXmlValue(xml, "endport", endPort);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private boolean createTenantVDCIpPool(String poolDn, String name, String description, String ipAddress) throws ExecutionException {
String xml = VnmcXml.CREATE_IP_POOL.getXml();
String service = VnmcXml.CREATE_IP_POOL.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "ippooldn", poolDn);
xml = replaceXmlValue(xml, "ippoolname", name);
xml = replaceXmlValue(xml, "descr", description);
xml = replaceXmlValue(xml, "ipvalue", ipAddress);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private boolean createTenantVDCNatPolicyRef(String policyRefDn, String name, String tenantName, boolean isSourceNat) throws ExecutionException {
String xml = VnmcXml.CREATE_NAT_POLICY_REF.getXml();
String service = VnmcXml.CREATE_NAT_POLICY_REF.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "natpolicyrefdn", policyRefDn);
xml = replaceXmlValue(xml, "natpolicyname", name);
// PF and static NAT policies need to come before source NAT, so leaving buffer
// and creating source NAT with a high order value.
// Initially tried setting MAX_INT as the order but VNMC complains about it
int order = 10000; // TODO: For now value should be sufficient, if required may need to increase
if (!isSourceNat) {
List<String> policies = listNatPolicies(tenantName);
order = 100; // order starts at 100
if (policies != null) {
order += policies.size();
}
}
xml = replaceXmlValue(xml, "order", Integer.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private boolean createTenantVDCNatPolicy(String policyDn, String name) throws ExecutionException {
String xml = VnmcXml.CREATE_NAT_POLICY.getXml();
String service = VnmcXml.CREATE_NAT_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "natpolicydn", policyDn);
xml = replaceXmlValue(xml, "natpolicyname", name);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private boolean deleteTenantVDCNatPolicy(String policyDn, String name) throws ExecutionException {
String xml = VnmcXml.DELETE_NAT_POLICY.getXml();
String service = VnmcXml.DELETE_NAT_POLICY.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "natpolicydn", policyDn);
xml = replaceXmlValue(xml, "natpolicyname", name);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private boolean deleteTenantVDCRule(String ruledn, String ruleName) throws ExecutionException {
String xml = VnmcXml.DELETE_RULE.getXml();
String service = VnmcXml.DELETE_RULE.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "ruledn", ruledn);
xml = replaceXmlValue(xml, "rulename", ruleName);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private List<String> listNatPolicies(String tenantName) throws ExecutionException {
String xml = VnmcXml.LIST_NAT_POLICIES.getXml();
String service = VnmcXml.LIST_NAT_POLICIES.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "vdcdn", getDnForTenantVDC(tenantName));
String response = sendRequest(service, xml);
List<String> result = new ArrayList<String>();
Document xmlDoc = getDocument(response);
xmlDoc.normalize();
NodeList policyList = xmlDoc.getElementsByTagName("pair");
for (int i = 0; i < policyList.getLength(); i++) {
Node policyNode = policyList.item(i);
result.add(policyNode.getAttributes().getNamedItem("key").getNodeValue());
}
return result;
}
private List<String> listAclPolicies(String tenantName) throws ExecutionException {
String xml = VnmcXml.LIST_ACL_POLICIES.getXml();
String service = VnmcXml.LIST_ACL_POLICIES.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "vdcdn", getDnForTenantVDC(tenantName));
String response = sendRequest(service, xml);
List<String> result = new ArrayList<String>();
Document xmlDoc = getDocument(response);
xmlDoc.normalize();
NodeList policyList = xmlDoc.getElementsByTagName("pair");
for (int i = 0; i < policyList.getLength(); i++) {
Node policyNode = policyList.item(i);
result.add(policyNode.getAttributes().getNamedItem("key").getNodeValue());
}
return result;
}
private List<String> listChildren(String dn) throws ExecutionException {
String xml = VnmcXml.LIST_CHILDREN.getXml();
String service = VnmcXml.LIST_CHILDREN.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "dn", dn);
String response = sendRequest(service, xml);
List<String> result = new ArrayList<String>();
Document xmlDoc = getDocument(response);
xmlDoc.normalize();
NodeList policyList = xmlDoc.getElementsByTagName("policyRule");
for (int i = 0; i < policyList.getLength(); i++) {
Node policyNode = policyList.item(i);
result.add(policyNode.getAttributes().getNamedItem("name").getNodeValue());
}
return result;
}
@Override
public boolean createTenantVDCPFPortPool(String tenantName, String identifier, String startPort, String endPort) throws ExecutionException {
return createTenantVDCPortPool(getDnForPFPortPool(tenantName, identifier), getNameForPFPortPool(tenantName, identifier), "PF port pool for " +
getNameForPFPortPool(tenantName, identifier), startPort, endPort);
}
@Override
public boolean createTenantVDCPFIpPool(String tenantName, String identifier, String ipAddress) throws ExecutionException {
return createTenantVDCIpPool(getDnForPFIpPool(tenantName, identifier), getNameForPFIpPool(tenantName, identifier),
"PF ip pool for " + getNameForPFIpPool(tenantName, identifier), ipAddress);
}
private String getNameForPFPolicy(String tenantName, String identifier) {
return "PF-" + tenantName + "-" + identifier;
}
private String getDnForPFPolicy(String tenantName, String identifier) {
return getDnForTenantVDC(tenantName) + "/natpol-" + getNameForPFPolicy(tenantName, identifier);
}
private String getDnForPFPolicyRef(String tenantName, String identifier) {
return getDnForNatPolicySet(tenantName) + "/polref-" + getNameForPFPolicy(tenantName, identifier);
}
private String getNameForPFRule(String tenantName, String identifier) {
return "Rule-" + tenantName + "-" + identifier;
}
private String getDnForPFRule(String tenantName, String identifier, String policyIdentifier) {
return getDnForPFPolicy(tenantName, policyIdentifier) + "/rule-" + getNameForPFRule(tenantName, identifier);
}
@Override
public boolean createTenantVDCPFRule(String tenantName, long ruleId, String policyIdentifier, String protocol, String publicIp, String startPort, String endPort)
throws ExecutionException {
String xml = VnmcXml.CREATE_PF_RULE.getXml();
String service = VnmcXml.CREATE_PF_RULE.getService();
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "natruledn", getDnForPFRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "natrulename", getNameForPFRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "PF rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "ippoolname", getNameForPFIpPool(tenantName, identifier));
xml = replaceXmlValue(xml, "portpoolname", getNameForPFPortPool(tenantName, identifier));
xml = replaceXmlValue(xml, "ip", publicIp);
xml = replaceXmlValue(xml, "startport", startPort);
xml = replaceXmlValue(xml, "endport", endPort);
xml = replaceXmlValue(xml, "protocolvalue", protocol);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDCPFRule(String tenantName, long ruleId, String policyIdentifier) throws ExecutionException {
String identifier = Long.toString(ruleId);
return deleteTenantVDCRule(getDnForPFRule(tenantName, identifier, policyIdentifier), getNameForPFRule(tenantName, identifier));
}
@Override
public boolean createTenantVDCAclRuleForPF(String tenantName, long ruleId, String policyIdentifier, String protocol, String ipAddress, String startPort,
String endPort) throws ExecutionException {
String xml = VnmcXml.CREATE_ACL_RULE_FOR_PF.getXml();
String service = VnmcXml.CREATE_ACL_RULE_FOR_PF.getService();
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclruledn", getDnForAclRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "aclrulename", getNameForAclRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "ACL rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "actiontype", "permit");
xml = replaceXmlValue(xml, "protocolvalue", protocol);
xml = replaceXmlValue(xml, "ip", ipAddress);
xml = replaceXmlValue(xml, "startport", startPort);
xml = replaceXmlValue(xml, "endport", endPort);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCPFPolicyRef(String tenantName, String identifier) throws ExecutionException {
return createTenantVDCNatPolicyRef(getDnForPFPolicyRef(tenantName, identifier), getNameForPFPolicy(tenantName, identifier), tenantName, false);
}
@Override
public boolean createTenantVDCPFPolicy(String tenantName, String identifier) throws ExecutionException {
return createTenantVDCNatPolicy(getDnForPFPolicy(tenantName, identifier), getNameForPFPolicy(tenantName, identifier));
}
@Override
public boolean deleteTenantVDCPFPolicy(String tenantName, String identifier) throws ExecutionException {
return deleteTenantVDCNatPolicy(getDnForPFPolicy(tenantName, identifier), getNameForPFPolicy(tenantName, identifier));
}
private String getNameForDNatIpPool(String tenantName, String identifier) {
return "IpPool-" + tenantName + "-" + identifier + "n";
}
private String getDnForDNatIpPool(String tenantName, String identifier) {
return getDnForTenantVDC(tenantName) + "/objgrp-" + getNameForDNatIpPool(tenantName, identifier);
}
@Override
public boolean createTenantVDCDNatIpPool(String tenantName, String identifier, String ipAddress) throws ExecutionException {
return createTenantVDCIpPool(getDnForDNatIpPool(tenantName, identifier), getNameForDNatIpPool(tenantName, identifier), "DNAT ip pool for " +
getNameForDNatIpPool(tenantName, identifier), ipAddress);
}
private String getNameForDNatRule(String tenantName, String identifier) {
return "Rule-" + tenantName + "-" + identifier;
}
private String getDnForDNatRule(String tenantName, String identifier, String policyIdentifier) {
return getDnForDNatPolicy(tenantName, policyIdentifier) + "/rule-" + getNameForDNatRule(tenantName, identifier);
}
private String getNameForDNatPolicy(String tenantName, String identifier) {
return "DNAT-" + tenantName + "-" + identifier;
}
private String getDnForDNatPolicy(String tenantName, String identifier) {
return getDnForTenantVDC(tenantName) + "/natpol-" + getNameForDNatPolicy(tenantName, identifier);
}
private String getDnForDNatPolicyRef(String tenantName, String identifier) {
return getDnForNatPolicySet(tenantName) + "/polref-" + getNameForDNatPolicy(tenantName, identifier);
}
@Override
public boolean createTenantVDCDNatRule(String tenantName, long ruleId, String policyIdentifier, String publicIp) throws ExecutionException {
String xml = VnmcXml.CREATE_DNAT_RULE.getXml();
String service = VnmcXml.CREATE_DNAT_RULE.getService();
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "natruledn", getDnForDNatRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "natrulename", getNameForDNatRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "DNAT rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "ippoolname", getNameForDNatIpPool(tenantName, identifier));
xml = replaceXmlValue(xml, "ip", publicIp);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteTenantVDCDNatRule(String tenantName, long ruleId, String policyIdentifier) throws ExecutionException {
String identifier = Long.toString(ruleId);
return deleteTenantVDCRule(getDnForDNatRule(tenantName, identifier, policyIdentifier), getNameForDNatRule(tenantName, identifier));
}
@Override
public boolean createTenantVDCAclRuleForDNat(String tenantName, long ruleId, String policyIdentifier, String ipAddress) throws ExecutionException {
String xml = VnmcXml.CREATE_ACL_RULE_FOR_DNAT.getXml();
String service = VnmcXml.CREATE_ACL_RULE_FOR_DNAT.getService();
String identifier = Long.toString(ruleId);
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "aclruledn", getDnForAclRule(tenantName, identifier, policyIdentifier));
xml = replaceXmlValue(xml, "aclrulename", getNameForAclRule(tenantName, identifier));
xml = replaceXmlValue(xml, "descr", "ACL rule for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "actiontype", "permit");
xml = replaceXmlValue(xml, "ip", ipAddress);
long order = 100 + ruleId;
xml = replaceXmlValue(xml, "order", Long.toString(order));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean createTenantVDCDNatPolicyRef(String tenantName, String identifier) throws ExecutionException {
return createTenantVDCNatPolicyRef(getDnForDNatPolicyRef(tenantName, identifier), getNameForDNatPolicy(tenantName, identifier), tenantName, false);
}
@Override
public boolean createTenantVDCDNatPolicy(String tenantName, String identifier) throws ExecutionException {
return createTenantVDCNatPolicy(getDnForDNatPolicy(tenantName, identifier), getNameForDNatPolicy(tenantName, identifier));
}
@Override
public boolean deleteTenantVDCDNatPolicy(String tenantName, String identifier) throws ExecutionException {
return deleteTenantVDCNatPolicy(getDnForDNatPolicy(tenantName, identifier), getNameForDNatPolicy(tenantName, identifier));
}
private String getNameForEdgeFirewall(String tenantName) {
return "ASA-1000v-" + tenantName;
}
private String getDnForEdgeFirewall(String tenantName) {
return getDnForTenantVDC(tenantName) + "/efw-" + getNameForEdgeFirewall(tenantName);
}
private String getNameForEdgeInsideIntf(String tenantName) {
return "Edge_Inside"; //TODO: make this configurable
}
private String getNameForEdgeOutsideIntf(String tenantName) {
return "Edge_Outside"; //TODO: make this configurable
}
private String getDnForOutsideIntf(String tenantName) {
return getDnForEdgeFirewall(tenantName) + "/interface-" + getNameForEdgeOutsideIntf(tenantName);
}
private String getDnForInsideIntf(String tenantName) {
return getDnForEdgeFirewall(tenantName) + "/interface-" + getNameForEdgeInsideIntf(tenantName);
}
@Override
public boolean createEdgeFirewall(String tenantName, String publicIp, String insideIp, String publicSubnet, String insideSubnet) throws ExecutionException {
String xml = VnmcXml.CREATE_EDGE_FIREWALL.getXml();
String service = VnmcXml.CREATE_EDGE_FIREWALL.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "edgefwdescr", "Edge Firewall for Tenant VDC " + tenantName);
xml = replaceXmlValue(xml, "edgefwname", getNameForEdgeFirewall(tenantName));
xml = replaceXmlValue(xml, "edgefwdn", getDnForEdgeFirewall(tenantName));
xml = replaceXmlValue(xml, "insideintfname", getNameForEdgeInsideIntf(tenantName));
xml = replaceXmlValue(xml, "outsideintfname", getNameForEdgeOutsideIntf(tenantName));
xml = replaceXmlValue(xml, "insideintfdn", getDnForInsideIntf(tenantName));
xml = replaceXmlValue(xml, "outsideintfdn", getDnForOutsideIntf(tenantName));
xml = replaceXmlValue(xml, "deviceserviceprofiledn", getDnForEdgeFirewall(tenantName) + "/device-service-profile");
xml = replaceXmlValue(xml, "outsideintfsp", getDnForOutsideIntf(tenantName) + "/interface-service-profile");
xml = replaceXmlValue(xml, "secprofileref", getNameForEdgeDeviceSecurityProfile(tenantName));
xml = replaceXmlValue(xml, "deviceserviceprofile", getNameForEdgeDeviceServiceProfile(tenantName));
xml = replaceXmlValue(xml, "insideip", insideIp);
xml = replaceXmlValue(xml, "publicip", publicIp);
xml = replaceXmlValue(xml, "insidesubnet", insideSubnet);
xml = replaceXmlValue(xml, "outsidesubnet", publicSubnet);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean deleteEdgeFirewall(String tenantName) throws ExecutionException {
String xml = VnmcXml.DELETE_EDGE_FIREWALL.getXml();
String service = VnmcXml.DELETE_EDGE_FIREWALL.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "edgefwname", getNameForEdgeFirewall(tenantName));
xml = replaceXmlValue(xml, "edgefwdn", getDnForEdgeFirewall(tenantName));
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public Map<String, String> listUnAssocAsa1000v() throws ExecutionException {
String xml = VnmcXml.LIST_UNASSOC_ASA1000V.getXml();
String service = VnmcXml.LIST_UNASSOC_ASA1000V.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
String response = sendRequest(service, xml);
Map<String, String> result = new HashMap<String, String>();
Document xmlDoc = getDocument(response);
xmlDoc.normalize();
NodeList fwList = xmlDoc.getElementsByTagName("fwInstance");
for (int j = 0; j < fwList.getLength(); j++) {
Node fwNode = fwList.item(j);
result.put(fwNode.getAttributes().getNamedItem("mgmtIp").getNodeValue(), fwNode.getAttributes().getNamedItem("dn").getNodeValue());
}
return result;
}
@Override
public boolean assignAsa1000v(String tenantName, String firewallDn) throws ExecutionException {
String xml = VnmcXml.ASSIGN_ASA1000V.getXml();
String service = VnmcXml.ASSIGN_ASA1000V.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "binddn", getDnForEdgeFirewall(tenantName) + "/binding");
xml = replaceXmlValue(xml, "fwdn", firewallDn);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
@Override
public boolean unassignAsa1000v(String tenantName, String firewallDn) throws ExecutionException {
String xml = VnmcXml.UNASSIGN_ASA1000V.getXml();
String service = VnmcXml.UNASSIGN_ASA1000V.getService();
xml = replaceXmlValue(xml, "cookie", _cookie);
xml = replaceXmlValue(xml, "binddn", getDnForEdgeFirewall(tenantName) + "/binding");
xml = replaceXmlValue(xml, "fwdn", firewallDn);
String response = sendRequest(service, xml);
return verifySuccess(response);
}
private String sendRequest(String service, String xmlRequest) throws ExecutionException {
HttpClient client = new HttpClient();
String response = null;
PostMethod method = new PostMethod("/xmlIM/" + service);
method.setRequestBody(xmlRequest);
try {
org.apache.commons.httpclient.protocol.Protocol myhttps = new org.apache.commons.httpclient.protocol.Protocol("https", new EasySSLProtocolSocketFactory(), 443);
client.getHostConfiguration().setHost(_ip, 443, myhttps);
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
throw new Exception("Error code : " + statusCode);
}
response = method.getResponseBodyAsString();
} catch (Exception e) {
System.out.println(e.getMessage());
throw new ExecutionException(e.getMessage());
}
System.out.println(response);
return response;
}
private Map<String, String> checkResponse(String xmlResponse, String... keys) throws ExecutionException {
Document xmlDoc = getDocument(xmlResponse);
Map<String, String> result = new HashMap<String, String>();
Node topElement = xmlDoc.getChildNodes().item(0);
if (topElement != null) {
for (String key : keys) {
Node valueNode = topElement.getAttributes().getNamedItem(key);
result.put(key, valueNode == null ? null : valueNode.getNodeValue());
}
}
return result;
}
private boolean verifySuccess(String xmlResponse) throws ExecutionException {
Map<String, String> checked = checkResponse(xmlResponse, "errorCode", "errorDescr");
if (checked.get("errorCode") != null) {
String errorCode = checked.get("errorCode");
if (errorCode.equals("103")) {
//tenant already exists
return true;
}
String errorDescr = checked.get("errorDescr");
throw new ExecutionException(errorDescr);
}
return true;
}
/*
* XML utils
*/
private Document getDocument(String xml) throws ExecutionException {
StringReader xmlReader = new StringReader("<?xml version=\"1.0\"?> \n" + xml.trim());
InputSource xmlSource = new InputSource(xmlReader);
Document doc = null;
try {
doc = ParserUtils.getSaferDocumentBuilderFactory().newDocumentBuilder().parse(xmlSource);
} catch (Exception e) {
LOGGER.error(e);
throw new ExecutionException(e.getMessage());
}
if (doc == null) {
throw new ExecutionException("Failed to parse xml " + xml);
} else {
return doc;
}
}
private String replaceXmlTag(String xml, String oldTag, String newTag) {
return xml.replaceAll(oldTag, newTag);
}
private String replaceXmlValue(String xml, String marker, String value) {
marker = "\\s*%" + marker + "%\\s*";
if (value == null) {
value = "";
}
return xml.replaceAll(marker, value);
}
private String extractXml(String xml, String marker) {
String startMarker = "<" + marker + ">";
String endMarker = "</" + marker + ">";
if (xml.contains(startMarker) && xml.contains(endMarker)) {
return xml.substring(xml.indexOf(startMarker) + startMarker.length(), xml.indexOf(endMarker));
} else {
return null;
}
}
}