Bug 5213 - Missing segmentation-id for physical networks
[groupbasedpolicy.git] / neutron-ovsdb / src / main / java / org / opendaylight / groupbasedpolicy / neutron / ovsdb / ProviderPhysicalNetworkListener.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
9
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
11 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
12 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
13 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
17 import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
18 import org.opendaylight.groupbasedpolicy.util.IidFactory;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.NeutronByGbpMappings;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.neutron.by.gbp.mappings.ProviderPhysicalNetworksAsL2FloodDomains;
24 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;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.Segmentation;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.SegmentationBuilder;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 import com.google.common.base.Strings;
32
33 public class ProviderPhysicalNetworkListener extends DataTreeChangeHandler<ProviderPhysicalNetworkAsL2FloodDomain> {
34
35     private static final Logger LOG = LoggerFactory.getLogger(ProviderPhysicalNetworkListener.class);
36
37     protected ProviderPhysicalNetworkListener(DataBroker dataProvider) {
38         super(dataProvider,
39                 new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
40                         InstanceIdentifier.builder(Mappings.class)
41                             .child(NeutronByGbpMappings.class)
42                             .child(ProviderPhysicalNetworksAsL2FloodDomains.class)
43                             .child(ProviderPhysicalNetworkAsL2FloodDomain.class)
44                             .build()));
45     }
46
47     @Override
48     protected void onWrite(DataObjectModification<ProviderPhysicalNetworkAsL2FloodDomain> rootNode,
49             InstanceIdentifier<ProviderPhysicalNetworkAsL2FloodDomain> rootIdentifier) {
50         L2FloodDomainId l2FdId = rootNode.getDataAfter().getL2FloodDomainId();
51         TenantId tenantId = rootNode.getDataAfter().getTenantId();
52         String segmentationId = rootNode.getDataAfter().getSegmentationId();
53         augmentSegmentationToFloodDomain(tenantId, l2FdId, segmentationId);
54     }
55
56     @Override
57     protected void onDelete(DataObjectModification<ProviderPhysicalNetworkAsL2FloodDomain> rootNode,
58             InstanceIdentifier<ProviderPhysicalNetworkAsL2FloodDomain> rootIdentifier) {
59         L2FloodDomainId l2FdId = rootNode.getDataBefore().getL2FloodDomainId();
60         TenantId tenantId = rootNode.getDataBefore().getTenantId();
61         augmentSegmentationToFloodDomain(tenantId, l2FdId, null);
62     }
63
64     @Override
65     protected void onSubtreeModified(DataObjectModification<ProviderPhysicalNetworkAsL2FloodDomain> rootNode,
66             InstanceIdentifier<ProviderPhysicalNetworkAsL2FloodDomain> rootIdentifier) {
67         L2FloodDomainId l2FdId = rootNode.getDataAfter().getL2FloodDomainId();
68         TenantId tenantId = rootNode.getDataAfter().getTenantId();
69         String segmentationId = rootNode.getDataAfter().getSegmentationId();
70         augmentSegmentationToFloodDomain(tenantId, l2FdId, segmentationId);
71     }
72
73     private void augmentSegmentationToFloodDomain(TenantId tenantId, L2FloodDomainId l2FdId, String segmentationId) {
74         if (Strings.isNullOrEmpty(segmentationId)) {
75             ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
76             DataStoreHelper.removeIfExists(LogicalDatastoreType.CONFIGURATION,
77                     IidFactory.l2FloodDomainIid(tenantId, l2FdId).augmentation(Segmentation.class), rwTx);
78             DataStoreHelper.submitToDs(rwTx);
79         } else {
80             try {
81                 Segmentation segmentation =
82                         new SegmentationBuilder().setSegmentationId(Integer.valueOf(segmentationId)).build();
83                 WriteTransaction wTx = dataProvider.newWriteOnlyTransaction();
84                 wTx.merge(LogicalDatastoreType.CONFIGURATION,
85                         IidFactory.l2FloodDomainIid(tenantId, l2FdId).augmentation(Segmentation.class), segmentation);
86                 DataStoreHelper.submitToDs(wTx);
87             } catch (NumberFormatException e) {
88                 LOG.info("Segmentation ID of Neutron Provider Physical Network {} is not a number but is {}.",
89                         l2FdId.getValue(), segmentationId);
90             }
91         }
92     }
93
94 }