package org.batfish.datamodel;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.NavigableSet;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.stream.Collectors;
import org.batfish.common.BfJson;
import org.batfish.common.util.ComparableStructure;
import org.batfish.datamodel.collections.RoleSet;
import org.batfish.datamodel.routing_policy.RoutingPolicy;
import org.batfish.datamodel.vendor_family.VendorFamily;
import org.batfish.datamodel.ConfigurationFormat;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaDescription;
@JsonSchemaDescription("A Configuration represents an autonomous network device, such as a router, host, switch, or firewall.")
public final class Configuration extends ComparableStructure<String> {
private static final String AS_PATH_ACCESS_LISTS_VAR = "asPathAccessLists";
private static final String COMMUNITY_LISTS_VAR = "communityLists";
private static final String CONFIGURATION_FORMAT_VAR = "configurationFormat";
private static final String DEFAULT_CROSS_ZONE_ACTION_VAR = "defaultCrossZoneAction";
private static final String DEFAULT_INBOUND_ACTION_VAR = "defaultInboundAction";
public static final String DEFAULT_VRF_NAME = "default";
private static final String IKE_GATEWAYS_VAR = "ikeGateways";
private static final String IKE_POLICIES_VAR = "ikePolicies";
private static final String IKE_PROPOSALS_VAR = "ikeProposals";
private static final String IP_ACCESS_LISTS_VAR = "ipAccessLists";
private static final String IPSEC_POLICIES_VAR = "ipsecPolicies";
private static final String IPSEC_PROPOSALS_VAR = "ipsecProposals";
private static final String IPSEC_VPNS_VAR = "ipsecVpns";
public static final String NODE_NONE_NAME = "(none)";
private static final String ROLES_VAR = "roles";
private static final String ROUTE_FILTER_LISTS_VAR = "routeFilterLists";
private static final String ROUTING_POLICIES_VAR = "routingPolicies";
private static final long serialVersionUID = 1L;
private static final String ZONES_VAR = "zones";
private NavigableMap<String, AsPathAccessList> _asPathAccessLists;
private transient NavigableSet<BgpAdvertisement> _bgpAdvertisements;
private NavigableMap<String, CommunityList> _communityLists;
private ConfigurationFormat _configurationFormat;
private LineAction _defaultCrossZoneAction;
private LineAction _defaultInboundAction;
private NavigableSet<String> _dnsServers;
private String _domainName;
private NavigableMap<String, IkeGateway> _ikeGateways;
private NavigableMap<String, IkePolicy> _ikePolicies;
private NavigableMap<String, IkeProposal> _ikeProposals;
private NavigableMap<String, Interface> _interfaces;
private NavigableMap<String, Ip6AccessList> _ip6AccessLists;
private NavigableMap<String, IpAccessList> _ipAccessLists;
private NavigableMap<String, IpsecPolicy> _ipsecPolicies;
private NavigableMap<String, IpsecProposal> _ipsecProposals;
private NavigableMap<String, IpsecVpn> _ipsecVpns;
private NavigableSet<String> _loggingServers;
private NavigableSet<String> _ntpServers;
private transient NavigableSet<BgpAdvertisement> _originatedAdvertisements;
private transient NavigableSet<BgpAdvertisement> _originatedEbgpAdvertisements;
private transient NavigableSet<BgpAdvertisement> _originatedIbgpAdvertisements;
private transient NavigableSet<BgpAdvertisement> _receivedAdvertisements;
private transient NavigableSet<BgpAdvertisement> _receivedEbgpAdvertisements;
private transient NavigableSet<BgpAdvertisement> _receivedIbgpAdvertisements;
private transient boolean _resolved;
private RoleSet _roles;
private NavigableMap<String, Route6FilterList> _route6FilterLists;
private NavigableMap<String, RouteFilterList> _routeFilterLists;
private transient NavigableSet<Route> _routes;
private NavigableMap<String, RoutingPolicy> _routingPolicies;
private transient NavigableSet<BgpAdvertisement> _sentAdvertisements;
private transient NavigableSet<BgpAdvertisement> _sentEbgpAdvertisements;
private transient NavigableSet<BgpAdvertisement> _sentIbgpAdvertisements;
private NavigableSet<String> _snmpTrapServers;
private NavigableSet<String> _tacacsServers;
private VendorFamily _vendorFamily;
private Map<String, Vrf> _vrfs;
private NavigableMap<String, Zone> _zones;
@JsonCreator
public Configuration(@JsonProperty(NAME_VAR) String hostname) {
super(hostname);
_asPathAccessLists = new TreeMap<>();
_communityLists = new TreeMap<>();
_dnsServers = new TreeSet<>();
_ikeGateways = new TreeMap<>();
_ikePolicies = new TreeMap<>();
_ikeProposals = new TreeMap<>();
_interfaces = new TreeMap<>();
_ipAccessLists = new TreeMap<>();
_ip6AccessLists = new TreeMap<>();
_ipsecPolicies = new TreeMap<>();
_ipsecProposals = new TreeMap<>();
_ipsecVpns = new TreeMap<>();
_loggingServers = new TreeSet<>();
_ntpServers = new TreeSet<>();
_roles = new RoleSet();
_routeFilterLists = new TreeMap<>();
_route6FilterLists = new TreeMap<>();
_routingPolicies = new TreeMap<>();
_snmpTrapServers = new TreeSet<>();
_tacacsServers = new TreeSet<>();
_vendorFamily = new VendorFamily();
_vrfs = new TreeMap<>();
_zones = new TreeMap<>();
}
@JsonProperty(AS_PATH_ACCESS_LISTS_VAR)
@JsonPropertyDescription("Dictionary of all AS-path access-lists for this node.")
public NavigableMap<String, AsPathAccessList> getAsPathAccessLists() {
return _asPathAccessLists;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getBgpAdvertisements() {
return _bgpAdvertisements;
}
@JsonProperty(COMMUNITY_LISTS_VAR)
@JsonPropertyDescription("Dictionary of all community-lists for this node.")
public NavigableMap<String, CommunityList> getCommunityLists() {
return _communityLists;
}
@JsonProperty(CONFIGURATION_FORMAT_VAR)
@JsonPropertyDescription("Best guess at vendor configuration format. Used for setting default values, protocol costs, etc.")
public ConfigurationFormat getConfigurationFormat() {
return _configurationFormat;
}
@JsonProperty(DEFAULT_CROSS_ZONE_ACTION_VAR)
@JsonPropertyDescription("Default forwarding action to take for traffic that crosses firewall zones.")
public LineAction getDefaultCrossZoneAction() {
return _defaultCrossZoneAction;
}
@JsonProperty(DEFAULT_INBOUND_ACTION_VAR)
@JsonPropertyDescription("Default forwarding action to take for traffic destined for this device.")
public LineAction getDefaultInboundAction() {
return _defaultInboundAction;
}
@JsonIgnore
public Vrf getDefaultVrf() {
return _vrfs.get(DEFAULT_VRF_NAME);
}
public NavigableSet<String> getDnsServers() {
return _dnsServers;
}
@JsonPropertyDescription("Domain name of this node.")
public String getDomainName() {
return _domainName;
}
@JsonProperty(NAME_VAR)
@JsonPropertyDescription("Hostname of this node.")
public String getHostname() {
return _key;
}
@JsonProperty(IKE_GATEWAYS_VAR)
@JsonPropertyDescription("Dictionary of all IKE gateways for this node.")
public NavigableMap<String, IkeGateway> getIkeGateways() {
return _ikeGateways;
}
@JsonProperty(IKE_POLICIES_VAR)
@JsonPropertyDescription("Dictionary of all IKE policies for this node.")
public NavigableMap<String, IkePolicy> getIkePolicies() {
return _ikePolicies;
}
@JsonProperty(IKE_PROPOSALS_VAR)
@JsonPropertyDescription("Dictionary of all IKE proposals for this node.")
public NavigableMap<String, IkeProposal> getIkeProposals() {
return _ikeProposals;
}
@JsonPropertyDescription("Dictionary of all interfaces across all VRFs for this node.")
public NavigableMap<String, Interface> getInterfaces() {
return _interfaces;
}
@JsonPropertyDescription("Dictionary of all IPV6 access-lists for this node.")
public NavigableMap<String, Ip6AccessList> getIp6AccessLists() {
return _ip6AccessLists;
}
@JsonProperty(IP_ACCESS_LISTS_VAR)
@JsonPropertyDescription("Dictionary of all IPV4 access-lists for this node.")
public NavigableMap<String, IpAccessList> getIpAccessLists() {
return _ipAccessLists;
}
@JsonProperty(IPSEC_POLICIES_VAR)
@JsonPropertyDescription("Dictionary of all IPSEC policies for this node.")
public NavigableMap<String, IpsecPolicy> getIpsecPolicies() {
return _ipsecPolicies;
}
@JsonProperty(IPSEC_PROPOSALS_VAR)
@JsonPropertyDescription("Dictionary of all IPSEC proposals for this node.")
public NavigableMap<String, IpsecProposal> getIpsecProposals() {
return _ipsecProposals;
}
@JsonProperty(IPSEC_VPNS_VAR)
@JsonPropertyDescription("Dictionary of all IPSEC VPNs for this node.")
public NavigableMap<String, IpsecVpn> getIpsecVpns() {
return _ipsecVpns;
}
public NavigableSet<String> getLoggingServers() {
return _loggingServers;
}
public NavigableSet<String> getNtpServers() {
return _ntpServers;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getOriginatedAdvertisements() {
return _originatedAdvertisements;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getOriginatedEbgpAdvertisements() {
return _originatedEbgpAdvertisements;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getOriginatedIbgpAdvertisements() {
return _originatedIbgpAdvertisements;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getReceivedAdvertisements() {
return _receivedAdvertisements;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getReceivedEbgpAdvertisements() {
return _receivedEbgpAdvertisements;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getReceivedIbgpAdvertisements() {
return _receivedIbgpAdvertisements;
}
@JsonProperty(ROLES_VAR)
@JsonPropertyDescription("Set of all roles in which this node serves.")
public RoleSet getRoles() {
return _roles;
}
@JsonPropertyDescription("Dictionary of all IPV6 route filter lists for this node.")
public NavigableMap<String, Route6FilterList> getRoute6FilterLists() {
return _route6FilterLists;
}
@JsonProperty(ROUTE_FILTER_LISTS_VAR)
@JsonPropertyDescription("Dictionary of all IPV4 route filter lists for this node.")
public NavigableMap<String, RouteFilterList> getRouteFilterLists() {
return _routeFilterLists;
}
@JsonIgnore
public NavigableSet<Route> getRoutes() {
return _routes;
}
@JsonProperty(ROUTING_POLICIES_VAR)
@JsonPropertyDescription("Dictionary of all routing policies for this node.")
public NavigableMap<String, RoutingPolicy> getRoutingPolicies() {
return _routingPolicies;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getSentAdvertisements() {
return _sentAdvertisements;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getSentEbgpAdvertisements() {
return _sentEbgpAdvertisements;
}
@JsonIgnore
public NavigableSet<BgpAdvertisement> getSentIbgpAdvertisements() {
return _sentIbgpAdvertisements;
}
public NavigableSet<String> getSnmpTrapServers() {
return _snmpTrapServers;
}
public NavigableSet<String> getTacacsServers() {
return _tacacsServers;
}
@JsonPropertyDescription("Object containing vendor-specific information for this node.")
public VendorFamily getVendorFamily() {
return _vendorFamily;
}
@JsonPropertyDescription("Dictionary of all VRFs for this node.")
public Map<String, Vrf> getVrfs() {
return _vrfs;
}
@JsonProperty(ZONES_VAR)
@JsonPropertyDescription("Dictionary of all firewall zones for this node.")
public NavigableMap<String, Zone> getZones() {
return _zones;
}
public void initBgpAdvertisements() {
_bgpAdvertisements = new TreeSet<>();
_originatedAdvertisements = new TreeSet<>();
_originatedEbgpAdvertisements = new TreeSet<>();
_originatedIbgpAdvertisements = new TreeSet<>();
_receivedAdvertisements = new TreeSet<>();
_receivedEbgpAdvertisements = new TreeSet<>();
_receivedIbgpAdvertisements = new TreeSet<>();
_sentAdvertisements = new TreeSet<>();
_sentEbgpAdvertisements = new TreeSet<>();
_sentIbgpAdvertisements = new TreeSet<>();
for (Vrf vrf : _vrfs.values()) {
vrf.initBgpAdvertisements();
}
}
public void initRoutes() {
_routes = new TreeSet<>();
for (Vrf vrf : _vrfs.values()) {
vrf.initRoutes();
}
}
public void resolveReferences() {
if (_resolved) {
return;
}
_resolved = true;
for (IkeGateway gateway : _ikeGateways.values()) {
gateway.resolveReferences(this);
}
for (IkePolicy ikePolicy : _ikePolicies.values()) {
ikePolicy.resolveReferences(this);
}
for (Interface iface : _interfaces.values()) {
iface.resolveReferences(this);
}
for (IpsecPolicy ipsecPolicy : _ipsecPolicies.values()) {
ipsecPolicy.resolveReferences(this);
}
for (IpsecVpn ipsecVpn : _ipsecVpns.values()) {
ipsecVpn.resolveReferences(this);
}
for (Vrf vrf : _vrfs.values()) {
vrf.resolveReferences(this);
BgpProcess bgpProc = vrf.getBgpProcess();
if (bgpProc != null) {
for (BgpNeighbor neighbor : bgpProc.getNeighbors().values()) {
neighbor.resolveReferences(this);
}
}
OspfProcess ospfProc = vrf.getOspfProcess();
if (ospfProc != null) {
for (OspfArea area : ospfProc.getAreas().values()) {
area.resolveReferences(this);
}
}
}
}
@JsonProperty(AS_PATH_ACCESS_LISTS_VAR)
public void setAsPathAccessLists(
NavigableMap<String, AsPathAccessList> asPathAccessLists) {
_asPathAccessLists = asPathAccessLists;
}
@JsonProperty(COMMUNITY_LISTS_VAR)
public void setCommunityLists(
NavigableMap<String, CommunityList> communityLists) {
_communityLists = communityLists;
}
public void setConfigurationFormat(ConfigurationFormat configurationFormat) {
_configurationFormat = configurationFormat;
}
public void setDefaultCrossZoneAction(LineAction defaultCrossZoneAction) {
_defaultCrossZoneAction = defaultCrossZoneAction;
}
public void setDefaultInboundAction(LineAction defaultInboundAction) {
_defaultInboundAction = defaultInboundAction;
}
public void setDnsServers(NavigableSet<String> dnsServers) {
_dnsServers = dnsServers;
}
public void setDomainName(String domainName) {
_domainName = domainName;
}
@JsonProperty(IKE_GATEWAYS_VAR)
public void setIkeGateways(NavigableMap<String, IkeGateway> ikeGateways) {
_ikeGateways = ikeGateways;
}
@JsonProperty(IKE_POLICIES_VAR)
public void setIkePolicies(NavigableMap<String, IkePolicy> ikePolicies) {
_ikePolicies = ikePolicies;
}
@JsonProperty(IKE_PROPOSALS_VAR)
public void setIkeProposals(NavigableMap<String, IkeProposal> ikeProposals) {
_ikeProposals = ikeProposals;
}
public void setInterfaces(NavigableMap<String, Interface> interfaces) {
_interfaces = interfaces;
}
public void setIp6AccessLists(
NavigableMap<String, Ip6AccessList> ip6AccessLists) {
_ip6AccessLists = ip6AccessLists;
}
@JsonProperty(IP_ACCESS_LISTS_VAR)
public void setIpAccessLists(
NavigableMap<String, IpAccessList> ipAccessLists) {
_ipAccessLists = ipAccessLists;
}
@JsonProperty(IPSEC_POLICIES_VAR)
public void setIpsecPolicies(
NavigableMap<String, IpsecPolicy> ipsecPolicies) {
_ipsecPolicies = ipsecPolicies;
}
@JsonProperty(IPSEC_PROPOSALS_VAR)
public void setIpsecProposals(
NavigableMap<String, IpsecProposal> ipsecProposals) {
_ipsecProposals = ipsecProposals;
}
@JsonProperty(IPSEC_VPNS_VAR)
public void setIpsecVpns(NavigableMap<String, IpsecVpn> ipsecVpns) {
_ipsecVpns = ipsecVpns;
}
public void setLoggingServers(NavigableSet<String> loggingServers) {
_loggingServers = loggingServers;
}
public void setNtpServers(NavigableSet<String> ntpServers) {
_ntpServers = ntpServers;
}
public void setRoles(RoleSet roles) {
_roles = roles;
}
public void setRoute6FilterLists(
NavigableMap<String, Route6FilterList> route6FilterLists) {
_route6FilterLists = route6FilterLists;
}
@JsonProperty(ROUTE_FILTER_LISTS_VAR)
public void setRouteFilterLists(
NavigableMap<String, RouteFilterList> routeFilterLists) {
_routeFilterLists = routeFilterLists;
}
@JsonProperty(ROUTING_POLICIES_VAR)
public void setRoutingPolicies(
NavigableMap<String, RoutingPolicy> routingPolicies) {
_routingPolicies = routingPolicies;
}
public void setSnmpTrapServers(NavigableSet<String> snmpTrapServers) {
_snmpTrapServers = snmpTrapServers;
}
public void setTacacsServers(NavigableSet<String> tacacsServers) {
_tacacsServers = tacacsServers;
}
public void setVendorFamily(VendorFamily vendorFamily) {
_vendorFamily = vendorFamily;
}
public void setVrfs(Map<String, Vrf> vrfs) {
_vrfs = vrfs;
}
@JsonProperty(ZONES_VAR)
public void setZones(NavigableMap<String, Zone> zones) {
_zones = zones;
}
public void simplifyRoutingPolicies() {
NavigableMap<String, RoutingPolicy> simpleRoutingPolicies = new TreeMap<>();
simpleRoutingPolicies.putAll(_routingPolicies.entrySet().stream()
.collect(Collectors
.<Entry<String, RoutingPolicy>, String, RoutingPolicy> toMap(
e -> e.getKey(), e -> e.getValue().simplify())));
_routingPolicies = simpleRoutingPolicies;
}
public JSONObject toJson() throws JSONException {
JSONObject jObj = new JSONObject();
jObj.put(BfJson.KEY_NODE_NAME, getHostname());
return jObj;
}
}