move vpnservice and cleanup poms
[netvirt.git] / statemanager / impl / src / main / java / org / opendaylight / netvirt / statemanager / StateManager.java
1 /*
2  * Copyright (c) 2016 Red Hat, 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
9 package org.opendaylight.netvirt.statemanager;
10
11 import com.google.common.util.concurrent.CheckedFuture;
12 import javax.annotation.PostConstruct;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
19 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
20 import org.opendaylight.netvirt.elanmanager.api.IElanService;
21 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
22 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
23 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 @Singleton
34 public class StateManager implements IStateManager {
35
36     private static final Logger LOG = LoggerFactory.getLogger(StateManager.class);
37     private final DataBroker dataBroker;
38
39     @Inject
40     public StateManager(final DataBroker databroker, final IBgpManager bgpManager, final IElanService elanService,
41                         final IFibManager fibManager, final INeutronVpnManager neutronVpnManager,
42                         final IVpnManager vpnManager) {
43         this.dataBroker = databroker;
44     }
45
46     /**
47      * Start method called by blueprint.
48      */
49     @PostConstruct
50     public void start() {
51         setReady(true);
52     }
53
54     /**
55      * Executes put as a blocking transaction.
56      *
57      * @param logicalDatastoreType {@link LogicalDatastoreType} which should be modified
58      * @param path {@link InstanceIdentifier} for path to read
59      * @param <D> the data object type
60      * @return the result of the request
61      */
62     public <D extends org.opendaylight.yangtools.yang.binding.DataObject> boolean put(
63             final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier<D> path, D data)  {
64         boolean result = false;
65         final WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
66         transaction.put(logicalDatastoreType, path, data, WriteTransaction.CREATE_MISSING_PARENTS);
67         CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
68         try {
69             future.checkedGet();
70             result = true;
71         } catch (TransactionCommitFailedException e) {
72             LOG.warn("StateManager failed to put {} ", path, e);
73         }
74         return result;
75     }
76
77     private void initializeNetvirtTopology() {
78         final TopologyId topologyId = new TopologyId("netvirt:1");
79         InstanceIdentifier<Topology> path =
80                 InstanceIdentifier.create(NetworkTopology.class).child(Topology.class, new TopologyKey(topologyId));
81         TopologyBuilder tpb = new TopologyBuilder();
82         tpb.setTopologyId(topologyId);
83         if (!put(LogicalDatastoreType.OPERATIONAL, path, tpb.build())) {
84             LOG.error("StateManager error initializing netvirt topology");
85         }
86     }
87
88     private class WriteTopology implements Runnable {
89         @Override
90         public void run() {
91             try {
92                 Thread.sleep(5000);
93             } catch (InterruptedException e) {
94                 LOG.warn("StateManager thread was interrupted", e);
95             }
96             LOG.info("StateManager all is ready");
97             initializeNetvirtTopology();
98         }
99     }
100
101     @Override
102     public void setReady(boolean ready) {
103         if (ready) {
104             new Thread(new WriteTopology()).start();
105         }
106     }
107 }