blob: 6da8cbf44b5585be8f6b97b7b477c6954d7ddeb4 [file] [log] [blame]
hirokibca3e932018-05-15 15:25:54 -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;
18
hirokiec18d3a2018-05-16 15:27:37 -070019import java.util.List;
hirokibca3e932018-05-15 15:25:54 -070020import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
25import org.apache.felix.scr.annotations.Service;
hirokiec18d3a2018-05-16 15:27:37 -070026import org.onlab.util.XmlString;
hirokibca3e932018-05-15 15:25:54 -070027import org.onosproject.config.DynamicConfigService;
28import org.onosproject.config.FailedException;
29import org.onosproject.config.Filter;
30import org.onosproject.d.config.DeviceResourceIds;
hirokibca3e932018-05-15 15:25:54 -070031
32import static org.onosproject.d.config.DeviceResourceIds.DCS_NAMESPACE;
hirokiec18d3a2018-05-16 15:27:37 -070033
34import org.onosproject.d.config.ResourceIds;
35import org.onosproject.net.ConnectPoint;
36import org.onosproject.net.Device;
37import org.onosproject.net.DeviceId;
38import org.onosproject.net.Link;
39import org.onosproject.net.Port;
40
41import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
42import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
43import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
44
45import org.onosproject.odtn.utils.tapi.TapiLinkBuilder;
46import org.onosproject.odtn.utils.tapi.TapiNepRef;
47import org.onosproject.odtn.utils.tapi.TapiNodeRef;
48import org.onosproject.odtn.utils.tapi.TapiResolver;
49import org.onosproject.odtn.utils.tapi.TapiContextBuilder;
50import org.onosproject.odtn.utils.tapi.TapiNepBuilder;
51import org.onosproject.odtn.utils.tapi.TapiNodeBuilder;
52import org.onosproject.odtn.utils.tapi.TapiSipBuilder;
53import org.onosproject.odtn.utils.tapi.TapiTopologyBuilder;
54import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
55import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
56import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
57import org.onosproject.yang.model.DataNode;
58import org.onosproject.yang.model.InnerNode;
59import org.onosproject.yang.model.ModelConverter;
60import org.onosproject.yang.model.ModelObjectData;
61import org.onosproject.yang.model.ResourceData;
62import org.onosproject.yang.model.ResourceId;
63import org.slf4j.Logger;
64
hirokibca3e932018-05-15 15:25:54 -070065import static org.slf4j.LoggerFactory.getLogger;
66
67/**
68 * OSGi Component for ODTN Tapi manager application.
69 */
70@Component(immediate = true)
71@Service
72public class DcsBasedTapiTopologyManager implements TapiTopologyManager {
73
74 private final Logger log = getLogger(getClass());
75
76 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 protected DynamicConfigService dcs;
78
hirokiec18d3a2018-05-16 15:27:37 -070079 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 protected ModelConverter modelConverter;
81
82 private DefaultContext context = new DefaultContext();
83 private DefaultTopology topology = new DefaultTopology();
84
85 private TapiResolver tapiResolver = new TapiResolver();
86
hirokibca3e932018-05-15 15:25:54 -070087 @Activate
88 public void activate() {
89 initDcsIfRootNotExist();
hirokiec18d3a2018-05-16 15:27:37 -070090 initDcsTapiContext();
91 initDcsTapiTopology();
hirokibca3e932018-05-15 15:25:54 -070092 log.info("Started");
93 }
94
95 @Deactivate
96 public void deactivate() {
97 log.info("Stopped");
98 }
99
100 @Override
101 public void addDevice(Device device) {
102 log.info("Add device: {}", device);
hirokiec18d3a2018-05-16 15:27:37 -0700103 DeviceId deviceId = device.id();
104 if (tapiResolver.hasNodeRef(deviceId)) {
105 return;
106 }
107 TapiNodeBuilder builder = TapiNodeBuilder.builder()
108 .setTopologyUuid(topology.uuid())
109 .setDeviceId(deviceId);
110 addModelObjectDataToDcs(builder.build());
111
112 TapiNodeRef nodeRef = new TapiNodeRef(topology.uuid().toString(), builder.getUuid().toString());
113 nodeRef.setDeviceId(deviceId);
114 tapiResolver.addNodeRef(nodeRef);
hirokibca3e932018-05-15 15:25:54 -0700115 }
116
117 @Override
118 public void removeDevice(Device device) {
119 log.info("Remove device: {}", device);
120 }
121
122 @Override
123 public void addLink(Link link) {
124 log.info("Add link: {}", link);
hirokiec18d3a2018-05-16 15:27:37 -0700125
126 // validation check
127
128 // src nep
129 addNep(link.src());
130 addNep(link.dst());
131
132 // link
133 TapiNepRef srcNepRef = tapiResolver.getNepRef(link.src());
134 TapiNepRef dstNepRef = tapiResolver.getNepRef(link.dst());
135
136 TapiLinkBuilder linkBuilder = TapiLinkBuilder.builder()
137 .setTopologyUuid(topology.uuid())
138 .setNep(srcNepRef)
139 .setNep(dstNepRef);
140 addModelObjectDataToDcs(linkBuilder.build());
hirokibca3e932018-05-15 15:25:54 -0700141 }
142
143 @Override
144 public void removeLink(Link link) {
145 log.info("Remove link: {}", link);
146 }
147
148 @Override
hirokiec18d3a2018-05-16 15:27:37 -0700149 public void addPort(Port port) {
150 log.info("Add port: {}", port);
151 if (tapiResolver.hasNepRef(new ConnectPoint(port.element().id(), port.number()))) {
152 return;
153 }
154
155 TapiNodeRef nodeRef = tapiResolver.getNodeRef(port.element().id());
156 String nodeId = nodeRef.getNodeId();
157
158 // nep
159 TapiNepBuilder nepBuilder = TapiNepBuilder.builder()
160 .setPort(port)
161 .setTopologyUuid(topology.uuid())
162 .setNodeUuid(Uuid.fromString(nodeId));
163
164 TapiNepRef nepRef = new TapiNepRef(topology.uuid().toString(), nodeId, nepBuilder.getUuid().toString());
165 nepRef.setConnectPoint(nepBuilder.getConnectPoint());
166
167 // sip
168 if (TapiSipBuilder.isSip(port)) {
169 TapiSipBuilder sipBuilder = TapiSipBuilder.builder().setPort(port);
170 nepBuilder.setSip(sipBuilder.getUuid());
171 nepRef.setSipId(sipBuilder.getUuid().toString());
172
173 addModelObjectDataToDcs(sipBuilder.build());
174 }
175
176 addModelObjectDataToDcs(nepBuilder.build());
177 tapiResolver.addNepRef(nepRef);
hirokibca3e932018-05-15 15:25:54 -0700178 }
179
180 @Override
hirokiec18d3a2018-05-16 15:27:37 -0700181 public void removePort(Port port) {
182 log.info("Remove port: {}", port);
183 }
184
185 private void addNep(ConnectPoint cp) {
186
187 log.info("device Id: {}", cp.deviceId());
188 TapiNodeRef nodeRef = tapiResolver.getNodeRef(cp.deviceId());
189 String nodeId = nodeRef.getNodeId();
190
191 TapiNepBuilder nepBuilder = TapiNepBuilder.builder()
192 .setConnectPoint(cp)
193 .setTopologyUuid(topology.uuid())
194 .setNodeUuid(Uuid.fromString(nodeId));
195 TapiNepRef nepRef = new TapiNepRef(topology.uuid().toString(), nodeId, nepBuilder.getUuid().toString());
196 nepRef.setConnectPoint(cp);
197
198 addModelObjectDataToDcs(nepBuilder.build());
199 tapiResolver.addNepRef(nepRef);
200 }
201
202 private void initDcsTapiContext() {
203 TapiContextBuilder builder = TapiContextBuilder.builder(context);
204 addModelObjectDataToDcs(builder.build());
205 }
206
207 private void initDcsTapiTopology() {
208 TapiTopologyBuilder builder = TapiTopologyBuilder.builder(topology);
209 addModelObjectDataToDcs(builder.build());
210 }
211
212 // FIXME: move DCS-related methods to DCS
213
214 private void addModelObjectDataToDcs(ModelObjectData input) {
215
216 ResourceData rnode = modelConverter.createDataNode(input);
217
218 // for debug
219 CharSequence strNode = toCharSequence(toXmlCompositeStream(toCompositeData(rnode)));
220 log.info("XML:\n{}", XmlString.prettifyXml(strNode));
221
222 addResourceDataToDcs(rnode);
223 }
224
225 private void addResourceDataToDcs(ResourceData input) {
226 addResourceDataToDcs(input, input.resourceId());
227 }
228
229 private void addResourceDataToDcs(ResourceData input, ResourceId rid) {
230 if (input == null || input.dataNodes() == null) {
231 return;
232 }
233 List<DataNode> dataNodes = input.dataNodes();
234 for (DataNode node : dataNodes) {
235 dcs.createNode(rid, node);
236 }
hirokibca3e932018-05-15 15:25:54 -0700237 }
238
239 private void initDcsIfRootNotExist() {
240
241 log.info("read root:");
242 try {
243 DataNode all = dcs.readNode(ResourceIds.ROOT_ID, Filter.builder().build());
244 log.info("all: {}", all);
245 } catch (FailedException e) {
246 // FIXME debug this issue
247 log.info("nothing retrievable in DCS?");
248 //e.printStackTrace(System.out);
249 }
250 if (!dcs.nodeExist(ResourceIds.ROOT_ID)) {
251 log.info("Root node does not exist!, creating...");
252 try {
253 log.info("create 'root' node");
254 dcs.createNode(null,
255 InnerNode.builder(DeviceResourceIds.ROOT_NAME, DCS_NAMESPACE)
256 .type(DataNode.Type.SINGLE_INSTANCE_NODE).build());
257 } catch (FailedException e) {
258 log.info("Failed to create root???");
259 //e.printStackTrace(System.out);
260 }
261 }
262 if (!dcs.nodeExist(ResourceIds.ROOT_ID)) {
263 log.info("'root' was created without error, but still not there. WTF!");
264 }
265 }
hirokiec18d3a2018-05-16 15:27:37 -0700266
hirokibca3e932018-05-15 15:25:54 -0700267}