/* * Copyright (c) 2016, 2017 NEC Corporation 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, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.ovsdb.southbound.reconciliation.configuration; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec; import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance; import org.opendaylight.ovsdb.southbound.OvsdbConnectionManager; import org.opendaylight.ovsdb.southbound.SouthboundMapper; import org.opendaylight.ovsdb.southbound.ovsdb.transact.BridgeOperationalState; import org.opendaylight.ovsdb.southbound.ovsdb.transact.TerminationPointCreateCommand; import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationManager; import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationTask; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Reconciliation task to reconcile termination point configurations in the config datastore. * When the OVS switch connects to the ODL, the list of all bridge and termination point * configurations in the config datastore are obtained. * We then listens for any new bridge show up in the operational data store. * If the new bridge is in the list of bridges to be reconciled as described above * termination point reconciliation is triggered for that bridge. */ public class TerminationPointConfigReconciliationTask extends ReconciliationTask { private static final Logger LOG = LoggerFactory.getLogger(TerminationPointConfigReconciliationTask.class); private final OvsdbConnectionInstance connectionInstance; private final InstanceIdentifierCodec instanceIdentifierCodec; public TerminationPointConfigReconciliationTask(final ReconciliationManager reconciliationManager, final OvsdbConnectionManager connectionManager, final Node bridgeNode, final InstanceIdentifier<?> bridgeIid, final OvsdbConnectionInstance connectionInstance, final InstanceIdentifierCodec instanceIdentifierCodec) { super(reconciliationManager, connectionManager, bridgeIid, bridgeNode); this.connectionInstance = connectionInstance; this.instanceIdentifierCodec = instanceIdentifierCodec; } @Override public boolean reconcileConfiguration(final OvsdbConnectionManager connectionManager) { LOG.debug("Reconcile Termination Point Configuration for node {}", ((Node) configData).getNodeId()); final Map<InstanceIdentifier<?>, DataObject> changes = new HashMap<>(); changes.putAll(SouthboundMapper.extractTerminationPointConfigurationChanges((Node) configData)); AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvents = new AsyncDataChangeEvent() { @Override public Map<InstanceIdentifier<?>, DataObject> getCreatedData() { return changes; } @Override public Map<InstanceIdentifier<?>, DataObject> getUpdatedData() { return Collections.emptyMap(); } @Override public Map<InstanceIdentifier<?>, DataObject> getOriginalData() { return Collections.emptyMap(); } @Override public Set<InstanceIdentifier<?>> getRemovedPaths() { return Collections.emptySet(); } @Override public DataObject getOriginalSubtree() { return null; } @Override public DataObject getUpdatedSubtree() { return null; } }; connectionInstance.transact(new TerminationPointCreateCommand(), new BridgeOperationalState(reconciliationManager.getDb(), changeEvents), changeEvents, instanceIdentifierCodec); return true; } @Override public void doRetry(boolean wasPreviousAttemptSuccessful) { } @Override public void checkReadinessAndProcess() { } @Override public long retryDelayInMills() { return 0; } }