2 * Copyright (c) 2015 Cisco Systems, Inc. and others. 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.groupbasedpolicy.neutron.ovsdb;
10 import com.google.common.base.Strings;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
14 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
15 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
19 import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
20 import org.opendaylight.groupbasedpolicy.util.IidFactory;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.NeutronByGbpMappings;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ProviderPhysicalNetworksAsL2FloodDomains;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.provider.physical.networks.as.l2.flood.domains.ProviderPhysicalNetworkAsL2FloodDomain;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.Segmentation;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.SegmentationBuilder;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
33 public class ProviderPhysicalNetworkListener extends DataTreeChangeHandler<ProviderPhysicalNetworkAsL2FloodDomain> {
35 private static final Logger LOG = LoggerFactory.getLogger(ProviderPhysicalNetworkListener.class);
37 protected ProviderPhysicalNetworkListener(DataBroker dataProvider) {
39 registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
40 InstanceIdentifier.builder(Mappings.class)
41 .child(NeutronByGbpMappings.class)
42 .child(ProviderPhysicalNetworksAsL2FloodDomains.class)
43 .child(ProviderPhysicalNetworkAsL2FloodDomain.class)
48 protected void onWrite(DataObjectModification<ProviderPhysicalNetworkAsL2FloodDomain> rootNode,
49 InstanceIdentifier<ProviderPhysicalNetworkAsL2FloodDomain> rootIdentifier) {
50 ProviderPhysicalNetworkAsL2FloodDomain dataAfter = rootNode.getDataAfter();
51 if (dataAfter != null) {
52 L2FloodDomainId l2FdId = dataAfter.getL2FloodDomainId();
53 TenantId tenantId = dataAfter.getTenantId();
54 String segmentationId = dataAfter.getSegmentationId();
55 augmentSegmentationToFloodDomain(tenantId, l2FdId, segmentationId);
60 protected void onDelete(DataObjectModification<ProviderPhysicalNetworkAsL2FloodDomain> rootNode,
61 InstanceIdentifier<ProviderPhysicalNetworkAsL2FloodDomain> rootIdentifier) {
62 ProviderPhysicalNetworkAsL2FloodDomain dataBefore = rootNode.getDataBefore();
63 if (dataBefore != null) {
64 L2FloodDomainId l2FdId = dataBefore.getL2FloodDomainId();
65 TenantId tenantId = dataBefore.getTenantId();
66 augmentSegmentationToFloodDomain(tenantId, l2FdId, null);
71 protected void onSubtreeModified(DataObjectModification<ProviderPhysicalNetworkAsL2FloodDomain> rootNode,
72 InstanceIdentifier<ProviderPhysicalNetworkAsL2FloodDomain> rootIdentifier) {
73 ProviderPhysicalNetworkAsL2FloodDomain dataAfter = rootNode.getDataAfter();
74 if (dataAfter != null) {
75 L2FloodDomainId l2FdId = dataAfter.getL2FloodDomainId();
76 TenantId tenantId = dataAfter.getTenantId();
77 String segmentationId = dataAfter.getSegmentationId();
78 augmentSegmentationToFloodDomain(tenantId, l2FdId, segmentationId);
82 private void augmentSegmentationToFloodDomain(TenantId tenantId, L2FloodDomainId l2FdId, String segmentationId) {
83 if (Strings.isNullOrEmpty(segmentationId)) {
84 ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
85 DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
86 IidFactory.l2FloodDomainIid(tenantId, l2FdId).augmentation(Segmentation.class), rwTx);
87 DataStoreHelper.submitToDs(rwTx);
90 Segmentation segmentation =
91 new SegmentationBuilder().setSegmentationId(Integer.valueOf(segmentationId)).build();
92 WriteTransaction writeTx = dataProvider.newWriteOnlyTransaction();
93 writeTx.merge(LogicalDatastoreType.CONFIGURATION,
94 IidFactory.l2FloodDomainIid(tenantId, l2FdId).augmentation(Segmentation.class), segmentation);
95 DataStoreHelper.submitToDs(writeTx);
96 } catch (NumberFormatException e) {
97 LOG.info("Segmentation ID of Neutron Provider Physical Network {} is not a number but is {}.",
98 l2FdId.getValue(), segmentationId);