Add blueprint wiring for neutron renderer
[netvirt.git] / netvirt / renderers / neutron / src / main / java / org / opendaylight / netvirt / netvirt / renderers / neutron / NeutronNetworkDataProcessor.java
1 /*
2  * Copyright © 2016 Red Hat, 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
9 package org.opendaylight.netvirt.netvirt.renderers.neutron;
10
11 import com.google.common.base.Preconditions;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
14 import org.opendaylight.netvirt.utils.mdsal.utils.MdsalUtils;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.common.rev151227.NetworkTypeBase;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l2.networks.rev151227.l2.networks.L2Network;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l2.networks.rev151227.l2.networks.L2NetworkBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l2.networks.rev151227.l2.networks.L2NetworkKey;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
21 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 /**
26  * Data processor for Neutron Network
27  */
28 public class NeutronNetworkDataProcessor implements DataProcessor<Network> {
29     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkDataProcessor.class);
30     private final MdsalUtils mdsalUtils;
31
32     /**
33      *
34      * @param db - mdsal
35      */
36     public NeutronNetworkDataProcessor(DataBroker db) {
37         mdsalUtils = new MdsalUtils(db);
38     }
39
40     /**
41      * Remove a netvirt network from mdsal
42      *
43      * @param identifier - the whole path to DataObject
44      * @param change - port to be removed
45      */
46     @Override
47     public void remove(final InstanceIdentifier<Network> identifier,
48                        final Network change) {
49         Preconditions.checkNotNull(change, "Removed object can not be null!");
50         LOG.debug("Delete Neutron Network model data changes for key: {} delete: {}", identifier, change);
51
52         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l2.networks.rev151227.l2.networks.L2Network> networkIid =
53                 MdsalHelper.createL2NetworkInstanceIdentifier(change.getUuid());
54
55         LOG.debug("Remove netvirt network uuid {} from mdsal", change.getUuid());
56         try {
57             boolean result = mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, networkIid);
58             if (result) {
59                 LOG.debug("Remove netvirt network from mdsal success. Result: {}", result);
60             } else {
61                 LOG.warn("Remove nevtirt network failed. Result: {}", result);
62             }
63         } catch (Exception e) {
64             LOG.warn("Remove netvirt network failed: exception {}", e);
65         }
66     }
67
68     /**
69      * Update a netvirt network in mdsal
70      *
71      * @param identifier - the whole path to DataObject
72      * @param original - original DataObject (for update)
73      * @param change - network to be updated
74      */
75
76     @Override
77     public void update(final InstanceIdentifier<Network> identifier,
78                        final Network original, final Network change) {
79         Preconditions.checkNotNull(original, "Updated original object can not be null!");
80         Preconditions.checkNotNull(change, "Updated change object can not be null!");
81         LOG.debug("Update Neutron Network model data changes for key: {} delete: {}", identifier, change);
82         remove(identifier, original);
83         add(identifier, change);
84     }
85
86     private void addExtensions(L2NetworkBuilder l2NetworkBuilder, Network network)
87     {
88         NetworkProviderExtension  providerExtension = network.getAugmentation(NetworkProviderExtension.class);
89         if (providerExtension != null) {
90             if (providerExtension.getSegmentationId() != null) {
91                 l2NetworkBuilder.setSegmentationId(providerExtension.getSegmentationId());
92             }
93
94             if (Constants.NETVIRT_NEUTRON_NETWORK_TYPE_MAP.get(providerExtension.getNetworkType().getSimpleName()) != null) {
95                 l2NetworkBuilder.setNetworkType(Constants.NETVIRT_NEUTRON_NETWORK_TYPE_MAP.get(providerExtension.getNetworkType().getSimpleName()));
96             } else {
97                 LOG.warn("Neutron Network Type not supported.. using Flat for network {}", network);
98                 l2NetworkBuilder.setNetworkType(NetworkTypeBase.class);
99             }
100         }
101     }
102
103     /**
104      * Add a netvirt Network to mdsal
105      *
106      * @param identifier - the whole path to new DataObject
107      * @param change - port to be added
108      */
109     @Override
110     public void add(final InstanceIdentifier<Network> identifier,
111                     final Network change) {
112         Preconditions.checkNotNull(change, "Added object can not be null!");
113         LOG.debug("Create Neutron Network model data changes for identifier: {} change: {}", identifier, change);
114         L2NetworkBuilder l2NetworkBuilder = new L2NetworkBuilder();
115
116         InstanceIdentifier<L2Network> networkIid = MdsalHelper.createL2NetworkInstanceIdentifier(change.getUuid());
117         addExtensions(l2NetworkBuilder, change);
118
119         if (change.isAdminStateUp() != null) {
120             l2NetworkBuilder.setAdminStateUp(change.isAdminStateUp());
121         }
122         if (change.getName() != null) {
123             l2NetworkBuilder.setName(change.getName());
124         }
125         if (change.isShared() != null) {
126             l2NetworkBuilder.setShared(change.isShared());
127         }
128         if (change.getStatus() != null) {
129             l2NetworkBuilder.setStatus(change.getStatus());
130         }
131         if (change.getTenantId() != null) {
132             // TODO
133             //l2NetworkBuilder.setTenantId(change.getTenantId());
134         }
135         if (change.getUuid() != null) {
136             l2NetworkBuilder.setUuid(change.getUuid());
137             l2NetworkBuilder.setKey(new L2NetworkKey(change.getUuid()));
138         }
139
140         LOG.debug("Add Netvirt network {} to mdsal", l2NetworkBuilder.build().toString());
141         try {
142             boolean result = mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, networkIid, l2NetworkBuilder.build());
143             if (result) {
144                 LOG.debug("createNetwork:addToMdSal success. Result: {}", result);
145             } else {
146                 LOG.warn("createNetwork:addToMdSal failed. Result: {}", result);
147             }
148         } catch (Exception e) {
149             LOG.warn("create Netvirt Network : addToMdSal exception {}", e);
150         }
151     }
152 }