2 * Copyright (c) 2015 Cisco Systems, Inc. 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.lispflowmapping.implementation.mdsal;
10 import java.util.ArrayList;
11 import java.util.List;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
18 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
19 import org.opendaylight.lispflowmapping.implementation.util.InstanceIdentifierUtil;
20 import org.opendaylight.lispflowmapping.implementation.util.LispAddressStringifier;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.MappingDatabase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.db.instance.AuthenticationKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.db.instance.Mapping;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mapping.database.rev150314.mapping.database.InstanceId;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
29 import com.google.common.base.Optional;
30 import com.google.common.util.concurrent.CheckedFuture;
33 * Stores data coming from the mapping database RPCs into the config datastore.
35 * @author Lorand Jakab
38 public class DataStoreBackEnd {
39 protected static final Logger LOG = LoggerFactory.getLogger(DataStoreBackEnd.class);
41 private DataBroker broker;
43 public DataStoreBackEnd(DataBroker broker) {
47 public void addAuthenticationKey(AuthenticationKey authenticationKey) {
48 LOG.debug("MD-SAL: Adding authentication key '{}' for {}", authenticationKey.getAuthkey(),
49 LispAddressStringifier.getString(authenticationKey.getLispAddressContainer(),
50 authenticationKey.getMaskLength()));
52 InstanceIdentifier<AuthenticationKey> path = InstanceIdentifierUtil
53 .createAuthenticationKeyIid(authenticationKey.getLispAddressContainer(),
54 authenticationKey.getMaskLength());
55 writePutTransaction(path, authenticationKey, LogicalDatastoreType.CONFIGURATION,
56 "Adding authentication key to config datastrore failed");
59 public void addMapping(Mapping mapping) {
60 LOG.debug("MD-SAL: Adding mapping for {}",
61 LispAddressStringifier.getString(mapping.getLispAddressContainer(), mapping.getMaskLength()));
63 InstanceIdentifier<Mapping> path = InstanceIdentifierUtil
64 .createMappingIid(mapping.getLispAddressContainer(), mapping.getMaskLength(), mapping.getOrigin());
65 writePutTransaction(path, mapping, LogicalDatastoreType.CONFIGURATION,
66 "Adding mapping to config datastrore failed");
69 public void removeAuthenticationKey(AuthenticationKey authenticationKey) {
70 LOG.debug("MD-SAL: Removing authentication key for {}",
71 LispAddressStringifier.getString(authenticationKey.getLispAddressContainer(),
72 authenticationKey.getMaskLength()));
74 InstanceIdentifier<AuthenticationKey> path = InstanceIdentifierUtil
75 .createAuthenticationKeyIid(authenticationKey.getLispAddressContainer(),
76 authenticationKey.getMaskLength());
77 deleteTransaction(path, LogicalDatastoreType.CONFIGURATION,
78 "Deleting authentication key from config datastrore failed");
81 public void removeMapping(Mapping mapping) {
82 LOG.debug("MD-SAL: Removing mapping for {}",
83 LispAddressStringifier.getString(mapping.getLispAddressContainer(), mapping.getMaskLength()));
85 InstanceIdentifier<Mapping> path = InstanceIdentifierUtil
86 .createMappingIid(mapping.getLispAddressContainer(), mapping.getMaskLength(), mapping.getOrigin());
87 deleteTransaction(path, LogicalDatastoreType.CONFIGURATION, "Deleting mapping from config datastrore failed");
90 public void updateAuthenticationKey(AuthenticationKey authenticationKey) {
91 LOG.debug("MD-SAL: Updating authentication key for {} with '{}'",
92 LispAddressStringifier.getString(authenticationKey.getLispAddressContainer(),
93 authenticationKey.getMaskLength()), authenticationKey.getAuthkey());
95 InstanceIdentifier<AuthenticationKey> path = InstanceIdentifierUtil
96 .createAuthenticationKeyIid(authenticationKey.getLispAddressContainer(),
97 authenticationKey.getMaskLength());
98 writePutTransaction(path, authenticationKey, LogicalDatastoreType.CONFIGURATION,
99 "Updating authentication key in config datastrore failed");
102 public void updateMapping(Mapping mapping) {
103 LOG.debug("MD-SAL: Updating mapping for {}",
104 LispAddressStringifier.getString(mapping.getLispAddressContainer(), mapping.getMaskLength()));
106 InstanceIdentifier<Mapping> path = InstanceIdentifierUtil
107 .createMappingIid(mapping.getLispAddressContainer(), mapping.getMaskLength(), mapping.getOrigin());
108 writePutTransaction(path, mapping, LogicalDatastoreType.CONFIGURATION,
109 "Updating mapping in config datastrore failed");
112 public List<Mapping> getAllMappings() {
113 LOG.debug("MD-SAL: Get all mappings from datastore");
114 List<Mapping> mappings = new ArrayList<Mapping>();
115 InstanceIdentifier<MappingDatabase> path = InstanceIdentifier.create(MappingDatabase.class);
116 MappingDatabase mdb = readTransaction(path, LogicalDatastoreType.CONFIGURATION);
119 for (InstanceId id : mdb.getInstanceId()) {
120 List<Mapping> ms = id.getMapping();
130 public List<AuthenticationKey> getAllAuthenticationKeys() {
131 LOG.debug("MD-SAL: Get all authentication keys from datastore");
132 List<AuthenticationKey> authKeys = new ArrayList<AuthenticationKey>();
133 InstanceIdentifier<MappingDatabase> path = InstanceIdentifier.create(MappingDatabase.class);
134 MappingDatabase mdb = readTransaction(path, LogicalDatastoreType.CONFIGURATION);
137 for (InstanceId id : mdb.getInstanceId()) {
138 List<AuthenticationKey> keys = id.getAuthenticationKey();
140 authKeys.addAll(keys);
148 private <U extends org.opendaylight.yangtools.yang.binding.DataObject> boolean writePutTransaction(
149 InstanceIdentifier<U> addIID, U data, LogicalDatastoreType logicalDatastoreType, String errMsg) {
151 WriteTransaction writeTx = broker.newWriteOnlyTransaction();
152 writeTx.put(logicalDatastoreType, addIID, data, true);
153 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = writeTx.submit();
155 submitFuture.checkedGet();
157 } catch (TransactionCommitFailedException e) {
158 LOG.error("{} : {}", errMsg, e.getMessage());
164 private <U extends org.opendaylight.yangtools.yang.binding.DataObject> U readTransaction(
165 InstanceIdentifier<U> readIID, LogicalDatastoreType logicalDatastoreType) {
167 ReadOnlyTransaction readTx = broker.newReadOnlyTransaction();
168 Optional<U> optionalDataObject;
169 CheckedFuture<Optional<U>, ReadFailedException> submitFuture = readTx.read(logicalDatastoreType, readIID);
171 optionalDataObject = submitFuture.checkedGet();
172 if (optionalDataObject != null && optionalDataObject.isPresent()) {
173 ret = optionalDataObject.get();
175 LOG.debug("{}: Failed to read", Thread.currentThread().getStackTrace()[1]);
177 } catch (ReadFailedException e) {
178 LOG.warn("Failed to ....", e);
183 private <U extends org.opendaylight.yangtools.yang.binding.DataObject> boolean deleteTransaction(
184 InstanceIdentifier<U> deleteIID, LogicalDatastoreType logicalDatastoreType, String errMsg) {
187 WriteTransaction writeTx = broker.newWriteOnlyTransaction();
188 writeTx.delete(logicalDatastoreType, deleteIID);
189 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = writeTx.submit();
191 submitFuture.checkedGet();
193 } catch (TransactionCommitFailedException e) {
194 LOG.error("{} : {}", errMsg, e.getMessage());