[ONOS-4164] PCE Store
Change-Id: I2caa918fae0bf635f98976b11ee8a717aba42aac
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DefaultLspLocalLabelInfo.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DefaultLspLocalLabelInfo.java
new file mode 100644
index 0000000..717044f
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DefaultLspLocalLabelInfo.java
@@ -0,0 +1,218 @@
+/*
+ * 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.pce.pcestore;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.incubator.net.resource.label.LabelResourceId;
+import org.onosproject.pce.pcestore.api.LspLocalLabelInfo;
+
+/**
+ * Local node details including IN and OUT labels as well as IN and OUT port details.
+ */
+public final class DefaultLspLocalLabelInfo implements LspLocalLabelInfo {
+
+ private final DeviceId deviceId;
+
+ private final LabelResourceId inLabelId;
+
+ private final LabelResourceId outLabelId;
+
+ private final PortNumber inPort;
+
+ private final PortNumber outPort;
+
+ /**
+ * Initialization of member variables.
+ *
+ * @param deviceId device id
+ * @param inLabelId in label id of a node
+ * @param outLabelId out label id of a node
+ * @param inPort input port
+ * @param outPort remote port
+ */
+ private DefaultLspLocalLabelInfo(DeviceId deviceId,
+ LabelResourceId inLabelId,
+ LabelResourceId outLabelId,
+ PortNumber inPort,
+ PortNumber outPort) {
+ this.deviceId = deviceId;
+ this.inLabelId = inLabelId;
+ this.outLabelId = outLabelId;
+ this.inPort = inPort;
+ this.outPort = outPort;
+ }
+
+ /**
+ * Initialization of member variables for serialization.
+ */
+ private DefaultLspLocalLabelInfo() {
+ this.deviceId = null;
+ this.inLabelId = null;
+ this.outLabelId = null;
+ this.inPort = null;
+ this.outPort = null;
+ }
+
+ @Override
+ public DeviceId deviceId() {
+ return deviceId;
+ }
+
+ @Override
+ public LabelResourceId inLabelId() {
+ return inLabelId;
+ }
+
+ @Override
+ public LabelResourceId outLabelId() {
+ return outLabelId;
+ }
+
+ @Override
+ public PortNumber inPort() {
+ return inPort;
+ }
+
+ @Override
+ public PortNumber outPort() {
+ return outPort;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(deviceId, inLabelId, outLabelId, inPort, outPort);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof LspLocalLabelInfo) {
+ final DefaultLspLocalLabelInfo other = (DefaultLspLocalLabelInfo) obj;
+ return Objects.equals(this.deviceId, other.deviceId) &&
+ Objects.equals(this.inLabelId, other.inLabelId) &&
+ Objects.equals(this.outLabelId, other.outLabelId) &&
+ Objects.equals(this.inPort, other.inPort) &&
+ Objects.equals(this.outPort, other.outPort);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("DeviceId", deviceId.toString())
+ .add("InLabelId", inLabelId.toString())
+ .add("OutLabelId", outLabelId.toString())
+ .add("InPort", inPort.toString())
+ .add("OutPort", outPort.toString())
+ .toString();
+ }
+
+ /**
+ * Creates and returns a new builder instance that clones an existing object.
+ *
+ * @param deviceLabelInfo device label information
+ * @return new builder
+ */
+ public static Builder builder(LspLocalLabelInfo deviceLabelInfo) {
+ return new Builder(deviceLabelInfo);
+ }
+
+ /**
+ * Creates and returns a new builder instance.
+ *
+ * @return new builder
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * Builder.
+ */
+ public static final class Builder implements LspLocalLabelInfo.Builder {
+
+ private DeviceId deviceId;
+
+ private LabelResourceId inLabelId;
+
+ private LabelResourceId outLabelId;
+
+ private PortNumber inPort;
+
+ private PortNumber outPort;
+
+ /**
+ * Constructs default builder.
+ */
+ private Builder() {
+ }
+
+ /**
+ * Initializes member variables with existing object.
+ */
+ private Builder(LspLocalLabelInfo deviceLabelInfo) {
+ this.deviceId = deviceLabelInfo.deviceId();
+ this.inLabelId = deviceLabelInfo.inLabelId();
+ this.outLabelId = deviceLabelInfo.outLabelId();
+ this.inPort = deviceLabelInfo.inPort();
+ this.outPort = deviceLabelInfo.outPort();
+ }
+
+ @Override
+ public Builder deviceId(DeviceId id) {
+ this.deviceId = id;
+ return this;
+ }
+
+ @Override
+ public Builder inLabelId(LabelResourceId id) {
+ this.inLabelId = id;
+ return this;
+ }
+
+ @Override
+ public Builder outLabelId(LabelResourceId id) {
+ this.outLabelId = id;
+ return this;
+ }
+
+ @Override
+ public Builder inPort(PortNumber port) {
+ this.inPort = port;
+ return this;
+ }
+
+ @Override
+ public Builder outPort(PortNumber port) {
+ this.outPort = port;
+ return this;
+ }
+
+ @Override
+ public LspLocalLabelInfo build() {
+ return new DefaultLspLocalLabelInfo(deviceId, inLabelId, outLabelId, inPort, outPort);
+ }
+ }
+}
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
new file mode 100644
index 0000000..8276f3d
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
@@ -0,0 +1,278 @@
+/*
+ * 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.pce.pcestore;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+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.incubator.net.resource.label.LabelResourceId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
+import org.onosproject.net.resource.ResourceConsumer;
+import org.onosproject.pce.pceservice.TunnelConsumerId;
+import org.onosproject.pce.pcestore.api.LspLocalLabelInfo;
+import org.onosproject.pce.pcestore.api.PceStore;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Manages the pool of available labels to devices, links and tunnels.
+ */
+@Component(immediate = true)
+@Service
+public class DistributedPceStore implements PceStore {
+
+ private static final String DEVICE_ID_NULL = "Device ID cannot be null";
+ private static final String LINK_NULL = "LINK cannot be null";
+ private static final String TUNNEL_ID_NULL = "Tunnel ID cannot be null";
+ private static final String LABEL_RESOURCE_ID_NULL = "Label Resource ID cannot be null";
+ private static final String PCECC_TUNNEL_INFO_NULL = "PCECC Tunnel Info cannot be null";
+ private static final String LSP_LOCAL_LABEL_INFO_NULL = "LSP Local Label info cannot be null";
+ private static final String TUNNEL_CONSUMER_ID_NULL = "Tunnel consumer Id cannot be null";
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected StorageService storageService;
+
+ // Mapping device with global node label
+ private ConsistentMap<DeviceId, LabelResourceId> globalNodeLabelMap;
+
+ // Mapping link with adjacency label
+ private ConsistentMap<Link, LabelResourceId> adjLabelMap;
+
+ // Mapping tunnel with device local info with tunnel consumer id
+ private ConsistentMap<TunnelId, PceccTunnelInfo> tunnelInfoMap;
+
+ @Activate
+ protected void activate() {
+ globalNodeLabelMap = storageService.<DeviceId, LabelResourceId>consistentMapBuilder()
+ .withName("onos-pce-globalnodelabelmap")
+ .withSerializer(Serializer.using(
+ new KryoNamespace.Builder()
+ .register(KryoNamespaces.API)
+ .register(LabelResourceId.class)
+ .build()))
+ .build();
+
+ adjLabelMap = storageService.<Link, LabelResourceId>consistentMapBuilder()
+ .withName("onos-pce-adjlabelmap")
+ .withSerializer(Serializer.using(
+ new KryoNamespace.Builder()
+ .register(KryoNamespaces.API)
+ .register(Link.class,
+ LabelResourceId.class)
+ .build()))
+ .build();
+
+ tunnelInfoMap = storageService.<TunnelId, PceccTunnelInfo>consistentMapBuilder()
+ .withName("onos-pce-tunnelinfomap")
+ .withSerializer(Serializer.using(
+ new KryoNamespace.Builder()
+ .register(KryoNamespaces.API)
+ .register(TunnelId.class,
+ PceccTunnelInfo.class,
+ DefaultLspLocalLabelInfo.class,
+ TunnelConsumerId.class,
+ LabelResourceId.class)
+ .build()))
+ .build();
+
+ log.info("Started");
+ }
+
+ @Deactivate
+ protected void deactivate() {
+ log.info("Stopped");
+ }
+
+ @Override
+ public boolean existsGlobalNodeLabel(DeviceId id) {
+ checkNotNull(id, DEVICE_ID_NULL);
+ return globalNodeLabelMap.containsKey(id);
+ }
+
+ @Override
+ public boolean existsAdjLabel(Link link) {
+ checkNotNull(link, LINK_NULL);
+ return adjLabelMap.containsKey(link);
+ }
+
+ @Override
+ public boolean existsTunnelInfo(TunnelId tunnelId) {
+ checkNotNull(tunnelId, TUNNEL_ID_NULL);
+ return tunnelInfoMap.containsKey(tunnelId);
+ }
+
+ @Override
+ public int getGlobalNodeLabelCount() {
+ return globalNodeLabelMap.size();
+ }
+
+ @Override
+ public int getAdjLabelCount() {
+ return adjLabelMap.size();
+ }
+
+ @Override
+ public int getTunnelInfoCount() {
+ return tunnelInfoMap.size();
+ }
+
+ @Override
+ public Map<DeviceId, LabelResourceId> getGlobalNodeLabels() {
+ return globalNodeLabelMap.entrySet().stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, e -> (LabelResourceId) e.getValue().value()));
+ }
+
+ @Override
+ public Map<Link, LabelResourceId> getAdjLabels() {
+ return adjLabelMap.entrySet().stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, e -> (LabelResourceId) e.getValue().value()));
+ }
+
+ @Override
+ public Map<TunnelId, PceccTunnelInfo> getTunnelInfos() {
+ return tunnelInfoMap.entrySet().stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, e -> (PceccTunnelInfo) e.getValue().value()));
+ }
+
+ @Override
+ public LabelResourceId getGlobalNodeLabel(DeviceId id) {
+ checkNotNull(id, DEVICE_ID_NULL);
+ return globalNodeLabelMap.get(id).value();
+ }
+
+ @Override
+ public LabelResourceId getAdjLabel(Link link) {
+ checkNotNull(link, LINK_NULL);
+ return adjLabelMap.get(link).value();
+ }
+
+ @Override
+ public PceccTunnelInfo getTunnelInfo(TunnelId tunnelId) {
+ checkNotNull(tunnelId, TUNNEL_ID_NULL);
+ return tunnelInfoMap.get(tunnelId).value();
+ }
+
+ @Override
+ public void addGlobalNodeLabel(DeviceId deviceId, LabelResourceId labelId) {
+ checkNotNull(deviceId, DEVICE_ID_NULL);
+ checkNotNull(labelId, LABEL_RESOURCE_ID_NULL);
+
+ globalNodeLabelMap.put(deviceId, labelId);
+ }
+
+ @Override
+ public void addAdjLabel(Link link, LabelResourceId labelId) {
+ checkNotNull(link, LINK_NULL);
+ checkNotNull(labelId, LABEL_RESOURCE_ID_NULL);
+
+ adjLabelMap.put(link, labelId);
+ }
+
+ @Override
+ public void addTunnelInfo(TunnelId tunnelId, PceccTunnelInfo pceccTunnelInfo) {
+ checkNotNull(tunnelId, TUNNEL_ID_NULL);
+ checkNotNull(pceccTunnelInfo, PCECC_TUNNEL_INFO_NULL);
+
+ tunnelInfoMap.put(tunnelId, pceccTunnelInfo);
+ }
+
+ @Override
+ public boolean updateTunnelInfo(TunnelId tunnelId, List<LspLocalLabelInfo> lspLocalLabelInfoList) {
+ checkNotNull(tunnelId, TUNNEL_ID_NULL);
+ checkNotNull(lspLocalLabelInfoList, LSP_LOCAL_LABEL_INFO_NULL);
+
+ if (!tunnelInfoMap.containsKey((tunnelId))) {
+ log.debug("Tunnel info does not exist whose tunnel id is {}.", tunnelId.toString());
+ return false;
+ }
+
+ PceccTunnelInfo tunnelInfo = tunnelInfoMap.get(tunnelId).value();
+ tunnelInfo.lspLocalLabelInfoList(lspLocalLabelInfoList);
+ tunnelInfoMap.put(tunnelId, tunnelInfo);
+
+ return true;
+ }
+
+ @Override
+ public boolean updateTunnelInfo(TunnelId tunnelId, ResourceConsumer tunnelConsumerId) {
+ checkNotNull(tunnelId, TUNNEL_ID_NULL);
+ checkNotNull(tunnelConsumerId, TUNNEL_CONSUMER_ID_NULL);
+
+ if (!tunnelInfoMap.containsKey((tunnelId))) {
+ log.debug("Tunnel info does not exist whose tunnel id is {}.", tunnelId.toString());
+ return false;
+ }
+
+ PceccTunnelInfo tunnelInfo = tunnelInfoMap.get(tunnelId).value();
+ tunnelInfo.tunnelConsumerId(tunnelConsumerId);
+ tunnelInfoMap.put(tunnelId, tunnelInfo);
+
+ return true;
+ }
+
+ @Override
+ public boolean removeGlobalNodeLabel(DeviceId id) {
+ checkNotNull(id, DEVICE_ID_NULL);
+
+ if (globalNodeLabelMap.remove(id) == null) {
+ log.error("SR-TE node label deletion for device {} has failed.", id.toString());
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean removeAdjLabel(Link link) {
+ checkNotNull(link, LINK_NULL);
+
+ if (adjLabelMap.remove(link) == null) {
+ log.error("Adjacency label deletion for link {} hash failed.", link.toString());
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean removeTunnelInfo(TunnelId tunnelId) {
+ checkNotNull(tunnelId, TUNNEL_ID_NULL);
+
+ if (tunnelInfoMap.remove(tunnelId) == null) {
+ log.error("Tunnel info deletion for tunnel id {} has failed.", tunnelId.toString());
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/PceccTunnelInfo.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/PceccTunnelInfo.java
new file mode 100644
index 0000000..48f49cd
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/PceccTunnelInfo.java
@@ -0,0 +1,122 @@
+/*
+ * 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.pce.pcestore;
+
+import java.util.List;
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+import org.onosproject.net.resource.ResourceConsumer;
+import org.onosproject.pce.pcestore.api.LspLocalLabelInfo;
+
+/**
+ * PCECC tunnel information is used to store
+ * list of links label information of a path containing IN, OUT label and destination port of a link
+ * to release label allocation in devices.
+ * Also storing resource consumer id to release bandwdith of a tunnel.
+ * The first entry is created with TunnelId and resource consumer id,
+ * later this entry may be updated to store label information on basic PCECC case.
+ */
+public final class PceccTunnelInfo {
+
+ private List<LspLocalLabelInfo> lspLocalLabelInfoList;
+
+ private ResourceConsumer tunnelConsumerId;
+
+ /**
+ * Initialization of member variables.
+ *
+ * @param lspLocalLabelInfoList list of devices local label info
+ * @param tunnelConsumerId tunnel consumer id
+ */
+ public PceccTunnelInfo(List<LspLocalLabelInfo> lspLocalLabelInfoList,
+ ResourceConsumer tunnelConsumerId) {
+ this.lspLocalLabelInfoList = lspLocalLabelInfoList;
+ this.tunnelConsumerId = tunnelConsumerId;
+ }
+
+ /**
+ * Initialization for serialization.
+ */
+ public PceccTunnelInfo() {
+ this.lspLocalLabelInfoList = null;
+ this.tunnelConsumerId = null;
+ }
+
+ /**
+ * Retrieves list of devices local label info.
+ *
+ * @return list of devices local label info
+ */
+ public List<LspLocalLabelInfo> lspLocalLabelInfoList() {
+ return this.lspLocalLabelInfoList;
+ }
+
+ /**
+ * Retrieves tunnel consumer id.
+ *
+ * @return tunnel consumer id
+ */
+ public ResourceConsumer tunnelConsumerId() {
+ return this.tunnelConsumerId;
+ }
+
+ /**
+ * Sets list of local label info of a path.
+ *
+ * @param lspLocalLabelInfoList list of devices local label info
+ */
+ public void lspLocalLabelInfoList(List<LspLocalLabelInfo> lspLocalLabelInfoList) {
+ this.lspLocalLabelInfoList = lspLocalLabelInfoList;
+ }
+
+ /**
+ * Sets tunnel consumer id.
+ *
+ * @param id tunnel consumer id
+ */
+ public void tunnelConsumerId(ResourceConsumer id) {
+ this.tunnelConsumerId = id;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(lspLocalLabelInfoList, tunnelConsumerId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof PceccTunnelInfo) {
+ final PceccTunnelInfo other = (PceccTunnelInfo) obj;
+ return Objects.equals(this.lspLocalLabelInfoList, other.lspLocalLabelInfoList) &&
+ Objects.equals(this.tunnelConsumerId, other.tunnelConsumerId);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("DeviceLabelInfoList", lspLocalLabelInfoList.toString())
+ .add("TunnelConsumerId", tunnelConsumerId.toString())
+ .toString();
+ }
+}
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/LspLocalLabelInfo.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/LspLocalLabelInfo.java
new file mode 100644
index 0000000..07b61be
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/LspLocalLabelInfo.java
@@ -0,0 +1,114 @@
+/*
+ * 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.pce.pcestore.api;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.incubator.net.resource.label.LabelResourceId;
+
+/**
+ * Abstraction of an entity providing LSP local label information.
+ */
+public interface LspLocalLabelInfo {
+
+ /**
+ * Returns device id.
+ *
+ * @return device id
+ */
+ DeviceId deviceId();
+
+ /**
+ * Returns in label id of a device.
+ *
+ * @return in label resource id
+ */
+ LabelResourceId inLabelId();
+
+ /**
+ * Returns out label id of a device.
+ *
+ * @return node out label resource id
+ */
+ LabelResourceId outLabelId();
+
+ /**
+ * Returns in port of an incoming label.
+ *
+ * @return in port
+ */
+ PortNumber inPort();
+
+ /**
+ * Returns next hop of an outgoing label.
+ *
+ * @return out port
+ */
+ PortNumber outPort();
+
+ /**
+ * LspLocalLabelInfo Builder.
+ */
+ interface Builder {
+
+ /**
+ * Returns builder object of a device id.
+ *
+ * @param id device id
+ * @return builder object of device id
+ */
+ Builder deviceId(DeviceId id);
+
+ /**
+ * Returns builder object of in label.
+ *
+ * @param id in label id
+ * @return builder object of in label id
+ */
+ Builder inLabelId(LabelResourceId id);
+
+ /**
+ * Returns builder object of out label.
+ *
+ * @param id out label id
+ * @return builder object of out label id
+ */
+ Builder outLabelId(LabelResourceId id);
+
+ /**
+ * Returns builder object of in port of an incoming label.
+ *
+ * @param port in port
+ * @return builder object of in port
+ */
+ Builder inPort(PortNumber port);
+
+ /**
+ * Returns builder object of next hop of an outgoing label.
+ *
+ * @param port out port
+ * @return builder object of out port
+ */
+ Builder outPort(PortNumber port);
+
+ /**
+ * Builds object of device local label info.
+ *
+ * @return object of device local label info.
+ */
+ LspLocalLabelInfo build();
+ }
+}
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/PceStore.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/PceStore.java
new file mode 100644
index 0000000..912330c
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/PceStore.java
@@ -0,0 +1,189 @@
+/*
+ * 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.pce.pcestore.api;
+
+import java.util.List;
+
+import org.onosproject.incubator.net.resource.label.LabelResourceId;
+import org.onosproject.incubator.net.tunnel.TunnelId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
+import org.onosproject.net.resource.ResourceConsumer;
+import org.onosproject.pce.pcestore.PceccTunnelInfo;
+
+import java.util.Map;
+
+/**
+ * Abstraction of an entity providing pool of available labels to devices, links and tunnels.
+ */
+public interface PceStore {
+ /**
+ * Checks whether device id is present in global node label store.
+ *
+ * @param id device id
+ * @return success of failure
+ */
+ boolean existsGlobalNodeLabel(DeviceId id);
+
+ /**
+ * Checks whether link is present in adjacency label store.
+ *
+ * @param link link between devices
+ * @return success of failure
+ */
+ boolean existsAdjLabel(Link link);
+
+ /**
+ * Checks whether tunnel id is present in tunnel info store.
+ *
+ * @param tunnelId tunnel id
+ * @return success of failure
+ */
+ boolean existsTunnelInfo(TunnelId tunnelId);
+
+ /**
+ * Retrieves the node label count.
+ *
+ * @return node label count
+ */
+ int getGlobalNodeLabelCount();
+
+ /**
+ * Retrieves the adjacency label count.
+ *
+ * @return adjacency label count
+ */
+ int getAdjLabelCount();
+
+ /**
+ * Retrieves the tunnel info count.
+ *
+ * @return tunnel info count
+ */
+ int getTunnelInfoCount();
+
+ /**
+ * Retrieves device id and label pairs collection from global node label store.
+ *
+ * @return collection of device id and label pairs
+ */
+ Map<DeviceId, LabelResourceId> getGlobalNodeLabels();
+
+ /**
+ * Retrieves link and label pairs collection from adjacency label store.
+ *
+ * @return collection of link and label pairs
+ */
+ Map<Link, LabelResourceId> getAdjLabels();
+
+ /**
+ * Retrieves tunnel id and pcecc tunnel info pairs collection from tunnel info store.
+ *
+ * @return collection of tunnel id and pcecc tunnel info pairs
+ */
+ Map<TunnelId, PceccTunnelInfo> getTunnelInfos();
+
+ /**
+ * Retrieves node label for specified device id.
+ *
+ * @param id device id
+ * @return node label
+ */
+ LabelResourceId getGlobalNodeLabel(DeviceId id);
+
+ /**
+ * Retrieves adjacency label for specified link.
+ *
+ * @param link between devices
+ * @return adjacency label
+ */
+ LabelResourceId getAdjLabel(Link link);
+
+ /**
+ * Retrieves local label info with tunnel consumer id from tunnel info store.
+ *
+ * @param tunnelId tunnel id
+ * @return pcecc tunnel info
+ */
+ PceccTunnelInfo getTunnelInfo(TunnelId tunnelId);
+
+ /**
+ * Stores node label into global node label store.
+ *
+ * @param deviceId device id
+ * @param labelId node label id
+ */
+ void addGlobalNodeLabel(DeviceId deviceId, LabelResourceId labelId);
+
+ /**
+ * Stores adjacency label into adjacency label store.
+ *
+ * @param link link between nodes
+ * @param labelId link label id
+ */
+ void addAdjLabel(Link link, LabelResourceId labelId);
+
+ /**
+ * Stores local label info with tunnel consumer id into tunnel info store for specified tunnel id.
+ *
+ * @param tunnelId tunnel id
+ * @param pceccTunnelInfo local label info
+ */
+ void addTunnelInfo(TunnelId tunnelId, PceccTunnelInfo pceccTunnelInfo);
+
+ /**
+ * Updates local label info. The first entry is created with TunnelId and TunnelConsumerId.
+ * Later this entry may be updated to store label information if it is basic PCECC case.
+ *
+ * @param tunnelId tunnel id
+ * @param lspLocalLabelInfoList list of local labels
+ * @return success or failure
+ */
+ boolean updateTunnelInfo(TunnelId tunnelId, List<LspLocalLabelInfo> lspLocalLabelInfoList);
+
+ /**
+ * Updates tunnel info map with tunnel consumer id.
+ *
+ * @param tunnelId tunnel id
+ * @param tunnelConsumerId tunnel consumer id
+ * @return success or failure
+ */
+ boolean updateTunnelInfo(TunnelId tunnelId, ResourceConsumer tunnelConsumerId);
+
+ /**
+ * Removes device label from global node label store for specified device id.
+ *
+ * @param id device id
+ * @return success or failure
+ */
+ boolean removeGlobalNodeLabel(DeviceId id);
+
+ /**
+ * Removes adjacency label from adjacency label store for specified link information.
+ *
+ * @param link between nodes
+ * @return success or failure
+ */
+ boolean removeAdjLabel(Link link);
+
+ /**
+ * Removes local label info with tunnel consumer id from tunnel info store for specified tunnel id.
+ *
+ * @param tunnelId tunnel id
+ * @return success or failure
+ */
+ boolean removeTunnelInfo(TunnelId tunnelId);
+}
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/package-info.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/package-info.java
new file mode 100644
index 0000000..0803071
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/api/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * PCE store service API.
+ */
+package org.onosproject.pce.pcestore.api;
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/package-info.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/package-info.java
new file mode 100644
index 0000000..c1d9bb5
--- /dev/null
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * PCE store application.
+ */
+package org.onosproject.pce.pcestore;