Add blueprint wiring for neutron renderer
[netvirt.git] / netvirt / renderers / neutron / src / main / java / org / opendaylight / netvirt / netvirt / renderers / neutron / NeutronPortDataProcessor.java
1 /*
2  * Copyright © 2015, 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 java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.netvirt.utils.mdsal.utils.MdsalUtils;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.PortTypeBase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.port.EndPoints;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.port.EndPointsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.ports.PortBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.ports.PortKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 /**
33  * Data processor for Neutron Port
34  */
35 public class NeutronPortDataProcessor implements DataProcessor<Port> {
36     private static final Logger LOG = LoggerFactory.getLogger(NeutronPortDataProcessor.class);
37     private MdsalUtils mdsalUtils;
38
39     /**
40      *
41      * @param db - mdsal
42      */
43     public NeutronPortDataProcessor(DataBroker db) {
44         mdsalUtils = new MdsalUtils(db);
45     }
46
47     /**
48      * Remove a netvirt from mdsal
49      *
50      * @param identifier - the whole path to DataObject
51      * @param change - port to be removed
52      */
53     @Override
54     public void remove(final InstanceIdentifier<Port> identifier,
55                        final Port change) {
56         Preconditions.checkNotNull(change, "Removed object can not be null!");
57         LOG.debug("Delete Neutron Port model data changes for key: {} delete: {}", identifier, change);
58
59         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.ports.Port> portIid =
60                 MdsalHelper.createPortInstanceIdentifier(change.getUuid());
61
62         LOG.debug("Remove netvirt Port uuid {} from mdsal", change.getUuid());
63         try {
64             boolean result = mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, portIid);
65             if (result) {
66                 LOG.debug("Remove netvirt port from mdsal success. Result: {}", result);
67             } else {
68                 LOG.warn("Remove nevtirt port failed. Result: {}", result);
69             }
70         } catch (Exception e) {
71             LOG.warn("Remove netvirt port failed: exception {}", e);
72         }
73     }
74
75     /**
76      * Update a netvirt port in mdsal
77      *
78      * @param identifier - the whole path to DataObject
79      * @param original - original DataObject (for update)
80      * @param change - port to be updated
81      */
82
83     @Override
84     public void update(final InstanceIdentifier<Port> identifier,
85                        final Port original, final Port change) {
86         Preconditions.checkNotNull(original, "Updated original object can not be null!");
87         Preconditions.checkNotNull(original, "Updated update object can not be null!");
88         remove(identifier, original);
89         LOG.debug("Update Neutron Port model data changes for key: {} delete: {}", identifier, change);
90         remove(identifier, original);
91         add(identifier, change);
92     }
93
94     /**
95      * Add a netvirt port to mdsal
96      *
97      * @param identifier - the whole path to new DataObject
98      * @param change - port to be added
99      */
100     @Override
101     public void add(final InstanceIdentifier<Port> identifier,
102                     final Port change) {
103         Preconditions.checkNotNull(change, "Added object can not be null!");
104         LOG.debug("Create Neutron Port model data changes for identifier: {} change: {}", identifier, change);
105         PortBuilder portBuilder = new PortBuilder();
106
107         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.ports.Port> portIid =
108                 MdsalHelper.createPortInstanceIdentifier(change.getUuid());
109
110         portBuilder.setStatus(change.getStatus());
111         if (change.isAdminStateUp() != null) {
112             portBuilder.setAdminStateUp(change.isAdminStateUp());
113         }
114         portBuilder.setName(change.getName());
115
116         // TODO
117         // Some neutron fields to consider for netvirt model
118         // tenant-id
119         // network-id
120         // extra-dhcp-opts list
121         // fixed-ips list
122         // security groups
123         // vif-details list
124         // vif-type
125         // vnic-type
126         // profile
127         // port-security-enabled
128         // host-id
129
130         if (Constants.NETVIRT_NEUTRON_PORT_TYPE_MAP.get(change.getDeviceOwner()) != null) {
131             portBuilder.setPortType(Constants.NETVIRT_NEUTRON_PORT_TYPE_MAP.get(change.getDeviceOwner()));
132         } else {
133             LOG.warn("Unsupported device owner for neutron port identifier: {}  port: {}", identifier, change);
134             portBuilder.setPortType(PortTypeBase.class);
135         }
136
137         // TODO - set parent when applicable
138         //portB.setParent(change.getParent());
139
140         portBuilder.setDeviceUuid(new Uuid(change.getDeviceId()));
141         portBuilder.setDeviceLocatorUuid(change.getNetworkId());
142         portBuilder.setKey(new PortKey(change.getUuid()));
143
144         if (change.getFixedIps() != null) {
145             List<IpAddress> ipAddressList = new ArrayList<>();
146             for (FixedIps ips : change.getFixedIps()) {
147                 ipAddressList.add(new IpAddress(ips.getIpAddress().getValue()));
148             }
149             EndPoints endPoint = new EndPointsBuilder()
150                     .setMacaddr(new MacAddress(change.getMacAddress()))
151                     .setIpaddrs(ipAddressList)
152                     .build();
153             portBuilder.setEndPoints(Collections.singletonList(endPoint));
154         }
155
156         LOG.debug("Add Netvirt Port {} to mdsal", portBuilder.build().toString());
157         try {
158             boolean result = mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, portIid, portBuilder.build());
159             if (result) {
160                 LOG.debug("createPort:addToMdSal success. Result: {}", result);
161             } else {
162                 LOG.warn("createPort:addToMdSal failed. Result: {}", result);
163             }
164         } catch (Exception e) {
165             LOG.warn("create Netvirt Port : addToMdSal exception {}", e);
166         }
167     }
168 }