@Override @Nonnull public IpSpace toIpSpace() { return new IpSpaceReference(_name, String.format("Match network object: '%s'", _name)); } }
@Override public BDD visitIpSpaceReference(IpSpaceReference ipSpaceReference) { String name = ipSpaceReference.getName(); checkArgument(_namedIpSpaceBDDs.containsKey(name), "Undefined IpSpace reference: %s", name); try { return _namedIpSpaceBDDs.get(name).get(); } catch (NonRecursiveSupplierException e) { throw new BatfishException("Circular IpSpaceReference: " + name); } }
@Override public IpSpace visitIpSpaceReference(IpSpaceReference ipSpaceReference) { return new IpSpaceReference( _renamer.apply(ipSpaceReference.getName()), ipSpaceReference.getDescription()); }
@Override @Nonnull public IpSpace toIpSpace() { return new IpSpaceReference(_name, String.format("Match network object-group: '%s'", _name)); } }
@Override public IpSpace visitIpSpaceReference(IpSpaceReference ipSpaceReference) { // todo cache simplified named IpSpaces? return _namedIpSpaces.get(ipSpaceReference.getName()).accept(this); } }
@Override public Void visitNatRuleMatchDstAddrName(NatRuleMatchDstAddrName natRuleMatchDstAddrName) { _headerSpace.setDstIps( new IpSpaceReference(GLOBAL_ADDRESS_BOOK_PREFIX + natRuleMatchDstAddrName.getName())); return null; }
@Override protected String featureValueOf(IpSpaceReference actual) { return actual.getName(); } }
@Override public Void visitNatRuleMatchSrcAddrName(NatRuleMatchSrcAddrName natRuleMatchSrcAddrName) { _headerSpace.setSrcIps( new IpSpaceReference(GLOBAL_ADDRESS_BOOK_PREFIX + natRuleMatchSrcAddrName.getName())); return null; }
@Override public IpSpace visitIpSpaceReference(IpSpaceReference ipSpaceReference) { String name = ipSpaceReference.getName(); return _specializedNamedIpSpaces.computeIfAbsent(name, k -> visit(_namedIpSpaces.get(name))); }
@Override public void exitOggn_group_object(Oggn_group_objectContext ctx) { String name = ctx.name.getText(); _currentNetworkObjectGroup.getLines().add(new IpSpaceReference(name)); _configuration.referenceStructure( NETWORK_OBJECT_GROUP, name, NETWORK_OBJECT_GROUP_GROUP_OBJECT, ctx.name.start.getLine()); }
@Override public Boolean visitIpSpaceReference(IpSpaceReference ipSpaceReference) { return _namedIpSpaces.get(ipSpaceReference.getName()).accept(this); }
@Override public void exitOgn_group_object(Ogn_group_objectContext ctx) { String name = ctx.name.getText(); _currentNetworkObjectGroup.getLines().add(new IpSpaceReference(name)); _configuration.referenceStructure( NETWORK_OBJECT_GROUP, name, NETWORK_OBJECT_GROUP_GROUP_OBJECT, ctx.name.start.getLine()); }
@Override public Boolean visitIpSpaceReference(IpSpaceReference ipSpaceReference) { return _namedIpSpaces.get(ipSpaceReference.getName()).accept(this); }
/** Convert address book into corresponding IpSpaces */ private Map<String, IpSpace> toIpSpaces(String bookName, AddressBook book) { Map<String, IpSpace> ipSpaces = new TreeMap<>(); book.getEntries() .forEach( (n, entry) -> { String entryName = bookName + "~" + n; // If this address book references other entries, add them to an AclIpSpace if (!entry.getEntries().isEmpty()) { AclIpSpace.Builder aclIpSpaceBuilder = AclIpSpace.builder(); entry .getEntries() .keySet() .forEach( name -> { String subEntryName = bookName + "~" + name; aclIpSpaceBuilder.thenPermitting(new IpSpaceReference(subEntryName)); }); ipSpaces.put(entryName, aclIpSpaceBuilder.build()); } else { ipSpaces.put( entryName, IpWildcardSetIpSpace.builder().including(entry.getIpWildcards(_w)).build()); } }); return ipSpaces; }
@Override public Boolean visitIpSpaceReference(IpSpaceReference ipSpaceReference) { return _namedIpSpaces.get(ipSpaceReference.getName()).accept(this); }
@Override public void applyTo( HeaderSpace.Builder headerSpaceBuilder, JuniperConfiguration jc, Warnings w, Configuration c) { AddressBook addressBook = _zone == null ? _globalAddressBook : _zone.getAddressBook(); String addressBookName = addressBook.getAddressBookName(_addressBookEntryName); String ipSpaceName = addressBookName + "~" + _addressBookEntryName; IpSpaceReference ipSpaceReference = new IpSpaceReference(ipSpaceName); if (headerSpaceBuilder.getDstIps() != null) { headerSpaceBuilder.setDstIps( AclIpSpace.union( ImmutableList.<IpSpace>builder() .add(ipSpaceReference) .add(headerSpaceBuilder.getDstIps()) .build())); } else { headerSpaceBuilder.setDstIps(AclIpSpace.union(ipSpaceReference)); } } }
@Override public BooleanExpr visitIpSpaceReference(IpSpaceReference ipSpaceReference) { return _namedIpSpaces.get(ipSpaceReference.getName()).accept(this); }
@Override public void applyTo( HeaderSpace.Builder headerSpaceBuilder, JuniperConfiguration jc, Warnings w, Configuration c) { AddressBook addressBook = _zone == null ? _globalAddressBook : _zone.getAddressBook(); String addressBookName = addressBook.getAddressBookName(_addressBookEntryName); String ipSpaceName = addressBookName + "~" + _addressBookEntryName; IpSpaceReference ipSpaceReference = new IpSpaceReference(ipSpaceName); if (headerSpaceBuilder.getSrcIps() != null) { headerSpaceBuilder.setSrcIps( AclIpSpace.union( ImmutableList.<IpSpace>builder() .add(ipSpaceReference) .add(headerSpaceBuilder.getSrcIps()) .build())); } else { headerSpaceBuilder.setSrcIps(AclIpSpace.union(ipSpaceReference)); } } }
@Override public String visitIpSpaceReference(IpSpaceReference ipSpaceReference) { String metadataDescription = computeMetadataDescription(ipSpaceReference); if (metadataDescription != null) { return metadataDescription; } String name = ipSpaceReference.getName(); IpSpace referencedSpace = _aclTracer.getNamedIpSpaces().get(name); String defaultValue = String.format("An IpSpace named '%s'", name); if (referencedSpace == null) { return defaultValue; } String referencedMetadataDescription = computeMetadataDescription(referencedSpace); if (referencedMetadataDescription != null) { return referencedMetadataDescription; } return defaultValue; }
@Test public void testCircularIpSpaceReference() { IpSpace foo = new IpSpaceReference("foo"); IpSpace bar = new IpSpaceReference("bar"); Map<String, IpSpace> namedIpSpaces = ImmutableMap.of("foo", bar, "bar", foo); IpSpaceToBDD ipSpaceToBDD = new IpSpaceToBDD(_ipAddrBdd, namedIpSpaces); exception.expect(BatfishException.class); exception.expectMessage("Circular IpSpaceReference: foo"); foo.accept(ipSpaceToBDD); } }