*/
package org.opendaylight.lispflowmapping.implementation;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.Future;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.lispflowmapping.implementation.util.RPCInputConvertorUtil;
import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.AddKeyInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.AddKeysInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.AddMappingInput;
RpcResultBuilder<Void> rpcResultBuilder;
- MappingAuthkey key = mappingSystem.getAuthenticationKey(input.getEid());
+ MappingAuthkey key = mappingSystem.getAuthenticationKey(convertToBinaryIfNecessary(input.getEid()));
if (key != null) {
String message = "Key already exists! Please use update-key if you want to change it.";
RpcResultBuilder<GetKeyOutput> rpcResultBuilder;
- MappingAuthkey key = mappingSystem.getAuthenticationKey(input.getEid());
+ MappingAuthkey key = mappingSystem.getAuthenticationKey(convertToBinaryIfNecessary(input.getEid()));
if (key == null) {
String message = "Key was not found in the mapping database";
RpcResultBuilder<GetMappingOutput> rpcResultBuilder;
- MappingRecord reply = (MappingRecord) mappingSystem.getMapping(input.getEid());
+ MappingRecord reply = (MappingRecord) mappingSystem.getMapping(convertToBinaryIfNecessary(input.getEid()));
if (reply == null) {
String message = "No mapping was found in the mapping database";
rpcResultBuilder = RpcResultBuilder.<GetMappingOutput>failed()
.withError(RpcError.ErrorType.APPLICATION, NOT_FOUND_TAG, message);
} else {
- rpcResultBuilder = RpcResultBuilder.success(new GetMappingOutputBuilder().setMappingRecord(reply));
+ final MappingRecord convertedReply = convertFromBinaryIfNecessary(reply);
+ rpcResultBuilder = RpcResultBuilder.success(new GetMappingOutputBuilder().setMappingRecord(convertedReply));
}
return Futures.immediateFuture(rpcResultBuilder.build());
RpcResultBuilder<Void> rpcResultBuilder;
- MappingAuthkey key = mappingSystem.getAuthenticationKey(input.getEid());
+ MappingAuthkey key = mappingSystem.getAuthenticationKey(convertToBinaryIfNecessary(input.getEid()));
if (key == null) {
String message = "Key doesn't exist! Please use add-key if you want to create a new authentication key.";
mappingSystem.cleanCaches();
dsbe.removeAllDatastoreContent();
}
+
+ private static Eid convertToBinaryIfNecessary(Eid eid) {
+ if (LispAddressUtil.addressNeedsConversionToBinary(eid.getAddress())) {
+ return LispAddressUtil.convertToBinary(eid);
+ }
+ return eid;
+ }
+
+ private static MappingRecord convertFromBinaryIfNecessary(MappingRecord originalRecord) {
+ List<LocatorRecord> originalLocators = originalRecord.getLocatorRecord();
+
+ List<LocatorRecord> convertedLocators = null;
+ if (originalLocators != null) {
+ // If convertedLocators is non-null, while originalLocators is also non-null, conversion has been made
+ convertedLocators = convertFromBinaryIfNecessary(originalLocators);
+ }
+
+ if (LispAddressUtil.addressNeedsConversionFromBinary(originalRecord.getEid().getAddress()) ||
+ (originalLocators != null && convertedLocators != null)) {
+ MappingRecordBuilder mrb = new MappingRecordBuilder(originalRecord);
+ mrb.setEid(LispAddressUtil.convertFromBinary(originalRecord.getEid()));
+ if (convertedLocators != null) {
+ mrb.setLocatorRecord(convertedLocators);
+ }
+ return mrb.build();
+ }
+ return originalRecord;
+ }
+
+ private static List<LocatorRecord> convertFromBinaryIfNecessary(List<LocatorRecord> originalLocators) {
+ List<LocatorRecord> convertedLocators = null;
+ for (LocatorRecord record : originalLocators) {
+ if (LispAddressUtil.addressNeedsConversionFromBinary(record.getRloc().getAddress())) {
+ LocatorRecordBuilder lrb = new LocatorRecordBuilder(record);
+ lrb.setRloc(LispAddressUtil.convertFromBinary(record.getRloc()));
+ if (convertedLocators == null) {
+ convertedLocators = new ArrayList<LocatorRecord>();
+ }
+ convertedLocators.add(lrb.build());
+ }
+ }
+ if (convertedLocators != null) {
+ return convertedLocators;
+ }
+ return originalLocators;
+ }
}
return mapping;
}
- private static List<LocatorRecord> convertToBinaryIfNecessary(List<LocatorRecord> locators) {
+ private static List<LocatorRecord> convertToBinaryIfNecessary(List<LocatorRecord> originalLocators) {
List<LocatorRecord> convertedLocators = null;
- for (LocatorRecord record : locators) {
+ for (LocatorRecord record : originalLocators) {
if (LispAddressUtil.addressNeedsConversionToBinary(record.getRloc().getAddress())) {
LocatorRecordBuilder lrb = new LocatorRecordBuilder(record);
lrb.setRloc(LispAddressUtil.convertToBinary(record.getRloc()));
convertedLocators.add(lrb.build());
}
}
- return convertedLocators;
+ if (convertedLocators != null) {
+ return convertedLocators;
+ }
+ return originalLocators;
}
}
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.opendaylight.lispflowmapping.implementation.util.RPCInputConvertorUtil;
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
// input
final GetMappingInput getMappingInput = new GetMappingInputBuilder().setEid(IPV4_EID).build();
final MappingRecord mappingRecord = getDefaultMappingRecordBuilder().build();
+ final MappingRecord nonBinaryMappingRecord = getDefaultMappingRecordBuilder()
+ .setEid(LispAddressUtil.toEid(new Ipv4Address(IPV4_STRING), null)).build();
Mockito.when(mappingSystem.getMapping(getMappingInput.getEid())).thenReturn(mappingRecord);
final RpcResult<GetMappingOutput> rpc = RpcResultBuilder
- .success(new GetMappingOutputBuilder().setMappingRecord(mappingRecord)).build();
+ .success(new GetMappingOutputBuilder().setMappingRecord(nonBinaryMappingRecord)).build();
//result
final Future<RpcResult<GetMappingOutput>> result = (mappingService.getMapping(getMappingInput));
return pb.build();
}
+ private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
+ .lisp.address.address.Ipv4Prefix convertFromBinary(Ipv4PrefixBinary prefix) {
+ return new Ipv4PrefixBuilder().setIpv4Prefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(
+ prefix.getIpv4AddressBinary().getValue(),
+ prefix.getIpv4MaskLength())).build();
+ }
+
private static Ipv6PrefixBinary convertToBinary(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
.lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix prefix) {
Ipv6PrefixBinaryBuilder pb = new Ipv6PrefixBinaryBuilder();
return pb.build();
}
+ private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
+ .lisp.address.address.Ipv6Prefix convertFromBinary(Ipv6PrefixBinary prefix) {
+ return new Ipv6PrefixBuilder().setIpv6Prefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(
+ prefix.getIpv6AddressBinary().getValue(),
+ prefix.getIpv6MaskLength())).build();
+}
+
private static Ipv4Binary convertToBinary(Ipv4 address) {
byte[] addr = InetAddresses.forString(address.getIpv4().getValue()).getAddress();
return new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(addr)).build();
}
+ private static Ipv4 convertFromBinary(Ipv4Binary address) {
+ return new Ipv4Builder().setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address.getIpv4Binary().getValue()))
+ .build();
+ }
+
private static Ipv6Binary convertToBinary(Ipv6 address) {
byte[] addr = InetAddresses.forString(address.getIpv6().getValue()).getAddress();
return new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(addr)).build();
}
+ private static Ipv6 convertFromBinary(Ipv6Binary address) {
+ return new Ipv6Builder().setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address.getIpv6Binary().getValue()))
+ .build();
+ }
+
private static Pair<Class<? extends LispAddressFamily>, Address> convertToBinary(Address addr) {
Address convAddr = null;
Class<? extends LispAddressFamily> convType = null;
return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
}
+ private static Pair<Class<? extends LispAddressFamily>, Address> convertFromBinary(Address addr) {
+ Address convAddr = null;
+ Class<? extends LispAddressFamily> convType = null;
+ if (addr instanceof Ipv4PrefixBinary) {
+ convAddr = convertFromBinary((Ipv4PrefixBinary) addr);
+ convType = Ipv4PrefixAfi.class;
+ } else if (addr instanceof Ipv6PrefixBinary) {
+ convAddr = convertFromBinary((Ipv6PrefixBinary) addr);
+ convType = Ipv6PrefixAfi.class;
+ } else if (addr instanceof Ipv4Binary) {
+ convAddr = convertFromBinary((Ipv4Binary) addr);
+ convType = Ipv4Afi.class;
+ } else if (addr instanceof Ipv6Binary) {
+ convAddr = convertFromBinary((Ipv6Binary) addr);
+ convType = Ipv6Afi.class;
+ }
+ return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
+ }
+
public static Eid convertToBinary(Eid eid) {
Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(eid.getAddress());
if (converted.getRight() == null) {
return eb.build();
}
+ public static Eid convertFromBinary(Eid eid) {
+ Pair<Class<? extends LispAddressFamily>, Address> converted = convertFromBinary(eid.getAddress());
+ if (converted.getRight() == null) {
+ return eid;
+ }
+ EidBuilder eb = new EidBuilder(eid);
+ eb.setAddressType(converted.getLeft());
+ eb.setAddress(converted.getRight());
+ return eb.build();
+ }
+
public static Rloc convertToBinary(Rloc rloc) {
Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(rloc.getAddress());
if (converted.getRight() == null) {
return rb.build();
}
+ public static Rloc convertFromBinary(Rloc rloc) {
+ Pair<Class<? extends LispAddressFamily>, Address> converted = convertFromBinary(rloc.getAddress());
+ if (converted.getRight() == null) {
+ return rloc;
+ }
+ RlocBuilder rb = new RlocBuilder(rloc);
+ rb.setAddressType(converted.getLeft());
+ rb.setAddress(converted.getRight());
+ return rb.build();
+ }
+
public static boolean addressNeedsConversionToBinary(Address address) {
if (address instanceof Ipv4 || address instanceof Ipv6 ||
address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
return false;
}
+ public static boolean addressNeedsConversionFromBinary(Address address) {
+ if (address instanceof Ipv4Binary || address instanceof Ipv6Binary ||
+ address instanceof Ipv4PrefixBinary || address instanceof Ipv6PrefixBinary) {
+ return true;
+ }
+ return false;
+ }
+
public static int compareIpAddressByteArrays(byte[] a, byte[] b) {
int i;
if (a.length < b.length) {