Federation plugin
[netvirt.git] / vpnservice / federation-plugin / impl / src / main / java / org / opendaylight / netvirt / federation / plugin / FederationPluginRpcServiceImpl.java
1 /*
2  * Copyright (c) 2017 Hewlett Packard Enterprise, Co. 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
9 package org.opendaylight.netvirt.federation.plugin;
10
11 import com.google.common.util.concurrent.Futures;
12
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.concurrent.Future;
16
17 import javax.annotation.PostConstruct;
18 import javax.inject.Inject;
19 import javax.inject.Singleton;
20
21 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.manager.rev170219.RoutedContainer;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.manager.rev170219.routed.container.RouteKeyItem;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.manager.rev170219.routed.container.RouteKeyItemKey;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.routed.rpc.rev170219.FederationPluginRoutedRpcService;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.routed.rpc.rev170219.UpdateFederatedNetworksInputBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.rpc.rev170219.FederationPluginRpcService;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.rpc.rev170219.UpdateFederatedNetworksInput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.rpc.rev170219.update.federated.networks.input.FederatedNetworksIn;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
32 import org.opendaylight.yangtools.yang.common.RpcResult;
33 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 @Singleton
38 public class FederationPluginRpcServiceImpl implements FederationPluginRpcService {
39     private static final Logger LOG = LoggerFactory.getLogger(FederationPluginRpcServiceImpl.class);
40
41     private final RpcProviderRegistry rpcRegistry;
42
43     @Inject
44     public FederationPluginRpcServiceImpl(final RpcProviderRegistry rpcRegistry) {
45         this.rpcRegistry = rpcRegistry;
46     }
47
48     @PostConstruct
49     public void init() {
50         LOG.info("init");
51         rpcRegistry.addRpcImplementation(FederationPluginRpcService.class, this);
52     }
53
54     @Override
55     public Future<RpcResult<Void>> updateFederatedNetworks(UpdateFederatedNetworksInput input) {
56         FederationPluginRoutedRpcService routedRpcService = rpcRegistry
57                 .getRpcService(FederationPluginRoutedRpcService.class);
58         if (routedRpcService == null) {
59             return Futures.immediateFuture(RpcResultBuilder.<Void>failed()
60                     .withError(ErrorType.RPC, "Failed to get routed RPC service for federation plugin").build());
61         }
62
63         List<FederatedNetworksIn> federatedNetworks = input.getFederatedNetworksIn();
64         UpdateFederatedNetworksInputBuilder builder = new UpdateFederatedNetworksInputBuilder()
65                 .setFederatedNetworksIn(convertFederatedNetworks(federatedNetworks))
66                 .setRouteKeyItem(buildtRouteKeyInstanceIdentifier());
67
68         return routedRpcService.updateFederatedNetworks(builder.build());
69     }
70
71     private static List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.routed.rpc.rev170219
72         .update.federated.networks.input.FederatedNetworksIn> convertFederatedNetworks(
73             List<FederatedNetworksIn> federatedNetworks) {
74         if (federatedNetworks == null) {
75             return null;
76         }
77
78         List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.routed.rpc.rev170219
79             .update.federated.networks.input.FederatedNetworksIn> routedFederatedNetworks = new ArrayList<>();
80         for (FederatedNetworksIn federatedNetwork : federatedNetworks) {
81             routedFederatedNetworks
82                     .add(new org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.routed.rpc
83                             .rev170219.update.federated.networks.input.FederatedNetworksInBuilder(
84                             federatedNetwork).build());
85         }
86
87         return routedFederatedNetworks;
88     }
89
90     private static InstanceIdentifier<RouteKeyItem> buildtRouteKeyInstanceIdentifier() {
91         return InstanceIdentifier.create(RoutedContainer.class).child(RouteKeyItem.class,
92                 new RouteKeyItemKey(FederationPluginConstants.RPC_ROUTE_KEY));
93     }
94
95 }