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
 
  10  * http://www.apache.org/licenses/LICENSE-2.0
 
  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
 
  16  * ============LICENSE_END==========================================================================
 
  18 package org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice;
 
  20 import java.util.Date;
 
  21 import java.util.concurrent.Executors;
 
  22 import java.util.concurrent.Future;
 
  23 import java.util.concurrent.ScheduledExecutorService;
 
  24 import java.util.concurrent.TimeUnit;
 
  26 import org.eclipse.jdt.annotation.NonNull;
 
  27 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
 
  28 import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener;
 
  29 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.ArchiveCleanProvider;
 
  30 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
 
  31 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 
  32 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
 
  33 import org.slf4j.Logger;
 
  34 import org.slf4j.LoggerFactory;
 
  36 import com.google.common.util.concurrent.Futures;
 
  37 import com.google.common.util.concurrent.ListenableFuture;
 
  39 public class ArchiveCleanService implements AutoCloseable, IConfigChangedListener, Runnable, ClusterSingletonService {
 
  41     private static final Logger LOG = LoggerFactory.getLogger(ArchiveCleanService.class);
 
  42     private static final ServiceGroupIdentifier IDENT =
 
  43             ServiceGroupIdentifier.create("ElasticSearchArchiveCleanService");
 
  45     private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 
  46     private final ArchiveCleanProvider[] indexCleanList;
 
  47     private final Runnable doClean;
 
  49     private final IEsConfig esConfig;
 
  50     private Future<?> taskReference;
 
  51     private boolean isMaster;
 
  53     public ArchiveCleanService(IEsConfig config, ArchiveCleanProvider... indexCleanList) {
 
  54         this.esConfig = config;
 
  55         this.esConfig.registerConfigChangedListener(this);
 
  57         this.indexCleanList = indexCleanList;
 
  59         this.taskReference = null;
 
  64     private void reinit() {
 
  66         if (taskReference != null) {
 
  67             taskReference.cancel(false);
 
  70             if (this.esConfig.getArchiveCheckIntervalSeconds() > 0) {
 
  71                 LOG.info("DBCleanService is turned on for entries older than {} seconds",
 
  72                         this.esConfig.getArchiveLifetimeSeconds());
 
  73                 taskReference = this.scheduler.scheduleAtFixedRate(doClean, 0,
 
  74                         this.esConfig.getArchiveCheckIntervalSeconds(), TimeUnit.SECONDS);
 
  76                 LOG.info("DBCleanService is turned off");
 
  79             LOG.info("service is inactive on this node. active on another node.");
 
  83     public Date getDateForOldElements() {
 
  84         return new Date(System.currentTimeMillis() - esConfig.getArchiveLifetimeSeconds() * 1000);
 
  87     public int countOldEntries() {
 
  89         Date olderAreOutdated = getDateForOldElements();
 
  90         for (ArchiveCleanProvider indexCleanElement : indexCleanList) {
 
  91             if (indexCleanElement != null) {
 
  92                 indexCleanElement.getNumberOfOldObjects(olderAreOutdated);
 
 103             Date olderElementToBeRemoved = getDateForOldElements();
 
 104             LOG.trace("cleaning logs from entries older than {}", olderElementToBeRemoved);
 
 106             for (ArchiveCleanProvider indexCleanElement : indexCleanList) {
 
 107                 if (indexCleanElement != null) {
 
 108                     removed += indexCleanElement.doIndexClean(olderElementToBeRemoved);
 
 112                 LOG.trace("Removed elements: {}", removed);
 
 114         } catch (Exception e) {
 
 115             LOG.warn("problem executing dbclean", e);
 
 120     public void onConfigChanged() {
 
 121         LOG.info("Not yet implemented. config changed. reninit timer");
 
 125     public void close() throws Exception {
 
 126         this.esConfig.unregisterConfigChangedListener(this);
 
 127         this.scheduler.shutdown();
 
 131     public String toString() {
 
 132         return "ArchivCleanService [ArchiveCheckIntervalSeconds=" + esConfig.getArchiveCheckIntervalSeconds()
 
 133                 + "ArchiveLifetimeSeconds=" + esConfig.getArchiveLifetimeSeconds() + "]";
 
 136     @SuppressWarnings("null")
 
 138     public @NonNull ServiceGroupIdentifier getIdentifier() {
 
 143     public void instantiateServiceInstance() {
 
 144         LOG.info("We take Leadership");
 
 145         this.isMaster = true;
 
 150     public ListenableFuture<? extends Object> closeServiceInstance() {
 
 151         LOG.info("We lost Leadership");
 
 152         this.isMaster = false;
 
 154         return Futures.immediateFuture(null);