Merge "PCEPReplyMessageParser fix - separate reply's serialization"
[bgpcep.git] / pcep / topology-provider / src / main / java / org / opendaylight / bgpcep / pcep / topology / provider / TopologyProgramming.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.bgpcep.pcep.topology.provider;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.util.concurrent.Futures;
12 import com.google.common.util.concurrent.ListenableFuture;
13
14 import org.opendaylight.bgpcep.pcep.topology.spi.AbstractInstructionExecutor;
15 import org.opendaylight.bgpcep.programming.spi.InstructionScheduler;
16 import org.opendaylight.bgpcep.programming.spi.SuccessfulRpcResult;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.NetworkTopologyPcepProgrammingService;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspInput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspOutput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspOutputBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalInput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalOutputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspOutput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspOutputBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspOutputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.OperationResult;
32 import org.opendaylight.yangtools.yang.common.RpcResult;
33
34 /**
35  *
36  */
37 final class TopologyProgramming implements NetworkTopologyPcepProgrammingService {
38     private final InstructionScheduler scheduler;
39     private final ServerSessionManager manager;
40
41     TopologyProgramming(final InstructionScheduler scheduler, final ServerSessionManager manager) {
42         this.scheduler = Preconditions.checkNotNull(scheduler);
43         this.manager = Preconditions.checkNotNull(manager);
44     }
45
46     @Override
47     public ListenableFuture<RpcResult<SubmitAddLspOutput>> submitAddLsp(final SubmitAddLspInput input) {
48         Preconditions.checkArgument(input.getNode() != null);
49         Preconditions.checkArgument(input.getName() != null);
50
51         final SubmitAddLspOutputBuilder b = new SubmitAddLspOutputBuilder();
52         b.setResult(AbstractInstructionExecutor.schedule(scheduler, new AbstractInstructionExecutor(input) {
53             @Override
54             protected ListenableFuture<OperationResult> invokeOperation() {
55                 return TopologyProgramming.this.manager.addLsp(input);
56             }
57         }));
58
59         final RpcResult<SubmitAddLspOutput> res = SuccessfulRpcResult.create(b.build());
60         return Futures.immediateFuture(res);
61     }
62
63     @Override
64     public ListenableFuture<RpcResult<SubmitRemoveLspOutput>> submitRemoveLsp(final SubmitRemoveLspInput input) {
65         Preconditions.checkArgument(input.getNode() != null);
66         Preconditions.checkArgument(input.getName() != null);
67
68         final SubmitRemoveLspOutputBuilder b = new SubmitRemoveLspOutputBuilder();
69         b.setResult(AbstractInstructionExecutor.schedule(scheduler, new AbstractInstructionExecutor(input) {
70             @Override
71             protected ListenableFuture<OperationResult> invokeOperation() {
72                 return TopologyProgramming.this.manager.removeLsp(input);
73             }
74         }));
75
76         final RpcResult<SubmitRemoveLspOutput> res = SuccessfulRpcResult.create(b.build());
77         return Futures.immediateFuture(res);
78     }
79
80     @Override
81     public ListenableFuture<RpcResult<SubmitUpdateLspOutput>> submitUpdateLsp(final SubmitUpdateLspInput input) {
82         Preconditions.checkArgument(input.getNode() != null);
83         Preconditions.checkArgument(input.getName() != null);
84
85         final SubmitUpdateLspOutputBuilder b = new SubmitUpdateLspOutputBuilder();
86         b.setResult(AbstractInstructionExecutor.schedule(scheduler, new AbstractInstructionExecutor(input) {
87             @Override
88             protected ListenableFuture<OperationResult> invokeOperation() {
89                 return TopologyProgramming.this.manager.updateLsp(input);
90             }
91         }));
92
93         final RpcResult<SubmitUpdateLspOutput> res = SuccessfulRpcResult.create(b.build());
94         return Futures.immediateFuture(res);
95     }
96
97     @Override
98     public ListenableFuture<RpcResult<SubmitEnsureLspOperationalOutput>> submitEnsureLspOperational(
99             final SubmitEnsureLspOperationalInput input) {
100         Preconditions.checkArgument(input.getNode() != null);
101         Preconditions.checkArgument(input.getName() != null);
102         Preconditions.checkArgument(input.getArguments() != null);
103
104         // FIXME: can we validate this early?
105         // Preconditions.checkArgument(input.getArguments().getOperational() != null);
106
107         final SubmitEnsureLspOperationalOutputBuilder b = new SubmitEnsureLspOperationalOutputBuilder();
108         b.setResult(AbstractInstructionExecutor.schedule(scheduler, new AbstractInstructionExecutor(input) {
109             @Override
110             protected ListenableFuture<OperationResult> invokeOperation() {
111                 EnsureLspOperationalInputBuilder ensureLspOperationalInputBuilder = new EnsureLspOperationalInputBuilder();
112                 ensureLspOperationalInputBuilder.fieldsFrom(input);
113                 return TopologyProgramming.this.manager.ensureLspOperational(ensureLspOperationalInputBuilder.build());
114             }
115         }));
116
117         final RpcResult<SubmitEnsureLspOperationalOutput> res = SuccessfulRpcResult.create(b.build());
118         return Futures.immediateFuture(res);
119     }
120 }