2 * Copyright (c) 2016, 2017 Brocade Communications Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.netvirt.sfc.translator;
11 import org.eclipse.jdt.annotation.Nullable;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
14 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
15 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
16 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.ServiceFunctions;
17 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
18 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionKey;
19 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.ServiceFunctionChains;
20 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain;
21 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainKey;
22 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.ServiceFunctionForwarders;
23 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
24 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey;
25 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPaths;
26 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
27 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathKey;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.AclKey;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 * Utility methods to read OpenDaylight SFC models.
38 public class SfcMdsalHelper {
39 private static final Logger LOG = LoggerFactory.getLogger(SfcMdsalHelper.class);
40 private static final InstanceIdentifier<AccessLists> ACCESS_LIST_IID = InstanceIdentifier.create(AccessLists.class);
41 private static final InstanceIdentifier<ServiceFunctions> SF_IID =
42 InstanceIdentifier.create(ServiceFunctions.class);
43 private static final InstanceIdentifier<ServiceFunctionForwarders> SFF_IID =
44 InstanceIdentifier.create(ServiceFunctionForwarders.class);
45 private static final InstanceIdentifier<ServiceFunctionChains> SFC_IID =
46 InstanceIdentifier.create(ServiceFunctionChains.class);
47 private static final InstanceIdentifier<ServiceFunctionPaths> SFP_IID
48 = InstanceIdentifier.create(ServiceFunctionPaths.class);
49 public static final String NETVIRT_LOGICAL_SFF_NAME = "Netvirt-Logical-SFF";
51 private final DataBroker dataBroker;
53 public SfcMdsalHelper(DataBroker dataBroker) {
54 this.dataBroker = dataBroker;
57 //ACL Flow Classifier data store utility methods
58 public void addAclFlowClassifier(Acl aclFlowClassifier) {
59 InstanceIdentifier<Acl> aclIid = getAclPath(aclFlowClassifier.key());
60 LOG.info("Write ACL FlowClassifier {} to config data store at {}",aclFlowClassifier, aclIid);
62 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, aclIid,
64 } catch (TransactionCommitFailedException e) {
65 LOG.error("Error writing {} to {}", aclFlowClassifier, aclIid, e);
69 public void updateAclFlowClassifier(Acl aclFlowClassifier) {
70 InstanceIdentifier<Acl> aclIid = getAclPath(aclFlowClassifier.key());
71 LOG.info("Update ACL FlowClassifier {} in config data store at {}",aclFlowClassifier, aclIid);
73 SingleTransactionDataBroker.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, aclIid,
75 } catch (TransactionCommitFailedException e) {
76 LOG.warn("Failed to merge {}", aclIid, e);
80 public void removeAclFlowClassifier(Acl aclFlowClassifier) {
81 InstanceIdentifier<Acl> aclIid = getAclPath(aclFlowClassifier.key());
82 LOG.info("Remove ACL FlowClassifier {} from config data store at {}",aclFlowClassifier, aclIid);
84 SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, aclIid);
85 } catch (TransactionCommitFailedException e) {
86 LOG.warn("Failed to delete {}", aclIid, e);
92 public ServiceFunction readServiceFunction(ServiceFunctionKey sfKey) {
93 InstanceIdentifier<ServiceFunction> sfIid = getSFPath(sfKey);
94 LOG.info("Read Service Function {} from config data store at {}",sfKey, sfIid);
95 return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
96 LogicalDatastoreType.CONFIGURATION, sfIid).orNull();
99 public void addServiceFunction(ServiceFunction sf) {
100 InstanceIdentifier<ServiceFunction> sfIid = getSFPath(sf.key());
101 LOG.info("Write Service Function {} to config data store at {}",sf, sfIid);
103 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, sfIid, sf);
104 } catch (TransactionCommitFailedException e) {
105 LOG.error("Error writing {} to {}", sf, sfIid, e);
109 public void updateServiceFunction(ServiceFunction sf) {
110 InstanceIdentifier<ServiceFunction> sfIid = getSFPath(sf.key());
111 LOG.info("Update Service Function {} in config data store at {}",sf, sfIid);
113 SingleTransactionDataBroker.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, sfIid, sf);
114 } catch (TransactionCommitFailedException e) {
115 LOG.warn("Failed to merge {}", sfIid, e);
119 public void removeServiceFunction(ServiceFunctionKey sfKey) {
120 InstanceIdentifier<ServiceFunction> sfIid = getSFPath(sfKey);
121 LOG.info("Remove Service Function {} from config data store at {}",sfKey, sfIid);
123 SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, sfIid);
124 } catch (TransactionCommitFailedException e) {
125 LOG.warn("Failed to delete {}", sfIid, e);
129 //Service Function Forwarder
131 public ServiceFunctionForwarder readServiceFunctionForwarder(ServiceFunctionForwarderKey sffKey) {
132 InstanceIdentifier<ServiceFunctionForwarder> sffIid = getSFFPath(sffKey);
133 LOG.info("Read Service Function Forwarder from config data store at {}", sffIid);
134 return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
135 LogicalDatastoreType.CONFIGURATION, sffIid).orNull();
138 public void addServiceFunctionForwarder(ServiceFunctionForwarder sff) {
139 InstanceIdentifier<ServiceFunctionForwarder> sffIid = getSFFPath(sff.key());
140 LOG.info("Write Service Function Forwarder {} to config data store at {}",sff, sffIid);
142 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, sffIid, sff);
143 } catch (TransactionCommitFailedException e) {
144 LOG.error("Error writing {} to {}", sff, sffIid, e);
148 public void updateServiceFunctionForwarder(ServiceFunctionForwarder sff) {
149 InstanceIdentifier<ServiceFunctionForwarder> sffIid = getSFFPath(sff.key());
150 LOG.info("Update Service Function Forwarder {} to config data store at {}",sff, sffIid);
152 SingleTransactionDataBroker.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, sffIid, sff);
153 } catch (TransactionCommitFailedException e) {
154 LOG.error("Error writing {} to {}", sff, sffIid, e);
158 public void deleteServiceFunctionForwarder(ServiceFunctionForwarderKey sffKey) {
159 InstanceIdentifier<ServiceFunctionForwarder> sffIid = getSFFPath(sffKey);
160 LOG.info("Delete Service Function Forwarder from config data store at {}", sffIid);
162 SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, sffIid);
163 } catch (TransactionCommitFailedException e) {
164 LOG.warn("Failed to delete {}", sffIid, e);
168 public void addServiceFunctionChain(ServiceFunctionChain sfc) {
169 InstanceIdentifier<ServiceFunctionChain> sfcIid = getSFCPath(sfc.key());
170 LOG.info("Write Service Function Chain {} to config data store at {}",sfc, sfcIid);
172 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, sfcIid, sfc);
173 } catch (TransactionCommitFailedException e) {
174 LOG.error("Error writing {} to {}", sfc, sfcIid, e);
178 public void deleteServiceFunctionChain(ServiceFunctionChainKey sfcKey) {
179 InstanceIdentifier<ServiceFunctionChain> sfcIid = getSFCPath(sfcKey);
180 LOG.info("Remove Service Function Chain {} from config data store at {}",sfcKey, sfcIid);
182 SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, sfcIid);
183 } catch (TransactionCommitFailedException e) {
184 LOG.warn("Failed to delete {}", sfcIid, e);
188 public void addServiceFunctionPath(ServiceFunctionPath sfp) {
189 InstanceIdentifier<ServiceFunctionPath> sfpIid = getSFPPath(sfp.key());
190 LOG.info("Write Service Function Path {} to config data store at {}",sfp, sfpIid);
192 SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, sfpIid, sfp);
193 } catch (TransactionCommitFailedException e) {
194 LOG.error("Error writing {} to {}", sfp, sfpIid, e);
198 public void deleteServiceFunctionPath(ServiceFunctionPathKey sfpKey) {
199 InstanceIdentifier<ServiceFunctionPath> sfpIid = getSFPPath(sfpKey);
200 LOG.info("Delete Service Function Path from config data store at {}", sfpIid);
202 SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, sfpIid);
203 } catch (TransactionCommitFailedException e) {
204 LOG.warn("Failed to delete {}", sfpIid, e);
208 private static InstanceIdentifier<Acl> getAclPath(AclKey aclKey) {
209 return ACCESS_LIST_IID.builder().child(Acl.class, aclKey).build();
212 private static InstanceIdentifier<ServiceFunction> getSFPath(ServiceFunctionKey key) {
213 return SF_IID.builder().child(ServiceFunction.class, key).build();
216 private static InstanceIdentifier<ServiceFunctionForwarder> getSFFPath(ServiceFunctionForwarderKey key) {
217 return SFF_IID.builder().child(ServiceFunctionForwarder.class, key).build();
220 private static InstanceIdentifier<ServiceFunctionChain> getSFCPath(ServiceFunctionChainKey key) {
221 return SFC_IID.builder().child(ServiceFunctionChain.class, key).build();
224 private static InstanceIdentifier<ServiceFunctionPath> getSFPPath(ServiceFunctionPathKey key) {
225 return SFP_IID.builder().child(ServiceFunctionPath.class, key).build();