2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
9 package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;
\r
11 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
\r
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
\r
13 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
\r
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
\r
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
\r
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
\r
17 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
\r
18 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
\r
19 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
\r
20 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
\r
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.GbpByNeutronMappings;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.BaseEndpointsByPorts;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPort;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.base.endpoints.by.ports.BaseEndpointByPortKey;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointKey;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCaseBuilder;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortKey;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
\r
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
\r
39 import org.slf4j.Logger;
\r
40 import org.slf4j.LoggerFactory;
\r
42 import com.google.common.annotations.VisibleForTesting;
\r
43 import com.google.common.base.Optional;
\r
45 public class PortHandler implements TransactionChainListener {
\r
47 private static final Logger LOG = LoggerFactory.getLogger(MappingProvider.class);
\r
49 private BindingTransactionChain transactionChain;
\r
50 BaseEndpointByPortListener portByBaseEpListener;
\r
51 DataBroker dataBroker;
\r
53 PortHandler(DataBroker dataBroker) {
\r
54 this.dataBroker = dataBroker;
\r
55 transactionChain = this.dataBroker.createTransactionChain(this);
\r
58 void processCreated(Port port) {
\r
59 ReadTransaction rTx = dataBroker.newReadOnlyTransaction();
\r
60 Optional<BaseEndpointByPort> optBaseEpByPort = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
\r
61 createBaseEpByPortIid(port.getUuid()), rTx);
\r
62 if (!optBaseEpByPort.isPresent()) {
\r
65 processCreatedData(port, optBaseEpByPort.get());
\r
68 void processCreated(BaseEndpointByPort bebp) {
\r
69 ReadTransaction rTx = dataBroker.newReadOnlyTransaction();
\r
70 Optional<Port> optPort = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, createPortIid(
\r
71 bebp.getPortId()), rTx);
\r
72 if (!optPort.isPresent()) {
\r
75 processCreatedData(optPort.get(), bebp);
\r
79 void processCreatedData(Port port, BaseEndpointByPort bebp) {
\r
80 // port not used yet
\r
81 VppEndpoint vppEp = buildVppEp(bebp);
\r
82 writeVppEndpoint(createVppEndpointIid(vppEp.getKey()), vppEp, true);
\r
83 LOG.debug("Created vpp-endpoint {}", vppEp);
\r
86 void processUpdated(Port original, Port delta) {
\r
87 processCreated(delta);
\r
90 void processDeleted(BaseEndpointByPort bebp) {
\r
91 VppEndpoint vppEp = buildVppEp(bebp);
\r
92 writeVppEndpoint(createVppEndpointIid(vppEp.getKey()), vppEp, false);
\r
93 LOG.debug("Deleted vpp-endpoint {}", vppEp);
\r
96 private void writeVppEndpoint(InstanceIdentifier<VppEndpoint> vppEpIid, VppEndpoint vppEp, boolean created) {
\r
97 WriteTransaction wTx = transactionChain.newWriteOnlyTransaction();
\r
98 InstanceIdentifier<VppEndpoint> iid = createVppEndpointIid(vppEp.getKey());
\r
99 if (created == true) {
\r
100 wTx.put(LogicalDatastoreType.CONFIGURATION, iid, vppEp, true);
\r
102 wTx.delete(LogicalDatastoreType.CONFIGURATION, iid);
\r
105 wTx.submit().checkedGet();
\r
106 } catch (TransactionCommitFailedException e) {
\r
107 LOG.error("Transaction chain commit failed. {}", e);
\r
108 transactionChain.close();
\r
109 transactionChain = dataBroker.createTransactionChain(this);
\r
114 VppEndpoint buildVppEp(BaseEndpointByPort bebp) {
\r
115 return new VppEndpointBuilder().setContextId(bebp.getContextId())
\r
116 .setContextType(bebp.getContextType())
\r
117 .setAddress(bebp.getAddress())
\r
118 .setInterfaceTypeChoice(new VhostUserCaseBuilder().setSocket(bebp.getPortId().getValue()).build())
\r
119 .setAddressType(bebp.getAddressType())
\r
123 private InstanceIdentifier<VppEndpoint> createVppEndpointIid(VppEndpointKey vppEpKey) {
\r
124 return InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, vppEpKey).build();
\r
127 private InstanceIdentifier<BaseEndpointByPort> createBaseEpByPortIid(Uuid uuid) {
\r
128 return createBaseEpByPortIid(new UniqueId(uuid.getValue()));
\r
131 private InstanceIdentifier<BaseEndpointByPort> createBaseEpByPortIid(UniqueId uuid) {
\r
132 return InstanceIdentifier.builder(Mappings.class)
\r
133 .child(GbpByNeutronMappings.class)
\r
134 .child(BaseEndpointsByPorts.class)
\r
135 .child(BaseEndpointByPort.class, new BaseEndpointByPortKey(uuid))
\r
139 InstanceIdentifier<Port> createWildcartedPortIid() {
\r
140 return portsIid().child(Port.class).build();
\r
143 private InstanceIdentifier<Port> createPortIid(UniqueId uuid) {
\r
144 return portsIid().child(Port.class, new PortKey(new Uuid(uuid.getValue()))).build();
\r
147 private InstanceIdentifierBuilder<Ports> portsIid() {
\r
148 return InstanceIdentifier.builder(Neutron.class).child(Ports.class);
\r
152 public void onTransactionChainFailed(TransactionChain<?, ?> chain, AsyncTransaction<?, ?> transaction,
\r
154 LOG.error("Transaction chain failed. {}", cause.getMessage());
\r
155 transactionChain.close();
\r
156 transactionChain = dataBroker.createTransactionChain(this);
\r
160 public void onTransactionChainSuccessful(TransactionChain<?, ?> chain) {
\r
161 LOG.trace("Transaction chain was successfull. {}", chain);
\r