mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-18 10:51:04 +02:00
[ONOS-6537] Refactor LispMappingDatabase to split out implementation
Change-Id: I876b25b5911395900f5805a87b489efbe0acd0b4
This commit is contained in:
parent
a5c54538fd
commit
2dbd8a2ba1
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016-present Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed 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 org.onosproject.lisp.ctl.impl;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import org.onosproject.lisp.ctl.impl.map.ExpireMap;
|
||||||
|
import org.onosproject.lisp.ctl.impl.map.ExpireHashMap;
|
||||||
|
import org.onosproject.lisp.msg.protocols.DefaultLispProxyMapRecord.DefaultMapWithProxyBuilder;
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispEidRecord;
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispMapRecord;
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispProxyMapRecord;
|
||||||
|
import org.onosproject.lisp.msg.types.LispAfiAddress;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
import static org.onosproject.lisp.ctl.impl.util.LispMapUtil.isInRange;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An expire map based LISP mapping database.
|
||||||
|
* A singleton class that stores EID-RLOC mapping information.
|
||||||
|
*/
|
||||||
|
public final class LispExpireMapDatabase implements LispMappingDatabase {
|
||||||
|
|
||||||
|
private static final long MINUTE_TO_MS_UNIT = 60 * 1000;
|
||||||
|
|
||||||
|
private static final Logger log = getLogger(LispExpireMapDatabase.class);
|
||||||
|
|
||||||
|
private final ExpireMap<LispEidRecord, LispProxyMapRecord> map = new ExpireHashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevents object instantiation from external.
|
||||||
|
*/
|
||||||
|
private LispExpireMapDatabase() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains a singleton instance.
|
||||||
|
*
|
||||||
|
* @return singleton instance
|
||||||
|
*/
|
||||||
|
public static LispExpireMapDatabase getInstance() {
|
||||||
|
return SingletonHelper.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void putMapRecord(LispEidRecord eid, LispMapRecord rloc,
|
||||||
|
boolean proxyMapReply) {
|
||||||
|
LispProxyMapRecord mapWithProxy = new DefaultMapWithProxyBuilder()
|
||||||
|
.withMapRecord(rloc)
|
||||||
|
.withIsProxyMapReply(proxyMapReply)
|
||||||
|
.build();
|
||||||
|
map.put(eid, mapWithProxy, rloc.getRecordTtl() * MINUTE_TO_MS_UNIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the results whether a given EidRecord is contained in the map.
|
||||||
|
*
|
||||||
|
* @param eid endpoint identifier
|
||||||
|
* @return the results whether a given EidRecord is contained in the map
|
||||||
|
*/
|
||||||
|
public boolean hasEidRecord(LispEidRecord eid) {
|
||||||
|
return map.containsKey(eid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeMapRecordByEid(LispEidRecord eid) {
|
||||||
|
map.remove(eid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeAllMapRecords() {
|
||||||
|
map.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains all of the EID-RLOC mapping records.
|
||||||
|
*
|
||||||
|
* @return all of the EID-RLOC mapping records
|
||||||
|
*/
|
||||||
|
public List<LispMapRecord> getAllMapRecords() {
|
||||||
|
|
||||||
|
List<LispMapRecord> mapRecords = Lists.newArrayList();
|
||||||
|
|
||||||
|
map.values().forEach(value -> mapRecords.add(value.getMapRecord()));
|
||||||
|
|
||||||
|
return mapRecords;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispMapRecord getMapRecordByEidRecord(LispEidRecord eid,
|
||||||
|
boolean proxyMapReply) {
|
||||||
|
Optional<LispEidRecord> filteredEidRecord = map.keySet().parallelStream()
|
||||||
|
.filter(k -> isInRange(k, eid)).findAny();
|
||||||
|
if (filteredEidRecord.isPresent()) {
|
||||||
|
LispProxyMapRecord record = map.get(filteredEidRecord.get());
|
||||||
|
if (record != null && record.isProxyMapReply() == proxyMapReply) {
|
||||||
|
return record.getMapRecord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LispMapRecord> getMapRecordByEidRecords(List<LispEidRecord> eids,
|
||||||
|
boolean proxyMapReply) {
|
||||||
|
List<LispMapRecord> mapRecords = Lists.newArrayList();
|
||||||
|
eids.forEach(eidRecord -> {
|
||||||
|
LispMapRecord mapRecord =
|
||||||
|
getMapRecordByEidRecord(eidRecord, proxyMapReply);
|
||||||
|
if (mapRecord != null) {
|
||||||
|
mapRecords.add(mapRecord);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return ImmutableList.copyOf(mapRecords);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains an EID-RLOC mapping record with given EID address.
|
||||||
|
*
|
||||||
|
* @param address endpoint identifier address
|
||||||
|
* @return an EID-RLOC mapping record
|
||||||
|
*/
|
||||||
|
public LispMapRecord getMapRecordByEidAddress(LispAfiAddress address) {
|
||||||
|
Optional<LispEidRecord> eidRecord =
|
||||||
|
map.keySet().stream().filter(k ->
|
||||||
|
k.getPrefix().equals(address)).findFirst();
|
||||||
|
return eidRecord.map(lispEidRecord ->
|
||||||
|
map.get(lispEidRecord).getMapRecord()).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevents object instantiation from external.
|
||||||
|
*/
|
||||||
|
private static final class SingletonHelper {
|
||||||
|
private static final String ILLEGAL_ACCESS_MSG = "Should not instantiate this class.";
|
||||||
|
private static final LispExpireMapDatabase INSTANCE = new LispExpireMapDatabase();
|
||||||
|
|
||||||
|
private SingletonHelper() {
|
||||||
|
throw new IllegalAccessError(ILLEGAL_ACCESS_MSG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -58,7 +58,7 @@ public final class LispMapResolver {
|
|||||||
"No ETR RLOC is found, cannot relay to ETR.";
|
"No ETR RLOC is found, cannot relay to ETR.";
|
||||||
private static final String NO_MAP_INFO_MSG = "Map information is not found.";
|
private static final String NO_MAP_INFO_MSG = "Map information is not found.";
|
||||||
|
|
||||||
private LispMappingDatabase mapDb = LispMappingDatabase.getInstance();
|
private LispMappingDatabase mapDb = LispExpireMapDatabase.getInstance();
|
||||||
|
|
||||||
// non-instantiable (except for our Singleton)
|
// non-instantiable (except for our Singleton)
|
||||||
private LispMapResolver() {
|
private LispMapResolver() {
|
||||||
|
@ -75,7 +75,7 @@ public final class LispMapServer {
|
|||||||
|
|
||||||
private boolean enableSmr = false;
|
private boolean enableSmr = false;
|
||||||
|
|
||||||
private LispMappingDatabase mapDb = LispMappingDatabase.getInstance();
|
private LispMappingDatabase mapDb = LispExpireMapDatabase.getInstance();
|
||||||
private LispAuthenticationConfig authConfig = LispAuthenticationConfig.getInstance();
|
private LispAuthenticationConfig authConfig = LispAuthenticationConfig.getInstance();
|
||||||
|
|
||||||
// non-instantiable (except for our Singleton)
|
// non-instantiable (except for our Singleton)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2016-present Open Networking Laboratory
|
* Copyright 2017-present Open Networking Laboratory
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -15,48 +15,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.onosproject.lisp.ctl.impl;
|
package org.onosproject.lisp.ctl.impl;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import org.onosproject.lisp.ctl.impl.map.ExpireMap;
|
|
||||||
import org.onosproject.lisp.ctl.impl.map.ExpireHashMap;
|
|
||||||
import org.onosproject.lisp.msg.protocols.DefaultLispProxyMapRecord.DefaultMapWithProxyBuilder;
|
|
||||||
import org.onosproject.lisp.msg.protocols.LispEidRecord;
|
import org.onosproject.lisp.msg.protocols.LispEidRecord;
|
||||||
import org.onosproject.lisp.msg.protocols.LispMapRecord;
|
import org.onosproject.lisp.msg.protocols.LispMapRecord;
|
||||||
import org.onosproject.lisp.msg.protocols.LispProxyMapRecord;
|
|
||||||
import org.onosproject.lisp.msg.types.LispAfiAddress;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import static org.slf4j.LoggerFactory.getLogger;
|
|
||||||
import static org.onosproject.lisp.ctl.impl.util.LispMapUtil.isInRange;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A singleton class that stores EID-RLOC mapping information.
|
* A LISP database that stores EID-RLOC mapping information.
|
||||||
*/
|
*/
|
||||||
public final class LispMappingDatabase {
|
public interface LispMappingDatabase {
|
||||||
|
|
||||||
private static final long MINUTE_TO_MS_UNIT = 60 * 1000;
|
|
||||||
|
|
||||||
private static final Logger log = getLogger(LispMappingDatabase.class);
|
|
||||||
|
|
||||||
private final ExpireMap<LispEidRecord, LispProxyMapRecord> map = new ExpireHashMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prevents object instantiation from external.
|
|
||||||
*/
|
|
||||||
private LispMappingDatabase() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtains a singleton instance.
|
|
||||||
*
|
|
||||||
* @return singleton instance
|
|
||||||
*/
|
|
||||||
public static LispMappingDatabase getInstance() {
|
|
||||||
return SingletonHelper.INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inserts a new EID-RLOC mapping record.
|
* Inserts a new EID-RLOC mapping record.
|
||||||
@ -65,47 +32,19 @@ public final class LispMappingDatabase {
|
|||||||
* @param rloc route locator record
|
* @param rloc route locator record
|
||||||
* @param proxyMapReply proxy map reply flag
|
* @param proxyMapReply proxy map reply flag
|
||||||
*/
|
*/
|
||||||
public void putMapRecord(LispEidRecord eid, LispMapRecord rloc,
|
void putMapRecord(LispEidRecord eid, LispMapRecord rloc, boolean proxyMapReply);
|
||||||
boolean proxyMapReply) {
|
|
||||||
LispProxyMapRecord mapWithProxy = new DefaultMapWithProxyBuilder()
|
|
||||||
.withMapRecord(rloc)
|
|
||||||
.withIsProxyMapReply(proxyMapReply)
|
|
||||||
.build();
|
|
||||||
map.put(eid, mapWithProxy, rloc.getRecordTtl() * MINUTE_TO_MS_UNIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the results whether a given EidRecord is contained in the map.
|
|
||||||
*
|
|
||||||
* @param eid endpoint identifier
|
|
||||||
* @return the results whether a given EidRecord is contained in the map
|
|
||||||
*/
|
|
||||||
public boolean hasEidRecord(LispEidRecord eid) {
|
|
||||||
return map.containsKey(eid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes an EID-RLOC mapping record with given endpoint identifier.
|
* Removes an EID-RLOC mapping record with given endpoint identifier.
|
||||||
*
|
*
|
||||||
* @param eid endpoint identifier
|
* @param eid endpoint identifier
|
||||||
*/
|
*/
|
||||||
public void removeMapRecordByEid(LispEidRecord eid) {
|
void removeMapRecordByEid(LispEidRecord eid);
|
||||||
map.remove(eid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains all of the EID-RLOC mapping records.
|
* Removes all EID-RLOC mapping records.
|
||||||
*
|
|
||||||
* @return all of the EID-RLOC mapping records
|
|
||||||
*/
|
*/
|
||||||
public List<LispMapRecord> getAllMapRecords() {
|
void removeAllMapRecords();
|
||||||
|
|
||||||
List<LispMapRecord> mapRecords = Lists.newArrayList();
|
|
||||||
|
|
||||||
map.values().forEach(value -> mapRecords.add(value.getMapRecord()));
|
|
||||||
|
|
||||||
return mapRecords;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains an EID-RLOC mapping record in accordance with the proxy map reply
|
* Obtains an EID-RLOC mapping record in accordance with the proxy map reply
|
||||||
@ -115,19 +54,7 @@ public final class LispMappingDatabase {
|
|||||||
* @param proxyMapReply proxy map reply flag
|
* @param proxyMapReply proxy map reply flag
|
||||||
* @return an EID-RLOC mapping record
|
* @return an EID-RLOC mapping record
|
||||||
*/
|
*/
|
||||||
public LispMapRecord getMapRecordByEidRecord(LispEidRecord eid,
|
LispMapRecord getMapRecordByEidRecord(LispEidRecord eid, boolean proxyMapReply);
|
||||||
boolean proxyMapReply) {
|
|
||||||
Optional<LispEidRecord> filteredEidRecord = map.keySet().parallelStream()
|
|
||||||
.filter(k -> isInRange(k, eid)).findAny();
|
|
||||||
if (filteredEidRecord.isPresent()) {
|
|
||||||
LispProxyMapRecord record = map.get(filteredEidRecord.get());
|
|
||||||
if (record != null && record.isProxyMapReply() == proxyMapReply) {
|
|
||||||
return record.getMapRecord();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains a collection of EID-RLOC mapping record in accordance with the
|
* Obtains a collection of EID-RLOC mapping record in accordance with the
|
||||||
@ -137,42 +64,9 @@ public final class LispMappingDatabase {
|
|||||||
* @param proxyMapReply proxy map reply flag
|
* @param proxyMapReply proxy map reply flag
|
||||||
* @return a collection of EID-RLOC mapping records
|
* @return a collection of EID-RLOC mapping records
|
||||||
*/
|
*/
|
||||||
public List<LispMapRecord> getMapRecordByEidRecords(List<LispEidRecord> eids,
|
List<LispMapRecord> getMapRecordByEidRecords(List<LispEidRecord> eids,
|
||||||
boolean proxyMapReply) {
|
boolean proxyMapReply);
|
||||||
List<LispMapRecord> mapRecords = Lists.newArrayList();
|
|
||||||
eids.forEach(eidRecord -> {
|
|
||||||
LispMapRecord mapRecord =
|
|
||||||
getMapRecordByEidRecord(eidRecord, proxyMapReply);
|
|
||||||
if (mapRecord != null) {
|
|
||||||
mapRecords.add(mapRecord);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return ImmutableList.copyOf(mapRecords);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtains an EID-RLOC mapping record with given EID address.
|
|
||||||
*
|
|
||||||
* @param address endpoint identifier address
|
|
||||||
* @return an EID-RLOC mapping record
|
|
||||||
*/
|
|
||||||
public LispMapRecord getMapRecordByEidAddress(LispAfiAddress address) {
|
|
||||||
Optional<LispEidRecord> eidRecord =
|
|
||||||
map.keySet().stream().filter(k ->
|
|
||||||
k.getPrefix().equals(address)).findFirst();
|
|
||||||
return eidRecord.map(lispEidRecord ->
|
|
||||||
map.get(lispEidRecord).getMapRecord()).orElse(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prevents object instantiation from external.
|
|
||||||
*/
|
|
||||||
private static final class SingletonHelper {
|
|
||||||
private static final String ILLEGAL_ACCESS_MSG = "Should not instantiate this class.";
|
|
||||||
private static final LispMappingDatabase INSTANCE = new LispMappingDatabase();
|
|
||||||
|
|
||||||
private SingletonHelper() {
|
|
||||||
throw new IllegalAccessError(ILLEGAL_ACCESS_MSG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017-present Open Networking Laboratory
|
||||||
|
*
|
||||||
|
* Licensed 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 org.onosproject.lisp.ctl.impl;
|
||||||
|
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispEidRecord;
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispMapRecord;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A radix tree based LISP mapping database.
|
||||||
|
*/
|
||||||
|
public class LispRadixTreeDatabase implements LispMappingDatabase {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void putMapRecord(LispEidRecord eid, LispMapRecord rloc,
|
||||||
|
boolean proxyMapReply) {
|
||||||
|
//TODO: requires implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeMapRecordByEid(LispEidRecord eid) {
|
||||||
|
//TODO: requires implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeAllMapRecords() {
|
||||||
|
//TODO: requires implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispMapRecord getMapRecordByEidRecord(LispEidRecord eid,
|
||||||
|
boolean proxyMapReply) {
|
||||||
|
//TODO: requires implementation
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LispMapRecord> getMapRecordByEidRecords(List<LispEidRecord> eids,
|
||||||
|
boolean proxyMapReply) {
|
||||||
|
//TODO: requires implementation
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -57,7 +57,7 @@ public class LispMappingDatabaseTest {
|
|||||||
private static final String EID_IP_PREFIX_2_32 = "10.1.2.1";
|
private static final String EID_IP_PREFIX_2_32 = "10.1.2.1";
|
||||||
private static final String EID_IP_PREFIX_2_24 = "10.1.2.0";
|
private static final String EID_IP_PREFIX_2_24 = "10.1.2.0";
|
||||||
|
|
||||||
final LispMappingDatabase mapDb = LispMappingDatabase.getInstance();
|
final LispMappingDatabase mapDb = LispExpireMapDatabase.getInstance();
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user