Add mapping record with port data add with fixed ip
[lispflowmapping.git] / mappingservice / neutron / src / main / java / org / opendaylight / lispflowmapping / neutron / mappingmanager / HostInformationManager.java
1 /*
2  * Copyright (c) 2017 Cisco Systems, Inc.  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.lispflowmapping.neutron.mappingmanager;
9
10 import java.util.Collection;
11 import java.util.List;
12
13 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
14 import org.opendaylight.lispflowmapping.neutron.LispUtil;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.OdlMappingserviceService;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 /**
22  * Created by Shakib Ahmed on 2/5/17.
23  */
24 public class HostInformationManager {
25     private static final Logger LOG = LoggerFactory.getLogger(HostInformationManager.class);
26
27     private OdlMappingserviceService lfmDbService;
28     private HostIdToPortDataMapper hostIdToPortDataMapper;
29     private HostIdToRlocMapper hostIdToRlocMapper;
30
31     private static HostInformationManager instance;
32
33     private HostInformationManager() {
34         hostIdToPortDataMapper = new HostIdToPortDataMapper();
35         hostIdToRlocMapper = new HostIdToRlocMapper();
36     }
37
38     public static synchronized HostInformationManager getInstance() {
39         if (instance == null) {
40             instance = new HostInformationManager();
41         }
42         return instance;
43     }
44
45     public void setOdlMappingserviceService(OdlMappingserviceService lfmDbService) {
46         this.lfmDbService = lfmDbService;
47     }
48
49     public synchronized void addHostRelatedInfo(String hostId, Object data) {
50         if (data instanceof PortData) {
51             hostIdToPortDataMapper.addMapping(hostId, (PortData) data);
52
53         } else if (data instanceof Rloc) {
54             hostIdToRlocMapper.addMapping(hostId, (Rloc) data);
55         } else {
56             LOG.warn("Unwanted information type " + data.getClass().getSimpleName()
57                     + " for Host Id " + hostId);
58         }
59
60         attemptToCreateMappingRecord(hostId);
61     }
62
63     private synchronized void attemptToCreateMappingRecord(String hostId) {
64         List<Rloc> rlocForMappingRecord = hostIdToRlocMapper.getRlocs(hostId);
65         PortUuidToPortDataMapper uuidToEidMapper = hostIdToPortDataMapper.getAllPortData(hostId);
66
67         if (rlocForMappingRecord == null || rlocForMappingRecord.isEmpty()
68                 || uuidToEidMapper == null) {
69             return;
70         }
71
72         Collection<PortData> allUnprocessedPorts = uuidToEidMapper.getAllUnprocessedPorts();
73         List<LocatorRecord> locators = LispAddressUtil.asLocatorRecords(rlocForMappingRecord);
74
75         allUnprocessedPorts.forEach(portData -> {
76             lfmDbService.addMapping(LispUtil.buildAddMappingInput(portData.getPortEid(), locators));
77             uuidToEidMapper.addPortDataToProcessed(portData);
78         });
79         uuidToEidMapper.clearAllUnprocessedData();
80
81     }
82 }