NormalizedNodeAggregator should also report empty
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / DistributedDataStoreFactory.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. 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.controller.cluster.datastore;
9
10 import akka.actor.ActorSystem;
11 import org.opendaylight.controller.cluster.ActorSystemProvider;
12 import org.opendaylight.controller.cluster.databroker.ClientBackedDataStore;
13 import org.opendaylight.controller.cluster.datastore.config.Configuration;
14 import org.opendaylight.controller.cluster.datastore.config.ConfigurationImpl;
15 import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot;
16 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19
20 public final class DistributedDataStoreFactory {
21
22     private static final Logger LOG = LoggerFactory.getLogger(DistributedDataStoreFactory.class);
23     private static final String DEFAULT_MODULE_SHARDS_PATH = "./configuration/initial/module-shards.conf";
24     private static final String DEFAULT_MODULES_PATH = "./configuration/initial/modules.conf";
25
26     private DistributedDataStoreFactory() {
27     }
28
29     public static AbstractDataStore createInstance(final DOMSchemaService schemaService,
30             final DatastoreContext initialDatastoreContext, final DatastoreSnapshotRestore datastoreSnapshotRestore,
31             final ActorSystemProvider actorSystemProvider, final DatastoreContextIntrospector introspector,
32             final DatastoreContextPropertiesUpdater updater) {
33         return createInstance(schemaService, initialDatastoreContext, datastoreSnapshotRestore, actorSystemProvider,
34                 introspector, updater, null);
35     }
36
37     // TODO: separate out settle wait so it is better controlled
38     public static AbstractDataStore createInstance(final DOMSchemaService schemaService,
39             final DatastoreContext initialDatastoreContext, final DatastoreSnapshotRestore datastoreSnapshotRestore,
40             final ActorSystemProvider actorSystemProvider, final DatastoreContextIntrospector introspector,
41             final DatastoreContextPropertiesUpdater updater, final Configuration orgConfig) {
42
43         final AbstractDataStore dataStore = createInstance(actorSystemProvider, initialDatastoreContext,
44             introspector, datastoreSnapshotRestore, orgConfig);
45
46         updater.setListener(dataStore);
47
48         schemaService.registerSchemaContextListener(dataStore);
49
50         dataStore.setCloseable(updater);
51         dataStore.waitTillReady();
52
53         return dataStore;
54     }
55
56     public static AbstractDataStore createInstance(final ActorSystemProvider actorSystemProvider,
57             final DatastoreContext initialDatastoreContext, final DatastoreContextIntrospector introspector,
58             final DatastoreSnapshotRestore datastoreSnapshotRestore, final Configuration orgConfig) {
59
60         final String datastoreName = initialDatastoreContext.getDataStoreName();
61         LOG.info("Create data store instance of type : {}", datastoreName);
62
63         final ActorSystem actorSystem = actorSystemProvider.getActorSystem();
64         final DatastoreSnapshot restoreFromSnapshot = datastoreSnapshotRestore.getAndRemove(datastoreName).orElse(null);
65
66         final Configuration config;
67         if (orgConfig == null) {
68             config = new ConfigurationImpl(DEFAULT_MODULE_SHARDS_PATH, DEFAULT_MODULES_PATH);
69         } else {
70             config = orgConfig;
71         }
72         final ClusterWrapper clusterWrapper = new ClusterWrapperImpl(actorSystem);
73         final DatastoreContextFactory contextFactory = introspector.newContextFactory();
74
75         // This is the potentially-updated datastore context, distinct from the initial one
76         final DatastoreContext datastoreContext = contextFactory.getBaseDatastoreContext();
77
78         final AbstractDataStore dataStore;
79         if (datastoreContext.isUseTellBasedProtocol()) {
80             dataStore = new ClientBackedDataStore(actorSystem, clusterWrapper, config, contextFactory,
81                 restoreFromSnapshot);
82             LOG.info("Data store {} is using tell-based protocol", datastoreName);
83         } else {
84             dataStore = new DistributedDataStore(actorSystem, clusterWrapper, config, contextFactory,
85                 restoreFromSnapshot);
86             LOG.info("Data store {} is using ask-based protocol", datastoreName);
87         }
88
89         return dataStore;
90     }
91 }