Bug 6066 - Improve the logging.
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / netvirt / openstack / netvirt / translator / crud / impl / NeutronPortInterface.java
1 /*
2  * Copyright (c) 2013, 2015 IBM Corporation 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.openstack.netvirt.translator.crud.impl;
10
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort;
19 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_AllowedAddressPairs;
20 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_ExtraDHCPOption;
21 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronPort_VIFDetail;
22 import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronSecurityGroup;
23 import org.opendaylight.netvirt.openstack.netvirt.translator.Neutron_IPs;
24 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronPortCRUD;
25 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.INeutronSecurityGroupCRUD;
26 import org.opendaylight.netvirt.openstack.netvirt.translator.crud.NeutronCRUDInterfaces;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtension;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.PortBindingExtensionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetails;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.binding.attributes.VifDetailsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairsBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.ExtraDhcpOpts;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.ExtraDhcpOptsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.portsecurity.rev150712.PortSecurityExtension;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.portsecurity.rev150712.PortSecurityExtensionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.types.rev160517.IpPrefixOrAddress;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.osgi.framework.BundleContext;
49 import org.osgi.framework.ServiceRegistration;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53 public class NeutronPortInterface extends AbstractNeutronInterface<Port, NeutronPort> implements INeutronPortCRUD {
54     private static final Logger LOG = LoggerFactory.getLogger(NeutronPortInterface.class);
55
56     NeutronPortInterface(final DataBroker dataBroker) {
57         super(dataBroker);
58     }
59
60     // IfNBPortCRUD methods
61
62     @Override
63     public boolean portExists(String uuid) {
64         Port port = readMd(createInstanceIdentifier(toMd(uuid)));
65         return port != null;
66     }
67
68     @Override
69     public NeutronPort getPort(String uuid) {
70         Port port = readMd(createInstanceIdentifier(toMd(uuid)));
71         if (port == null) {
72             return null;
73         }
74         return fromMd(port);
75     }
76
77     @Override
78     public List<NeutronPort> getAllPorts() {
79         Set<NeutronPort> allPorts = new HashSet<>();
80         Ports ports = readMd(createInstanceIdentifier());
81         if (ports != null) {
82             for (Port port : ports.getPort()) {
83                 allPorts.add(fromMd(port));
84             }
85         }
86         LOG.debug("Exiting getAllPorts, Found {} OpenStackPorts", allPorts.size());
87         List<NeutronPort> ans = new ArrayList<>();
88         ans.addAll(allPorts);
89         return ans;
90     }
91
92     @Override
93     public boolean addPort(NeutronPort input) {
94         if (portExists(input.getID())) {
95             return false;
96         }
97         addMd(input);
98         return true;
99     }
100
101     @Override
102     public boolean removePort(String uuid) {
103         if (!portExists(uuid)) {
104             return false;
105         }
106         return removeMd(toMd(uuid));
107     }
108
109     @Override
110     public boolean updatePort(String uuid, NeutronPort delta) {
111         if (!portExists(uuid)) {
112             return false;
113         }
114         updateMd(delta);
115         return true;
116     }
117
118     // @deprecated, will be removed in Boron
119     @Override
120     public boolean macInUse(String macAddress) {
121         return false;
122     }
123
124     // @deprecated, will be removed in Boron
125     @Override
126     public NeutronPort getGatewayPort(String subnetUUID) {
127         return null;
128     }
129
130     @Override
131     protected InstanceIdentifier<Port> createInstanceIdentifier(Port port) {
132         return InstanceIdentifier.create(Neutron.class)
133                 .child(Ports.class)
134                 .child(Port.class, port.getKey());
135     }
136
137     protected InstanceIdentifier<Ports> createInstanceIdentifier() {
138         return InstanceIdentifier.create(Neutron.class)
139                 .child(Ports.class);
140     }
141
142     protected void addExtensions(Port port, NeutronPort result) {
143         PortBindingExtension binding = port.getAugmentation(PortBindingExtension.class);
144         result.setBindinghostID(binding.getHostId());
145         if (binding.getVifDetails() != null) {
146             final Map<String, String> details = new HashMap<String, String>(binding.getVifDetails().size());
147             for (final VifDetails vifDetail : binding.getVifDetails()) {
148                 details.put(vifDetail.getDetailsKey(), vifDetail.getValue());
149             }
150             result.setVIFDetails(details);
151         }
152         result.setBindingvifType(binding.getVifType());
153         result.setBindingvnicType(binding.getVnicType());
154     }
155
156     private void portSecurityExtension(Port port, NeutronPort result) {
157         PortSecurityExtension portSecurity = port.getAugmentation(PortSecurityExtension.class);
158         if(portSecurity != null && portSecurity.isPortSecurityEnabled() != null) {
159             result.setPortSecurityEnabled(portSecurity.isPortSecurityEnabled());
160         }
161     }
162
163     protected NeutronPort fromMd(Port port) {
164         NeutronPort result = new NeutronPort();
165         result.setAdminStateUp(port.isAdminStateUp());
166         if (port.getAllowedAddressPairs() != null) {
167             List<NeutronPort_AllowedAddressPairs> pairs = new ArrayList<>();
168             for (AllowedAddressPairs mdPair : port.getAllowedAddressPairs()) {
169                 NeutronPort_AllowedAddressPairs pair = new NeutronPort_AllowedAddressPairs();
170                 pair.setIpAddress(String.valueOf(mdPair.getIpAddress().getValue()));
171                 pair.setMacAddress(mdPair.getMacAddress().getValue());
172                 pairs.add(pair);
173             }
174             result.setAllowedAddressPairs(pairs);
175         }
176         result.setDeviceID(port.getDeviceId());
177         result.setDeviceOwner(port.getDeviceOwner());
178         if (port.getExtraDhcpOpts() != null) {
179             List<NeutronPort_ExtraDHCPOption> options = new ArrayList<>();
180             for (ExtraDhcpOpts opt : port.getExtraDhcpOpts()) {
181                 NeutronPort_ExtraDHCPOption arg = new NeutronPort_ExtraDHCPOption();
182                 arg.setName(opt.getOptName());
183                 arg.setValue(opt.getOptValue());
184                 options.add(arg);
185             }
186             result.setExtraDHCPOptions(options);
187         }
188         if (port.getFixedIps() != null) {
189             List<Neutron_IPs> ips = new ArrayList<>();
190             for (FixedIps mdIP : port.getFixedIps()) {
191                 Neutron_IPs ip = new Neutron_IPs();
192                 ip.setIpAddress(String.valueOf(mdIP.getIpAddress().getValue()));
193                 ip.setSubnetUUID(mdIP.getSubnetId().getValue());
194                 ips.add(ip);
195             }
196             result.setFixedIPs(ips);
197         }
198         result.setMacAddress(port.getMacAddress().getValue());
199         result.setName(port.getName());
200         result.setNetworkUUID(String.valueOf(port.getNetworkId().getValue()));
201         if (port.getSecurityGroups() != null) {
202             Set<NeutronSecurityGroup> allGroups = new HashSet<>();
203             NeutronCRUDInterfaces interfaces = new NeutronCRUDInterfaces().fetchINeutronSecurityGroupCRUD(this);
204             INeutronSecurityGroupCRUD sgIf = interfaces.getSecurityGroupInterface();
205             for (Uuid sgUuid : port.getSecurityGroups()) {
206                 NeutronSecurityGroup secGroup = sgIf.getNeutronSecurityGroup(sgUuid.getValue());
207                 if (secGroup != null) {
208                     allGroups.add(sgIf.getNeutronSecurityGroup(sgUuid.getValue()));
209                 }
210             }
211             List<NeutronSecurityGroup> groups = new ArrayList<>();
212             groups.addAll(allGroups);
213             result.setSecurityGroups(groups);
214         }
215         result.setStatus(port.getStatus());
216         if (port.getTenantId() != null) {
217             result.setTenantID(String.valueOf(port.getTenantId().getValue()).replace("-", ""));
218         }
219         result.setPortUUID(String.valueOf(port.getUuid().getValue()));
220         addExtensions(port, result);
221         portSecurityExtension(port, result);
222         return result;
223     }
224
225     @Override
226     protected Port toMd(NeutronPort neutronPort) {
227         PortBindingExtensionBuilder bindingBuilder = new PortBindingExtensionBuilder();
228         if (neutronPort.getBindinghostID() != null) {
229             bindingBuilder.setHostId(neutronPort.getBindinghostID());
230         }
231         if (neutronPort.getVIFDetails() != null) {
232             final Map<String, String> vifDetails = neutronPort.getVIFDetails();
233             final List<VifDetails> listVifDetail = new ArrayList<VifDetails>(vifDetails.size());
234             for (final Map.Entry<String, String> vifDetail : vifDetails.entrySet()) {
235                 final VifDetailsBuilder vifDetailsBuilder = new VifDetailsBuilder();
236                 if (vifDetail.getKey() != null) {
237                     vifDetailsBuilder.setDetailsKey(vifDetail.getKey());
238                 }
239                 if (vifDetail.getValue() != null) {
240                     vifDetailsBuilder.setValue(vifDetail.getValue());
241                 }
242                 listVifDetail.add(vifDetailsBuilder.build());
243             }
244             bindingBuilder.setVifDetails(listVifDetail);
245         }
246         if (neutronPort.getBindingvifType() != null) {
247             bindingBuilder.setVifType(neutronPort.getBindingvifType());
248         }
249         if (neutronPort.getBindingvnicType() != null) {
250             bindingBuilder.setVnicType(neutronPort.getBindingvnicType());
251         }
252
253         PortSecurityExtensionBuilder portSecurityBuilder = new PortSecurityExtensionBuilder();
254         if (neutronPort.getPortSecurityEnabled() != null) {
255             portSecurityBuilder.setPortSecurityEnabled(neutronPort.getPortSecurityEnabled());
256         }
257         PortBuilder portBuilder = new PortBuilder();
258         portBuilder.addAugmentation(PortBindingExtension.class,
259                                     bindingBuilder.build());
260         portBuilder.addAugmentation(PortSecurityExtension.class, portSecurityBuilder.build());
261         portBuilder.setAdminStateUp(neutronPort.isAdminStateUp());
262         if(neutronPort.getAllowedAddressPairs() != null) {
263             List<AllowedAddressPairs> listAllowedAddressPairs = new ArrayList<>();
264             for (NeutronPort_AllowedAddressPairs allowedAddressPairs : neutronPort.getAllowedAddressPairs()) {
265                     AllowedAddressPairsBuilder allowedAddressPairsBuilder = new AllowedAddressPairsBuilder();
266                     allowedAddressPairsBuilder.setIpAddress(new IpPrefixOrAddress(allowedAddressPairs.getIpAddress().toCharArray()));
267                     allowedAddressPairsBuilder.setMacAddress(new MacAddress(allowedAddressPairs.getMacAddress()));
268                     listAllowedAddressPairs.add(allowedAddressPairsBuilder.build());
269             }
270             portBuilder.setAllowedAddressPairs(listAllowedAddressPairs);
271         }
272         if (neutronPort.getDeviceID() != null) {
273             portBuilder.setDeviceId(neutronPort.getDeviceID());
274         }
275         if (neutronPort.getDeviceOwner() != null) {
276         portBuilder.setDeviceOwner(neutronPort.getDeviceOwner());
277         }
278         if (neutronPort.getExtraDHCPOptions() != null) {
279             List<ExtraDhcpOpts> listExtraDHCPOptions = new ArrayList<>();
280             for (NeutronPort_ExtraDHCPOption extraDHCPOption : neutronPort.getExtraDHCPOptions()) {
281                 ExtraDhcpOptsBuilder extraDHCPOptsBuilder = new ExtraDhcpOptsBuilder();
282                 extraDHCPOptsBuilder.setOptName(extraDHCPOption.getName());
283                 extraDHCPOptsBuilder.setOptValue(extraDHCPOption.getValue());
284                 listExtraDHCPOptions.add(extraDHCPOptsBuilder.build());
285             }
286             portBuilder.setExtraDhcpOpts(listExtraDHCPOptions);
287         }
288         if (neutronPort.getFixedIPs() != null) {
289             List<FixedIps> listNeutronIPs = new ArrayList<>();
290             for (Neutron_IPs neutron_IPs : neutronPort.getFixedIPs()) {
291                 FixedIpsBuilder fixedIpsBuilder = new FixedIpsBuilder();
292                 fixedIpsBuilder.setIpAddress(new IpAddress(neutron_IPs.getIpAddress().toCharArray()));
293                 fixedIpsBuilder.setSubnetId(toUuid(neutron_IPs.getSubnetUUID()));
294                 listNeutronIPs.add(fixedIpsBuilder.build());
295             }
296             portBuilder.setFixedIps(listNeutronIPs);
297         }
298         if (neutronPort.getMacAddress() != null) {
299             portBuilder.setMacAddress(new MacAddress(neutronPort.getMacAddress()));
300         }
301         if (neutronPort.getName() != null) {
302         portBuilder.setName(neutronPort.getName());
303         }
304         if (neutronPort.getNetworkUUID() != null) {
305         portBuilder.setNetworkId(toUuid(neutronPort.getNetworkUUID()));
306         }
307         if (neutronPort.getSecurityGroups() != null) {
308             List<Uuid> listSecurityGroups = new ArrayList<>();
309             for (NeutronSecurityGroup neutronSecurityGroup : neutronPort.getSecurityGroups()) {
310                 listSecurityGroups.add(toUuid(neutronSecurityGroup.getID()));
311             }
312             portBuilder.setSecurityGroups(listSecurityGroups);
313         }
314         if (neutronPort.getStatus() != null) {
315             portBuilder.setStatus(neutronPort.getStatus());
316         }
317         if (neutronPort.getTenantID() != null) {
318             portBuilder.setTenantId(toUuid(neutronPort.getTenantID()));
319         }
320         if (neutronPort.getPortUUID() != null) {
321             portBuilder.setUuid(toUuid(neutronPort.getPortUUID()));
322         } else {
323             LOG.warn("Attempting to write neutron port without UUID");
324         }
325         return portBuilder.build();
326     }
327
328     @Override
329     protected Port toMd(String uuid) {
330         PortBuilder portBuilder = new PortBuilder();
331         portBuilder.setUuid(toUuid(uuid));
332         return portBuilder.build();
333     }
334
335     public static void registerNewInterface(BundleContext context,
336                                             final DataBroker dataBroker,
337                                             List<ServiceRegistration<?>> registrations) {
338         NeutronPortInterface neutronPortInterface = new NeutronPortInterface(dataBroker);
339         ServiceRegistration<INeutronPortCRUD> neutronPortInterfaceRegistration = context.registerService(INeutronPortCRUD.class, neutronPortInterface, null);
340         if(neutronPortInterfaceRegistration != null) {
341             registrations.add(neutronPortInterfaceRegistration);
342         }
343     }
344 }