From 607e23e94e73a75813214b402f6dbbde6989200a Mon Sep 17 00:00:00 2001 From: Shakib Ahmed Date: Wed, 26 Apr 2017 02:47:09 -0700 Subject: [PATCH] Add subnet aware for vpp-mapper and vpp-renderer Change-Id: I6451ba5262396436d26a6e568bb6349244de362c Signed-off-by: Shakib Ahmed --- .../mapper/processors/NeutronListener.java | 1 + .../vpp/mapper/processors/SubnetAware.java | 53 ++++++++++++++ .../vpp/mapper/processors/SubnetHandler.java | 73 +++++++++++++++++++ .../neutron/vpp/mapper/util/HandlerUtil.java | 54 ++++++++++++++ .../config/vpp_provider/impl/VppRenderer.java | 3 + .../renderer/vpp/event/GbpSubnetEvent.java | 25 +++++++ .../vpp/listener/GbpSubnetListener.java | 62 ++++++++++++++++ renderers/vpp/src/main/yang/vpp-renderer.yang | 30 ++++++++ 8 files changed, 301 insertions(+) create mode 100644 neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetAware.java create mode 100644 neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetHandler.java create mode 100644 neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/util/HandlerUtil.java create mode 100644 renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/event/GbpSubnetEvent.java create mode 100644 renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/listener/GbpSubnetListener.java diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java index 08c0df3bf..f1958b36b 100644 --- a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java @@ -54,6 +54,7 @@ public class NeutronListener implements ClusteredDataTreeChangeListener PortHandler portHandler = new PortHandler(dataBroker, routingNode); dataChangeProviders.add(new PortAware(portHandler, dataBroker)); dataChangeProviders.add(new NetworkAware(dataBroker)); + dataChangeProviders.add(new SubnetAware(dataBroker)); } @Override diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetAware.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetAware.java new file mode 100644 index 000000000..4f08dc644 --- /dev/null +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetAware.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2017 Cisco Systems, 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.groupbasedpolicy.neutron.vpp.mapper.processors; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by Shakib Ahmed on 4/3/17. + */ +public class SubnetAware implements MappingProvider{ + private static final Logger LOG = LoggerFactory.getLogger(SubnetAware.class); + + private SubnetHandler subnetHandler; + + public SubnetAware(DataBroker dataBroker) { + subnetHandler = new SubnetHandler(dataBroker); + } + + @Override + public InstanceIdentifier getNeutronDtoIid() { + return InstanceIdentifier.builder(Neutron.class).child(Subnets.class).child(Subnet.class).build(); + } + + @Override + public void processCreatedNeutronDto(Subnet subnet) { + LOG.debug("Got create for subnet: {}", subnet.getUuid().getValue()); + subnetHandler.processCreatedNeutronDto(subnet); + } + + @Override + public void processUpdatedNeutronDto(Subnet original, Subnet delta) { + LOG.debug("Got update of subnet: {}", original.getUuid().getValue()); + subnetHandler.processUpdatedNeutronDto(original, delta); + } + + @Override + public void processDeletedNeutronDto(Subnet subnet) { + LOG.debug("Got delete of subnet: {}", subnet.getUuid().getValue()); + subnetHandler.processDeletedNeutronDto(subnet); + } +} \ No newline at end of file diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetHandler.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetHandler.java new file mode 100644 index 000000000..20f5768a0 --- /dev/null +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/SubnetHandler.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017 Cisco Systems, 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.groupbasedpolicy.neutron.vpp.mapper.processors; + +import com.google.common.base.Preconditions; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.util.HandlerUtil; +import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpSubnet; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by Shakib Ahmed on 4/3/17. + */ +public class SubnetHandler { + + private static final Logger LOG = LoggerFactory.getLogger(SubnetHandler.class); + + private final DataBroker dataBroker; + + public SubnetHandler(DataBroker dataBroker) { + this.dataBroker = dataBroker; + } + + public void processCreatedNeutronDto(Subnet subnet) { + GbpSubnet gbpSubnet = HandlerUtil.toGbpSubnet(subnet); + + if (gbpSubnet != null) { + ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction(); + rwTx.put(LogicalDatastoreType.CONFIGURATION, + HandlerUtil.getInstanceIdentifier(gbpSubnet.getId()), + gbpSubnet, true); + DataStoreHelper.submitToDs(rwTx); + } + } + + public void processUpdatedNeutronDto(Subnet oldSubnet, Subnet delta) { + Preconditions.checkState(oldSubnet.getUuid().equals(delta.getUuid()), + "Uuid change not allowed!"); + GbpSubnet gbpSubnet = HandlerUtil.toGbpSubnet(delta); + + if (gbpSubnet != null) { + ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction(); + rwTx.put(LogicalDatastoreType.CONFIGURATION, + HandlerUtil.getInstanceIdentifier(gbpSubnet.getId()), + gbpSubnet, true); + DataStoreHelper.submitToDs(rwTx); + } + } + + public void processDeletedNeutronDto(Subnet subnet) { + GbpSubnet gbpSubnet = HandlerUtil.toGbpSubnet(subnet); + if (gbpSubnet != null) { + ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction(); + rwTx.put(LogicalDatastoreType.CONFIGURATION, + HandlerUtil.getInstanceIdentifier(gbpSubnet.getId()), + gbpSubnet, true); + DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION, + HandlerUtil.getInstanceIdentifier(gbpSubnet.getId()), + rwTx); + } + } +} \ No newline at end of file diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/util/HandlerUtil.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/util/HandlerUtil.java new file mode 100644 index 000000000..50c20ecf4 --- /dev/null +++ b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/util/HandlerUtil.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 Cisco Systems, 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.groupbasedpolicy.neutron.vpp.mapper.util; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpSubnet; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpSubnetBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpSubnetKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.gbp.subnet.base.attributes.AllocationPools; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.gbp.subnet.base.attributes.AllocationPoolsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.gbp.subnet.base.attributes.AllocationPoolsKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +import java.util.stream.Collectors; + +/** + * Created by Shakib Ahmed on 4/25/17. + */ +public class HandlerUtil { + public static GbpSubnet toGbpSubnet(Subnet subnet) { + GbpSubnetBuilder gbpSubnetBuilder = new GbpSubnetBuilder(); + gbpSubnetBuilder.setKey(new GbpSubnetKey(subnet.getUuid().getValue())); + gbpSubnetBuilder.setId(subnet.getUuid().getValue()); + gbpSubnetBuilder.setCidr(subnet.getCidr()); + gbpSubnetBuilder.setGatewayIp(subnet.getGatewayIp()); + gbpSubnetBuilder.setAllocationPools(subnet.getAllocationPools() + .stream() + .map(allocationPools -> toGbpAllocationPools(allocationPools)) + .collect(Collectors.toList())); + return gbpSubnetBuilder.build(); + } + + private static AllocationPools toGbpAllocationPools(org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712. + subnet.attributes.AllocationPools pool) { + AllocationPoolsBuilder allocationPoolsBuilder = new AllocationPoolsBuilder(); + allocationPoolsBuilder.setKey(new AllocationPoolsKey(pool.getStart())); + allocationPoolsBuilder.setStart(pool.getStart()); + allocationPoolsBuilder.setEnd(pool.getEnd()); + return allocationPoolsBuilder.build(); + } + + public static InstanceIdentifier getInstanceIdentifier(String subnetUuid) { + return InstanceIdentifier + .builder(Config.class) + .child(GbpSubnet.class, new GbpSubnetKey(subnetUuid)).build(); + } +} \ No newline at end of file diff --git a/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java b/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java index 9dc7a8537..a8a332226 100644 --- a/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java +++ b/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java @@ -24,6 +24,7 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager; import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.AclManager; import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager; +import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.GbpSubnetListener; import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.RendererPolicyListener; import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppEndpointListener; import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppNodeListener; @@ -76,6 +77,7 @@ public class VppRenderer implements AutoCloseable, BindingAwareProvider { private VppNodeListener vppNodeListener; private VppEndpointListener vppEndpointListener; private RendererPolicyListener rendererPolicyListener; + private GbpSubnetListener vppGbpSubnetListener; VppRenderer(@Nonnull DataBroker dataBroker, @Nonnull BindingAwareBroker bindingAwareBroker, @Nullable String publicInterfaces) { @@ -145,6 +147,7 @@ public class VppRenderer implements AutoCloseable, BindingAwareProvider { vppNodeListener = new VppNodeListener(dataBroker, vppNodeManager, dtoEventBus); vppEndpointListener = new VppEndpointListener(dataBroker, dtoEventBus); rendererPolicyListener = new RendererPolicyListener(dataBroker, dtoEventBus); + vppGbpSubnetListener = new GbpSubnetListener(dataBroker, dtoEventBus); registerToRendererManager(); } diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/event/GbpSubnetEvent.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/event/GbpSubnetEvent.java new file mode 100644 index 000000000..5dd7b4141 --- /dev/null +++ b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/event/GbpSubnetEvent.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 Cisco Systems, 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.groupbasedpolicy.renderer.vpp.event; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpSubnet; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +/** + * Created by Shakib Ahmed on 4/26/17. + */ +public class GbpSubnetEvent extends DtoChangeEvent{ + + public GbpSubnetEvent(@Nonnull InstanceIdentifier iid, @Nullable GbpSubnet before, @Nullable GbpSubnet after) { + super(iid, before, after); + } +} diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/listener/GbpSubnetListener.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/listener/GbpSubnetListener.java new file mode 100644 index 000000000..b9f484b55 --- /dev/null +++ b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/listener/GbpSubnetListener.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2017 Cisco Systems, 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.groupbasedpolicy.renderer.vpp.listener; + +import com.google.common.base.Preconditions; +import com.google.common.eventbus.EventBus; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.groupbasedpolicy.renderer.vpp.event.GbpSubnetEvent; +import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.GbpSubnet; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by Shakib Ahmed on 4/25/17. + */ +public class GbpSubnetListener extends DataTreeChangeHandler { + private static final Logger LOG = LoggerFactory.getLogger(GbpSubnetListener.class); + private EventBus eventBus; + + public GbpSubnetListener(DataBroker dataBroker, EventBus eventbus) { + super(dataBroker); + this.eventBus = Preconditions.checkNotNull(eventbus); + registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, + InstanceIdentifier.builder(Config.class).child(GbpSubnet.class).build())); + } + + @Override + protected void onWrite(DataObjectModification rootNode, InstanceIdentifier rootIdentifier) { + GbpSubnetEvent writeEvent = new GbpSubnetEvent(rootIdentifier, + rootNode.getDataBefore(), + rootNode.getDataAfter()); + eventBus.post(writeEvent); + } + + @Override + protected void onDelete(DataObjectModification rootNode, InstanceIdentifier rootIdentifier) { + GbpSubnetEvent deleteEvent = new GbpSubnetEvent(rootIdentifier, + rootNode.getDataBefore(), + rootNode.getDataAfter()); + eventBus.post(deleteEvent); + } + + @Override + protected void onSubtreeModified(DataObjectModification rootNode, InstanceIdentifier rootIdentifier) { + GbpSubnetEvent modificationEvent = new GbpSubnetEvent(rootIdentifier, + rootNode.getDataBefore(), + rootNode.getDataAfter()); + eventBus.post(modificationEvent); + } +} diff --git a/renderers/vpp/src/main/yang/vpp-renderer.yang b/renderers/vpp/src/main/yang/vpp-renderer.yang index 9c80c6b35..ae0a8430a 100644 --- a/renderers/vpp/src/main/yang/vpp-renderer.yang +++ b/renderers/vpp/src/main/yang/vpp-renderer.yang @@ -138,6 +138,31 @@ module vpp-renderer { } } + grouping gbp-subnet-base-attributes { + leaf id { + description "Subnet UUID of neutron subnet call."; + type string; + } + leaf cidr { + type inet:ip-prefix; + description "cidr representing IP range for this subnet, based on IP version"; + } + leaf gateway-ip { + type inet:ip-address; + description "default gateway used by devices in this subnet"; + } + list allocation-pools { + description "Sub-ranges of cidr available for dynamic allocation to ports"; + key start; + leaf start { + type inet:ip-address; + } + leaf end { + type inet:ip-address; + } + } + } + container config { list vpp-endpoint { description "Renderer creates/removes interface on VPP node based on given parameters."; @@ -160,6 +185,11 @@ module vpp-renderer { type l2-types:vlan-id; } } + + list gbp-subnet { + key "id"; + uses gbp-subnet-base-attributes; + } } augment "rend:renderers/rend:renderer/rend:renderer-nodes/rend:renderer-node" { -- 2.36.6