/*
- * Copyright (C) 2014 Red Hat, Inc.
+ * Copyright (c) 2014, 2015 Red Hat, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
package org.opendaylight.neutron.transcriber;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashSet;
+import com.google.common.collect.ImmutableBiMap;
import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.neutron.northbound.api.BadRequestException;
import org.opendaylight.neutron.spi.INeutronFirewallRuleCRUD;
import org.opendaylight.neutron.spi.NeutronFirewallRule;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Deprecated as all Neutron FWaaS is experimental and so doesn't meet
- * the scope of neutron northbound
- *
- * @deprecated
- */
-
-public class NeutronFirewallRuleInterface extends AbstractNeutronInterface implements INeutronFirewallRuleCRUD {
- private static final Logger logger = LoggerFactory.getLogger(NeutronFirewallRuleInterface.class);
-
- private ConcurrentMap<String, NeutronFirewallRule> firewallRuleDB = new ConcurrentHashMap<String, NeutronFirewallRule>();
-
-
- NeutronFirewallRuleInterface(ProviderContext providerContext) {
- super(providerContext);
- }
-
- // this method uses reflection to update an object from it's delta.
-
- private boolean overwrite(Object target, Object delta) {
- Method[] methods = target.getClass().getMethods();
-
- for(Method toMethod: methods){
- if(toMethod.getDeclaringClass().equals(target.getClass())
- && toMethod.getName().startsWith("set")){
-
- String toName = toMethod.getName();
- String fromName = toName.replace("set", "get");
-
- try {
- Method fromMethod = delta.getClass().getMethod(fromName);
- Object value = fromMethod.invoke(delta, (Object[])null);
- if(value != null){
- toMethod.invoke(target, value);
- }
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
- }
- return true;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV4;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV6;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.NeutronUtils.FwProtocolMapper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.ActionAllow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.ActionBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.ActionDeny;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.FirewallRuleAttributes.Protocol;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.rules.attributes.FirewallRules;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.rules.attributes.firewall.rules.FirewallRule;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.rules.attributes.firewall.rules.FirewallRuleBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.fwaas.rev150712.rules.attributes.firewall.rules.FirewallRuleKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.types.rev160517.IpPrefixOrAddress;
+
+public final class NeutronFirewallRuleInterface
+ extends AbstractNeutronInterface<FirewallRule, FirewallRules, FirewallRuleKey, NeutronFirewallRule>
+ implements INeutronFirewallRuleCRUD {
+ private static final ImmutableBiMap<Class<? extends ActionBase>,
+ String> ACTION_MAP = new ImmutableBiMap.Builder<Class<? extends ActionBase>, String>()
+ .put(ActionAllow.class, "allow").put(ActionDeny.class, "deny").build();
+
+ private static final ImmutableBiMap<Class<? extends IpVersionBase>,
+ Integer> IP_VERSION_MAP = new ImmutableBiMap.Builder<Class<? extends IpVersionBase>, Integer>()
+ .put(IpVersionV4.class, Integer.valueOf(4)).put(IpVersionV6.class, Integer.valueOf(6)).build();
+
+ NeutronFirewallRuleInterface(DataBroker db) {
+ super(FirewallRuleBuilder.class, db);
}
@Override
- public boolean neutronFirewallRuleExists(String uuid) {
- return firewallRuleDB.containsKey(uuid);
+ protected List<FirewallRule> getDataObjectList(FirewallRules rules) {
+ return rules.getFirewallRule();
}
@Override
- public NeutronFirewallRule getNeutronFirewallRule(String uuid) {
- if (!neutronFirewallRuleExists(uuid)) {
- logger.debug("No Firewall Rule Have Been Defined");
- return null;
+ protected NeutronFirewallRule fromMd(FirewallRule rule) {
+ final NeutronFirewallRule answer = new NeutronFirewallRule();
+ fromMdBaseAttributes(rule, answer);
+ if (rule.isShared() != null) {
+ answer.setFirewallRuleIsShared(rule.isShared());
}
- return firewallRuleDB.get(uuid);
- }
-
- @Override
- public List<NeutronFirewallRule> getAllNeutronFirewallRules() {
- Set<NeutronFirewallRule> allFirewallRules = new HashSet<NeutronFirewallRule>();
- for (Entry<String, NeutronFirewallRule> entry : firewallRuleDB.entrySet()) {
- NeutronFirewallRule firewallRule = entry.getValue();
- allFirewallRules.add(firewallRule);
- }
- logger.debug("Exiting getFirewallRules, Found {} OpenStackFirewallRule", allFirewallRules.size());
- List<NeutronFirewallRule> ans = new ArrayList<NeutronFirewallRule>();
- ans.addAll(allFirewallRules);
- return ans;
- }
-
- @Override
- public boolean addNeutronFirewallRule(NeutronFirewallRule input) {
- if (neutronFirewallRuleExists(input.getFirewallRuleUUID())) {
- return false;
+ if (rule.isEnabled() != null) {
+ answer.setFirewallRuleIsEnabled(rule.isEnabled());
}
- firewallRuleDB.putIfAbsent(input.getFirewallRuleUUID(), input);
- return true;
- }
-
- @Override
- public boolean removeNeutronFirewallRule(String uuid) {
- if (!neutronFirewallRuleExists(uuid)) {
- return false;
+ if (rule.getFirewallPolicyId() != null) {
+ answer.setFirewallRulePolicyID(rule.getFirewallPolicyId().getValue());
}
- firewallRuleDB.remove(uuid);
- return true;
- }
-
- @Override
- public boolean updateNeutronFirewallRule(String uuid, NeutronFirewallRule delta) {
- if (!neutronFirewallRuleExists(uuid)) {
- return false;
+ if (rule.getProtocol() != null) {
+ final Protocol protocol = rule.getProtocol();
+ if (protocol.getUint8() != null) {
+ // uint8
+ answer.setFirewallRuleProtocol(protocol.getUint8().toString());
+ } else {
+ // symbolic protocol name
+ answer.setFirewallRuleProtocol(FwProtocolMapper.getName(protocol.getIdentityref()));
+ }
}
- NeutronFirewallRule target = firewallRuleDB.get(uuid);
- return overwrite(target, delta);
- }
-
- @Override
- public boolean neutronFirewallRuleInUse(String firewallRuleUUID) {
- return !neutronFirewallRuleExists(firewallRuleUUID);
- }
-
- @Override
- protected InstanceIdentifier createInstanceIdentifier(DataObject item) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- protected DataObject toMd(Object neutronObject) {
- // TODO Auto-generated method stub
- return null;
+ if (rule.getIpVersion() != null) {
+ answer.setFirewallRuleIpVer(IP_VERSION_MAP.get(rule.getIpVersion()));
+ }
+ if (rule.getSourceIpAddr() != null) {
+ answer.setFirewallRuleSrcIpAddr(String.valueOf(rule.getSourceIpAddr().getValue()));
+ }
+ if (rule.getDestinationIpAddr() != null) {
+ answer.setFirewallRuleDstIpAddr(String.valueOf(rule.getDestinationIpAddr().getValue()));
+ }
+ if (rule.getSourcePortRangeMin() != null) {
+ answer.setFirewallRuleSrcPortRangeMin(rule.getSourcePortRangeMin());
+ }
+ if (rule.getSourcePortRangeMax() != null) {
+ answer.setFirewallRuleSrcPortRangeMax(rule.getSourcePortRangeMax());
+ }
+ if (rule.getDestinationPortRangeMin() != null) {
+ answer.setFirewallRuleDstPortRangeMin(rule.getDestinationPortRangeMin());
+ }
+ if (rule.getDestinationPortRangeMax() != null) {
+ answer.setFirewallRuleDstPortRangeMax(rule.getDestinationPortRangeMax());
+ }
+ if (rule.getPosition() != null) {
+ answer.setFirewallRulePosition(Integer.valueOf(rule.getPosition().intValue()));
+ }
+ if (rule.getAction() != null) {
+ answer.setFirewallRuleAction(ACTION_MAP.get(rule.getAction()));
+ }
+ return answer;
}
@Override
- protected DataObject toMd(String uuid) {
- // TODO Auto-generated method stub
- return null;
+ protected FirewallRule toMd(NeutronFirewallRule rule) {
+ final FirewallRuleBuilder ruleBuilder = new FirewallRuleBuilder();
+ toMdBaseAttributes(rule, ruleBuilder);
+ if (rule.getFirewallRuleIsShared() != null) {
+ ruleBuilder.setShared(rule.getFirewallRuleIsShared());
+ }
+ if (rule.getFirewallRuleIsEnabled() != null) {
+ ruleBuilder.setEnabled(rule.getFirewallRuleIsEnabled());
+ }
+ if (rule.getFirewallRulePolicyID() != null) {
+ ruleBuilder.setFirewallPolicyId(toUuid(rule.getFirewallRulePolicyID()));
+ }
+ if (rule.getFirewallRuleProtocol() != null) {
+ final String protocolString = rule.getFirewallRuleProtocol();
+ try {
+ final Protocol protocol = new Protocol(protocolString.toCharArray());
+ ruleBuilder.setProtocol(protocol);
+ } catch (NumberFormatException e) {
+ throw new BadRequestException("Protocol {" + rule.getFirewallRuleProtocol()
+ + "} is not supported");
+ }
+ }
+ if (rule.getFirewallRuleIpVer() != null) {
+ final ImmutableBiMap<Integer, Class<? extends IpVersionBase>> mapper = IP_VERSION_MAP.inverse();
+ ruleBuilder.setIpVersion(mapper.get(rule.getFirewallRuleIpVer()));
+ }
+ if (rule.getFirewallRuleSrcIpAddr() != null) {
+ final IpPrefixOrAddress ipAddress = new IpPrefixOrAddress(rule.getFirewallRuleSrcIpAddr().toCharArray());
+ ruleBuilder.setSourceIpAddr(ipAddress);
+ }
+ if (rule.getFirewallRuleDstIpAddr() != null) {
+ final IpPrefixOrAddress ipAddress = new IpPrefixOrAddress(rule.getFirewallRuleDstIpAddr().toCharArray());
+ ruleBuilder.setDestinationIpAddr(ipAddress);
+ }
+ if (rule.getFirewallRuleSrcPortRangeMin() != null) {
+ ruleBuilder.setSourcePortRangeMin(rule.getFirewallRuleSrcPortRangeMin());
+ }
+ if (rule.getFirewallRuleSrcPortRangeMax() != null) {
+ ruleBuilder.setSourcePortRangeMax(rule.getFirewallRuleSrcPortRangeMax());
+ }
+ if (rule.getFirewallRuleDstPortRangeMin() != null) {
+ ruleBuilder.setDestinationPortRangeMin(rule.getFirewallRuleDstPortRangeMin());
+ }
+ if (rule.getFirewallRuleDstPortRangeMax() != null) {
+ ruleBuilder.setDestinationPortRangeMax(rule.getFirewallRuleDstPortRangeMax());
+ }
+ if (rule.getFirewallRulePosition() != null) {
+ ruleBuilder.setPosition(rule.getFirewallRulePosition().shortValue());
+ }
+ if (rule.getFirewallRuleAction() != null) {
+ final ImmutableBiMap<String, Class<? extends ActionBase>> mapper = ACTION_MAP.inverse();
+ ruleBuilder.setAction(mapper.get(rule.getFirewallRuleAction()));
+ }
+ return ruleBuilder.build();
}
-
}