blob: 91923ab53b281e09a91ad83d74f80c27acfef053 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Foundation
*
* 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.pce.pcestore;
import com.google.common.collect.ImmutableSet;
import java.util.Arrays;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
import org.onlab.util.KryoNamespace;
import org.onosproject.incubator.net.tunnel.TunnelId;
import org.onosproject.pce.pceservice.ExplicitPathInfo;
import org.onosproject.pce.pceservice.LspType;
import org.onosproject.pce.pceservice.constraint.CapabilityConstraint;
import org.onosproject.pce.pceservice.constraint.CostConstraint;
import org.onosproject.pce.pceservice.constraint.PceBandwidthConstraint;
import org.onosproject.pce.pceservice.constraint.SharedBandwidthConstraint;
import org.onosproject.pce.pcestore.api.PceStore;
import org.onosproject.store.serializers.KryoNamespaces;
import org.onosproject.store.service.ConsistentMap;
import org.onosproject.store.service.DistributedSet;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.StorageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Manages the pool of available labels to devices, links and tunnels.
*/
@Component(immediate = true)
@Service
public class DistributedPceStore implements PceStore {
private static final String PATH_INFO_NULL = "Path Info cannot be null";
private static final String PCECC_TUNNEL_INFO_NULL = "PCECC Tunnel Info cannot be null";
private static final String TUNNEL_ID_NULL = "Tunnel Id cannot be null";
private final Logger log = LoggerFactory.getLogger(getClass());
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected StorageService storageService;
//Mapping tunnel name with Disjoint paths
private ConsistentMap<String, List<TunnelId>> tunnelNameDisjoinTunnelIdInfo;
// List of Failed path info
private DistributedSet<PcePathInfo> failedPathSet;
// Maintains tunnel name mapped to explicit path info
private ConsistentMap<String, List<ExplicitPathInfo>> tunnelNameExplicitPathInfoMap;
private static final Serializer SERIALIZER = Serializer
.using(new KryoNamespace.Builder().register(KryoNamespaces.API)
.register(PcePathInfo.class)
.register(ExplicitPathInfo.class)
.register(ExplicitPathInfo.Type.class)
.register(CostConstraint.class)
.register(CostConstraint.Type.class)
.register(PceBandwidthConstraint.class)
.register(SharedBandwidthConstraint.class)
.register(CapabilityConstraint.class)
.register(CapabilityConstraint.CapabilityType.class)
.register(LspType.class)
.build());
@Activate
protected void activate() {
failedPathSet = storageService.<PcePathInfo>setBuilder()
.withName("failed-path-info")
.withSerializer(SERIALIZER)
.build()
.asDistributedSet();
tunnelNameExplicitPathInfoMap = storageService.<String, List<ExplicitPathInfo>>consistentMapBuilder()
.withName("onos-pce-explicitpathinfo")
.withSerializer(Serializer.using(
new KryoNamespace.Builder()
.register(KryoNamespaces.API)
.register(ExplicitPathInfo.class)
.register(ExplicitPathInfo.Type.class)
.build()))
.build();
tunnelNameDisjoinTunnelIdInfo = storageService.<String, List<TunnelId>>consistentMapBuilder()
.withName("onos-pce-disjointTunnelIds")
.withSerializer(Serializer.using(
new KryoNamespace.Builder()
.register(KryoNamespaces.API)
.register(TunnelId.class)
.build()))
.build();
log.info("Started");
}
@Deactivate
protected void deactivate() {
log.info("Stopped");
}
@Override
public boolean existsFailedPathInfo(PcePathInfo failedPathInfo) {
checkNotNull(failedPathInfo, PATH_INFO_NULL);
return failedPathSet.contains(failedPathInfo);
}
@Override
public int getFailedPathInfoCount() {
return failedPathSet.size();
}
@Override
public Iterable<PcePathInfo> getFailedPathInfos() {
return ImmutableSet.copyOf(failedPathSet);
}
@Override
public void addFailedPathInfo(PcePathInfo failedPathInfo) {
checkNotNull(failedPathInfo, PATH_INFO_NULL);
failedPathSet.add(failedPathInfo);
}
@Override
public boolean removeFailedPathInfo(PcePathInfo failedPathInfo) {
checkNotNull(failedPathInfo, PATH_INFO_NULL);
if (!failedPathSet.remove(failedPathInfo)) {
log.error("Failed path info {} deletion has failed.", failedPathInfo.toString());
return false;
}
return true;
}
@Override
public boolean tunnelNameExplicitPathInfoMap(String tunnelName, List<ExplicitPathInfo> explicitPathInfo) {
checkNotNull(tunnelName);
checkNotNull(explicitPathInfo);
return tunnelNameExplicitPathInfoMap.put(tunnelName, explicitPathInfo) != null ? true : false;
}
@Override
public List<ExplicitPathInfo> getTunnelNameExplicitPathInfoMap(String tunnelName) {
checkNotNull(tunnelName);
if (tunnelNameExplicitPathInfoMap.get(tunnelName) != null) {
return tunnelNameExplicitPathInfoMap.get(tunnelName).value();
}
return null;
}
/* @Override
public DisjointPath getDisjointPaths(String tunnelName) {
if (tunnelNameDisjointPathInfo.get(tunnelName) != null) {
return tunnelNameDisjointPathInfo.get(tunnelName).value();
}
return null;
}
@Override
public boolean addDisjointPathInfo(String tunnelName, DisjointPath path) {
checkNotNull(tunnelName);
checkNotNull(path);
return tunnelNameDisjointPathInfo.put(tunnelName, path) != null ? true : false;
}*/
@Override
public boolean addLoadBalancingTunnelIdsInfo(String tunnelName, TunnelId... tunnelIds) {
checkNotNull(tunnelName);
checkNotNull(tunnelIds);
return tunnelNameDisjoinTunnelIdInfo.put(tunnelName, Arrays.asList(tunnelIds)) != null ? true : false;
}
@Override
public List<TunnelId> getLoadBalancingTunnelIds(String tunnelName) {
if (tunnelNameDisjoinTunnelIdInfo.get(tunnelName) != null) {
return tunnelNameDisjoinTunnelIdInfo.get(tunnelName).value();
}
return null;
}
@Override
public boolean removeLoadBalancingTunnelIdsInfo(String tunnelName) {
if (tunnelNameDisjoinTunnelIdInfo.remove(tunnelName) == null) {
log.error("Failed to remove entry {} for this tunnelName in DisjointTunnelIdsInfoMap" + tunnelName);
return false;
}
return true;
}
/* @Override
public boolean removeDisjointPathInfo(String tunnelName) {
if (tunnelNameDisjointPathInfo.remove(tunnelName) == null) {
log.error("Failed to remove entry {} for this tunnelName in DisjointPathInfoMap", tunnelName);
return false;
}
return true;
}*/
}