/* * Copyright (c) 2015 Cisco Systems, 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, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.sf; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; import org.opendaylight.groupbasedpolicy.util.IidFactory; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ActionDefinition; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedActionDefinition; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinition; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; public class SupportedActionDefinitionListener implements ClusteredDataTreeChangeListener<SupportedActionDefinition>, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(SupportedActionDefinitionListener.class); private final DataBroker dataProvider; private final ListenerRegistration<SupportedActionDefinitionListener> registration; @VisibleForTesting final SetMultimap<ClassifierDefinitionId, InstanceIdentifier<SupportedClassifierDefinition>> supportedCdIidByCdId = HashMultimap.create(); @VisibleForTesting final Map<InstanceIdentifier<SupportedClassifierDefinition>, ClassifierInstanceValidator> ciValidatorBySupportedCdIid = new HashMap<>(); public SupportedActionDefinitionListener(DataBroker dataProvider) { this.dataProvider = checkNotNull(dataProvider); registration = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, IidFactory.supportedActionDefinitionIidWildcard()), this); } @Override public void onDataTreeChanged(Collection<DataTreeModification<SupportedActionDefinition>> changes) { for (DataTreeModification<SupportedActionDefinition> change : changes) { DataObjectModification<SupportedActionDefinition> rootNode = change.getRootNode(); switch (rootNode.getModificationType()) { case WRITE: case SUBTREE_MODIFIED: ActionDefinitionId actionDefinitionId = rootNode.getDataAfter().getActionDefinitionId(); ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); Optional<ActionDefinition> potentialAdFromConfDs = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, IidFactory.actionDefinitionIid(actionDefinitionId), rwTx); if (!potentialAdFromConfDs.isPresent()) { LOG.error("Action-definition with ID {} does not exist in CONF datastore.", actionDefinitionId); return; } // TODO validation needs to be finished - this is effectively a union. ActionDefinition ad = potentialAdFromConfDs.get(); rwTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.actionDefinitionIid(actionDefinitionId), ad); DataStoreHelper.submitToDs(rwTx); break; case DELETE: throw new UnsupportedOperationException("Not implemented yet."); } } } @Override public void close() { registration.close(); } }