HONEYCOMB-34: Config initializer for ietf-interfaces 47/747/2
authorMarek Gradzki <mgradzki@cisco.com>
Tue, 12 Apr 2016 08:51:45 +0000 (10:51 +0200)
committerMarek Gradzki <mgradzki@cisco.com>
Tue, 12 Apr 2016 12:09:40 +0000 (14:09 +0200)
Change-Id: I164ab014638d40d1494dacb704c079c166256128
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/AbstractDataTreeConverter.java
v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializer.java [new file with mode: 0644]
v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializer.java
v3po/vpp-cfg-init/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/vpp/data/init/rev160407/VppConfigurationInitializerModule.java
v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializerTest.java [new file with mode: 0644]
v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializerTest.java [new file with mode: 0644]

index a8144f2..18c0dce 100644 (file)
@@ -47,11 +47,20 @@ public abstract class AbstractDataTreeConverter<O extends DataObject, C extends
     private final DataBroker bindingDataBroker;
 
     public AbstractDataTreeConverter(final DataBroker bindingDataBroker,
-                                     final InstanceIdentifier<O> idOper,
-                                     final InstanceIdentifier<C> idConfig) {
+                                     final InstanceIdentifier<O> operRootId,
+                                     final InstanceIdentifier<C> cfgRootId) {
         this.bindingDataBroker = checkNotNull(bindingDataBroker, "bindingDataBroker should not be null");
-        this.idOper = checkNotNull(idOper, "idOper should not be null");
-        this.idConfig = checkNotNull(idConfig, "idConfig should not be null");
+        this.idOper = checkNotNull(operRootId, "operRootId should not be null");
+        this.idConfig = checkNotNull(cfgRootId, "cfgRootId should not be null");
+    }
+
+    @Override
+    public void close() throws Exception {
+        LOG.debug("AbstractDataTreeConverter.close()");
+        final WriteTransaction writeTx = bindingDataBroker.newWriteOnlyTransaction();
+        writeTx.delete(LogicalDatastoreType.CONFIGURATION, idConfig);
+        writeTx.submit().checkedGet();
+        LOG.info("Config initialization data for {} successfully removed.", idConfig);
     }
 
     @Override
@@ -90,9 +99,15 @@ public abstract class AbstractDataTreeConverter<O extends DataObject, C extends
 
     private void writeData(final C configData) throws TransactionCommitFailedException {
         final WriteTransaction writeTx = bindingDataBroker.newWriteOnlyTransaction();
-        writeTx.merge(LogicalDatastoreType.CONFIGURATION, idConfig, configData);
+        writeTx.put(LogicalDatastoreType.CONFIGURATION, idConfig, configData);
         writeTx.submit().checkedGet();
     }
 
+    // TODO make this class concrete and use function dependency instead of abstract method
+    /**
+     * Converts operational data to config data for given root node
+     * @param operationalData data object representing operational data
+     * @return data object representing config data
+     */
     protected abstract C convert(final O operationalData);
 }
diff --git a/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializer.java b/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializer.java
new file mode 100644 (file)
index 0000000..fde2a28
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.v3po.vpp.data.init;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Initializes ietf-interfaces config data based on operational state
+ */
+public class InterfacesInitializer extends AbstractDataTreeConverter<InterfacesState, Interfaces> {
+    private static final Logger LOG = LoggerFactory.getLogger(InterfacesInitializer.class);
+
+    public InterfacesInitializer(@Nonnull final DataBroker bindingDataBroker) {
+        super(bindingDataBroker, InstanceIdentifier.create(InterfacesState.class),
+                InstanceIdentifier.create(Interfaces.class));
+    }
+
+    @Override
+    protected Interfaces convert(final InterfacesState operationalData) {
+        LOG.debug("InterfacesInitializer.convert()");
+        InterfacesBuilder interfacesBuilder = new InterfacesBuilder();
+        interfacesBuilder.setInterface(Lists.transform(operationalData.getInterface(), CONVERT_INTERFACE));
+        return interfacesBuilder.build();
+    }
+
+    private static final Function<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface, Interface>
+            CONVERT_INTERFACE =
+            new Function<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface, Interface>() {
+                @Nullable
+                @Override
+                public Interface apply(
+                        @Nullable final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface input) {
+
+                    InterfaceBuilder builder = new InterfaceBuilder();
+                    builder.setKey(new InterfaceKey(input.getKey().getName()));
+                    builder.setName(input.getName());
+                    // builder.setDescription(); not present in interfaces-state
+                    builder.setType(input.getType());
+                    builder.setEnabled(AdminStatus.Up.equals(input.getAdminStatus()));
+                    // builder.setLinkUpDownTrapEnable(); not present in interfaces-state
+                    return builder.build();
+                }
+            };
+}
index 3fad2a8..9e6d742 100644 (file)
 
 package io.fd.honeycomb.v3po.vpp.data.init;
 
-import java.util.ArrayList;
-import java.util.List;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Vpp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomainsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * Initializes vpp node in config data tree based on operational state
+ */
 public class VppInitializer extends AbstractDataTreeConverter<VppState, Vpp> {
     private static final Logger LOG = LoggerFactory.getLogger(VppInitializer.class);
 
@@ -37,43 +42,35 @@ public class VppInitializer extends AbstractDataTreeConverter<VppState, Vpp> {
         super(bindingDataBroker, InstanceIdentifier.create(VppState.class), InstanceIdentifier.create(Vpp.class));
     }
 
-    @Override
-    public void close() throws Exception {
-        // NOP
-        LOG.debug("VppStateInitializer.close()");
-        // FIXME implement delete
-    }
-
     @Override
     protected Vpp convert(final VppState operationalData) {
-        LOG.debug("VppStateInitializer.convert()");
-        final BridgeDomains bridgeDomains = operationalData.getBridgeDomains();
-        final List<BridgeDomain> bridgeDomainList = bridgeDomains.getBridgeDomain();
+        LOG.debug("VppInitializer.convert()");
 
         VppBuilder vppBuilder = new VppBuilder();
-        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomainsBuilder
-                bdsBuilder =
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomainsBuilder();
-        final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain>
-                listOfBDs = new ArrayList<>();
-
-        for (BridgeDomain bd : bridgeDomainList) {
-            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder
-                    bdBuilder =
-                    new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder();
-            bdBuilder.setLearn(bd.isLearn());
-            bdBuilder.setUnknownUnicastFlood(bd.isUnknownUnicastFlood());
-            bdBuilder.setArpTermination(bd.isArpTermination());
-            bdBuilder.setFlood(bd.isFlood());
-            bdBuilder.setForward(bd.isForward());
-            bdBuilder.setKey(new BridgeDomainKey(bd.getKey().getName()));
-            // TODO bdBuilder.setL2Fib(bd.getL2Fib());
-            bdBuilder.setName(bd.getName());
-            listOfBDs.add(bdBuilder.build());
-        }
+        BridgeDomainsBuilder bdsBuilder = new BridgeDomainsBuilder();
 
-        bdsBuilder.setBridgeDomain(listOfBDs);
+        bdsBuilder.setBridgeDomain(Lists.transform(operationalData.getBridgeDomains().getBridgeDomain(), CONVERT_BD));
         vppBuilder.setBridgeDomains(bdsBuilder.build());
         return vppBuilder.build();
     }
+
+    private static final Function<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain, BridgeDomain>
+            CONVERT_BD =
+            new Function<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain, BridgeDomain>() {
+                @Nullable
+                @Override
+                public BridgeDomain apply(
+                        @Nullable final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain input) {
+                    final BridgeDomainBuilder builder = new BridgeDomainBuilder();
+                    builder.setLearn(input.isLearn());
+                    builder.setUnknownUnicastFlood(input.isUnknownUnicastFlood());
+                    builder.setArpTermination(input.isArpTermination());
+                    builder.setFlood(input.isFlood());
+                    builder.setForward(input.isForward());
+                    builder.setKey(new BridgeDomainKey(input.getKey().getName()));
+                    // TODO bdBuilder.setL2Fib(bd.getL2Fib());
+                    builder.setName(input.getName());
+                    return builder.build();
+                }
+            };
 }
index eddc74d..ae83cb3 100644 (file)
@@ -3,8 +3,9 @@ package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.vpp.data.i
 import io.fd.honeycomb.v3po.vpp.data.init.DataTreeInitializer;
 import io.fd.honeycomb.v3po.vpp.data.init.InitializerRegistry;
 import io.fd.honeycomb.v3po.vpp.data.init.InitializerRegistryImpl;
+import io.fd.honeycomb.v3po.vpp.data.init.InterfacesInitializer;
 import io.fd.honeycomb.v3po.vpp.data.init.VppInitializer;
-import java.util.Collections;
+import java.util.Arrays;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,21 +34,22 @@ public class VppConfigurationInitializerModule extends
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        LOG.debug("VppConfigurationInitializerModule.createInstance()");
+        LOG.info("VppConfigurationInitializerModule.createInstance(): initialization started");
         final DataBroker bindingDataBroker = getBindingDataBrokerDependency();
 
-        // TODO make configurable
-        final VppInitializer vppInitializer =
-                new VppInitializer(bindingDataBroker);
+        final VppInitializer vppInitializer = new VppInitializer(bindingDataBroker);
+        final InterfacesInitializer interfacesInitializer = new InterfacesInitializer(bindingDataBroker);
 
+        // TODO make configurable
         final InitializerRegistry initializer =
-                new InitializerRegistryImpl(Collections.<DataTreeInitializer>singletonList(vppInitializer));
+                new InitializerRegistryImpl(Arrays.<DataTreeInitializer>asList(vppInitializer, interfacesInitializer));
 
         try {
             initializer.initialize();
         } catch (Exception e) {
             LOG.warn("Failed to initialize config", e);
         }
+        LOG.info("VppConfigurationInitializerModule.createInstance(): initialization completed");
 
         return initializer;
     }
diff --git a/v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializerTest.java b/v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializerTest.java
new file mode 100644 (file)
index 0000000..32f9163
--- /dev/null
@@ -0,0 +1,90 @@
+package io.fd.honeycomb.v3po.vpp.data.init;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import java.util.Arrays;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.EthernetCsmacd;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+
+public class InterfacesInitializerTest {
+
+    @Mock
+    private DataBroker bindingDataBroker;
+
+    private InterfacesInitializer interfacesInitializer;
+
+    @Before
+    public void setUp() {
+        initMocks(this);
+        interfacesInitializer = new InterfacesInitializer(bindingDataBroker);
+    }
+
+    @Test
+    public void testConvert() throws Exception {
+        final InterfacesState operationalData = operationalData();
+        final Interfaces expectedConfigData = expectedConfigData();
+
+        final Interfaces configData = interfacesInitializer.convert(operationalData);
+        assertEquals(expectedConfigData, configData);
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface operInterface(
+            String name, Class<? extends InterfaceType> inerfaceType, Interface.AdminStatus adminStatus) {
+        final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder
+                iface =
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder();
+        iface.setKey(
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(
+                        name));
+        iface.setName(name);
+        iface.setType(inerfaceType);
+        iface.setAdminStatus(adminStatus);
+        return iface.build();
+    }
+
+    private InterfacesState operationalData() {
+        final InterfacesStateBuilder builder = new InterfacesStateBuilder();
+        builder.setInterface(
+                Arrays.asList(
+                        operInterface("eth1", EthernetCsmacd.class, Interface.AdminStatus.Up),
+                        operInterface("eth2", EthernetCsmacd.class, Interface.AdminStatus.Down)
+                ));
+        return builder.build();
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface configInterface(
+            String name, Class<? extends InterfaceType> inerfaceType, boolean isEnabled) {
+        final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder
+                iface =
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder();
+        iface.setKey(
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey(
+                        name));
+        iface.setName(name);
+        iface.setType(inerfaceType);
+        iface.setEnabled(isEnabled);
+        return iface.build();
+    }
+
+    private Interfaces expectedConfigData() {
+        final InterfacesBuilder builder = new InterfacesBuilder();
+
+        builder.setInterface(
+                Arrays.asList(
+                        configInterface("eth1", EthernetCsmacd.class, true),
+                        configInterface("eth2", EthernetCsmacd.class, false)
+                ));
+        return builder.build();
+    }
+
+}
\ No newline at end of file
diff --git a/v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializerTest.java b/v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializerTest.java
new file mode 100644 (file)
index 0000000..f3a7627
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.v3po.vpp.data.init;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import java.util.Arrays;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Vpp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppStateBuilder;
+
+public class VppInitializerTest {
+
+    @Mock
+    private DataBroker bindingDataBroker;
+
+    private VppInitializer vppInitializer;
+
+    @Before
+    public void setUp() throws Exception {
+        initMocks(this);
+        vppInitializer = new VppInitializer(bindingDataBroker);
+    }
+
+    @Test
+    public void testConvert() throws Exception {
+        final VppState operationalData = operationalData();
+        final Vpp expectedConfigData = expectedConfigData();
+        final Vpp configData = vppInitializer.convert(operationalData);
+        assertEquals(expectedConfigData, configData);
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain
+    operBd(String name, boolean learn, boolean unknownUnicastFlood, boolean arpTermination, boolean flood,
+           boolean forward) {
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomainBuilder
+                bd =
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomainBuilder();
+        bd.setName(name);
+        bd.setKey(
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomainKey(
+                        name));
+        bd.setLearn(learn);
+        bd.setUnknownUnicastFlood(unknownUnicastFlood);
+        bd.setArpTermination(arpTermination);
+        bd.setFlood(flood);
+        bd.setForward(forward);
+        return bd.build();
+    }
+
+    private VppState operationalData() {
+        final VppStateBuilder builder = new VppStateBuilder();
+
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomainsBuilder
+                bdBuilder =
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomainsBuilder();
+        bdBuilder.setBridgeDomain(Arrays.asList(
+                operBd("b1", true, true, true, true, true),
+                operBd("b2", false, false, false, false, false)
+        ));
+        builder.setBridgeDomains(bdBuilder.build());
+        return builder.build();
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain
+    configBd(String name, boolean learn, boolean unknownUnicastFlood, boolean arpTermination, boolean flood,
+           boolean forward) {
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder
+                bd =
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder();
+        bd.setName(name);
+        bd.setKey(
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainKey(
+                        name));
+        bd.setLearn(learn);
+        bd.setUnknownUnicastFlood(unknownUnicastFlood);
+        bd.setArpTermination(arpTermination);
+        bd.setFlood(flood);
+        bd.setForward(forward);
+        return bd.build();
+    }
+
+    private Vpp expectedConfigData() {
+        final VppBuilder builder = new VppBuilder();
+
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomainsBuilder
+                bdBuilder =
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomainsBuilder();
+        bdBuilder.setBridgeDomain(Arrays.asList(
+                configBd("b1", true, true, true, true, true),
+                configBd("b2", false, false, false, false, false)
+        ));
+        builder.setBridgeDomains(bdBuilder.build());
+        return builder.build();
+    }
+}
\ No newline at end of file