blob: 40e606a643a9034cccd53a8f2a146f593a98549c [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;
hirokifca084b2018-06-02 08:29:42 -070030import org.onosproject.odtn.utils.tapi.DcsBasedTapiObjectRefFactory;
hiroki684aa2f2018-05-19 20:48:49 -070031import org.onosproject.odtn.utils.tapi.TapiNepRef;
32import org.onosproject.odtn.utils.tapi.TapiNodeRef;
hirokid8fd7862018-10-09 15:24:24 +090033import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
34import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.globalclass.Name;
35import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.topologycontext.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
36import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.DefaultAugmentedTapiCommonContext;
37import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.Topology;
hiroki684aa2f2018-05-19 20:48:49 -070038import org.onosproject.yang.model.DataNode;
39import org.onosproject.yang.model.DefaultModelObjectData;
40import org.onosproject.yang.model.DefaultResourceData;
41import org.onosproject.yang.model.ModelConverter;
hiroki684aa2f2018-05-19 20:48:49 -070042import org.onosproject.yang.model.ModelObjectData;
43import org.onosproject.yang.model.ModelObjectId;
44import org.onosproject.yang.model.ResourceData;
45import org.onosproject.yang.model.ResourceId;
46import org.slf4j.Logger;
47
48import static org.onlab.osgi.DefaultServiceDirectory.getService;
hirokif4ed5212018-05-26 22:39:38 -070049import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
50import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
51import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ONOS_CP;
52import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.CONNECTION_ID;
hiroki684aa2f2018-05-19 20:48:49 -070053import static org.slf4j.LoggerFactory.getLogger;
54
hirokif4ed5212018-05-26 22:39:38 -070055/**
56 * DCS-dependent Tapi Data producer implementation.
57 */
hiroki684aa2f2018-05-19 20:48:49 -070058public class DcsBasedTapiDataProducer implements TapiDataProducer {
59
60 private final Logger log = getLogger(getClass());
hirokif4ed5212018-05-26 22:39:38 -070061
hiroki684aa2f2018-05-19 20:48:49 -070062 protected DynamicConfigService dcs;
63 protected ModelConverter modelConverter;
64
65 @Override
66 public void init() {
67 dcs = getService(DynamicConfigService.class);
68 modelConverter = getService(ModelConverter.class);
69 }
70
71 @Override
72 public void updateCacheRequest(DefaultTapiResolver resolver) {
hirokif4ed5212018-05-26 22:39:38 -070073 updateCache(resolver, readContextModelObject());
hiroki684aa2f2018-05-19 20:48:49 -070074 }
75
hirokif4ed5212018-05-26 22:39:38 -070076 /**
77 * Update resolver's cache with Tapi context modelObject.
78 *
79 * @param resolver TapiResolver
80 * @param context Context ModelObject which has all data nodes of Tapi DataTree in Dcs store
81 */
hiroki684aa2f2018-05-19 20:48:49 -070082 @VisibleForTesting
hirokif4ed5212018-05-26 22:39:38 -070083 protected void updateCache(DefaultTapiResolver resolver, DefaultContext context) {
hiroki684aa2f2018-05-19 20:48:49 -070084 updateNodes(resolver, getNodes(context));
85 updateNeps(resolver, getNeps(context));
86 }
87
hirokif4ed5212018-05-26 22:39:38 -070088 /**
89 * Get Tapi context modelObject from Dcs.
90 *
91 * @return Tapi context modelObject in Dcs store
92 */
93 // FIXME update this method using TapiContextHandler
94 private DefaultContext readContextModelObject() {
hiroki684aa2f2018-05-19 20:48:49 -070095 // read DataNode from DCS
96 ModelObjectId mid = ModelObjectId.builder().addChild(DefaultContext.class).build();
97 DataNode node = dcs.readNode(getResourceId(mid), Filter.builder().build());
98
99 // convert to ModelObject
100 ResourceData data = DefaultResourceData.builder().addDataNode(node)
101 .resourceId(ResourceId.builder().build()).build();
102 ModelObjectData modelData = modelConverter.createModel(data);
hirokif4ed5212018-05-26 22:39:38 -0700103 DefaultContext context = (DefaultContext) modelData.modelObjects().get(0);
hiroki684aa2f2018-05-19 20:48:49 -0700104
105 return context;
106 }
107
hirokif4ed5212018-05-26 22:39:38 -0700108 /**
109 * Extract Tapi Nodes from context modelObject and convert them to NodeRefs.
110 *
111 * @param context
112 * @return List of NodeRef
113 */
114 private List<TapiNodeRef> getNodes(DefaultContext context) {
hiroki684aa2f2018-05-19 20:48:49 -0700115 DefaultAugmentedTapiCommonContext topologyContext
hirokif4ed5212018-05-26 22:39:38 -0700116 = context.augmentation(DefaultAugmentedTapiCommonContext.class);
hirokid8fd7862018-10-09 15:24:24 +0900117 Topology topology = topologyContext.topologyContext().topology().get(0);
hiroki684aa2f2018-05-19 20:48:49 -0700118
119 if (topology.node() == null) {
120 return Collections.emptyList();
121 }
122 return topology.node().stream()
123 .map(node -> {
hirokifca084b2018-06-02 08:29:42 -0700124 TapiNodeRef nodeRef = DcsBasedTapiObjectRefFactory.create(topology, node);
hirokif4ed5212018-05-26 22:39:38 -0700125 if (node.name() != null) {
126 String deviceId = node.name().stream()
127 .filter(kv -> kv.valueName().equals(DEVICE_ID))
128 .findFirst().map(Name::value).get();
129 nodeRef.setDeviceId(DeviceId.deviceId(deviceId));
130 }
131 return nodeRef;
hiroki684aa2f2018-05-19 20:48:49 -0700132 })
133 .collect(Collectors.toList());
134 }
135
hirokif4ed5212018-05-26 22:39:38 -0700136 /**
137 * Extract Tapi Neps from context modelObject and convert them to NepRefs.
138 *
139 * @param context
140 * @return List of TapiNepRef
141 */
142 private List<TapiNepRef> getNeps(DefaultContext context) {
hiroki684aa2f2018-05-19 20:48:49 -0700143 DefaultAugmentedTapiCommonContext topologyContext
hirokif4ed5212018-05-26 22:39:38 -0700144 = context.augmentation(DefaultAugmentedTapiCommonContext.class);
hirokid8fd7862018-10-09 15:24:24 +0900145 Topology topology = topologyContext.topologyContext().topology().get(0);
hiroki684aa2f2018-05-19 20:48:49 -0700146
147 if (topology.node() == null) {
148 return Collections.emptyList();
149 }
150 List<TapiNepRef> ret = topology.node().stream()
151 .flatMap(node -> {
hirokif4ed5212018-05-26 22:39:38 -0700152 if (node.ownedNodeEdgePoint() == null) {
153 return null;
154 }
155 return node.ownedNodeEdgePoint().stream()
hiroki684aa2f2018-05-19 20:48:49 -0700156 .map(nep -> {
hirokifca084b2018-06-02 08:29:42 -0700157 TapiNepRef nepRef = DcsBasedTapiObjectRefFactory.create(topology, node, nep);
hirokif4ed5212018-05-26 22:39:38 -0700158 if (nep.name() != null) {
159 Map<String, String> kvs = new HashMap<>();
160 nep.name().forEach(kv -> kvs.put(kv.valueName(), kv.value()));
161
162 String onosConnectPoint = kvs.getOrDefault(ONOS_CP, null);
163 String portType = kvs.getOrDefault(ODTN_PORT_TYPE, null);
164 String connectionId = kvs.getOrDefault(CONNECTION_ID, null);
165 nepRef.setConnectPoint(ConnectPoint.fromString(onosConnectPoint))
166 .setPortType(portType)
167 .setConnectionId(connectionId);
168 }
hiroki684aa2f2018-05-19 20:48:49 -0700169 if (nep.mappedServiceInterfacePoint() != null) {
170 nep.mappedServiceInterfacePoint().stream()
171 .forEach(sip -> {
hirokid8fd7862018-10-09 15:24:24 +0900172 nepRef.setSipId(sip.serviceInterfacePointUuid().toString());
hiroki684aa2f2018-05-19 20:48:49 -0700173 });
174 }
hirokif4ed5212018-05-26 22:39:38 -0700175
176 DefaultAugmentedTapiTopologyOwnedNodeEdgePoint augmentNep =
177 nep.augmentation(DefaultAugmentedTapiTopologyOwnedNodeEdgePoint.class);
178 try {
hirokid8fd7862018-10-09 15:24:24 +0900179 if (augmentNep.cepList().connectionEndPoint() != null) {
180 List<String> cepIds = augmentNep.cepList().connectionEndPoint().stream()
hirokif4ed5212018-05-26 22:39:38 -0700181 .map(cep -> cep.uuid().toString()).collect(Collectors.toList());
182 nepRef.setCepIds(cepIds);
183 }
184 } catch (NullPointerException e) {
185 log.warn("Augmented ownedNodeEdgePoint is not found.");
186 }
hiroki684aa2f2018-05-19 20:48:49 -0700187 return nepRef;
188 });
189 }
190 ).collect(Collectors.toList());
191 return ret;
192 }
193
hirokif4ed5212018-05-26 22:39:38 -0700194 /**
195 * Update resolver's NodeRef list.
196 *
197 * @param resolver TapiResolver
198 * @param nodes List of NodeRef for update
199 */
hiroki684aa2f2018-05-19 20:48:49 -0700200 private void updateNodes(DefaultTapiResolver resolver, List<TapiNodeRef> nodes) {
201 resolver.addNodeRefList(nodes);
202 }
203
hirokif4ed5212018-05-26 22:39:38 -0700204 /**
205 * Update resolver's NepRef list.
206 *
207 * @param resolver TapiResolver
208 * @param neps List of NepRef for update
209 */
hiroki684aa2f2018-05-19 20:48:49 -0700210 private void updateNeps(DefaultTapiResolver resolver, List<TapiNepRef> neps) {
211 resolver.addNepRefList(neps);
212 }
213
hiroki684aa2f2018-05-19 20:48:49 -0700214 private ResourceId getResourceId(ModelObjectId modelId) {
215 ModelObjectData data = DefaultModelObjectData.builder()
216 .identifier(modelId)
217 .build();
218 ResourceData rnode = modelConverter.createDataNode(data);
219 return rnode.resourceId();
220 }
221
222}