content: // 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.resource;
  
  import java.util.HashMap;
  import java.util.Map;
  
  import com.cloud.utils.exception.ExecutionException;
  // http client handling
  // for prettyFormat()
  
  public class MockablePaloAltoResource extends PaloAltoResource {
      private HashMap<String, String> context;
  
      public void setMockContext(HashMap<String, String> context) {
          this.context = context;
      }
  
      /* Fake the calls to the Palo Alto API */
      @Override
      protected String request(PaloAltoMethod method, Map<String, String> params) throws ExecutionException {
          if (method != PaloAltoMethod.GET && method != PaloAltoMethod.POST) {
              throw new ExecutionException("Invalid http method used to access the Palo Alto API.");
          }
  
          String response = "";
  
          // 'keygen' request
          if (params.containsKey("type") && params.get("type").equals("keygen")) {
              response = "<response status = 'success'><result><key>LUFRPT14MW5xOEo1R09KVlBZNnpnemh0VHRBOWl6TGM9bXcwM3JHUGVhRlNiY0dCR0srNERUQT09</key></result></response>";
          }
  
          // 'config' requests
          if (params.containsKey("type") && params.get("type").equals("config") && params.containsKey("action")) {
              // action = 'get'
              if (params.get("action").equals("get")) {
                  // get interface for type
                  // | public_using_ethernet
                  if (params.get("xpath").equals("/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/1']")) {
                      if (context.containsKey("public_using_ethernet") && context.get("public_using_ethernet").equals("true")) {
                          context.put("public_interface_type", "ethernet");
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\"><entry name=\"ethernet1/1\" admin=\"admin\" time=\"2013/06/18 "
                                  +
                                  "13:33:56\"><layer3 admin=\"admin\" time=\"2013/06/18 13:33:56\"><ipv6><neighbor-discovery><router-advertisement><enable>no</enable>"
                                  +
                                  "<min-interval>200</min-interval><max-interval>600</max-interval><hop-limit>64</hop-limit><reachable-time>unspecified</reachable-time>"
                                  +
                                  "<retransmission-timer>unspecified</retransmission-timer><lifetime>1800</lifetime><managed-flag>no</managed-flag>"
                                  +
                                  "<other-flag>no</other-flag><enable-consistency-check>no</enable-consistency-check><link-mtu>unspecified</link-mtu></router-advertisement>"
                                  +
                                  "<enable-dad>no</enable-dad><reachable-time>30</reachable-time><ns-interval>1</ns-interval><dad-attempts>1</dad-attempts></neighbor-discovery>"+
                                  "<enabled>no</enabled><interface-id>EUI-64</interface-id></ipv6><untagged-sub-interface>no</untagged-sub-interface>"
                                  +
                                  "<units admin=\"admin\" time=\"2013/06/18 13:33:56\"><entry name=\"ethernet1/1.9999\" admin=\"admin\" time=\"2013/06/18 13:33:56\">"
                                  +
                                  "<ipv6><neighbor-discovery><router-advertisement><enable>no</enable><min-interval>200</min-interval><max-interval>600</max-interval>"
                                  +
                                  "<hop-limit>64</hop-limit><reachable-time>unspecified</reachable-time><retransmission-timer>unspecified</retransmission-timer><lifetime>"
                                  +
                                  "1800</lifetime><managed-flag>no</managed-flag><other-flag>no</other-flag><enable-consistency-check>no</enable-consistency-check>" +
                                  "<link-mtu>unspecified</link-mtu></router-advertisement><enable-dad>no</enable-dad><reachable-time>30</reachable-time><ns-interval>" +
                                  "1</ns-interval><dad-attempts>1</dad-attempts></neighbor-discovery><enabled>no</enabled><interface-id>EUI-64</interface-id></ipv6>" +
                                  "<ip admin=\"admin\" time=\"2013/06/18 13:33:56\"><entry name=\"192.168.80.254/24\"/></ip><adjust-tcp-mss>no</adjust-tcp-mss>" +
                                  "<tag>3033</tag></entry></units></layer3><link-speed>auto</link-speed><link-duplex>auto</link-duplex><link-state>auto</link-state>" +
                                  "</entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  } // | private_using_ethernet
                  if (params.get("xpath").equals("/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/2']")) {
                      if (context.containsKey("private_using_ethernet") && context.get("private_using_ethernet").equals("true")) {
                          context.put("private_interface_type", "ethernet");
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\"><entry name=\"ethernet1/2\" admin=\"admin\" "
                                  + "time=\"2013/06/18 13:33:57\"><layer3 admin=\"admin\" time=\"2013/06/18 13:33:57\"><ipv6><neighbor-discovery><router-advertisement>"
                                  + "<enable>no</enable><min-interval>200</min-interval><max-interval>600</max-interval><hop-limit>64</hop-limit>"
                                  + "<reachable-time>unspecified</reachable-time><retransmission-timer>unspecified</retransmission-timer><lifetime>1800</lifetime>"
                                  + "<managed-flag>no</managed-flag><other-flag>no</other-flag><enable-consistency-check>no</enable-consistency-check>"
                                  + "<link-mtu>unspecified</link-mtu></router-advertisement><enable-dad>no</enable-dad><reachable-time>30</reachable-time>"
                                  + "<ns-interval>1</ns-interval><dad-attempts>1</dad-attempts></neighbor-discovery><enabled>no</enabled><interface-id>EUI-64</interface-id>"
                                  + "</ipv6><untagged-sub-interface>no</untagged-sub-interface><units admin=\"admin\" time=\"2013/06/18 13:33:57\"/></layer3>"
                                  + "<link-speed>auto</link-speed><link-duplex>auto</link-duplex><link-state>auto</link-state></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get management profile | has_management_profile
                  if (params.get("xpath").equals("/config/devices/entry/network/profiles/interface-management-profile/entry[@name='Ping']")) {
                      if (context.containsKey("has_management_profile") && context.get("has_management_profile").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\"><entry name=\"Ping\"><ping>yes</ping></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get public interface IP | has_public_interface
                  if (params.get("xpath").equals(
                      "/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/1']"
                          + "/layer3/units/entry[@name='ethernet1/1.9999']/ip/entry[@name='192.168.80.102/32']")) {
                      if (context.containsKey("has_public_interface") && context.get("has_public_interface").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"192.168.80.102/32\" admin=\"admin\" time=\"2013/07/05 13:02:37\"/></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get private interface | has_private_interface
                  if (params.get("xpath")
                      .equals("/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/2']/layer3/units/entry[@name='ethernet1/2.3954']")) {
                      if (context.containsKey("has_private_interface") && context.get("has_private_interface").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"ethernet1/2.3954\" admin=\"admin\" time=\"2013/07/05 13:02:36\"><tag admin=\"admin\" time=\"2013/07/05 13:02:36\">3954</tag>"
                                  + "<ip><entry name=\"10.5.80.1/20\"/></ip><interface-management-profile>Ping</interface-management-profile></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get private interface ip
                  if (params.get("xpath").equals(
                      "/config/devices/entry/network/interface/ethernet/entry" + "[@name='ethernet1/2']/layer3/units/entry[@name='ethernet1/2.3954']/ip/entry")) {
                      response = "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\"><entry name=\"10.3.96.1/20\"/></result></response>";
                  }
  
                  // get source nat | has_src_nat_rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='src_nat.3954']")) {
                      if (context.containsKey("has_src_nat_rule") && context.get("has_src_nat_rule").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"src_nat.3954\" admin=\"admin\" time=\"2013/07/05 13:02:38\"><to admin=\"admin\" time=\"2013/07/05 13:02:38\">"
                                  + "<member admin=\"admin\" time=\"2013/07/05 13:02:38\">untrust</member></to><from><member>trust</member></from><source>"
                                  + "<member>10.5.80.1/20</member></source><destination><member>any</member></destination><service>any</service>"
                                  + "<nat-type>ipv4</nat-type><to-interface>ethernet1/1.9999</to-interface><source-translation><dynamic-ip-and-port>"
                                  + "<interface-address><ip>192.168.80.102/32</ip><interface>ethernet1/1.9999</interface></interface-address></dynamic-ip-and-port>"
                                  + "</source-translation></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get isolation firewall rule | has_isolation_fw_rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='isolate_3954']")) {
                      if (context.containsKey("has_isolation_fw_rule") && context.get("has_isolation_fw_rule").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"isolate_3954\" admin=\"admin\" time=\"2013/07/05 13:02:38\"><from admin=\"admin\" time=\"2013/07/05 13:02:38\">"
                                  + "<member admin=\"admin\" time=\"2013/07/05 13:02:38\">trust</member></from><to><member>trust</member></to><source>"
                                  + "<member>10.5.80.0/20</member></source><destination><member>10.5.80.1</member></destination><application><member>any</member></application>"
                                  + "<service><member>any</member></service><action>deny</action><negate-source>no</negate-source><negate-destination>yes</negate-destination>"
                                  + "</entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get service | has_service
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/service/entry[@name='cs_tcp_80']")) {
                      if (context.containsKey("has_service_tcp_80") && context.get("has_service_tcp_80").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\"><entry name=\"cs_tcp_80\">"
                                  + "<protocol><tcp><port>80</port></tcp></protocol></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get egress firewall rule | has_egress_fw_rule | policy_0_3954
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='policy_0_3954']")) {
                      if (context.containsKey("has_egress_fw_rule") && context.get("has_egress_fw_rule").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"policy_0_3954\" admin=\"admin\" time=\"2013/07/03 12:43:30\"><from admin=\"admin\" time=\"2013/07/03 12:43:30\">"
                                  + "<member admin=\"admin\" time=\"2013/07/03 12:43:30\">trust</member></from><to><member>untrust</member></to><source><member>10.3.96.1/20</member>"
                                  + "</source><destination><member>any</member></destination><application><member>any</member></application><service><member>cs_tcp_80</member>"
                                  + "</service><action>allow</action><negate-source>no</negate-source><negate-destination>no</negate-destination></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get ingress firewall rule | has_ingress_fw_rule | policy_8
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='policy_8']")) {
                      if (context.containsKey("has_ingress_fw_rule") && context.get("has_ingress_fw_rule").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"policy_8\" admin=\"admin\" time=\"2013/07/03 13:26:27\"><from admin=\"admin\" time=\"2013/07/03 13:26:27\">"
                                  + "<member admin=\"admin\" time=\"2013/07/03 13:26:27\">untrust</member></from><to><member>trust</member></to><source><member>any</member>"
                                  + "</source><destination><member>192.168.80.103</member></destination><application><member>any</member></application><service>"
                                  + "<member>cs_tcp_80</member></service><action>allow</action><negate-source>no</negate-source><negate-destination>no</negate-destination>"
                                  + "</entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get default egress rule | policy_0_3954
                  if (params.get("xpath").equals(
                      "/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[contains(@name, 'policy') and contains(@name, '3954')]")) {
                      response = "<response status=\"success\" code=\"19\"><result/></response>";
                  }
  
                  // get destination nat rule (port forwarding) | has_dst_nat_rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='dst_nat.192-168-80-103_9']")) {
                      if (context.containsKey("has_dst_nat_rule") && context.get("has_dst_nat_rule").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"dst_nat.192-168-80-103_9\" admin=\"admin\" time=\"2013/07/03 13:40:50\"><to admin=\"admin\" time=\"2013/07/03 13:40:50\">"
                                  + "<member admin=\"admin\" time=\"2013/07/03 13:40:50\">untrust</member></to><from><member>untrust</member></from><source><member>any</member>"
                                  + "</source><destination><member>192.168.80.103</member></destination><service>cs_tcp_80</service><nat-type>ipv4</nat-type>"
                                  + "<to-interface>ethernet1/1.9999</to-interface><destination-translation><translated-address>10.3.97.158</translated-address>"
                                  + "<translated-port>8080</translated-port></destination-translation></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get destination nat rules (returns all dst nat rules per ip)
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[destination/member[text()='192.168.80.103']]")) {
                      if (context.containsKey("has_dst_nat_rule") && context.get("has_dst_nat_rule").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"dst_nat.192-168-80-103_9\" admin=\"admin\" time=\"2013/07/03 13:40:50\"><to admin=\"admin\" time=\"2013/07/03 13:40:50\">"
                                  + "<member admin=\"admin\" time=\"2013/07/03 13:40:50\">untrust</member></to><from><member>untrust</member></from><source><member>any</member>"
                                  + "</source><destination><member>192.168.80.103</member></destination><service>cs_tcp_80</service><nat-type>ipv4</nat-type>"
                                  + "<to-interface>ethernet1/1.9999</to-interface><destination-translation><translated-address>10.3.97.158</translated-address>"
                                  + "<translated-port>8080</translated-port></destination-translation></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
                  // get static nat rule | has_stc_nat_rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='stc_nat.192-168-80-103_0']")) {
                      if (context.containsKey("has_stc_nat_rule") && context.get("has_stc_nat_rule").equals("true")) {
                          response =
                              "<response status=\"success\" code=\"19\"><result total-count=\"1\" count=\"1\">"
                                  + "<entry name=\"stc_nat.192-168-80-103_0\" admin=\"admin\" time=\"2013/07/03 14:02:23\"><to admin=\"admin\" time=\"2013/07/03 14:02:23\">"
                                  + "<member admin=\"admin\" time=\"2013/07/03 14:02:23\">untrust</member></to><from><member>untrust</member></from><source><member>any</member>"
                                  + "</source><destination><member>192.168.80.103</member></destination><service>any</service><nat-type>ipv4</nat-type>"
                                  + "<to-interface>ethernet1/1.9999</to-interface><destination-translation><translated-address>10.3.97.158</translated-address>"
                                  + "</destination-translation></entry></result></response>";
                      } else {
                          response = "<response status=\"success\" code=\"19\"><result/></response>";
                      }
                  }
  
              }
  
              // action = 'set'
              if (params.get("action").equals("set")) {
                  // set management profile
                  if (params.get("xpath").equals("/config/devices/entry/network/profiles/interface-management-profile/entry[@name='Ping']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_management_profile", "true");
                  }
  
                  // add private interface
                  if (params.get("xpath")
                      .equals("/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/2']/layer3/units/entry[@name='ethernet1/2.3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_private_interface", "true");
                  }
  
                  // add public ip to public interface
                  if (params.get("xpath").equals(
                      "/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/1']/layer3/units/entry[@name='ethernet1/1.9999']/ip")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_public_interface", "true");
                  }
  
                  // add private interface to zone
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/zone/entry[@name='trust']/network/layer3")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // add public interface to zone
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/zone/entry[@name='untrust']/network/layer3")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // set virtual router (public | private)
                  if (params.get("xpath").equals("/config/devices/entry/network/virtual-router/entry[@name='default']/interface")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // add interface to network (public | private)
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/import/network/interface")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // add src nat rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='src_nat.3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_src_nat_rule", "true");
                  }
  
                  // add isolation firewall rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='isolate_3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_isolation_fw_rule", "true");
                  }
  
                  // add egress firewall rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='policy_0_3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_egress_fw_rule", "true");
                  }
  
                  // add ingress firewall rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='policy_8']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_ingress_fw_rule", "true");
                  }
  
                  // add destination nat rule (port forwarding)
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='dst_nat.192-168-80-103_9']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_dst_nat_rule", "true");
                  }
  
                  // add static nat rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='stc_nat.192-168-80-103_0']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_stc_nat_rule", "true");
                  }
  
                  // add tcp 80 service
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/service/entry[@name='cs_tcp_80']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.put("has_service_tcp_80", "true");
                  }
              }
  
              // action = 'delete'
              if (params.get("action").equals("delete")) {
                  // remove egress firewall rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='policy_0_3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_egress_fw_rule");
                  }
  
                  // remove ingress firewall rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='policy_8']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_ingress_fw_rule");
                  }
  
                  // remove destination nat rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='dst_nat.192-168-80-103_9']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_dst_nat_rule");
                  }
  
                  // remove static nat rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='stc_nat.192-168-80-103_0']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_dst_nat_rule");
                  }
  
                  // remove public ip from interface (dst_nat | stc_nat)
                  if (params.get("xpath").equals(
                      "/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/1']/layer3/units/entry"
                          + "[@name='ethernet1/1.9999']/ip/entry[@name='192.168.80.103/32']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // remove isolation firewall rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='isolate_3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_isolation_fw_rule");
                  }
  
                  // remove source nat rule
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/rulebase/nat/rules/entry[@name='src_nat.3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_src_nat_rule");
                  }
  
                  // remove public source nat ip
                  if (params.get("xpath").equals(
                      "/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/1']/layer3/units/entry"
                          + "[@name='ethernet1/1.9999']/ip/entry[@name='192.168.80.102/32']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_public_interface");
                  }
  
                  // remove private interface from the zone
                  if (params.get("xpath").equals(
                      "/config/devices/entry/vsys/entry[@name='vsys1']/zone/entry[@name='trust']/network/layer3/member[text()='ethernet1/2.3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // remove private interface from the virtual router
                  if (params.get("xpath").equals("/config/devices/entry/network/virtual-router/entry[@name='default']/interface/member[text()='ethernet1/2.3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // remove private interface from network
                  if (params.get("xpath").equals("/config/devices/entry/vsys/entry[@name='vsys1']/import/network/interface/member[text()='ethernet1/2.3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                  }
  
                  // remove private interface
                  if (params.get("xpath")
                      .equals("/config/devices/entry/network/interface/ethernet/entry[@name='ethernet1/2']/layer3/units/entry[@name='ethernet1/2.3954']")) {
                      response = "<response status=\"success\" code=\"20\"><msg>command succeeded</msg></response>";
                      context.remove("has_private_interface");
                  }
  
              }
          } // end 'config'
  
          // 'op' requests
          if (params.containsKey("type") && params.get("type").equals("op")) {
              // check if there are pending changes
              if (params.get("cmd").equals("<check><pending-changes></pending-changes></check>")) {
                  if (context.containsKey("firewall_has_pending_changes") && context.get("firewall_has_pending_changes").equals("true")) {
                      response = "<response status=\"success\"><result>yes</result></response>";
                  } else {
                      response = "<response status=\"success\"><result>no</result></response>";
                  }
              }
  
              // add a config lock
              if (params.get("cmd").equals("<request><config-lock><add></add></config-lock></request>")) {
                  response =
                      "<response status=\"success\"><result>Successfully acquired lock. Other administrators will not be able to modify configuration "
                          + "for scope shared until lock is released</result></response>";
              }
  
              // check job status
              if (params.get("cmd").equals("<show><jobs><id>1</id></jobs></show>")) {
                  if (context.containsKey("simulate_commit_failure") && context.get("simulate_commit_failure").equals("true")) {
                      response =
                          "<response status=\"success\"><result><job><tenq>2013/07/10 11:11:49</tenq><id>1</id><user>admin</user><type>Commit</type>"
                              + "<status>FIN</status><stoppable>no</stoppable><result>FAIL</result><tfin>11:11:54</tfin><progress>11:11:54</progress><details>"
                              + "<line>Bad config</line><line>Commit failed</line></details><warnings></warnings></job></result></response>";
                  } else {
                      response =
                          "<response status=\"success\"><result><job><tenq>2013/07/02 14:49:49</tenq><id>1</id><user>admin</user>"
                              + "<type>Commit</type><status>FIN</status><stoppable>no</stoppable><result>OK</result><tfin>14:50:02</tfin><progress>14:50:02</progress>"
                              + "<details><line>Configuration committed successfully</line></details><warnings></warnings></job></result></response>";
                  }
              }
  
              // load from running config
              if (params.get("cmd").equals("<load><config><from>running-config.xml</from></config></load>")) {
                  response = "<response status=\"success\"><result><msg><line>Config loaded from running-config.xml</line></msg></result></response>";
              }
  
              // remove config lock
              if (params.get("cmd").equals("<request><config-lock><remove></remove></config-lock></request>")) {
                  response = "<response status=\"success\"><result>Config lock released for scope shared</result></response>";
              }
          } // end 'op'
  
          // 'commit' requests
          if (params.containsKey("type") && params.get("type").equals("commit")) {
              // cmd = '<commit></commit>'
              if (params.get("cmd").equals("<commit></commit>")) {
                  response = "<response status=\"success\" code=\"19\"><result><msg><line>Commit job enqueued with jobid 1</line></msg><job>1</job></result></response>";
              }
          } // end 'commit'
  
          // print out the details into the console
          if (context.containsKey("enable_console_output") && context.get("enable_console_output") == "true") {
              if (params.containsKey("xpath")) {
                  System.out.println("XPATH(" + params.get("action") + "): " + params.get("xpath"));
              }
              if (params.containsKey("type") && params.get("type").equals("op")) {
                  System.out.println("OP CMD: " + params.get("cmd"));
              }
              System.out.println(response + "\n");
          }
  
          return response;
      }
  }
  