2 * Copyright © 2015, 2016 Red Hat, 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
9 package org.opendaylight.netvirt.netvirt.renderers.neutron;
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;
33 * Data processor for Neutron Port
35 public class NeutronPortDataProcessor implements DataProcessor<Port> {
36 private static final Logger LOG = LoggerFactory.getLogger(NeutronPortDataProcessor.class);
37 private MdsalUtils mdsalUtils;
43 public NeutronPortDataProcessor(DataBroker db) {
44 mdsalUtils = new MdsalUtils(db);
48 * Remove a netvirt from mdsal
50 * @param identifier - the whole path to DataObject
51 * @param change - port to be removed
54 public void remove(final InstanceIdentifier<Port> identifier,
56 Preconditions.checkNotNull(change, "Removed object can not be null!");
57 LOG.debug("Delete Neutron Port model data changes for key: {} delete: {}", identifier, change);
59 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.ports.Port> portIid =
60 MdsalHelper.createPortInstanceIdentifier(change.getUuid());
62 LOG.debug("Remove netvirt Port uuid {} from mdsal", change.getUuid());
64 boolean result = mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, portIid);
66 LOG.debug("Remove netvirt port from mdsal success. Result: {}", result);
68 LOG.warn("Remove nevtirt port failed. Result: {}", result);
70 } catch (Exception e) {
71 LOG.warn("Remove netvirt port failed: exception {}", e);
76 * Update a netvirt port in mdsal
78 * @param identifier - the whole path to DataObject
79 * @param original - original DataObject (for update)
80 * @param change - port to be updated
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);
95 * Add a netvirt port to mdsal
97 * @param identifier - the whole path to new DataObject
98 * @param change - port to be added
101 public void add(final InstanceIdentifier<Port> identifier,
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();
107 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ports.rev151227.ports.Port> portIid =
108 MdsalHelper.createPortInstanceIdentifier(change.getUuid());
110 portBuilder.setStatus(change.getStatus());
111 if (change.isAdminStateUp() != null) {
112 portBuilder.setAdminStateUp(change.isAdminStateUp());
114 portBuilder.setName(change.getName());
117 // Some neutron fields to consider for netvirt model
120 // extra-dhcp-opts list
127 // port-security-enabled
130 if (Constants.NETVIRT_NEUTRON_PORT_TYPE_MAP.get(change.getDeviceOwner()) != null) {
131 portBuilder.setPortType(Constants.NETVIRT_NEUTRON_PORT_TYPE_MAP.get(change.getDeviceOwner()));
133 LOG.warn("Unsupported device owner for neutron port identifier: {} port: {}", identifier, change);
134 portBuilder.setPortType(PortTypeBase.class);
137 // TODO - set parent when applicable
138 //portB.setParent(change.getParent());
140 portBuilder.setDeviceUuid(new Uuid(change.getDeviceId()));
141 portBuilder.setDeviceLocatorUuid(change.getNetworkId());
142 portBuilder.setKey(new PortKey(change.getUuid()));
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()));
149 EndPoints endPoint = new EndPointsBuilder()
150 .setMacaddr(new MacAddress(change.getMacAddress()))
151 .setIpaddrs(ipAddressList)
153 portBuilder.setEndPoints(Collections.singletonList(endPoint));
156 LOG.debug("Add Netvirt Port {} to mdsal", portBuilder.build().toString());
158 boolean result = mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, portIid, portBuilder.build());
160 LOG.debug("createPort:addToMdSal success. Result: {}", result);
162 LOG.warn("createPort:addToMdSal failed. Result: {}", result);
164 } catch (Exception e) {
165 LOG.warn("create Netvirt Port : addToMdSal exception {}", e);