Merge "Integrate md-sal port model and add more port E2E tests"
[neutron.git] / transcriber / src / main / java / org / opendaylight / neutron / transcriber / NeutronSecurityGroupInterface.java
1 /*
2  * Copyright (C) 2014 Red Hat, Inc.
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
10 package org.opendaylight.neutron.transcriber;
11
12 import java.util.ArrayList;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Map.Entry;
16 import java.util.Set;
17 import java.util.concurrent.ConcurrentHashMap;
18 import java.util.concurrent.ConcurrentMap;
19
20 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
21 import org.opendaylight.neutron.spi.INeutronSecurityGroupCRUD;
22 import org.opendaylight.neutron.spi.INeutronSecurityRuleCRUD;
23 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
24 import org.opendaylight.neutron.spi.NeutronSecurityGroup;
25 import org.opendaylight.neutron.spi.NeutronSecurityRule;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150325.Neutron;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev141002.security.groups.attributes.SecurityGroups;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev141002.security.groups.attributes.security.groups.SecurityGroup;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev141002.security.groups.attributes.security.groups.SecurityGroupBuilder;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.osgi.framework.BundleContext;
33 import org.osgi.framework.ServiceRegistration;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37
38 public class NeutronSecurityGroupInterface extends AbstractNeutronInterface<SecurityGroup,NeutronSecurityGroup> implements INeutronSecurityGroupCRUD {
39     private static final Logger LOGGER = LoggerFactory.getLogger(NeutronSecurityGroupInterface.class);
40     private ConcurrentMap<String, NeutronSecurityGroup> securityGroupDB  = new ConcurrentHashMap<String, NeutronSecurityGroup>();
41
42
43     NeutronSecurityGroupInterface(ProviderContext providerContext) {
44         super(providerContext);
45     }
46
47     @Override
48     public boolean neutronSecurityGroupExists(String uuid) {
49         return securityGroupDB.containsKey(uuid);
50     }
51
52     @Override
53     public NeutronSecurityGroup getNeutronSecurityGroup(String uuid) {
54         if (!neutronSecurityGroupExists(uuid)) {
55             LOGGER.debug("No Security Groups Have Been Defined");
56             return null;
57         }
58         return securityGroupDB.get(uuid);
59     }
60
61     @Override
62     public List<NeutronSecurityGroup> getAllNeutronSecurityGroups() {
63         Set<NeutronSecurityGroup> allSecurityGroups = new HashSet<NeutronSecurityGroup>();
64         for (Entry<String, NeutronSecurityGroup> entry : securityGroupDB.entrySet()) {
65             NeutronSecurityGroup securityGroup = entry.getValue();
66             allSecurityGroups.add(securityGroup);
67         }
68         LOGGER.debug("Exiting getSecurityGroups, Found {} OpenStackSecurityGroup", allSecurityGroups.size());
69         List<NeutronSecurityGroup> ans = new ArrayList<NeutronSecurityGroup>();
70         ans.addAll(allSecurityGroups);
71         return ans;
72     }
73
74     @Override
75     public boolean addNeutronSecurityGroup(NeutronSecurityGroup input) {
76         if (neutronSecurityGroupExists(input.getSecurityGroupUUID())) {
77             return false;
78         }
79         NeutronCRUDInterfaces interfaces = new NeutronCRUDInterfaces()
80             .fetchINeutronSecurityRuleCRUD(this);
81         INeutronSecurityRuleCRUD sgrCrud = interfaces.getSecurityRuleInterface();
82         for(NeutronSecurityRule sgr : input.getSecurityRules()) {
83             sgrCrud.addNeutronSecurityRule(sgr);
84         }
85         securityGroupDB.putIfAbsent(input.getSecurityGroupUUID(), input);
86         addMd(input);
87         return true;
88     }
89
90     @Override
91     public boolean removeNeutronSecurityGroup(String uuid) {
92         if (!neutronSecurityGroupExists(uuid)) {
93             return false;
94         }
95         securityGroupDB.remove(uuid);
96         removeMd(toMd(uuid));
97         return true;
98     }
99
100     @Override
101     public boolean updateNeutronSecurityGroup(String uuid, NeutronSecurityGroup delta) {
102         if (!neutronSecurityGroupExists(uuid)) {
103             return false;
104         }
105         NeutronSecurityGroup target = securityGroupDB.get(uuid);
106         boolean rc = overwrite(target, delta);
107         if (rc) {
108             updateMd(securityGroupDB.get(uuid));
109         }
110         return rc;
111     }
112
113     @Override
114     public boolean neutronSecurityGroupInUse(String securityGroupUUID) {
115         return !neutronSecurityGroupExists(securityGroupUUID);
116     }
117
118     @Override
119     protected SecurityGroup toMd(NeutronSecurityGroup securityGroup) {
120         SecurityGroupBuilder securityGroupBuilder = new SecurityGroupBuilder();
121         if (securityGroup.getSecurityGroupName() != null) {
122             securityGroupBuilder.setName(securityGroup.getSecurityGroupName());
123         }
124         if (securityGroup.getSecurityGroupDescription() != null) {
125             securityGroupBuilder.setDescription(securityGroup.getSecurityGroupDescription());
126         }
127         if (securityGroup.getSecurityGroupTenantID() != null) {
128             securityGroupBuilder.setTenantId(toUuid(securityGroup.getSecurityGroupTenantID()));
129         }
130         if (securityGroup.getSecurityRules() != null) {
131             List<Uuid> neutronSecurityRule = new ArrayList<>();
132             for (NeutronSecurityRule securityRule : securityGroup.getSecurityRules()) {
133                 if (securityRule.getSecurityRuleUUID() != null) {
134                     neutronSecurityRule.add(toUuid(securityRule.getSecurityRuleUUID()));
135                 }
136             }
137             securityGroupBuilder.setSecurityRules(neutronSecurityRule);
138         }
139         if (securityGroup.getSecurityGroupUUID() != null) {
140             securityGroupBuilder.setUuid(toUuid(securityGroup.getSecurityGroupUUID()));
141         } else {
142             LOGGER.warn("Attempting to write neutron securityGroup without UUID");
143         }
144
145         return securityGroupBuilder.build();
146     }
147
148     @Override
149     protected InstanceIdentifier<SecurityGroup> createInstanceIdentifier(SecurityGroup securityGroup) {
150         return InstanceIdentifier.create(Neutron.class).child(SecurityGroups.class).child(SecurityGroup.class,
151                 securityGroup.getKey());
152     }
153
154     @Override
155     protected SecurityGroup toMd(String uuid) {
156         SecurityGroupBuilder securityGroupBuilder = new SecurityGroupBuilder();
157         securityGroupBuilder.setUuid(toUuid(uuid));
158         return securityGroupBuilder.build();
159     }
160
161     public static void registerNewInterface(BundleContext context,
162                                             ProviderContext providerContext,
163                                             List<ServiceRegistration<?>> registrations) {
164         NeutronSecurityGroupInterface neutronSecurityGroupInterface = new NeutronSecurityGroupInterface(providerContext);
165         ServiceRegistration<INeutronSecurityGroupCRUD> neutronSecurityGroupInterfaceRegistration = context.registerService(INeutronSecurityGroupCRUD.class, neutronSecurityGroupInterface, null);
166         if(neutronSecurityGroupInterfaceRegistration != null) {
167             registrations.add(neutronSecurityGroupInterfaceRegistration);
168         }
169     }
170 }