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