From: Sam Hague Date: Mon, 21 Sep 2015 01:45:11 +0000 (-0400) Subject: Mdsal utils bundle X-Git-Tag: release/beryllium-sr2~412^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=d7f284495da2bb68ddcc52b9925cc21127a12585;p=netvirt.git Mdsal utils bundle Patch set 2: Renamed to MdsalUtils and matched the strucure of the other bundles in the utils dir. This commit adds a Mdsal utils bundle that has all the mdsal methods to read, write, delete and merge to the datastore. This is so that other bundles can reuse the same methods. Change-Id: Ida83ed957f74155224b007b54e3e80bfb1e29a71 Signed-off-by: Sam Hague --- diff --git a/utils/mdsal-utils/pom.xml b/utils/mdsal-utils/pom.xml new file mode 100644 index 0000000000..c218c8b319 --- /dev/null +++ b/utils/mdsal-utils/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + org.opendaylight.mdsal + binding-parent + 0.8.0-SNAPSHOT + + + + org.opendaylight.ovsdb + utils.mdsal-utils + 1.2.0-SNAPSHOT + bundle + + + + com.google.guava + guava + + + org.opendaylight.controller + sal-binding-api + 1.3.0-SNAPSHOT + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-simple + test + + + junit + junit + test + + + org.mockito + mockito-all + test + + + + \ No newline at end of file diff --git a/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalUtils.java b/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalUtils.java new file mode 100644 index 0000000000..642ba080ae --- /dev/null +++ b/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalUtils.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2015 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.ovsdb.utils.mdsal.utils; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MdsalUtils { + private static final Logger LOG = LoggerFactory.getLogger(MdsalUtils.class); + private DataBroker databroker = null; + + /** + * Class constructor setting the data broker. + * + * @param dataBroker the {@link org.opendaylight.controller.md.sal.binding.api.DataBroker} + */ + public MdsalUtils(DataBroker dataBroker) { + this.databroker = dataBroker; + } + + /** + * Executes delete as a blocking transaction. + * + * @param store {@link LogicalDatastoreType} which should be modified + * @param path {@link InstanceIdentifier} to read from + * @param the data object type + * @return the result of the request + */ + public boolean delete( + final LogicalDatastoreType store, final InstanceIdentifier path) { + boolean result = false; + final WriteTransaction transaction = databroker.newWriteOnlyTransaction(); + transaction.delete(store, path); + CheckedFuture future = transaction.submit(); + try { + future.checkedGet(); + result = true; + } catch (TransactionCommitFailedException e) { + LOG.warn("Failed to delete {} ", path, e); + } + return result; + } + + /** + * Executes merge as a blocking transaction. + * + * @param logicalDatastoreType {@link LogicalDatastoreType} which should be modified + * @param path {@link InstanceIdentifier} for path to read + * @param the data object type + * @return the result of the request + */ + public boolean merge( + final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier path, D data) { + boolean result = false; + final WriteTransaction transaction = databroker.newWriteOnlyTransaction(); + transaction.merge(logicalDatastoreType, path, data, true); + CheckedFuture future = transaction.submit(); + try { + future.checkedGet(); + result = true; + } catch (TransactionCommitFailedException e) { + LOG.warn("Failed to merge {} ", path, e); + } + return result; + } + + /** + * Executes put as a blocking transaction. + * + * @param logicalDatastoreType {@link LogicalDatastoreType} which should be modified + * @param path {@link InstanceIdentifier} for path to read + * @param the data object type + * @return the result of the request + */ + public boolean put( + final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier path, D data) { + boolean result = false; + final WriteTransaction transaction = databroker.newWriteOnlyTransaction(); + transaction.put(logicalDatastoreType, path, data, true); + CheckedFuture future = transaction.submit(); + try { + future.checkedGet(); + result = true; + } catch (TransactionCommitFailedException e) { + LOG.warn("Failed to put {} ", path, e); + } + return result; + } + + /** + * Executes read as a blocking transaction. + * + * @param store {@link LogicalDatastoreType} to read + * @param path {@link InstanceIdentifier} for path to read + * @param the data object type + * @return the result as the data object requested + */ + public D read( + final LogicalDatastoreType store, final InstanceIdentifier path) { + D result = null; + final ReadOnlyTransaction transaction = databroker.newReadOnlyTransaction(); + Optional optionalDataObject; + CheckedFuture, ReadFailedException> future = transaction.read(store, path); + try { + optionalDataObject = future.checkedGet(); + if (optionalDataObject.isPresent()) { + result = optionalDataObject.get(); + } else { + LOG.debug("{}: Failed to read {}", + Thread.currentThread().getStackTrace()[1], path); + } + } catch (ReadFailedException e) { + LOG.warn("Failed to read {} ", path, e); + } + transaction.close(); + return result; + } +} diff --git a/utils/mdsal-utils/src/test/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalUtilsTest.java b/utils/mdsal-utils/src/test/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalUtilsTest.java new file mode 100644 index 0000000000..c0e9ebbf21 --- /dev/null +++ b/utils/mdsal-utils/src/test/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalUtilsTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2015 Inocybe and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.ovsdb.utils.mdsal.utils; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; + +/** + * Unit test for class {@link MdsalUtils} + * + */ +@RunWith(MockitoJUnitRunner.class) +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class MdsalUtilsTest { + + @InjectMocks private MdsalUtils mdsalUtils; + + @Mock private DataBroker databroker; + + @Test + public void testDelete() { + WriteTransaction writeTransaction = mock(WriteTransaction.class); + when(databroker.newWriteOnlyTransaction()).thenReturn(writeTransaction); + CheckedFuture future = mock(CheckedFuture.class); + when(writeTransaction.submit()).thenReturn(future ); + + boolean result = mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, mock(InstanceIdentifier.class)); + + verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)); + verify(writeTransaction, times(1)).submit(); + + assertTrue("Error, the delete transaction failed", result); + } + + @Test + public void testMerge() { + WriteTransaction writeTransaction = mock(WriteTransaction.class); + when(databroker.newWriteOnlyTransaction()).thenReturn(writeTransaction); + CheckedFuture future = mock(CheckedFuture.class); + when(writeTransaction.submit()).thenReturn(future ); + + boolean result = mdsalUtils.merge(LogicalDatastoreType.CONFIGURATION, mock(InstanceIdentifier.class), mock(DataObject.class)); + + verify(writeTransaction, times(1)).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class), anyBoolean()); + verify(writeTransaction, times(1)).submit(); + + assertTrue("Error, the merge transaction failed", result); + } + + @Test + public void testPut() { + WriteTransaction writeTransaction = mock(WriteTransaction.class); + when(databroker.newWriteOnlyTransaction()).thenReturn(writeTransaction); + CheckedFuture future = mock(CheckedFuture.class); + when(writeTransaction.submit()).thenReturn(future ); + + boolean result = mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, mock(InstanceIdentifier.class), mock(DataObject.class)); + + verify(writeTransaction, times(1)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class), anyBoolean()); + verify(writeTransaction, times(1)).submit(); + + assertTrue("Error, the put transaction failed", result); + } + + @Test + public void testRead() throws ReadFailedException { + ReadOnlyTransaction readOnlyTransaction = mock(ReadOnlyTransaction.class); + when(databroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction); + CheckedFuture future = mock(CheckedFuture.class); + Optional opt = mock(Optional.class); + when(opt.isPresent()).thenReturn(true); + DataObject obj = mock(DataObject.class); + when(opt.get()).thenReturn(obj ); + when(future.checkedGet()).thenReturn(opt); + when(readOnlyTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(future); + + DataObject result = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, mock(InstanceIdentifier.class)); + + verify(readOnlyTransaction, times(1)).read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)); + verify(readOnlyTransaction, times(1)).close(); + + assertEquals("Error, the read transaction failed", obj, result); + } +} diff --git a/utils/pom.xml b/utils/pom.xml index 42b9b7108a..2d57c9aa9a 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -52,5 +52,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html mdsal-node mdsal-openflow servicehelper + mdsal-utils