blob: 726d002a05fa699f1c624591abc656471a07c6c4 [file] [log] [blame]
hiroki684aa2f2018-05-19 20:48:49 -07001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.odtn.internal;
hirokif4ed5212018-05-26 22:39:38 -070018
hiroki684aa2f2018-05-19 20:48:49 -070019import com.google.common.annotations.VisibleForTesting;
20import java.util.Collections;
hirokif4ed5212018-05-26 22:39:38 -070021import java.util.HashMap;
hiroki684aa2f2018-05-19 20:48:49 -070022import java.util.List;
hirokif4ed5212018-05-26 22:39:38 -070023import java.util.Map;
hiroki684aa2f2018-05-19 20:48:49 -070024import java.util.stream.Collectors;
25import org.onosproject.config.DynamicConfigService;
26
27import org.onosproject.config.Filter;
28import org.onosproject.net.ConnectPoint;
29import org.onosproject.net.DeviceId;
30import org.onosproject.odtn.utils.tapi.DcsBasedTapiNepRef;
31import org.onosproject.odtn.utils.tapi.DcsBasedTapiNodeRef;
32import org.onosproject.odtn.utils.tapi.TapiNepRef;
33import org.onosproject.odtn.utils.tapi.TapiNodeRef;
34import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
35import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
hirokif4ed5212018-05-26 22:39:38 -070036import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
hiroki684aa2f2018-05-19 20:48:49 -070037import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
38import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
hiroki684aa2f2018-05-19 20:48:49 -070039import org.onosproject.yang.model.DataNode;
40import org.onosproject.yang.model.DefaultModelObjectData;
41import org.onosproject.yang.model.DefaultResourceData;
42import org.onosproject.yang.model.ModelConverter;
hiroki684aa2f2018-05-19 20:48:49 -070043import org.onosproject.yang.model.ModelObjectData;
44import org.onosproject.yang.model.ModelObjectId;
45import org.onosproject.yang.model.ResourceData;
46import org.onosproject.yang.model.ResourceId;
47import org.slf4j.Logger;
48
49import static org.onlab.osgi.DefaultServiceDirectory.getService;
hirokif4ed5212018-05-26 22:39:38 -070050import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
51import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
52import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ONOS_CP;
53import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.CONNECTION_ID;
hiroki684aa2f2018-05-19 20:48:49 -070054import static org.slf4j.LoggerFactory.getLogger;
55
hirokif4ed5212018-05-26 22:39:38 -070056/**
57 * DCS-dependent Tapi Data producer implementation.
58 */
hiroki684aa2f2018-05-19 20:48:49 -070059public class DcsBasedTapiDataProducer implements TapiDataProducer {
60
61 private final Logger log = getLogger(getClass());
hirokif4ed5212018-05-26 22:39:38 -070062
hiroki684aa2f2018-05-19 20:48:49 -070063 protected DynamicConfigService dcs;
64 protected ModelConverter modelConverter;
65
66 @Override
67 public void init() {
68 dcs = getService(DynamicConfigService.class);
69 modelConverter = getService(ModelConverter.class);
70 }
71
72 @Override
73 public void updateCacheRequest(DefaultTapiResolver resolver) {
hirokif4ed5212018-05-26 22:39:38 -070074 updateCache(resolver, readContextModelObject());
hiroki684aa2f2018-05-19 20:48:49 -070075 }
76
hirokif4ed5212018-05-26 22:39:38 -070077 /**
78 * Update resolver's cache with Tapi context modelObject.
79 *
80 * @param resolver TapiResolver
81 * @param context Context ModelObject which has all data nodes of Tapi DataTree in Dcs store
82 */
hiroki684aa2f2018-05-19 20:48:49 -070083 @VisibleForTesting
hirokif4ed5212018-05-26 22:39:38 -070084 protected void updateCache(DefaultTapiResolver resolver, DefaultContext context) {
hiroki684aa2f2018-05-19 20:48:49 -070085 updateNodes(resolver, getNodes(context));
86 updateNeps(resolver, getNeps(context));
87 }
88
hirokif4ed5212018-05-26 22:39:38 -070089 /**
90 * Get Tapi context modelObject from Dcs.
91 *
92 * @return Tapi context modelObject in Dcs store
93 */
94 // FIXME update this method using TapiContextHandler
95 private DefaultContext readContextModelObject() {
hiroki684aa2f2018-05-19 20:48:49 -070096 // read DataNode from DCS
97 ModelObjectId mid = ModelObjectId.builder().addChild(DefaultContext.class).build();
98 DataNode node = dcs.readNode(getResourceId(mid), Filter.builder().build());
99
100 // convert to ModelObject
101 ResourceData data = DefaultResourceData.builder().addDataNode(node)
102 .resourceId(ResourceId.builder().build()).build();
103 ModelObjectData modelData = modelConverter.createModel(data);
hirokif4ed5212018-05-26 22:39:38 -0700104 DefaultContext context = (DefaultContext) modelData.modelObjects().get(0);
hiroki684aa2f2018-05-19 20:48:49 -0700105
106 return context;
107 }
108
hirokif4ed5212018-05-26 22:39:38 -0700109 /**
110 * Extract Tapi Nodes from context modelObject and convert them to NodeRefs.
111 *
112 * @param context
113 * @return List of NodeRef
114 */
115 private List<TapiNodeRef> getNodes(DefaultContext context) {
hiroki684aa2f2018-05-19 20:48:49 -0700116 DefaultAugmentedTapiCommonContext topologyContext
hirokif4ed5212018-05-26 22:39:38 -0700117 = context.augmentation(DefaultAugmentedTapiCommonContext.class);
hiroki684aa2f2018-05-19 20:48:49 -0700118 Topology topology = topologyContext.topology().get(0);
119
120 if (topology.node() == null) {
121 return Collections.emptyList();
122 }
123 return topology.node().stream()
124 .map(node -> {
hirokif4ed5212018-05-26 22:39:38 -0700125 DcsBasedTapiNodeRef nodeRef = DcsBasedTapiNodeRef.create(topology, node);
126 if (node.name() != null) {
127 String deviceId = node.name().stream()
128 .filter(kv -> kv.valueName().equals(DEVICE_ID))
129 .findFirst().map(Name::value).get();
130 nodeRef.setDeviceId(DeviceId.deviceId(deviceId));
131 }
132 return nodeRef;
hiroki684aa2f2018-05-19 20:48:49 -0700133 })
134 .collect(Collectors.toList());
135 }
136
hirokif4ed5212018-05-26 22:39:38 -0700137 /**
138 * Extract Tapi Neps from context modelObject and convert them to NepRefs.
139 *
140 * @param context
141 * @return List of TapiNepRef
142 */
143 private List<TapiNepRef> getNeps(DefaultContext context) {
hiroki684aa2f2018-05-19 20:48:49 -0700144 DefaultAugmentedTapiCommonContext topologyContext
hirokif4ed5212018-05-26 22:39:38 -0700145 = context.augmentation(DefaultAugmentedTapiCommonContext.class);
hiroki684aa2f2018-05-19 20:48:49 -0700146 Topology topology = topologyContext.topology().get(0);
147
148 if (topology.node() == null) {
149 return Collections.emptyList();
150 }
151 List<TapiNepRef> ret = topology.node().stream()
152 .flatMap(node -> {
hirokif4ed5212018-05-26 22:39:38 -0700153 if (node.ownedNodeEdgePoint() == null) {
154 return null;
155 }
156 return node.ownedNodeEdgePoint().stream()
hiroki684aa2f2018-05-19 20:48:49 -0700157 .map(nep -> {
hirokif4ed5212018-05-26 22:39:38 -0700158 TapiNepRef nepRef = DcsBasedTapiNepRef.create(topology, node, nep);
159 if (nep.name() != null) {
160 Map<String, String> kvs = new HashMap<>();
161 nep.name().forEach(kv -> kvs.put(kv.valueName(), kv.value()));
162
163 String onosConnectPoint = kvs.getOrDefault(ONOS_CP, null);
164 String portType = kvs.getOrDefault(ODTN_PORT_TYPE, null);
165 String connectionId = kvs.getOrDefault(CONNECTION_ID, null);
166 nepRef.setConnectPoint(ConnectPoint.fromString(onosConnectPoint))
167 .setPortType(portType)
168 .setConnectionId(connectionId);
169 }
hiroki684aa2f2018-05-19 20:48:49 -0700170 if (nep.mappedServiceInterfacePoint() != null) {
171 nep.mappedServiceInterfacePoint().stream()
172 .forEach(sip -> {
173 nepRef.setSipId(sip.serviceInterfacePointId().toString());
174 });
175 }
hirokif4ed5212018-05-26 22:39:38 -0700176
177 DefaultAugmentedTapiTopologyOwnedNodeEdgePoint augmentNep =
178 nep.augmentation(DefaultAugmentedTapiTopologyOwnedNodeEdgePoint.class);
179 try {
180 if (augmentNep.connectionEndPoint() != null) {
181 List<String> cepIds = augmentNep.connectionEndPoint().stream()
182 .map(cep -> cep.uuid().toString()).collect(Collectors.toList());
183 nepRef.setCepIds(cepIds);
184 }
185 } catch (NullPointerException e) {
186 log.warn("Augmented ownedNodeEdgePoint is not found.");
187 }
hiroki684aa2f2018-05-19 20:48:49 -0700188 return nepRef;
189 });
190 }
191 ).collect(Collectors.toList());
192 return ret;
193 }
194
hirokif4ed5212018-05-26 22:39:38 -0700195 /**
196 * Update resolver's NodeRef list.
197 *
198 * @param resolver TapiResolver
199 * @param nodes List of NodeRef for update
200 */
hiroki684aa2f2018-05-19 20:48:49 -0700201 private void updateNodes(DefaultTapiResolver resolver, List<TapiNodeRef> nodes) {
202 resolver.addNodeRefList(nodes);
203 }
204
hirokif4ed5212018-05-26 22:39:38 -0700205 /**
206 * Update resolver's NepRef list.
207 *
208 * @param resolver TapiResolver
209 * @param neps List of NepRef for update
210 */
hiroki684aa2f2018-05-19 20:48:49 -0700211 private void updateNeps(DefaultTapiResolver resolver, List<TapiNepRef> neps) {
212 resolver.addNepRefList(neps);
213 }
214
hiroki684aa2f2018-05-19 20:48:49 -0700215 private ResourceId getResourceId(ModelObjectId modelId) {
216 ModelObjectData data = DefaultModelObjectData.builder()
217 .identifier(modelId)
218 .build();
219 ResourceData rnode = modelConverter.createDataNode(data);
220 return rnode.resourceId();
221 }
222
223}