package org.opennaas.extensions.router.model.utils;
import static com.google.common.collect.Iterables.filter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.opennaas.extensions.router.model.AutonomousSystem;
import org.opennaas.extensions.router.model.BGPPeerGroup;
import org.opennaas.extensions.router.model.BGPPeerGroupService;
import org.opennaas.extensions.router.model.BGPProtocolEndpoint;
import org.opennaas.extensions.router.model.BGPService;
import org.opennaas.extensions.router.model.ComputerSystem;
import org.opennaas.extensions.router.model.EntriesInFilterList;
import org.opennaas.extensions.router.model.FilterEntryBase;
import org.opennaas.extensions.router.model.FilterList;
import org.opennaas.extensions.router.model.FilterOfPacketCondition;
import org.opennaas.extensions.router.model.IPAddressPrefixList;
import org.opennaas.extensions.router.model.ManagedElement;
import org.opennaas.extensions.router.model.PacketFilterCondition;
import org.opennaas.extensions.router.model.PolicyAction;
import org.opennaas.extensions.router.model.PolicyActionInPolicyRule;
import org.opennaas.extensions.router.model.PolicyCondition;
import org.opennaas.extensions.router.model.PolicyConditionInPolicyRule;
import org.opennaas.extensions.router.model.PolicyRule;
import org.opennaas.extensions.router.model.PolicySet;
import org.opennaas.extensions.router.model.PolicySetAppliesToElement;
import org.opennaas.extensions.router.model.PolicySetComponent;
import org.opennaas.extensions.router.model.PolicySetInSystem;
import org.opennaas.extensions.router.model.PrefixListFilterEntry;
import org.opennaas.extensions.router.model.RoutersInAS;
import org.opennaas.extensions.router.model.System;
public class BGPUtils {
public static List<BGPService> getBGPServices(System system) {
return system.getAllHostedServicesByType(new BGPService());
}
public static List<BGPPeerGroup> getBGPPeerGroups(BGPService service) {
return (List<BGPPeerGroup>) service.getFromAssociatedElementsByType(BGPPeerGroupService.class);
}
public static List<BGPProtocolEndpoint> getBGPProtocolEndpoints(BGPService service) {
List<BGPProtocolEndpoint> peps = new ArrayList<BGPProtocolEndpoint>(service.getProtocolEndpoint().size());
for (BGPProtocolEndpoint bgpPep : filter(service.getProtocolEndpoint(), BGPProtocolEndpoint.class)) {
peps.add(bgpPep);
}
return peps;
}
public static List<PolicySet> getAppliedPolicies(ManagedElement elem) {
return (List<PolicySet>) elem.getFromAssociatedElementsByType(PolicySetAppliesToElement.class);
}
public static List<PolicySet> getPolicySetComponents(PolicySet composite) {
return (List<PolicySet>) composite.getToAssociatedElementsByType(PolicySetComponent.class);
}
public static List<PolicySet> getPolicySetInSystem(System host) {
return (List<PolicySet>) host.getToAssociatedElementsByType(PolicySetInSystem.class);
}
public static List<PolicyCondition> getPolicyConditionInPolicyRule(PolicyRule rule) {
return (List<PolicyCondition>) rule.getToAssociatedElementsByType(PolicyConditionInPolicyRule.class);
}
public static List<PolicyAction> getPolicyActionInPolicyRule(PolicyRule rule) {
return (List<PolicyAction>) rule.getToAssociatedElementsByType(PolicyActionInPolicyRule.class);
}
public static List<FilterList> getFilterOfPacketCondition(PacketFilterCondition condition) {
return (List<FilterList>) condition.getFromAssociatedElementsByType(FilterOfPacketCondition.class);
}
public static List<FilterEntryBase> getEntriesInFilterList(FilterList list) {
return (List<FilterEntryBase>) list.getToAssociatedElementsByType(EntriesInFilterList.class);
}
public static AutonomousSystem getASFromRouter(ComputerSystem router) {
return (AutonomousSystem) router.getFirstFromAssociatedElementByType(RoutersInAS.class);
}
public static List<IPAddressPrefixList> getPrefixListsFromPoliciesInSystem(ComputerSystem system) {
Map<String, IPAddressPrefixList> prefixLists = new HashMap<String, IPAddressPrefixList>();
for (PolicySet policy : BGPUtils.getPolicySetInSystem(system)) {
for (PolicySet rule : BGPUtils.getPolicySetComponents(policy)) {
if (rule instanceof PolicyRule) {
for (PolicyCondition condition : BGPUtils.getPolicyConditionInPolicyRule((PolicyRule) rule)) {
if (condition instanceof PacketFilterCondition) {
for (FilterList filterList : BGPUtils.getFilterOfPacketCondition((PacketFilterCondition) condition)) {
for (FilterEntryBase entry : BGPUtils.getEntriesInFilterList(filterList)) {
if (entry instanceof PrefixListFilterEntry) {
IPAddressPrefixList prefixList = ((PrefixListFilterEntry) entry).getPrefixList();
if (prefixList != null) {
// Notice that using the map repeated elements are overridden
prefixLists.put(prefixList.getElementName(), prefixList);
}
}
}
}
}
}
}
}
}
return new ArrayList<IPAddressPrefixList>(prefixLists.values());
}
}