2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.netconf.topology.singleton.impl;
10 import static java.util.Objects.requireNonNull;
12 import akka.util.Timeout;
13 import com.google.common.annotations.VisibleForTesting;
14 import com.google.common.util.concurrent.ListenableFuture;
15 import io.netty.util.concurrent.EventExecutor;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
18 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
19 import org.opendaylight.controller.config.threadpool.ThreadPool;
20 import org.opendaylight.mdsal.binding.api.DataBroker;
21 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
22 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
23 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
24 import org.opendaylight.netconf.client.NetconfClientDispatcher;
25 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas;
26 import org.opendaylight.netconf.client.mdsal.api.CredentialProvider;
27 import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory;
28 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
29 import org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager;
30 import org.opendaylight.netconf.client.mdsal.api.SslHandlerFactoryProvider;
31 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologySetup;
32 import org.opendaylight.netconf.topology.spi.NetconfNodeUtils;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode;
34 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 class NetconfTopologyContext implements ClusterSingletonService, AutoCloseable {
39 private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyContext.class);
41 private final @NonNull ServiceGroupIdentifier serviceGroupIdent;
42 private final NetconfTopologySingletonImpl topologySingleton;
44 private volatile boolean closed;
45 private volatile boolean isMaster;
47 private RemoteDeviceId remoteDeviceId;
49 NetconfTopologyContext(final String topologyId, final NetconfClientDispatcher clientDispatcher,
50 final EventExecutor eventExecutor, final ScheduledThreadPool keepaliveExecutor,
51 final ThreadPool processingExecutor, final SchemaResourceManager schemaManager,
52 final DataBroker dataBroker, final DOMMountPointService mountPointService,
53 final AAAEncryptionService encryptionService, final DeviceActionFactory deviceActionFactory,
54 final BaseNetconfSchemas baseSchemas, final Timeout actorResponseWaitTime,
55 final ServiceGroupIdentifier serviceGroupIdent, final NetconfTopologySetup setup,
56 final CredentialProvider credentialProvider, final SslHandlerFactoryProvider sslHandlerFactoryProvider) {
57 this.serviceGroupIdent = requireNonNull(serviceGroupIdent);
58 this.remoteDeviceId = NetconfNodeUtils.toRemoteDeviceId(setup.getNode().getNodeId(),
59 setup.getNode().augmentation(NetconfNode.class));
61 this.topologySingleton = new NetconfTopologySingletonImpl(topologyId, clientDispatcher,
62 eventExecutor, keepaliveExecutor, processingExecutor, schemaManager, dataBroker, mountPointService,
63 encryptionService, deviceActionFactory, baseSchemas, remoteDeviceId, setup, actorResponseWaitTime,
64 credentialProvider, sslHandlerFactoryProvider);
68 protected NetconfTopologySingletonImpl getTopologySingleton() {
69 // FIXME we have to access topology singleton via this method because of mocking in MountPointEndToEndTest
70 return topologySingleton;
74 public void instantiateServiceInstance() {
75 LOG.info("Leader was selected: {}", remoteDeviceId.host().getIpAddress());
77 LOG.warn("Instance is already closed.");
81 getTopologySingleton().becomeTopologyLeader();
84 // called when master is down/changed to slave
86 public ListenableFuture<?> closeServiceInstance() {
87 // this method is also called when topology data are deleted
88 LOG.info("Follower was selected: {}", remoteDeviceId.host().getIpAddress());
90 LOG.warn("Instance is already closed.");
91 return FluentFutures.immediateNullFluentFuture();
93 getTopologySingleton().becomeTopologyFollower();
94 return FluentFutures.immediateNullFluentFuture();
97 void refresh(final @NonNull NetconfTopologySetup setup) {
98 final var node = requireNonNull(setup).getNode();
99 remoteDeviceId = NetconfNodeUtils.toRemoteDeviceId(node.getNodeId(), node.augmentation(NetconfNode.class));
102 getTopologySingleton().disconnectNode(setup.getNode().getNodeId());
103 getTopologySingleton().refreshSetupConnection(setup, remoteDeviceId);
105 getTopologySingleton().refreshDevice(setup, remoteDeviceId);
110 public ServiceGroupIdentifier getIdentifier() {
111 return serviceGroupIdent;
115 public void close() {
117 LOG.warn("Instance is already closed.");
120 getTopologySingleton().close();