From 24a6bf1fee7871fb9c93d277c5d676a48de0cf67 Mon Sep 17 00:00:00 2001 From: Marek Gradzki Date: Tue, 12 Apr 2016 10:51:45 +0200 Subject: HONEYCOMB-34: Config initializer for ietf-interfaces Change-Id: I164ab014638d40d1494dacb704c079c166256128 Signed-off-by: Marek Gradzki --- .../vpp/data/init/AbstractDataTreeConverter.java | 25 ++++- .../v3po/vpp/data/init/InterfacesInitializer.java | 72 +++++++++++++ .../v3po/vpp/data/init/VppInitializer.java | 67 ++++++------ .../VppConfigurationInitializerModule.java | 14 +-- .../vpp/data/init/InterfacesInitializerTest.java | 90 ++++++++++++++++ .../v3po/vpp/data/init/VppInitializerTest.java | 116 +++++++++++++++++++++ 6 files changed, 338 insertions(+), 46 deletions(-) create mode 100644 v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializer.java create mode 100644 v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializerTest.java create mode 100644 v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializerTest.java (limited to 'v3po/vpp-cfg-init') diff --git a/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/AbstractDataTreeConverter.java b/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/AbstractDataTreeConverter.java index a8144f258..18c0dce59 100644 --- a/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/AbstractDataTreeConverter.java +++ b/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/AbstractDataTreeConverter.java @@ -47,11 +47,20 @@ public abstract class AbstractDataTreeConverter idOper, - final InstanceIdentifier idConfig) { + final InstanceIdentifier operRootId, + final InstanceIdentifier 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 { + 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 + CONVERT_INTERFACE = + new Function() { + @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(); + } + }; +} diff --git a/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializer.java b/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializer.java index 3fad2a8d3..9e6d742d0 100644 --- a/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializer.java +++ b/v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializer.java @@ -16,20 +16,25 @@ 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 { private static final Logger LOG = LoggerFactory.getLogger(VppInitializer.class); @@ -37,43 +42,35 @@ public class VppInitializer extends AbstractDataTreeConverter { 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 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 - 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 + CONVERT_BD = + new Function() { + @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(); + } + }; } diff --git a/v3po/vpp-cfg-init/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/vpp/data/init/rev160407/VppConfigurationInitializerModule.java b/v3po/vpp-cfg-init/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/vpp/data/init/rev160407/VppConfigurationInitializerModule.java index eddc74d27..ae83cb3fe 100644 --- a/v3po/vpp-cfg-init/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/vpp/data/init/rev160407/VppConfigurationInitializerModule.java +++ b/v3po/vpp-cfg-init/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/vpp/data/init/rev160407/VppConfigurationInitializerModule.java @@ -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.singletonList(vppInitializer)); + new InitializerRegistryImpl(Arrays.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 index 000000000..32f9163bb --- /dev/null +++ b/v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/InterfacesInitializerTest.java @@ -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 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 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 index 000000000..f3a762776 --- /dev/null +++ b/v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializerTest.java @@ -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 -- cgit 1.2.3-korg