blob: 9dab96462dc36d5172f221784596da1240250cfb [file] [log] [blame]
/*
* Copyright 2015-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.xran.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Lists;
import org.apache.felix.scr.annotations.*;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.store.AbstractStore;
import org.onosproject.xran.XranStore;
import org.onosproject.xran.codecs.api.ECGI;
import org.onosproject.xran.codecs.api.EUTRANCellIdentifier;
import org.onosproject.xran.codecs.api.MMEUES1APID;
import org.onosproject.xran.controller.XranController;
import org.onosproject.xran.entities.RnibCell;
import org.onosproject.xran.entities.RnibLink;
import org.onosproject.xran.entities.RnibSlice;
import org.onosproject.xran.entities.RnibUe;
import org.onosproject.xran.identifiers.LinkId;
import org.slf4j.Logger;
import javax.xml.bind.DatatypeConverter;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Created by dimitris on 7/22/17.
*/
@Component(immediate = true)
@Service
public class DefaultXranStore extends AbstractStore implements XranStore {
private static final String XRAN_APP_ID = "org.onosproject.xran";
private final Logger log = getLogger(getClass());
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService;
private ConcurrentMap<LinkId, RnibLink> linkMap = new ConcurrentHashMap<>();
private ConcurrentMap<ECGI, RnibCell> cellMap = new ConcurrentHashMap<>();
private ConcurrentMap<MMEUES1APID, RnibUe> ueMap = new ConcurrentHashMap<>();
private ConcurrentMap<Object, RnibSlice> sliceMap = new ConcurrentHashMap<>();
private XranController controller;
@Activate
public void activate() {
ApplicationId appId = coreService.getAppId(XRAN_APP_ID);
log.info("XRAN Default Store Started");
}
@Deactivate
public void deactive() {
log.info("XRAN Default Store Stopped");
}
@Override
public List<RnibLink> getLinks() {
List<RnibLink> list = Lists.newArrayList();
list.addAll(linkMap.values());
return list;
}
@Override
public List<RnibLink> getLinksByECGI(ECGI ecgi) {
List<RnibLink> list = Lists.newArrayList();
list.addAll(
linkMap.keySet()
.stream()
.filter(k -> k.getEcgi().equals(ecgi))
.map(v -> linkMap.get(v))
.collect(Collectors.toList()));
return list;
}
@Override
public List<RnibLink> getLinksByCellId(String eciHex) {
List<RnibLink> list = Lists.newArrayList();
EUTRANCellIdentifier eci = hexToECI(eciHex);
list.addAll(
linkMap.keySet()
.stream()
.filter(k -> k.getEcgi().getEUTRANcellIdentifier().equals(eci))
.map(v -> linkMap.get(v))
.collect(Collectors.toList()));
return list;
}
@Override
public List<RnibLink> getLinksByUeId(long euId) {
List<RnibLink> list = Lists.newArrayList();
MMEUES1APID mme = new MMEUES1APID(euId);
list.addAll(
linkMap.keySet()
.stream()
.filter(k -> k.getMmeues1apid().equals(mme))
.map(v -> linkMap.get(v))
.collect(Collectors.toList()));
return list;
}
@Override
public RnibLink getLinkBetweenCellIdUeId(String eciHex, long euId) {
EUTRANCellIdentifier eci = hexToECI(eciHex);
MMEUES1APID mme = new MMEUES1APID(euId);
Optional<LinkId> first = linkMap.keySet()
.stream()
.filter(linkId -> linkId.getEcgi().getEUTRANcellIdentifier().equals(eci))
.filter(linkId -> linkId.getMmeues1apid().equals(mme))
.findFirst();
return first.map(linkId -> linkMap.get(linkId)).orElse(null);
}
@Override
public void storeLink(RnibLink link) {
synchronized (this) {
if (link.getLinkId() != null) {
// if we add a primary link then change the primary to non serving
if (link.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
RnibUe ue = link.getLinkId().getUe();
getLinksByUeId(ue.getMmeS1apId().longValue())
.forEach(l -> {
if (l.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
l.setType(RnibLink.Type.NON_SERVING);
}
});
}
linkMap.put(link.getLinkId(), link);
}
}
}
@Override
public boolean removeLink(LinkId link) {
return linkMap.remove(link) != null;
}
@Override
public RnibLink getLink(ECGI ecgi, MMEUES1APID mme) {
LinkId linkId = LinkId.valueOf(ecgi, mme);
return linkMap.get(linkId);
}
@Override
public void modifyLinkRrmConf(RnibLink link, JsonNode rrmConf) {
link.modifyRrmParameters(rrmConf);
}
@Override
public List<Object> getNodes() {
List<Object> list = Lists.newArrayList();
list.add(cellMap.values());
list.add(ueMap.values());
return list;
}
@Override
public List<Object> getCellNodes() {
List<Object> list = Lists.newArrayList();
list.addAll(cellMap.values());
return list;
}
@Override
public List<Object> getUeNodes() {
List<Object> list = Lists.newArrayList();
list.addAll(ueMap.values());
return list;
}
@Override
public Object getByNodeId(String nodeId) {
try {
return getCell(nodeId);
} catch (Exception e) {
}
return getUe(Long.parseLong(nodeId));
}
@Override
public void storeCell(RnibCell cell) {
if (cell.getEcgi() != null) {
cellMap.putIfAbsent(cell.getEcgi(), cell);
}
}
@Override
public boolean removeCell(ECGI ecgi) {
return cellMap.remove(ecgi) != null;
}
@Override
public RnibCell getCell(String hexeci) {
EUTRANCellIdentifier eci = hexToECI(hexeci);
Optional<ECGI> first = cellMap.keySet().stream().filter(ecgi -> ecgi.getEUTRANcellIdentifier().equals(eci)).findFirst();
return first.map(ecgi -> cellMap.get(ecgi)).orElse(null);
}
@Override
public RnibCell getCell(ECGI ecgi) {
return cellMap.get(ecgi);
}
@Override
public void modifyCellRrmConf(RnibCell cell, JsonNode rrmConf) throws Exception {
List<RnibLink> linkList = getLinksByECGI(cell.getEcgi());
List<RnibUe> ueList = linkList.stream().map(link -> link.getLinkId().getUe()).collect(Collectors.toList());
cell.modifyRrmConfig(rrmConf, ueList);
}
@Override
public RnibSlice getSlice(long sliceId) {
if (sliceMap.containsKey(sliceId)) {
return sliceMap.get(sliceId);
}
return null;
}
@Override
public boolean createSlice(ObjectNode attributes) {
return false;
}
@Override
public boolean removeCell(long sliceId) {
return sliceMap.remove(sliceId) != null;
}
@Override
public XranController getController() {
return controller;
}
@Override
public void setController(XranController controller) {
this.controller = controller;
}
@Override
public void storeUe(RnibUe ue) {
if (ue.getMmeS1apId() != null) {
ueMap.putIfAbsent(ue.getMmeS1apId(), ue);
}
}
@Override
public boolean removeUe(MMEUES1APID mme) {
return ueMap.remove(mme) != null;
}
@Override
public RnibUe getUe(long euId) {
MMEUES1APID mme = new MMEUES1APID(euId);
return ueMap.get(mme);
}
@Override
public RnibUe getUe(MMEUES1APID mme) {
return ueMap.get(mme);
}
private EUTRANCellIdentifier hexToECI(String eciHex) {
byte[] hexBinary = DatatypeConverter.parseHexBinary(eciHex);
return new EUTRANCellIdentifier(hexBinary, 28);
}
}