blob: 1af23021503d440b1491da312cfb5b39ecda95b7 [file] [log] [blame]
Bharat saraswalf53b29a2016-09-27 15:35:15 +05301/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Bharat saraswalf53b29a2016-09-27 15:35:15 +05303 *
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.yms.app.ymsm;
18
19import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.apache.felix.scr.annotations.Service;
25import org.onosproject.core.ApplicationId;
26import org.onosproject.core.CoreService;
27import org.onosproject.core.IdGenerator;
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +053028import org.onosproject.event.ListenerService;
Vidyashree Rama76faccc2016-10-17 22:06:52 +053029import org.onosproject.yms.app.yab.YangApplicationBroker;
Shankara-Huaweid5823ab2016-11-22 10:14:52 +053030import org.onosproject.yms.app.ych.DefaultYangCodecHandler;
31import org.onosproject.yms.app.ych.defaultcodecs.YangCodecRegistry;
sonu gupta1bb37b82016-11-11 16:51:18 +053032import org.onosproject.yms.app.ydt.DefaultYdtWalker;
33import org.onosproject.yms.app.ydt.YangRequestWorkBench;
Bharat saraswalf53b29a2016-09-27 15:35:15 +053034import org.onosproject.yms.app.ynh.YangNotificationExtendedService;
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +053035import org.onosproject.yms.app.ynh.YangNotificationManager;
sonu guptaeff184b2016-11-24 12:43:49 +053036import org.onosproject.yms.app.ysr.DefaultYangModuleLibrary;
Bharat saraswalf53b29a2016-09-27 15:35:15 +053037import org.onosproject.yms.app.ysr.DefaultYangSchemaRegistry;
38import org.onosproject.yms.app.ysr.YangSchemaRegistry;
39import org.onosproject.yms.ych.YangCodecHandler;
40import org.onosproject.yms.ych.YangDataTreeCodec;
41import org.onosproject.yms.ych.YangProtocolEncodingFormat;
42import org.onosproject.yms.ydt.YdtBuilder;
43import org.onosproject.yms.ydt.YdtResponse;
44import org.onosproject.yms.ydt.YdtWalker;
45import org.onosproject.yms.ydt.YmsOperationType;
46import org.onosproject.yms.ymsm.YmsService;
47import org.onosproject.yms.ynh.YangNotificationService;
48import org.onosproject.yms.ysr.YangModuleIdentifier;
49import org.onosproject.yms.ysr.YangModuleLibrary;
50import org.slf4j.Logger;
51import org.slf4j.LoggerFactory;
52
53import java.util.List;
54import java.util.concurrent.ExecutorService;
Bharat saraswalf53b29a2016-09-27 15:35:15 +053055
sonu guptaeff184b2016-11-24 12:43:49 +053056import static java.lang.String.valueOf;
57import static java.util.concurrent.Executors.newSingleThreadExecutor;
Bharat saraswalf53b29a2016-09-27 15:35:15 +053058import static org.onlab.util.Tools.groupedThreads;
sonu guptaeff184b2016-11-24 12:43:49 +053059import static org.onosproject.yms.app.ych.defaultcodecs.YangCodecRegistry.initializeDefaultCodec;
Bharat saraswalf53b29a2016-09-27 15:35:15 +053060
61/**
62 * Represents implementation of YANG management system manager.
63 */
64@Service
65@Component(immediate = true)
66public class YmsManager
67 implements YmsService {
68
69 private final Logger log = LoggerFactory.getLogger(getClass());
70
71 private static final String APP_ID = "org.onosproject.app.yms";
72 private static final String MODULE_ID = "module-id";
73 private ApplicationId appId;
74 private YangSchemaRegistry schemaRegistry;
75 //module id generator should be used to generate a new module id for
76 //each YSR instance. So YCH also should generate it.
77 private IdGenerator moduleIdGenerator;
sonu guptaeff184b2016-11-24 12:43:49 +053078 private ExecutorService executor;
Bharat saraswalf53b29a2016-09-27 15:35:15 +053079 private YangNotificationExtendedService ynhExtendedService;
sonu guptaeff184b2016-11-24 12:43:49 +053080 private YangModuleLibrary library;
Bharat saraswalf53b29a2016-09-27 15:35:15 +053081
82 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
83 protected CoreService coreService;
84
85 @Activate
86 public void activate() {
87 appId = coreService.registerApplication(APP_ID);
88 moduleIdGenerator = coreService.getIdGenerator(MODULE_ID);
sonu guptaeff184b2016-11-24 12:43:49 +053089 schemaRegistry = new DefaultYangSchemaRegistry();
90 library = new DefaultYangModuleLibrary(getNewModuleId());
91 executor = newSingleThreadExecutor(groupedThreads(
92 "onos/apps/yang-management-system/schema-registry",
93 "schema-registry-handler", log));
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +053094 ynhExtendedService = new YangNotificationManager(schemaRegistry);
sonu guptaeff184b2016-11-24 12:43:49 +053095 //Initialize the default codec
96 initializeDefaultCodec();
Shankara-Huaweid5823ab2016-11-22 10:14:52 +053097
Bharat saraswalf53b29a2016-09-27 15:35:15 +053098 log.info("Started");
99 }
100
101 @Deactivate
102 public void deactivate() {
sonu guptaeff184b2016-11-24 12:43:49 +0530103 schemaRegistry.flushYsrData();
104 executor.shutdown();
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530105
106 // TODO implementation for other components.
107 log.info("Stopped");
108 }
109
110 @Override
111 public YdtBuilder getYdtBuilder(String logicalRootName,
112 String rootNamespace,
sonu guptaeff184b2016-11-24 12:43:49 +0530113 YmsOperationType opType) {
sonu gupta1bb37b82016-11-11 16:51:18 +0530114 return new YangRequestWorkBench(logicalRootName, rootNamespace,
sonu guptaeff184b2016-11-24 12:43:49 +0530115 opType, schemaRegistry, true);
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530116 }
117
118 @Override
119 public YdtBuilder getYdtBuilder(String logicalRootName,
120 String rootNamespace,
sonu guptaeff184b2016-11-24 12:43:49 +0530121 YmsOperationType opType,
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530122 Object schemaRegistryForYdt) {
sonu gupta1bb37b82016-11-11 16:51:18 +0530123 if (schemaRegistryForYdt != null) {
sonu guptaeff184b2016-11-24 12:43:49 +0530124 return new YangRequestWorkBench(
125 logicalRootName, rootNamespace, opType,
126 (YangSchemaRegistry) schemaRegistryForYdt, false);
sonu gupta1bb37b82016-11-11 16:51:18 +0530127 }
128 return new YangRequestWorkBench(logicalRootName, rootNamespace,
sonu guptaeff184b2016-11-24 12:43:49 +0530129 opType, schemaRegistry, true);
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530130 }
131
132 @Override
133 public YdtWalker getYdtWalker() {
sonu gupta1bb37b82016-11-11 16:51:18 +0530134 return new DefaultYdtWalker();
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530135 }
136
137 @Override
138 public YdtResponse executeOperation(YdtBuilder operationRequest) {
Vidyashree Rama76faccc2016-10-17 22:06:52 +0530139 YangApplicationBroker requestBroker =
140 new YangApplicationBroker(schemaRegistry);
141 switch (operationRequest.getYmsOperationType()) {
142 case EDIT_CONFIG_REQUEST:
143 try {
144 return requestBroker.processEdit(operationRequest);
145 } catch (CloneNotSupportedException e) {
146 log.error("YAB: failed to process edit request.");
147 }
148 case QUERY_CONFIG_REQUEST:
149 // TODO : to be implemented
150 case QUERY_REQUEST:
151 return requestBroker.processQuery(operationRequest);
152 case RPC_REQUEST:
153 return requestBroker.processOperation(operationRequest);
154 default:
155 // TODO : throw exception
156 }
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530157 return null;
158 }
159
160 @Override
161 public YangNotificationService getYangNotificationService() {
162 return ynhExtendedService;
163 }
164
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530165 @Override
166 public YangModuleLibrary getYangModuleLibrary() {
sonu guptaeff184b2016-11-24 12:43:49 +0530167 //TODO: get for YCH should be handled.
168 return library;
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530169 }
170
171 @Override
172 public String getYangFile(YangModuleIdentifier moduleIdentifier) {
sonu guptaeff184b2016-11-24 12:43:49 +0530173 return schemaRegistry.getYangFile(moduleIdentifier);
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530174 }
175
176 @Override
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530177 public void registerDefaultCodec(YangDataTreeCodec defaultCodec,
178 YangProtocolEncodingFormat dataFormat) {
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530179 YangCodecRegistry.registerDefaultCodec(defaultCodec, dataFormat);
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530180 }
181
182 @Override
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530183 public void registerService(Object manager, Class<?> service,
184 List<String> features) {
sonu guptaeff184b2016-11-24 12:43:49 +0530185 //perform registration of service
186 executor.execute(() -> {
187
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530188 schemaRegistry.registerApplication(manager, service);
sonu guptaeff184b2016-11-24 12:43:49 +0530189 //process notification registration.
190 processNotificationRegistration(manager, service);
191
192 schemaRegistry.processModuleLibrary(service.getName(), library);
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530193 });
194 // TODO implementation based on supported features.
195 }
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530196
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530197 /**
198 * Process notification registration for manager class object.
199 *
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530200 * @param manager yang manager
sonu guptaeff184b2016-11-24 12:43:49 +0530201 * @param service service class
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530202 */
sonu guptaeff184b2016-11-24 12:43:49 +0530203 private void processNotificationRegistration(Object manager, Class<?> service) {
204 synchronized (service) {
205 if (manager != null && manager instanceof ListenerService) {
206 if (schemaRegistry.verifyNotificationObject(manager, service)) {
207 ynhExtendedService.registerAsListener((ListenerService) manager);
208 }
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530209 }
210 }
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530211 }
212
213 @Override
214 public void unRegisterService(Object appManager, Class<?> yangService) {
215 schemaRegistry.unRegisterApplication(appManager, yangService);
216 }
217
218 @Override
219 public YangCodecHandler getYangCodecHandler() {
sonu guptaeff184b2016-11-24 12:43:49 +0530220 YangSchemaRegistry registry = new DefaultYangSchemaRegistry();
221 DefaultYangCodecHandler handler = new DefaultYangCodecHandler(registry);
222 handler.setLibrary(new DefaultYangModuleLibrary(getNewModuleId()));
223 return handler;
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530224 }
225
226 /**
227 * Returns schema registry.
228 *
229 * @return schema registry
230 */
231 public YangSchemaRegistry getSchemaRegistry() {
232 return schemaRegistry;
233 }
sonu guptaeff184b2016-11-24 12:43:49 +0530234
235 /**
236 * Returns new generated module id.
237 *
238 * @return new module id
239 */
240 private String getNewModuleId() {
241 return valueOf(moduleIdGenerator.getNewId());
242 }
Bharat saraswalf53b29a2016-09-27 15:35:15 +0530243}