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