Refactoring rollback when service create fails 30/109830/6
authorJoakim Törnqvist <joakim.tornqvist@smartoptics.com>
Wed, 17 Jan 2024 14:35:53 +0000 (14:35 +0000)
committerJoakim Törnqvist <joakim.tornqvist@smartoptics.com>
Tue, 13 Feb 2024 12:58:35 +0000 (12:58 +0000)
commit9a30b4a275893473efc7486a24605aeb9c11d9f8
treebe409b519a22abaaf84774718197e52b16d87d60
parent0a5e92dab0c7a79e3c7b446802d4551e53f943dc
Refactoring rollback when service create fails

The new rollback feature is primarily implemented in the method
deviceRendering in the class RendererServiceOperationsImpl.

The new class TransactionHistory is passed into
DeviceRendererServiceImpl via DeviceRenderingTask.
DeviceRendererServiceImpl populates the TransationHistory class
with created interfaces etc.

A new rollback task NetworkDeviceRenderingRollbackTask has been
created intended to replace DeviceRenderingRollbackTask. The
class is instantiated with a TransactionHistory object intended
to be used in case of a rollback.

Sample pseudo code extract

class RendererServiceOperationsImpl:
private List<DeviceRenderingResult> deviceRendering(...) {

    History transactionHistory = new TransactionHistory();

    ListenableFuture<DeviceRenderingResult> atozrenderingFuture =
        this.executor.submit(
            new DeviceRenderingTask(..., transactionHistory));

    ListenableFuture<DeviceRenderingResult> ztoarenderingFuture =
        this.executor.submit(
            new DeviceRenderingTask(..., transactionHistory));

    ListenableFuture<List<DeviceRenderingResult>>
        renderingCombinedFuture = Futures.allAsList(
            atozrenderingFuture, ztoarenderingFuture
        );

    List<DeviceRenderingResult> renderingResults = new ArrayList<>(2);
    renderingResults = renderingCombinedFuture.get(...);

    rollbackProcessor.addTask(
        new NetworkDeviceRenderingRollbackTask(
            "RollbackTransactionHistoryTask",
            transactionHistory,
            ! (renderingResults.get(0).isSuccess()
                && renderingResults.get(1).isSuccess()),
            deviceRenderer,
            new RollbackResultMessage()
        )
    );

    return renderingResults;
}

New somewhat simplified rollback method using TransactionHistory
intended to replace the previous method using RendererRollbackInput:

class RendererServiceOperationsImpl:
@Override
public RendererRollbackOutput rendererRollback(
    History transactionHistory
) {
    LOG.info("Rolling back...");

    Result rollbackResult = new FailedRollbackResult();
    Subscriber deleteSubscriber = new DeleteSubscriber(rollbackResult);

    transactionHistory.rollback(
            new DeleteService(
                    crossConnect,
                    openRoadmInterfaces,
                    deleteSubscriber
            )
    );

    LOG.info("Rollback done!");

    return rollbackResult.renderRollbackOutput();
}

JIRA: TRNSPRTPCE-615
Change-Id: Ib795f077ae763bd92bac44ee77186a19ed0e4b2a
Signed-off-by: Joakim Törnqvist <joakim.tornqvist@smartoptics.com>
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererService.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/DeviceRenderingTask.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/NetworkDeviceRenderingRollbackTask.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/ResultMessage.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/RollbackResultMessage.java [new file with mode: 0644]
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplTest.java