1db3433e27f78cfa3e836eeb3dbdd7d1fd5711b3
[ccsdk/features.git] /
1 /*******************************************************************************
2  * ============LICENSE_START========================================================================
3  * ONAP : ccsdk feature sdnr wt
4  * =================================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6  * =================================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License
13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14  * or implied. See the License for the specific language governing permissions and limitations under
15  * the License.
16  * ============LICENSE_END==========================================================================
17  ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.impl;
19
20 import java.time.ZonedDateTime;
21 import java.util.ArrayList;
22 import java.util.List;
23 import javax.annotation.Nonnull;
24 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsBaseRequireNetworkElement;
25 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDataBaseReaderAndWriter;
26 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract;
27 import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode;
28 import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.impl.IndexMwtnService;
29 import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceRPCServiceAPI;
30 import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceService;
31 import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types.EsMaintenanceFilter;
32 import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types.EsMaintenanceFilterDefinition;
33 import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types.EsMaintenanceMode;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeOutputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetRequiredNetworkElementKeysOutputBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeOutputBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementOutputBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeOutputBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.show.required.network.element.output.RequiredNetworkElementBuilder;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 public class MaintenanceServiceImpl implements MaintenanceService, MaintenanceRPCServiceAPI, AutoCloseable {
48
49     private static final Logger LOG = LoggerFactory.getLogger(MaintenanceServiceImpl.class);
50
51     /**
52      * Use the Client Index
53      */
54     private HtDataBaseReaderAndWriter<EsMaintenanceMode> maintenanceRW;
55     private HtDataBaseReaderAndWriter<EsBaseRequireNetworkElement> requiredNeRW;
56
57     public MaintenanceServiceImpl(HtDatabaseClientAbstract client) {
58
59         LOG.info("Create {} start", MaintenanceServiceImpl.class);
60
61         try {
62             // Create control structure
63             maintenanceRW = new HtDataBaseReaderAndWriter<>(client, EsMaintenanceMode.ESDATATYPENAME, EsMaintenanceMode.class);
64             requiredNeRW = new HtDataBaseReaderAndWriter<>(client, EsBaseRequireNetworkElement.ESDATATYPENAME, EsBaseRequireNetworkElement.class);
65
66         } catch (Exception e) {
67             LOG.error("Can not start database client. Exception: {}", e.getMessage());
68         }
69         LOG.info("Create {} finished. DB Service {} started.", MaintenanceServiceImpl.class,  client != null ? "sucessfully" : "not" );
70
71     }
72
73     public MaintenanceServiceImpl(HtDatabaseNode database) {
74         this(getDatabaseClient(database));
75     }
76
77     private static HtDatabaseClientAbstract getDatabaseClient(HtDatabaseNode database) {
78         return new HtDatabaseClientAbstract(IndexMwtnService.INDEX,database);
79     }
80
81     /**
82      * Get existing object for mountpoint to manage maintenance mode
83      * @return Object with configuration
84      */
85     private @Nonnull EsMaintenanceMode getMaintenance(String mountpointId)
86     {
87         EsMaintenanceMode deviceMaintenanceMode = null;
88         if (maintenanceRW != null) {
89             deviceMaintenanceMode = maintenanceRW.doRead(mountpointId);
90         }
91
92         return deviceMaintenanceMode == null ? EsMaintenanceMode.getNotInMaintenance() : deviceMaintenanceMode;
93     }
94     /**
95      * Check in required ne if entry exists for mountpointNodeName
96      * @param mountPointNodeName
97      * @return
98      */
99     private boolean isRequireNe(String mountPointNodeName) {
100         EsBaseRequireNetworkElement ne=null;
101         if( requiredNeRW!=null)
102         {
103             LOG.debug("searching for entry in required-networkelement for "+mountPointNodeName);
104             ne = requiredNeRW.doRead(mountPointNodeName);
105         } else {
106             LOG.warn("cannot read db. no db reader writer initialized");
107         }
108         return ne!=null;
109     }
110     public EsMaintenanceMode createIfNotExists(String mountpointId)
111     {
112         EsMaintenanceMode deviceMaintenanceMode = null;
113         if (maintenanceRW != null)
114         {
115              deviceMaintenanceMode = maintenanceRW.doRead(mountpointId);
116              if(deviceMaintenanceMode==null)
117              {
118                  LOG.debug("creating empty maintenance object in database");
119                  deviceMaintenanceMode=new EsMaintenanceMode(mountpointId);
120                  EsMaintenanceFilter filter = new EsMaintenanceFilter();
121                  filter.setDescription("");
122                  filter.setStart(null);
123                  filter.setEnd(null);
124                  EsMaintenanceFilterDefinition definition=new EsMaintenanceFilterDefinition();
125                  definition.setObjectIdRef("");
126                  definition.setProblem("");
127                  filter.setDefinition(definition);
128                  deviceMaintenanceMode.addFilter(filter );
129                  maintenanceRW.doWrite(deviceMaintenanceMode);
130              } else {
131                 LOG.debug("maintenance object already exists in database");
132             }
133         } else {
134             LOG.warn("cannot create maintenance obj. db reader/writer is null");
135         }
136
137         return deviceMaintenanceMode;
138     }
139     public void deleteIfNotRequired(String mountPointNodeName) {
140
141         if(!this.isRequireNe(mountPointNodeName))
142         {
143             EsMaintenanceMode deviceMaintenanceMode = new EsMaintenanceMode(mountPointNodeName);
144             if (maintenanceRW != null)
145             {
146                 LOG.debug("removing maintenance object in database for "+mountPointNodeName);
147                 maintenanceRW.doRemove(deviceMaintenanceMode);
148             } else {
149                 LOG.warn("cannot create maintenance obj. db reader/writer is null");
150             }
151         }
152
153     }
154
155
156
157     /*-------------------------------------------------
158      * Interface AutoClosable
159      */
160
161     @Override
162     public void close() throws Exception {
163     }
164
165     /*-------------------------------------------------
166      * Interface MaintenanceRPCServiceAPI
167      */
168
169     @Override
170     public GetRequiredNetworkElementKeysOutputBuilder getRequiredNetworkElementKeys() {
171         GetRequiredNetworkElementKeysOutputBuilder outputBuilder = new GetRequiredNetworkElementKeysOutputBuilder();
172         List<EsMaintenanceMode> all = maintenanceRW != null ? maintenanceRW.doReadAll() : new ArrayList<>();
173         List<String> mountpointList = new ArrayList<>();
174         for (EsMaintenanceMode oneOfAll : all) {
175             mountpointList.add(oneOfAll.getEsId());
176
177         }
178         outputBuilder.setMountpointNames(mountpointList);
179         return outputBuilder;
180     }
181
182     @Override
183     public ShowRequiredNetworkElementOutputBuilder showRequiredNetworkElement(ShowRequiredNetworkElementInput input) {
184         ShowRequiredNetworkElementOutputBuilder outputBuilder = new ShowRequiredNetworkElementOutputBuilder();
185         EsMaintenanceMode maintenanceMode = new EsMaintenanceMode(input.getMountpointName());
186         if (maintenanceRW != null) {
187             maintenanceMode = maintenanceRW.doRead(maintenanceMode);
188         }
189         if (maintenanceMode != null) {
190             RequiredNetworkElementBuilder valueBuilder = new RequiredNetworkElementBuilder();
191
192             valueBuilder.setMountpointName(maintenanceMode.getNode());
193             valueBuilder.setStatus(String.valueOf(maintenanceMode.isONFObjectInMaintenance("","")));
194             valueBuilder.setDescription("Pretty description here");
195             outputBuilder.setRequiredNetworkElement(valueBuilder.build());
196         } else {
197             LOG.warn("No info in database for {}",input.getMountpointName());
198         }
199         return outputBuilder;
200     }
201
202     @Override
203     public GetMaintenanceModeOutputBuilder getMaintenanceMode(GetMaintenanceModeInput input) {
204         EsMaintenanceMode maintenanceMode = null;
205         GetMaintenanceModeOutputBuilder outputBuilder;
206         if (maintenanceRW != null) {
207             maintenanceMode = maintenanceRW.doRead(input.getMountpointName());
208         }
209         if (maintenanceMode != null) {
210             outputBuilder = new GetMaintenanceModeOutputBuilder(maintenanceMode);
211         } else {
212             throw new IllegalArgumentException("No info in database for "+input.getMountpointName());
213         }
214         return outputBuilder;
215     }
216
217     @Override
218     public SetMaintenanceModeOutputBuilder setMaintenanceMode(SetMaintenanceModeInput input) {
219
220         SetMaintenanceModeOutputBuilder outputBuilder = new SetMaintenanceModeOutputBuilder();
221         if (maintenanceRW != null) {
222             EsMaintenanceMode m = new EsMaintenanceMode(input);
223             if (maintenanceRW.doWrite(m) == null) {
224                 throw new IllegalArgumentException("Problem writing to database: "+input.getMountpointName());
225             }
226             outputBuilder = new SetMaintenanceModeOutputBuilder(m);
227             LOG.info("Wrote maintenance object {}", m.toString());
228         }
229         return outputBuilder;
230     }
231
232     @Override
233     public TestMaintenanceModeOutputBuilder testMaintenanceMode(TestMaintenanceModeInput input) {
234
235         StringBuffer resultString = new StringBuffer();
236
237         EsMaintenanceMode maintenanceMode = getMaintenance(input.getMountpointName());
238
239         TestMaintenanceModeOutputBuilder outputBuilder = new TestMaintenanceModeOutputBuilder(maintenanceMode);
240
241         ZonedDateTime now = EsMaintenanceFilter.valueOf(input.getTestDate());
242
243         resultString.append("In database table: ");
244         resultString.append(!(EsMaintenanceMode.getNotInMaintenance() == maintenanceMode));
245         resultString.append(" Maintenance active: ");
246         resultString.append(maintenanceMode.isONFObjectInMaintenance(input.getObjectIdRef(), input.getProblemName(), now));
247         resultString.append(" at Timestamp: ");
248         resultString.append(now);
249
250         outputBuilder.setResultString(resultString.toString());
251
252         return outputBuilder;
253     }
254
255     /*-------------------------------------------------
256      * Interface MaintenaceService
257      */
258
259     @Override
260     public boolean isONFObjectInMaintenance(String mountpointReference, String objectIdRef, String problem) {
261         EsMaintenanceMode maintenanceMode = getMaintenance(mountpointReference);
262         boolean res = maintenanceMode.isONFObjectInMaintenance(objectIdRef, problem);
263         LOG.debug("inMaintenance={} for mountpoint/id/problem:{} {} {} Definition: {}",res, mountpointReference, objectIdRef, problem, this );
264         return res;
265     }
266
267
268
269 }