/*
* Copyright (c) 2015 Hewlett Packard Enterprise Development LP, Serro LLC 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.nic.impl;
import com.google.common.util.concurrent.CheckedFuture;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.nic.engine.IntentStateMachineExecutorService;
import org.opendaylight.nic.engine.StateMachine;
import org.opendaylight.nic.engine.utils.StateMachineUtils;
import org.opendaylight.nic.utils.EventType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.intent.rev150122.intents.Intent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.nic.intent.state.transaction.rev151203.intent.state.transactions.IntentStateTransaction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.nic.intent.state.transaction.rev151203.intent.state.transactions.IntentStateTransactionBuilder;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class IntentStateMachineExecutor implements IntentStateMachineExecutorService {
private static final Logger LOG = LoggerFactory.getLogger(IntentStateMachineExecutor.class);
private ServiceRegistration<IntentStateMachineExecutorService> nicStateMachineServiceRegistration;
private DataBroker dataBroker;
public IntentStateMachineExecutor(DataBroker dataBroker) {
this.dataBroker = dataBroker;
}
@Override
public void init() {
LOG.info("Intent State Machine Session Initiated.");
BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
nicStateMachineServiceRegistration = context.registerService(IntentStateMachineExecutorService.class, this, null);
}
@Override
public synchronized CheckedFuture<Void, TransactionCommitFailedException> createTransaction(
final String intentId,
final EventType receivedEvent) {
final IntentStateTransaction transaction = new IntentStateTransactionBuilder()
.setIntentId(intentId)
.setDeployAttempts(StateMachineUtils.MAX_ATTEMPTS)
.setUndeployAttempts(StateMachineUtils.MAX_ATTEMPTS)
.setCurrentState(StateMachineUtils.INITIAL_STATE)
.setReceivedEvent(receivedEvent.toString()).build();
final StateMachine engineService =
new StateMachineEngineImpl(new TransactionHandlerServiceImpl(dataBroker));
final CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = engineService.pushTransaction(transaction);
return checkedFuture;
}
@Override
public synchronized CheckedFuture<Void, TransactionCommitFailedException> goToNextTransaction(String intentId, EventType eventType){
final StateMachine engineService = getEngineService();
final IntentStateTransaction transaction = engineService.retrieveTransaction(intentId);
final IntentStateTransaction newTransaction =
StateMachineUtils.buildNewTransactionBy(transaction, Intent.State.valueOf(transaction.getCurrentState()), eventType);
return engineService.execute(newTransaction);
}
@Override
public synchronized void removeTransactions(String intentId, EventType receivedEvent) {
final StateMachine engineService = getEngineService();
final IntentStateTransaction transaction = engineService.retrieveTransaction(intentId);
engineService.execute(new IntentStateTransactionBuilder(transaction).setReceivedEvent(receivedEvent.name()).build());
}
@Override
public synchronized boolean canEvaluateAttempt(String id, EventType eventType) {
return getEngineService().canExecute(id, eventType);
}
private StateMachine getEngineService() {
return new StateMachineEngineImpl(new TransactionHandlerServiceImpl(dataBroker));
}
@Override
public void close() throws Exception {
nicStateMachineServiceRegistration.unregister();
}
}