Migrate topology-manager to CompositeListener
[openflowplugin.git] / openflowjava / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / core / DefaultOpenflowDiagStatusProvider.java
1 /*
2  * Copyright (c) 2019 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.openflowjava.protocol.impl.core;
9
10 import static org.opendaylight.infrautils.diagstatus.ServiceState.ERROR;
11 import static org.opendaylight.infrautils.diagstatus.ServiceState.OPERATIONAL;
12 import static org.opendaylight.infrautils.diagstatus.ServiceState.STARTING;
13
14 import java.util.Map;
15 import java.util.concurrent.ConcurrentHashMap;
16 import java.util.concurrent.ConcurrentMap;
17 import javax.annotation.PreDestroy;
18 import javax.inject.Inject;
19 import javax.inject.Singleton;
20 import org.opendaylight.infrautils.diagstatus.DiagStatusService;
21 import org.opendaylight.infrautils.diagstatus.ServiceDescriptor;
22 import org.opendaylight.infrautils.diagstatus.ServiceRegistration;
23 import org.opendaylight.infrautils.diagstatus.ServiceState;
24 import org.opendaylight.openflowjava.protocol.api.connection.OpenflowDiagStatusProvider;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 @Singleton
29 public final class DefaultOpenflowDiagStatusProvider implements OpenflowDiagStatusProvider {
30     private static final Logger LOG = LoggerFactory.getLogger(DefaultOpenflowDiagStatusProvider.class);
31     private static final String OPENFLOW_SERVICE = "OPENFLOW";
32     private static final String OPENFLOW_SERVER_6633 = "OPENFLOW_SERVER_6633";
33     private static final String OPENFLOW_SERVER_6653 = "OPENFLOW_SERVER_6653";
34     private static final String OPENFLOW_SERVICE_AGGREGATE = OPENFLOW_SERVICE;
35
36     private final ConcurrentMap<String, ServiceState> statusMap = new ConcurrentHashMap<>(Map.of(
37         OPENFLOW_SERVICE, STARTING,
38         OPENFLOW_SERVER_6633, STARTING,
39         OPENFLOW_SERVER_6653, STARTING));
40     private final DiagStatusService diagStatusService;
41
42     private ServiceRegistration reg;
43
44     @Inject
45     public DefaultOpenflowDiagStatusProvider(final DiagStatusService diagStatusService) {
46         this.diagStatusService = diagStatusService;
47         reg = diagStatusService.register(OPENFLOW_SERVICE_AGGREGATE);
48     }
49
50     @PreDestroy
51     public void close() {
52         if (reg != null) {
53             reg.unregister();
54             reg = null;
55         }
56     }
57
58     @Override
59     public void reportStatus(final ServiceState serviceState) {
60         LOG.debug("reporting status as {} for {}", serviceState,OPENFLOW_SERVICE_AGGREGATE);
61         diagStatusService.report(new ServiceDescriptor(OPENFLOW_SERVICE_AGGREGATE, serviceState));
62     }
63
64     @Override
65     public void reportStatus(final String diagStatusIdentifier, final Throwable throwable) {
66         LOG.debug("Reporting error for {} as {}",  diagStatusIdentifier, throwable.toString());
67         statusMap.replace(diagStatusIdentifier, ERROR);
68         diagStatusService.report(new ServiceDescriptor(OPENFLOW_SERVICE_AGGREGATE, throwable));
69     }
70
71     @Override
72     public void reportStatus(final String diagStatusIdentifier, final ServiceState serviceState,
73                              final String description) {
74         LOG.debug("Reporting status {} for {} and desc {}", serviceState, diagStatusIdentifier, description);
75         diagStatusService.report(new ServiceDescriptor(OPENFLOW_SERVICE_AGGREGATE, serviceState, description));
76     }
77
78     @Override
79     public void reportStatus(final String diagStatusIdentifier, final ServiceState serviceState) {
80         statusMap.replace(diagStatusIdentifier, serviceState);
81         LOG.info("The report status is {} for {}", serviceState, diagStatusIdentifier);
82         reportStatus();
83     }
84
85     public void reportStatus() {
86         if (statusMap.values().stream().allMatch(OPERATIONAL::equals)) {
87             reportStatus(OPERATIONAL);
88         }
89     }
90 }