mirror of
https://github.com/Telecominfraproject/wlan-cloud-opensync-controller.git
synced 2025-11-03 12:08:07 +00:00
TW-20 - Read AP config from KDC instance - part 2
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
package ai.connectus.opensync.external.integration;
|
||||
|
||||
import com.vmware.ovsdb.service.OvsdbClient;
|
||||
|
||||
public class OvsdbSession {
|
||||
private OvsdbClient ovsdbClient;
|
||||
private String apId;
|
||||
private long routingId;
|
||||
private long equipmentId;
|
||||
private int customerId;
|
||||
|
||||
public OvsdbClient getOvsdbClient() {
|
||||
return ovsdbClient;
|
||||
}
|
||||
public void setOvsdbClient(OvsdbClient ovsdbClient) {
|
||||
this.ovsdbClient = ovsdbClient;
|
||||
}
|
||||
public String getApId() {
|
||||
return apId;
|
||||
}
|
||||
public void setApId(String apId) {
|
||||
this.apId = apId;
|
||||
}
|
||||
public long getRoutingId() {
|
||||
return routingId;
|
||||
}
|
||||
public void setRoutingId(long routingId) {
|
||||
this.routingId = routingId;
|
||||
}
|
||||
public long getEquipmentId() {
|
||||
return equipmentId;
|
||||
}
|
||||
public void setEquipmentId(long equipmentId) {
|
||||
this.equipmentId = equipmentId;
|
||||
}
|
||||
public int getCustomerId() {
|
||||
return customerId;
|
||||
}
|
||||
public void setCustomerId(int customerId) {
|
||||
this.customerId = customerId;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package ai.connectus.opensync.external.integration;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import com.vmware.ovsdb.service.OvsdbClient;
|
||||
|
||||
public interface OvsdbSessionMapInterface {
|
||||
OvsdbSession getSession(String apId);
|
||||
OvsdbSession removeSession(String apId);
|
||||
void closeSession(String apId);
|
||||
OvsdbSession newSession(String apId, OvsdbClient ovsdbClient);
|
||||
int getNumSessions();
|
||||
Set<String> getConnectedClientIds();
|
||||
String lookupClientId(OvsdbClient ovsdbClient);
|
||||
}
|
||||
147
opensync_ext_kdc/pom.xml
Normal file
147
opensync_ext_kdc/pom.xml
Normal file
@@ -0,0 +1,147 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>root-pom</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<groupId>ai.connectus</groupId>
|
||||
<artifactId>opensync_ext_kdc</artifactId>
|
||||
<name>opensync_ext_kdc</name>
|
||||
<description>Component that reads AP configuration from the KDC deployment, and registers/deregisters APs in there.</description>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>ai.connectus</groupId>
|
||||
<artifactId>opensync_ext_interface</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>base-container</artifactId>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-configuration-manager-service-remote</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-and-network-management-service-remote</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-routing-service-remote</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>order-and-subscription-management-service-remote</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- KDC models -->
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>service-metrics-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>rule-engine-partitioning-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-and-network-status-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>customer-account-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>service-subscription-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-inventory-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-routing-info-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-and-network-config-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>radio-resource-planner-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>system-event-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>issue-and-action-report-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>preferences-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>cami-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>ml-results-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>client-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>rogue-ap-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>msp-account-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>equipment-configuration-manager-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>email-notification-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.whizcontrol</groupId>
|
||||
<artifactId>recommendation-models</artifactId>
|
||||
<version>${whizcontrol.release.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,368 @@
|
||||
package ai.connectus.opensync.external.integration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cache.Cache;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.context.annotation.Profile;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.whizcontrol.core.model.equipment.EquipmentType;
|
||||
import com.whizcontrol.core.model.equipment.RadioType;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.ApElementConfiguration;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.ApElementConfiguration.ApModel;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.CountryCode;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.DeviceMode;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.ElementRadioConfiguration;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.EquipmentElementConfiguration;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.GettingDNS;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.GettingIP;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.SsidConfiguration;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.SsidConfiguration.AppliedRadio;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.SsidConfiguration.SecureMode;
|
||||
import com.whizcontrol.equipmentandnetworkconfig.models.StateSetting;
|
||||
import com.whizcontrol.equipmentandnetworkmanagement.EquipmentAndNetworkManagementInterface;
|
||||
import com.whizcontrol.equipmentconfigurationmanager.EquipmentConfigurationManagerInterface;
|
||||
import com.whizcontrol.equipmentconfigurationmanager.models.ResolvedEquipmentConfiguration;
|
||||
import com.whizcontrol.equipmentinventory.models.CustomerEquipment;
|
||||
import com.whizcontrol.equipmentrouting.EquipmentRoutingInterface;
|
||||
import com.whizcontrol.equipmentroutinginfo.models.EquipmentRoutingRecord;
|
||||
import com.whizcontrol.orderandsubscriptionmanagement.OrderAndSubscriptionManagementInterface;
|
||||
|
||||
import ai.connectus.opensync.external.integration.controller.OpensyncKDCGatewayController;
|
||||
import ai.connectus.opensync.external.integration.models.OpensyncAPConfig;
|
||||
import ai.connectus.opensync.external.integration.models.OpensyncAPRadioConfig;
|
||||
import ai.connectus.opensync.external.integration.models.OpensyncAPSsidConfig;
|
||||
import sts.PlumeStats.Report;
|
||||
import traffic.NetworkMetadata.FlowReport;
|
||||
import wc.stats.IpDnsTelemetry.WCStatsReport;
|
||||
|
||||
@Profile("opensync_kdc_config")
|
||||
@Component
|
||||
public class OpensyncExternalIntegrationKDC implements OpensyncExternalIntegrationInterface {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(OpensyncExternalIntegrationKDC.class);
|
||||
|
||||
@Autowired
|
||||
private EquipmentAndNetworkManagementInterface eqNetworkManagementInterface;
|
||||
|
||||
@Autowired
|
||||
private EquipmentConfigurationManagerInterface eqConfigurationManagerInterface;
|
||||
|
||||
@Autowired
|
||||
private OrderAndSubscriptionManagementInterface orderAndSubscriptionManagementInterface;
|
||||
|
||||
/**
|
||||
* Equipment routing provide the qrCode to CE gateway mapping
|
||||
*/
|
||||
@Autowired
|
||||
private EquipmentRoutingInterface eqRoutingInterface;
|
||||
|
||||
@Autowired
|
||||
private OpensyncKDCGatewayController kdcGwController;
|
||||
|
||||
@Autowired
|
||||
private OvsdbSessionMapInterface ovsdbSessionMapInterface;
|
||||
|
||||
@Autowired
|
||||
private CacheManager cacheManagerShortLived;
|
||||
|
||||
@Value("${connectus.ovsdb.autoProvisionedCustomerId:1004}")
|
||||
private int autoProvisionedCustomerId;
|
||||
@Value("${connectus.ovsdb.autoProvisionedLocationId:2}")
|
||||
private int autoProvisionedLocationId;
|
||||
@Value("${connectus.ovsdb.autoProvisionedNetworkConfigId:1}")
|
||||
private long autoProvisionedNetworkConfigId;
|
||||
|
||||
private Cache kdcEquipmentRecordCache;
|
||||
|
||||
@PostConstruct
|
||||
private void postCreate(){
|
||||
LOG.info("Using KDC integration");
|
||||
kdcEquipmentRecordCache = cacheManagerShortLived.getCache("KDC_equipment_record_cache");
|
||||
}
|
||||
|
||||
public void apConnected(String apId) {
|
||||
LOG.info("AP {} got connected to the gateway", apId);
|
||||
try {
|
||||
|
||||
CustomerEquipment ce = null;
|
||||
|
||||
try {
|
||||
ce = kdcEquipmentRecordCache.get(apId, new Callable<CustomerEquipment>() {
|
||||
@Override
|
||||
public CustomerEquipment call() throws Exception {
|
||||
return eqNetworkManagementInterface.getCustomerEquipmentByQrCodeOrNull(apId);
|
||||
}
|
||||
});
|
||||
}catch (Exception e) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
if(ce == null) {
|
||||
|
||||
//auto-provision APs for the demo
|
||||
//we'll use hardcoded customerId/locationId/networkConfigId for the new equipment
|
||||
|
||||
ce = new CustomerEquipment();
|
||||
ce.setEquipmentType(EquipmentType.AP);
|
||||
ce.setModelId("plume");
|
||||
ce.setQrCode(apId);
|
||||
ce = eqNetworkManagementInterface.createCustomerEquipment(ce);
|
||||
|
||||
//bind newly created CE to specified customer
|
||||
Set<Long> equipmentIdsToAdd = new HashSet<Long>();
|
||||
equipmentIdsToAdd.add(ce.getId());
|
||||
orderAndSubscriptionManagementInterface.bindEquipment(autoProvisionedCustomerId, equipmentIdsToAdd);
|
||||
|
||||
// now update CE record itself
|
||||
ce.setName(apId);
|
||||
ce.setCustomerId(autoProvisionedCustomerId);
|
||||
ce.setEquipmentNetworkConfigId(autoProvisionedNetworkConfigId);
|
||||
ce.setLocation(autoProvisionedLocationId);
|
||||
|
||||
ce = eqNetworkManagementInterface.updateCustomerEquipment(ce);
|
||||
|
||||
// create the element configuration
|
||||
LOG.debug("Creating element configuration for AP({})", apId);
|
||||
|
||||
EquipmentElementConfiguration equipmentElementConfiguration = new EquipmentElementConfiguration();
|
||||
EquipmentType equipmentType = ce.getEquipmentType();
|
||||
|
||||
equipmentElementConfiguration.setEquipmentId(ce.getId());
|
||||
equipmentElementConfiguration.setEquipmentType(equipmentType);
|
||||
equipmentElementConfiguration.setCustomerId(ce.getCustomerId());
|
||||
equipmentElementConfiguration.setElementConfigVersion("" + equipmentType + "-V1");
|
||||
|
||||
ApElementConfiguration apElementConfiguration = ApElementConfiguration.createWithDefaults(
|
||||
equipmentElementConfiguration.getElementConfigVersion(),
|
||||
ApModel.INDOOR);
|
||||
|
||||
apElementConfiguration.setGettingIP(GettingIP.dhcp);
|
||||
apElementConfiguration.setGettingDNS(GettingDNS.dhcp);
|
||||
apElementConfiguration.setDeviceMode(DeviceMode.standaloneAP);
|
||||
|
||||
equipmentElementConfiguration.setApElementConfig(apElementConfiguration);
|
||||
|
||||
equipmentElementConfiguration = eqNetworkManagementInterface
|
||||
.createEquipmentElementConfiguration(equipmentElementConfiguration);
|
||||
|
||||
//cache newly created AP
|
||||
kdcEquipmentRecordCache.put(apId, ce);
|
||||
}
|
||||
|
||||
|
||||
EquipmentRoutingRecord equipmentRoutingRecord = new EquipmentRoutingRecord();
|
||||
equipmentRoutingRecord.setGatewayRecordId(kdcGwController.getRegisteredGwId());
|
||||
equipmentRoutingRecord.setCustomerId(ce.getCustomerId());
|
||||
equipmentRoutingRecord.setEquipmentId(ce.getId());
|
||||
EquipmentRoutingRecord ret = eqRoutingInterface.registerUERoute(equipmentRoutingRecord);
|
||||
OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
|
||||
ovsdbSession.setRoutingId(ret.getId());
|
||||
ovsdbSession.setEquipmentId(ce.getId());
|
||||
ovsdbSession.setCustomerId(ce.getCustomerId());
|
||||
|
||||
}catch(Exception e) {
|
||||
LOG.error("Exception when registering ap routing {}", apId, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void apDisconnected(String apId) {
|
||||
LOG.info("AP {} got disconnected from the gateway", apId);
|
||||
try {
|
||||
OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
|
||||
|
||||
if(ovsdbSession!=null) {
|
||||
eqRoutingInterface.deregisterUserEquipment(ovsdbSession.getEquipmentId());
|
||||
} else {
|
||||
LOG.warn("Cannot find ap {} in KDC inventory", apId);
|
||||
}
|
||||
}catch(Exception e) {
|
||||
LOG.error("Exception when registering ap routing {}", apId, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public OpensyncAPConfig getApConfig(String apId) {
|
||||
LOG.info("Retrieving config for AP {} ", apId);
|
||||
OpensyncAPConfig ret = null;
|
||||
|
||||
try {
|
||||
|
||||
OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
|
||||
if(ovsdbSession == null) {
|
||||
throw new IllegalStateException("AP is not connected " + apId);
|
||||
}
|
||||
long equipmentId = ovsdbSession.getEquipmentId();
|
||||
ResolvedEquipmentConfiguration resolvedEqCfg = eqConfigurationManagerInterface.getResolvedEquipmentConfiguration(equipmentId, null, null);
|
||||
|
||||
if(resolvedEqCfg==null) {
|
||||
throw new IllegalStateException("Cannot retrieve configuration for " + apId);
|
||||
}
|
||||
ret = new OpensyncAPConfig();
|
||||
|
||||
//extract country, radio channels from resolvedEqCfg
|
||||
String country = "CA";
|
||||
CountryCode countryCode = resolvedEqCfg.getEquipmentCountryCode();
|
||||
if(countryCode!=null && countryCode!=CountryCode.UNSUPPORTED) {
|
||||
country = countryCode.toString().toUpperCase();
|
||||
}
|
||||
|
||||
int radioChannel24G = 1;
|
||||
int radioChannel5LG = 44;
|
||||
|
||||
Map<Integer, ElementRadioConfiguration> erc = resolvedEqCfg.getEquipmentElementConfiguration().getApElementConfig().getRadioMap();
|
||||
if(erc!=null) {
|
||||
ElementRadioConfiguration erc24 = erc.get(1);
|
||||
ElementRadioConfiguration erc5 = erc.get(0);
|
||||
|
||||
if(erc24!=null) {
|
||||
radioChannel24G = erc24.getChannelNumber();
|
||||
}
|
||||
|
||||
if(erc5!=null) {
|
||||
radioChannel5LG = erc5.getChannelNumber();
|
||||
}
|
||||
}
|
||||
|
||||
OpensyncAPRadioConfig radioConfig = new OpensyncAPRadioConfig();
|
||||
radioConfig.setCountry(country);
|
||||
radioConfig.setRadioChannel24G(radioChannel24G);
|
||||
radioConfig.setRadioChannel5LG(radioChannel5LG);
|
||||
//hardcoding this one, as there are no config for it in KDC
|
||||
radioConfig.setRadioChannel5HG(108);
|
||||
|
||||
ret.setRadioConfig(radioConfig);
|
||||
|
||||
//extract ssid parameters from resolvedEqCfg
|
||||
List<OpensyncAPSsidConfig> ssidConfigs = new ArrayList<>();
|
||||
ret.setSsidConfigs(ssidConfigs);
|
||||
|
||||
List<SsidConfiguration> resolvedSsids = resolvedEqCfg.getSsidConfigurations();
|
||||
if(resolvedSsids!=null) {
|
||||
for(SsidConfiguration ssidCfg : resolvedSsids) {
|
||||
OpensyncAPSsidConfig osSsidCfg = new OpensyncAPSsidConfig();
|
||||
osSsidCfg.setSsid(ssidCfg.getSsid());
|
||||
|
||||
AppliedRadio ar = ssidCfg.getAppliedRadio();
|
||||
if(ar == AppliedRadio.radioA) {
|
||||
osSsidCfg.setRadioType(RadioType.is5GHz);
|
||||
} else if (ar == AppliedRadio.radioB ){
|
||||
osSsidCfg.setRadioType(RadioType.is2dot4GHz);
|
||||
} else if (ar == AppliedRadio.radioAandB ){
|
||||
osSsidCfg.setRadioType(RadioType.is5GHz);
|
||||
}
|
||||
|
||||
osSsidCfg.setBroadcast(ssidCfg.getBroadcastSsid() == StateSetting.enabled);
|
||||
|
||||
if(ssidCfg.getSecureMode() == SecureMode.wpa2OnlyPSK || ssidCfg.getSecureMode() == SecureMode.wpa2PSK) {
|
||||
osSsidCfg.setEncryption("WPA-PSK");
|
||||
osSsidCfg.setMode("2");
|
||||
} else if(ssidCfg.getSecureMode() == SecureMode.wpaPSK ) {
|
||||
osSsidCfg.setEncryption("WPA-PSK");
|
||||
osSsidCfg.setMode("1");
|
||||
} else {
|
||||
LOG.warn("Unsupported encryption mode {} - will use WPA-PSK instead", ssidCfg.getSecureMode());
|
||||
osSsidCfg.setEncryption("WPA-PSK");
|
||||
osSsidCfg.setMode("2");
|
||||
}
|
||||
|
||||
osSsidCfg.setKey(ssidCfg.getKeyStr());
|
||||
|
||||
ssidConfigs.add(osSsidCfg);
|
||||
|
||||
if( ar==AppliedRadio.radioAandB ) {
|
||||
//configure the same ssid on the second radio
|
||||
osSsidCfg = osSsidCfg.clone();
|
||||
osSsidCfg.setRadioType(RadioType.is2dot4GHz);
|
||||
ssidConfigs.add(osSsidCfg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
LOG.error("Cannot read config for AP {}", apId, e);
|
||||
}
|
||||
|
||||
LOG.debug("Config content : {}", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param topic
|
||||
* @return apId extracted from the topic name, or null if it cannot be extracted
|
||||
*/
|
||||
public String extractApIdFromTopic(String topic) {
|
||||
//Topic is formatted as "/ap/"+clientCn+"_"+ret.serialNumber+"/opensync"
|
||||
if(topic==null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String[] parts = topic.split("/");
|
||||
if(parts.length<3) {
|
||||
return null;
|
||||
}
|
||||
|
||||
//apId is the second element in the topic
|
||||
return parts[1];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param topic
|
||||
* @return customerId looked up from the topic name, or -1 if it cannot be extracted
|
||||
*/
|
||||
public int extractCustomerIdFromTopic(String topic) {
|
||||
|
||||
String apId = extractApIdFromTopic(topic);
|
||||
if(apId == null) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
|
||||
|
||||
if(ovsdbSession!=null) {
|
||||
return ovsdbSession.getCustomerId();
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
public void processMqttMessage(String topic, Report report) {
|
||||
LOG.info("Received report on topic {} for ap {}", topic, report.getNodeID());
|
||||
int customerId = extractCustomerIdFromTopic(topic);
|
||||
if(customerId>0) {
|
||||
kdcGwController.updateActiveCustomer(customerId);
|
||||
}
|
||||
}
|
||||
|
||||
public void processMqttMessage(String topic, FlowReport flowReport) {
|
||||
LOG.info("Received flowReport on topic {} for ap {}", topic, flowReport.getObservationPoint().getNodeId());
|
||||
int customerId = extractCustomerIdFromTopic(topic);
|
||||
if(customerId>0) {
|
||||
kdcGwController.updateActiveCustomer(customerId);
|
||||
}
|
||||
}
|
||||
|
||||
public void processMqttMessage(String topic, WCStatsReport wcStatsReport) {
|
||||
LOG.info("Received wcStatsReport on topic {} for ap {}", topic, wcStatsReport.getObservationPoint().getNodeId());
|
||||
int customerId = extractCustomerIdFromTopic(topic);
|
||||
if(customerId>0) {
|
||||
kdcGwController.updateActiveCustomer(customerId);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package ai.connectus.opensync.external.integration.controller;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.ContextStartedEvent;
|
||||
|
||||
/**
|
||||
* Listen for context started event so that we are register with routing service
|
||||
*
|
||||
* @author yongli
|
||||
*
|
||||
*/
|
||||
public class OpensyncGatewayControllerStartListener implements ApplicationListener<ContextStartedEvent> {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(OpensyncGatewayControllerStartListener.class);
|
||||
|
||||
OpensyncKDCGatewayController controller;
|
||||
|
||||
public OpensyncGatewayControllerStartListener(OpensyncKDCGatewayController controller) {
|
||||
this.controller = controller;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(ContextStartedEvent event) {
|
||||
LOG.debug("Processing ContextStartedEvent event");
|
||||
controller.registerWithRoutingService();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package ai.connectus.opensync.external.integration.controller;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.ContextClosedEvent;
|
||||
|
||||
/**
|
||||
* Register for stop event so that we can de-register from routing service
|
||||
*
|
||||
* @author yongli
|
||||
*
|
||||
*/
|
||||
public class OpensyncGatewayControllerStopListener implements ApplicationListener<ContextClosedEvent> {
|
||||
OpensyncKDCGatewayController controller;
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(OpensyncGatewayControllerStopListener.class);
|
||||
|
||||
public OpensyncGatewayControllerStopListener(OpensyncKDCGatewayController controller) {
|
||||
this.controller = controller;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(ContextClosedEvent event) {
|
||||
LOG.debug("Processing ContextClosedEvent event");
|
||||
controller.deregisterFromRoutingService();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package ai.connectus.opensync.external.integration.controller;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.event.ContextClosedEvent;
|
||||
import org.springframework.context.event.ContextStartedEvent;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class OpensyncGatewayListenerConfiguration {
|
||||
@Autowired
|
||||
OpensyncKDCGatewayController controller;
|
||||
private static final Logger LOG = LoggerFactory.getLogger(OpensyncGatewayControllerStartListener.class);
|
||||
|
||||
@Bean
|
||||
public ApplicationListener<ContextClosedEvent> myStopEventListner() {
|
||||
LOG.debug("Creating stop event listener");
|
||||
return new OpensyncGatewayControllerStopListener(controller);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ApplicationListener<ContextStartedEvent> myStartedEventListener() {
|
||||
LOG.debug("Creating start event listener");
|
||||
return new OpensyncGatewayControllerStartListener(controller);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,432 @@
|
||||
package ai.connectus.opensync.external.integration.controller;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.security.core.userdetails.User;
|
||||
import org.springframework.security.web.bind.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.whizcontrol.core.model.json.BaseJsonModel;
|
||||
import com.whizcontrol.core.model.service.CloudServiceType;
|
||||
import com.whizcontrol.core.model.service.ServiceInstanceInformation;
|
||||
import com.whizcontrol.core.server.container.ConnectorProperties;
|
||||
import com.whizcontrol.customerequipmentgateway.models.CEGWBaseCommand;
|
||||
import com.whizcontrol.customerequipmentgateway.models.CEGWCloseSessionRequest;
|
||||
import com.whizcontrol.customerequipmentgateway.models.CEGWCommandResultCode;
|
||||
import com.whizcontrol.customerequipmentgateway.models.CEGWConfigChangeNotification;
|
||||
import com.whizcontrol.customerequipmentgateway.models.CEGWRouteCheck;
|
||||
import com.whizcontrol.customerequipmentgateway.models.CustomerEquipmentCommand;
|
||||
import com.whizcontrol.customerequipmentgateway.models.CustomerEquipmentCommandResponse;
|
||||
import com.whizcontrol.customerequipmentgateway.models.GatewayDefaults;
|
||||
import com.whizcontrol.equipmentrouting.EquipmentRoutingInterface;
|
||||
import com.whizcontrol.equipmentroutinginfo.models.CustomerEquipmentGwRecord;
|
||||
import com.whizcontrol.equipmentroutinginfo.models.EquipmentRoutingRecord;
|
||||
import com.whizcontrol.equipmentroutinginfo.models.RoutingRegisterResponse;
|
||||
import com.whizcontrol.server.exceptions.ConfigurationException;
|
||||
|
||||
import ai.connectus.opensync.external.integration.OvsdbSession;
|
||||
import ai.connectus.opensync.external.integration.OvsdbSessionMapInterface;
|
||||
|
||||
/**
|
||||
* Opensync Gateway Controller - integration code for Kodacloud deployment
|
||||
*
|
||||
* @author yongli
|
||||
* @author dtop
|
||||
*
|
||||
*/
|
||||
@RestController
|
||||
@EnableScheduling
|
||||
public class OpensyncKDCGatewayController {
|
||||
|
||||
@Autowired
|
||||
EquipmentRoutingInterface eqRoutingSvc;
|
||||
|
||||
@Autowired
|
||||
ConnectorProperties connectorProperties;
|
||||
|
||||
@Autowired
|
||||
private ServiceInstanceInformation serviceInstanceInfo;
|
||||
|
||||
/**
|
||||
* Flag indicates if this gateway has registered with routing service
|
||||
*/
|
||||
private boolean registeredWithRoutingService = false;
|
||||
|
||||
private long registeredGwId = -1;
|
||||
|
||||
/**
|
||||
* Lock used to protected {@link #activeCustomerLock}
|
||||
*/
|
||||
private final ReadWriteLock activeCustomerLock = new ReentrantReadWriteLock();
|
||||
private final Lock activeCustomerReadLock = activeCustomerLock.readLock();
|
||||
private final Lock activeCustomerWriteLock = activeCustomerLock.writeLock();
|
||||
|
||||
@Autowired
|
||||
private OvsdbSessionMapInterface ovsdbSessionMapInterface;
|
||||
|
||||
/**
|
||||
* Map <customerId, lastSeenTimestamp>
|
||||
*/
|
||||
private ConcurrentMap<Integer, Long> activeCustomerMap = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* latestTimetamp used when updating {@link #activeCustomerMap}
|
||||
*/
|
||||
private final BiFunction<Long, Long, Long> latestTimestamp = new BiFunction<Long, Long, Long>() {
|
||||
@Override
|
||||
public Long apply(Long oldValue, Long newValue) {
|
||||
if (newValue.compareTo(oldValue) > 0) {
|
||||
return newValue;
|
||||
}
|
||||
return oldValue;
|
||||
}
|
||||
};
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(OpensyncKDCGatewayController.class);
|
||||
|
||||
@RequestMapping(value = "/command", method = RequestMethod.POST)
|
||||
public CustomerEquipmentCommandResponse sendCommand(@RequestBody CEGWBaseCommand command) {
|
||||
LOG.debug("sendCommand({})", command);
|
||||
String qrCode = command.getEquipmentQRCode();
|
||||
if (BaseJsonModel.hasUnsupportedValue(command)) {
|
||||
LOG.error("[{}] Failed to deliver command {}, command contains unsupported value", qrCode, command);
|
||||
return new CustomerEquipmentCommandResponse(CEGWCommandResultCode.UnsupportedCommand.ordinal(),
|
||||
"Unsupported value in command for " + qrCode);
|
||||
}
|
||||
OvsdbSession session = ovsdbSessionMapInterface.getSession(qrCode);
|
||||
if (session == null) {
|
||||
LOG.warn("[{}] Failed to deliver command {}, websocket session not found", qrCode, command);
|
||||
return new CustomerEquipmentCommandResponse(CEGWCommandResultCode.NoRouteToCE.ordinal(),
|
||||
"No session found for " + qrCode);
|
||||
}
|
||||
|
||||
switch (command.getCommandType()) {
|
||||
case ConfigChangeNotification:
|
||||
return sendConfigChangeNotification(session, (CEGWConfigChangeNotification) command);
|
||||
case CloseSessionRequest:
|
||||
return closeSession(session, (CEGWCloseSessionRequest) command);
|
||||
case CheckRouting:
|
||||
return checkEquipmentRouting(session, (CEGWRouteCheck) command);
|
||||
case StartDebugEngine:
|
||||
case StopDebugEngine:
|
||||
case FirmwareDownloadRequest:
|
||||
case FirmwareFlashRequest:
|
||||
case RebootRequest:
|
||||
case BlinkRequest:
|
||||
case NeighbourhoodReport:
|
||||
case ClientDeauthRequest:
|
||||
case CellSizeRequest:
|
||||
case NewChannelRequest:
|
||||
case ReportCurrentAPCRequest:
|
||||
case FileUpdateRequest:
|
||||
case InterferenceThresholdUpdateRequest:
|
||||
case BestApConfigurationUpdateRequest:
|
||||
case StartPacketFileCapture:
|
||||
case StopPacketCapture:
|
||||
case ReportCurrentVLANRequest:
|
||||
case BSSIDToMacMonitoringRequest:
|
||||
case ChannelChangeAnnouncementRequest:
|
||||
case UploadLogFile:
|
||||
case TogglePoERequest:
|
||||
case RadioReset:
|
||||
case ClearScanTable:
|
||||
case WdsRequest:
|
||||
default:
|
||||
LOG.warn("[{}] Failed to deliver command {}, unsupported command type", qrCode, command);
|
||||
return new CustomerEquipmentCommandResponse(CEGWCommandResultCode.UnsupportedCommand.ordinal(),
|
||||
"Invalid command type (" + command.getCommandType() + ") for equipment (" + qrCode + ")");
|
||||
}
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/defaults", method = RequestMethod.GET)
|
||||
public GatewayDefaults retrieveGatewayDefaults()
|
||||
{
|
||||
return new GatewayDefaults();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Verify a route to customer equipment
|
||||
*
|
||||
* @param session
|
||||
* @param command
|
||||
* @param protocolVersion
|
||||
* @return NoRouteToCE if route Id does not match or Success
|
||||
*/
|
||||
private CustomerEquipmentCommandResponse checkEquipmentRouting(OvsdbSession session, CEGWRouteCheck command) {
|
||||
if (null != command.getRoutingId()) {
|
||||
if (!command.getRoutingId().equals(session.getRoutingId())) {
|
||||
|
||||
LOG.info("[C:{} E:{} R:{}] Stale routing entry ({}) detected",
|
||||
session.getCustomerId(), command.getEquipmentQRCode(),
|
||||
session.getRoutingId(), command.getRoutingId());
|
||||
|
||||
return new CustomerEquipmentCommandResponse(CEGWCommandResultCode.NoRouteToCE.ordinal(),
|
||||
"Inactive Route Identifer");
|
||||
}
|
||||
}
|
||||
return new CustomerEquipmentCommandResponse(CEGWCommandResultCode.Success.ordinal(), "Route active");
|
||||
}
|
||||
|
||||
private CustomerEquipmentCommandResponse sendConfigChangeNotification(OvsdbSession session,
|
||||
CEGWConfigChangeNotification command) {
|
||||
|
||||
return sendMessage(session, command.getEquipmentQRCode(), command);
|
||||
}
|
||||
|
||||
private CustomerEquipmentCommandResponse closeSession(OvsdbSession session, CEGWCloseSessionRequest command) {
|
||||
try {
|
||||
session.getOvsdbClient().shutdown();
|
||||
} catch (Exception e) {
|
||||
LOG.error("[{}] Failed to close session on CE: {}", command.getEquipmentQRCode(), e.getLocalizedMessage());
|
||||
return new CustomerEquipmentCommandResponse(CEGWCommandResultCode.FailedToSend.ordinal(),
|
||||
"Failed to send command " + command.getCommandType() + " to " + command.getEquipmentQRCode() + ": "
|
||||
+ e.getMessage());
|
||||
}
|
||||
LOG.debug("[{}] Closed session to CE", command.getEquipmentQRCode());
|
||||
return new CustomerEquipmentCommandResponse(CEGWCommandResultCode.Success.ordinal(),
|
||||
"Closed session to " + command.getEquipmentQRCode());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Deliver a message in payload to the CE
|
||||
*
|
||||
* @param session
|
||||
* @param qrCode
|
||||
* @param command
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
private CustomerEquipmentCommandResponse sendMessage(OvsdbSession session, String qrCode,
|
||||
CustomerEquipmentCommand command) {
|
||||
|
||||
LOG.debug("Queued command {} for {}", command.getCommandType(), qrCode);
|
||||
CustomerEquipmentCommandResponse response = new CustomerEquipmentCommandResponse(CEGWCommandResultCode.Success.ordinal(),
|
||||
"Queued Command " + command.getCommandType() + " to " + qrCode);
|
||||
|
||||
//TODO: implement sending command via ovsdb session.
|
||||
|
||||
response.setQueued(true);
|
||||
return response;
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/commandWithUser", method = RequestMethod.POST)
|
||||
public CustomerEquipmentCommandResponse sendCommandWithAuthUser(@RequestBody CustomerEquipmentCommand command,
|
||||
@AuthenticationPrincipal Object requestUser, HttpServletRequest httpServletRequest) {
|
||||
|
||||
// use these properties to get address and port where request has
|
||||
// arrived
|
||||
httpServletRequest.getLocalAddr();
|
||||
httpServletRequest.getLocalPort();
|
||||
|
||||
// requestUser will be instance of
|
||||
// org.springframework.security.core.userdetails.User for client auth
|
||||
// and digest auth,
|
||||
// although other auth providers may return something entirely different
|
||||
if (requestUser instanceof User) {
|
||||
LOG.debug("calling command with auth principal: {}", ((User) requestUser).getUsername());
|
||||
} else {
|
||||
LOG.debug("calling command with auth principal: {}", requestUser);
|
||||
}
|
||||
|
||||
// This is a test method to show how to get access to the auth user
|
||||
// object for a given request
|
||||
|
||||
return sendCommand(command);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register this controller with Equipment Routing Service
|
||||
*/
|
||||
public void registerWithRoutingService() {
|
||||
synchronized (this) {
|
||||
if (registeredWithRoutingService) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (eqRoutingSvc == null) {
|
||||
throw new ConfigurationException(
|
||||
"Unabled to register gateway with routing service: routing service interface not initialized");
|
||||
}
|
||||
CustomerEquipmentGwRecord gwRecord = new CustomerEquipmentGwRecord(CloudServiceType.CEGW, getDeploymentId());
|
||||
|
||||
// Internal facing service
|
||||
gwRecord.setGatewayId(getGatewayName());
|
||||
gwRecord.setIpAddr(connectorProperties.getInternalIpAddress().getHostAddress());
|
||||
gwRecord.setPort(connectorProperties.getInternalPort());
|
||||
|
||||
try {
|
||||
CustomerEquipmentGwRecord result = this.eqRoutingSvc.registerGateway(gwRecord);
|
||||
this.registeredGwId = result.getId();
|
||||
LOG.info("Successfully registered (name={}, id={}) with Routing Service", result.getGatewayId(),
|
||||
registeredGwId);
|
||||
registeredWithRoutingService = true;
|
||||
} catch (RuntimeException e) {
|
||||
// failed
|
||||
LOG.error("Failed to register Customer Equipment Gateway (name={}) with Routing Service : {}",
|
||||
getGatewayName(), e.getLocalizedMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the current deployment identifier
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public int getDeploymentId() {
|
||||
return serviceInstanceInfo.getDeploymentId();
|
||||
}
|
||||
|
||||
/**
|
||||
* De-register from Routing service
|
||||
*/
|
||||
public void deregisterFromRoutingService() {
|
||||
if (registeredWithRoutingService) {
|
||||
try {
|
||||
eqRoutingSvc.deregisterGateway(registeredGwId);
|
||||
LOG.info("Deregistered Customer Equipment Gateway (name={},id={}) with Routing Service",
|
||||
getGatewayName(), this.registeredGwId);
|
||||
} catch (Exception e) {
|
||||
// failed
|
||||
LOG.error("Failed to deregister Customer Equipment Gateway (name={},id={}) with Routing Service: {}",
|
||||
getGatewayName(), this.registeredGwId, e.getLocalizedMessage());
|
||||
}
|
||||
registeredWithRoutingService = false;
|
||||
}
|
||||
}
|
||||
|
||||
public long getRegisteredGwId() {
|
||||
return this.registeredGwId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a customer equipment with this gateway
|
||||
*
|
||||
* @param equipmentName
|
||||
* @param customerId
|
||||
* @param equipmentId
|
||||
* @return associationId
|
||||
*/
|
||||
public RoutingRegisterResponse registerCustomerEquipment(String equipmentName, Integer customerId,
|
||||
Long equipmentId) {
|
||||
registerWithRoutingService();
|
||||
if (!registeredWithRoutingService) {
|
||||
LOG.error("Unable to register customer equipement (name={},id={}): gateway not registered.", equipmentName,
|
||||
equipmentId);
|
||||
return null;
|
||||
}
|
||||
EquipmentRoutingRecord routingRecord = new EquipmentRoutingRecord();
|
||||
routingRecord.setCustomerId(customerId);
|
||||
routingRecord.setEquipmentId(equipmentId);
|
||||
routingRecord.setGatewayRecordId(this.registeredGwId);
|
||||
try {
|
||||
RoutingRegisterResponse result = eqRoutingSvc.registerUERouteForDeployment(routingRecord,
|
||||
getDeploymentId());
|
||||
LOG.debug("Registered customer equipment (name={},id={}) with route id={}", equipmentName, equipmentId,
|
||||
result.getRoutingRecord().getId());
|
||||
return result;
|
||||
|
||||
} catch (Exception e) {
|
||||
LOG.error("Failed to register customer equipement (name={},id={}): {}", equipmentName, equipmentId,
|
||||
e.getLocalizedMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void deregisterCustomerEquipment(Long routingId, String equipmentName, Long equipmentId) {
|
||||
if (!registeredWithRoutingService) {
|
||||
LOG.error("Unable to deregister customer equipement (name={},id={}): gateway not registered", equipmentName,
|
||||
equipmentId);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
LOG.debug("Deregistering customer equipment (name={},id={}) with route id={}", equipmentName, equipmentId,
|
||||
routingId);
|
||||
|
||||
eqRoutingSvc.deregisterUERoute(routingId);
|
||||
} catch (Exception e) {
|
||||
LOG.error("Failed to deregister customer equipement (name={},id={}) with route id={}: {}", equipmentName,
|
||||
equipmentId, routingId, e.getLocalizedMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Run every 5 minutes
|
||||
*/
|
||||
@Scheduled(initialDelay = 5 * 60 * 1000, fixedRate = 5 * 60 * 1000)
|
||||
public void updateActiveCustomer() {
|
||||
try {
|
||||
Map<Integer, Long> activeMap = this.getActiveCustomerMapForUpdate();
|
||||
if (null != activeMap) {
|
||||
LOG.info("Updating active customer records, total record size {}", activeMap.size());
|
||||
this.eqRoutingSvc.updateActiveCustomer(activeMap, getDeploymentId());
|
||||
}
|
||||
} catch (RuntimeException exp) {
|
||||
LOG.error("Failed to update active customer records due to exception {}", exp.getLocalizedMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Use connection internal hostname as the gateway name
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private String getGatewayName() {
|
||||
return connectorProperties.getInternalHostName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the active timestamp for the customer
|
||||
*
|
||||
* @param customerId
|
||||
*/
|
||||
public void updateActiveCustomer(int customerId) {
|
||||
this.activeCustomerReadLock.lock();
|
||||
try {
|
||||
this.activeCustomerMap.merge(customerId, System.currentTimeMillis(), latestTimestamp);
|
||||
} finally {
|
||||
this.activeCustomerReadLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Swap the active customer map for reporting if it contains records.
|
||||
*
|
||||
* @return null if no records.
|
||||
*/
|
||||
protected Map<Integer, Long> getActiveCustomerMapForUpdate() {
|
||||
this.activeCustomerWriteLock.lock();
|
||||
try {
|
||||
Map<Integer, Long> map = null;
|
||||
if (!this.activeCustomerMap.isEmpty()) {
|
||||
map = this.activeCustomerMap;
|
||||
this.activeCustomerMap = new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
return map;
|
||||
} finally {
|
||||
this.activeCustomerWriteLock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package ai.connectus.opensync.ovsdb;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.vmware.ovsdb.service.OvsdbClient;
|
||||
|
||||
import ai.connectus.opensync.external.integration.OvsdbSession;
|
||||
import ai.connectus.opensync.external.integration.OvsdbSessionMapInterface;
|
||||
|
||||
@Component
|
||||
public class OvsdbSessionMap implements OvsdbSessionMapInterface {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(OvsdbSessionMap.class);
|
||||
|
||||
private final ConcurrentHashMap<String, OvsdbSession> connectedClients = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public OvsdbSession getSession(String apId) {
|
||||
return connectedClients.get(apId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OvsdbSession removeSession(String apId) {
|
||||
return connectedClients.remove(apId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeSession(String apId) {
|
||||
try {
|
||||
connectedClients.get(apId).getOvsdbClient().shutdown();
|
||||
connectedClients.remove(apId);
|
||||
LOG.info("Closed ovsdb session for {}", apId);
|
||||
}catch (Exception e) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public OvsdbSession newSession(String apId, OvsdbClient ovsdbClient) {
|
||||
OvsdbSession ret = new OvsdbSession();
|
||||
ret.setApId(apId);
|
||||
ret.setOvsdbClient(ovsdbClient);
|
||||
OvsdbSession oldSession = connectedClients.put(apId, ret);
|
||||
|
||||
if(oldSession!=null) {
|
||||
try {
|
||||
oldSession.getOvsdbClient().shutdown();
|
||||
LOG.info("Closed old ovsdb session for {}", apId);
|
||||
}catch (Exception e) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
LOG.info("Created new ovsdb session for {}", apId);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNumSessions() {
|
||||
return connectedClients.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getConnectedClientIds() {
|
||||
return new HashSet<String>(connectedClients.keySet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String lookupClientId(OvsdbClient ovsdbClient) {
|
||||
String key = connectedClients.searchEntries(1,
|
||||
(Entry<String, OvsdbSession> t) -> { return t.getValue().getOvsdbClient().equals(ovsdbClient) ? t.getKey() : null ;}
|
||||
);
|
||||
|
||||
return key;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user