mirror of
				https://github.com/Telecominfraproject/wlan-cloud-opensync-controller.git
				synced 2025-11-03 20:17:53 +00:00 
			
		
		
		
	Compare commits
	
		
			33 Commits
		
	
	
		
			WIFI-4415
			...
			release/v1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					495487ae8f | ||
| 
						 | 
					4e8164fb6d | ||
| 
						 | 
					4b6a18df9f | ||
| 
						 | 
					8724c4521c | ||
| 
						 | 
					583d8e1e4c | ||
| 
						 | 
					19473c8b39 | ||
| 
						 | 
					307bf0cd1c | ||
| 
						 | 
					de7d156429 | ||
| 
						 | 
					4512096a49 | ||
| 
						 | 
					1275043232 | ||
| 
						 | 
					78f4169339 | ||
| 
						 | 
					b7c6594937 | ||
| 
						 | 
					d2c7eac05d | ||
| 
						 | 
					69f9f1a973 | ||
| 
						 | 
					c6582199e9 | ||
| 
						 | 
					d167278a6b | ||
| 
						 | 
					6a90a24c52 | ||
| 
						 | 
					fa85300dc0 | ||
| 
						 | 
					20b29fdb5c | ||
| 
						 | 
					3470b01ea1 | ||
| 
						 | 
					d3cffd570f | ||
| 
						 | 
					753a4fdb89 | ||
| 
						 | 
					014bfa4189 | ||
| 
						 | 
					40ea53f87c | ||
| 
						 | 
					49aacc151d | ||
| 
						 | 
					077c535750 | ||
| 
						 | 
					6110a8d78d | ||
| 
						 | 
					5614d87f79 | ||
| 
						 | 
					ca511c70c1 | ||
| 
						 | 
					836fbc95ca | ||
| 
						 | 
					1d11b96a7d | ||
| 
						 | 
					36ab26df07 | ||
| 
						 | 
					dcfefa2adb | 
@@ -25,6 +25,8 @@ import java.util.regex.Matcher;
 | 
				
			|||||||
import java.util.regex.Pattern;
 | 
					import java.util.regex.Pattern;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					import java.util.Collections;
 | 
				
			||||||
 | 
					import java.util.Comparator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.slf4j.Logger;
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
import org.slf4j.LoggerFactory;
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
@@ -47,6 +49,7 @@ import com.telecominfraproject.wlan.client.session.models.ClientDhcpDetails;
 | 
				
			|||||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
 | 
					import com.telecominfraproject.wlan.client.session.models.ClientSession;
 | 
				
			||||||
import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
 | 
					import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
 | 
				
			||||||
import com.telecominfraproject.wlan.core.model.entity.CountryCode;
 | 
					import com.telecominfraproject.wlan.core.model.entity.CountryCode;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth;
 | 
				
			||||||
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
 | 
					import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
 | 
				
			||||||
import com.telecominfraproject.wlan.core.model.equipment.LedStatus;
 | 
					import com.telecominfraproject.wlan.core.model.equipment.LedStatus;
 | 
				
			||||||
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
 | 
					import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
 | 
				
			||||||
@@ -97,7 +100,6 @@ import com.telecominfraproject.wlan.profile.models.ProfileType;
 | 
				
			|||||||
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.network.models.RadioProfileConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.RadioProfileConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.rf.models.RfElementConfiguration;
 | 
					 | 
				
			||||||
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration.SecureMode;
 | 
					import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration.SecureMode;
 | 
				
			||||||
import com.telecominfraproject.wlan.routing.RoutingServiceInterface;
 | 
					import com.telecominfraproject.wlan.routing.RoutingServiceInterface;
 | 
				
			||||||
@@ -136,12 +138,15 @@ import sts.OpensyncStats.Report;
 | 
				
			|||||||
@Component
 | 
					@Component
 | 
				
			||||||
public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegrationInterface {
 | 
					public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegrationInterface {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String DERIVED_SESSION_ID_PREFIX = "DERIVED-";
 | 
				
			||||||
    protected static final String standard_linux_date_format = "EEE MMM dd HH:mm:ss zzz yyyy";
 | 
					    protected static final String standard_linux_date_format = "EEE MMM dd HH:mm:ss zzz yyyy";
 | 
				
			||||||
    private static final String VLAN_TRUNK_IF_TYPE = "vlan_trunk";
 | 
					    private static final String VLAN_TRUNK_IF_TYPE = "vlan_trunk";
 | 
				
			||||||
    private static final String ALLOWED_VLANS = "allowed_vlans";
 | 
					    private static final String ALLOWED_VLANS = "allowed_vlans";
 | 
				
			||||||
    private static final String NATIVE_VLAN_ID = "pvid";
 | 
					    private static final String NATIVE_VLAN_ID = "pvid";
 | 
				
			||||||
    private static final String SPACE_SEPERATOR = " ";
 | 
					    private static final String SPACE_SEPERATOR = " ";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public final static int MAX_ALLOWED_2GHz_CHANNEL_NUMBER = 14;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    private static final Logger LOG = LoggerFactory.getLogger(OpensyncExternalIntegrationCloud.class);
 | 
					    private static final Logger LOG = LoggerFactory.getLogger(OpensyncExternalIntegrationCloud.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
@@ -581,7 +586,8 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
            protocolStatusData.setBandPlan("FCC");
 | 
					            protocolStatusData.setBandPlan("FCC");
 | 
				
			||||||
            protocolStatusData.setBaseMacAddress(MacAddress.valueOf(connectNodeInfo.macAddress));
 | 
					            protocolStatusData.setBaseMacAddress(MacAddress.valueOf(connectNodeInfo.macAddress));
 | 
				
			||||||
            protocolStatusData.setCloudCfgDataVersion(42L);
 | 
					            protocolStatusData.setCloudCfgDataVersion(42L);
 | 
				
			||||||
            protocolStatusData.setReportedCfgDataVersion(42L);
 | 
					            //this will be set later in the flow - after the config is successfully pushed to the AP
 | 
				
			||||||
 | 
					            //protocolStatusData.setReportedCfgDataVersion(42L);
 | 
				
			||||||
            CountryCode countryCode = Location.getCountryCode(locationServiceInterface.getOrNull(ce.getLocationId()));
 | 
					            CountryCode countryCode = Location.getCountryCode(locationServiceInterface.getOrNull(ce.getLocationId()));
 | 
				
			||||||
            if (countryCode != null)
 | 
					            if (countryCode != null)
 | 
				
			||||||
                protocolStatusData.setCountryCode(countryCode.getName());
 | 
					                protocolStatusData.setCountryCode(countryCode.getName());
 | 
				
			||||||
@@ -765,7 +771,7 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
            String firmwareVersion) {
 | 
					            String firmwareVersion) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        LOG.debug("reconcileFwVersionToTrack for AP {} with active firmware version {} model {}", ce.getInventoryId(), activeFirmwareImageAp, model);
 | 
					        LOG.debug("reconcileFwVersionToTrack for AP {} with active firmware version {} model {}", ce.getInventoryId(), activeFirmwareImageAp, model);
 | 
				
			||||||
        Status statusRecord = statusServiceInterface.getOrNull(autoProvisionedCustomerId, autoProvisionedCustomerId, StatusDataType.FIRMWARE);
 | 
					        Status statusRecord = statusServiceInterface.getOrNull(ce.getCustomerId(), ce.getId(), StatusDataType.FIRMWARE);
 | 
				
			||||||
        if (statusRecord == null) {
 | 
					        if (statusRecord == null) {
 | 
				
			||||||
            statusRecord = new Status();
 | 
					            statusRecord = new Status();
 | 
				
			||||||
            statusRecord.setCreatedTimestamp(System.currentTimeMillis());
 | 
					            statusRecord.setCreatedTimestamp(System.currentTimeMillis());
 | 
				
			||||||
@@ -775,7 +781,7 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
            statusRecord.setDetails(new EquipmentUpgradeStatusData());
 | 
					            statusRecord.setDetails(new EquipmentUpgradeStatusData());
 | 
				
			||||||
            ((EquipmentUpgradeStatusData) statusRecord.getDetails()).setActiveSwVersion(activeFirmwareImageAp);
 | 
					            ((EquipmentUpgradeStatusData) statusRecord.getDetails()).setActiveSwVersion(activeFirmwareImageAp);
 | 
				
			||||||
            if (inactiveFirmwareImageAp != null) {
 | 
					            if (inactiveFirmwareImageAp != null) {
 | 
				
			||||||
                ((EquipmentUpgradeStatusData) statusRecord.getDetails()).setActiveSwVersion(inactiveFirmwareImageAp);
 | 
					                ((EquipmentUpgradeStatusData) statusRecord.getDetails()).setAlternateSwVersion(inactiveFirmwareImageAp);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        EquipmentUpgradeStatusData fwUpgradeStatusData = (EquipmentUpgradeStatusData) statusRecord.getDetails();
 | 
					        EquipmentUpgradeStatusData fwUpgradeStatusData = (EquipmentUpgradeStatusData) statusRecord.getDetails();
 | 
				
			||||||
@@ -793,8 +799,8 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
        // determine if AP requires FW upgrade before cloud
 | 
					        // determine if AP requires FW upgrade before cloud
 | 
				
			||||||
        // connection/provision
 | 
					        // connection/provision
 | 
				
			||||||
        if (trackSettings.getAutoUpgradeDeprecatedOnBind().equals(TrackFlag.ALWAYS) || trackSettings.getAutoUpgradeUnknownOnBind().equals(TrackFlag.ALWAYS)) {
 | 
					        if (trackSettings.getAutoUpgradeDeprecatedOnBind().equals(TrackFlag.ALWAYS) || trackSettings.getAutoUpgradeUnknownOnBind().equals(TrackFlag.ALWAYS)) {
 | 
				
			||||||
            LOG.debug("reconcileFwVersionToTrack for AP {} track flag for auto-upgrade {}", ce.getInventoryId(),
 | 
					            LOG.debug("reconcileFwVersionToTrack for AP {} track flag for auto-upgrade; deprecated flag {} ; unknown flag {} ", ce.getInventoryId(),
 | 
				
			||||||
                    trackSettings.getAutoUpgradeDeprecatedOnBind());
 | 
					                    trackSettings.getAutoUpgradeDeprecatedOnBind(), trackSettings.getAutoUpgradeUnknownOnBind());
 | 
				
			||||||
            // check the reported fw version for the AP, if it is < than
 | 
					            // check the reported fw version for the AP, if it is < than
 | 
				
			||||||
            // the default version for the cloud, then download and
 | 
					            // the default version for the cloud, then download and
 | 
				
			||||||
            // flash the firmware before proceeding.
 | 
					            // flash the firmware before proceeding.
 | 
				
			||||||
@@ -883,23 +889,17 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void apDisconnected(String apId) {
 | 
					    public void apDisconnected(String apId, Long ctxRoutingId) {
 | 
				
			||||||
        LOG.info("AP {} got disconnected from the gateway", apId);
 | 
					        LOG.info("AP {} got disconnected from the gateway, remove ctxRoutingId {} ", apId, ctxRoutingId);
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 | 
					            if (ctxRoutingId != null && ctxRoutingId > 0L) {
 | 
				
			||||||
            OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (ovsdbSession != null) {
 | 
					 | 
				
			||||||
                if (ovsdbSession.getRoutingId() > 0L) {
 | 
					 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                        routingServiceInterface.delete(ovsdbSession.getRoutingId());
 | 
					                    routingServiceInterface.delete(ctxRoutingId);
 | 
				
			||||||
                } catch (Exception e) {
 | 
					                } catch (Exception e) {
 | 
				
			||||||
                        LOG.warn("Unable to delete routing service Id {} for ap {}. {}", ovsdbSession.getRoutingId(), apId, e);
 | 
					                    LOG.warn("Unable to delete routing service Id {} for ap {}. {}", ctxRoutingId, apId, e);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            } else {
 | 
					
 | 
				
			||||||
                LOG.warn("Cannot find ap {} in inventory", apId);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            Equipment ce = equipmentServiceInterface.getByInventoryIdOrNull(apId);
 | 
					            Equipment ce = equipmentServiceInterface.getByInventoryIdOrNull(apId);
 | 
				
			||||||
            if (ce != null) {
 | 
					            if (ce != null) {
 | 
				
			||||||
                List<Status> deletedStatuses = statusServiceInterface.deleteOnEquipmentDisconnect(ce.getCustomerId(), ce.getId());
 | 
					                List<Status> deletedStatuses = statusServiceInterface.deleteOnEquipmentDisconnect(ce.getCustomerId(), ce.getId());
 | 
				
			||||||
@@ -916,6 +916,47 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Long getLatestRoutingId(String apId) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Equipment ce = equipmentServiceInterface.getByInventoryIdOrNull(apId);
 | 
				
			||||||
 | 
					            if (ce != null) {
 | 
				
			||||||
 | 
					                List<EquipmentRoutingRecord> recordList = routingServiceInterface.getRegisteredRouteList(ce.getId());
 | 
				
			||||||
 | 
					                LOG.info("{} routing records found for AP {}, sort and return latest routingRecordId", recordList.size(), apId);
 | 
				
			||||||
 | 
					                if (!recordList.isEmpty()) {
 | 
				
			||||||
 | 
					                    // Sort by latest record first
 | 
				
			||||||
 | 
					                    Collections.sort(recordList, new Comparator<EquipmentRoutingRecord>() {
 | 
				
			||||||
 | 
					                        @Override
 | 
				
			||||||
 | 
					                        public int compare(EquipmentRoutingRecord o1, EquipmentRoutingRecord o2) {
 | 
				
			||||||
 | 
					                            return Long.compare(o2.getLastModifiedTimestamp(), o1.getLastModifiedTimestamp());
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    return recordList.get(0).getId();
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    LOG.debug("No records found for AP {} equipmentId {}", apId, ce.getId());
 | 
				
			||||||
 | 
					                    return null;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // Equipment doesn't exist, nothing to clean up
 | 
				
			||||||
 | 
					                LOG.debug("No equipment found for AP {} ", apId);
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            LOG.error("Exception when registering ap routing {}", apId, e);
 | 
				
			||||||
 | 
					            // Equipment doesn't exist, nothing to clean up
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void removeRoutingRecord(Long routingId) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            routingServiceInterface.delete(routingId);
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            LOG.warn("Unable to delete routing service Id {}. {}", routingId, e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void updateApDisconnectedStatus(String apId, Equipment ce) {
 | 
					    private void updateApDisconnectedStatus(String apId, Equipment ce) {
 | 
				
			||||||
        LOG.info("updateApDisconnectedStatus disconnected AP {}", apId);
 | 
					        LOG.info("updateApDisconnectedStatus disconnected AP {}", apId);
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
@@ -1121,11 +1162,6 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ApElementConfiguration apElementConfig = (ApElementConfiguration) apNode.getDetails();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ProfileContainer profileContainer = new ProfileContainer(profileServiceInterface.getProfileWithChildren(apNode.getProfileId()));
 | 
					 | 
				
			||||||
        RfConfiguration rfConfig = (RfConfiguration) profileContainer.getChildOfTypeOrNull(apNode.getProfileId(), ProfileType.rf).getDetails();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (OpensyncAPVIFState vifState : vifStateTables) {
 | 
					        for (OpensyncAPVIFState vifState : vifStateTables) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            LOG.debug("Processing vifState for interface {} on AP {}", vifState.getIfName(), apId);
 | 
					            LOG.debug("Processing vifState for interface {} on AP {}", vifState.getIfName(), apId);
 | 
				
			||||||
@@ -1152,22 +1188,14 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            LOG.debug("Values from Vif State Mac (BSSID) {} SSID {} AssociatedClients {} Channel {}", bssid, ssid, vifState.getAssociatedClients());
 | 
					            LOG.debug("Values from Vif State Mac (BSSID) {} SSID {} AssociatedClients {} Channel {}", bssid, ssid,
 | 
				
			||||||
 | 
					                    vifState.getAssociatedClients(), channel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            RadioType radioType = null;
 | 
					            RadioType radioType = null;
 | 
				
			||||||
            Map<RadioType, RfElementConfiguration> rfElementMap = rfConfig.getRfConfigMap();
 | 
					            if (channel <= MAX_ALLOWED_2GHz_CHANNEL_NUMBER) {
 | 
				
			||||||
            Map<RadioType, ElementRadioConfiguration> elementRadioMap = apElementConfig.getRadioMap();
 | 
					            	radioType = RadioType.is2dot4GHz;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
            if (apElementConfig.getAdvancedRadioMap().isEmpty()) {
 | 
					            	radioType = RadioType.is5GHz; // 8300 isn't supported
 | 
				
			||||||
                LOG.warn("No AdvancedRadioMap for ap {} {}", apId, apElementConfig);
 | 
					 | 
				
			||||||
                continue;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            for (RadioType rType : elementRadioMap.keySet()) {
 | 
					 | 
				
			||||||
                boolean autoChannelSelection = rfElementMap.get(rType).getAutoChannelSelection();
 | 
					 | 
				
			||||||
                if (elementRadioMap.get(rType).getActiveChannel(autoChannelSelection) == channel) {
 | 
					 | 
				
			||||||
                    radioType = rType;
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            updateActiveBssids(customerId, equipmentId, apId, ssid, radioType, bssid, numClients);
 | 
					            updateActiveBssids(customerId, equipmentId, apId, ssid, radioType, bssid, numClients);
 | 
				
			||||||
@@ -1351,10 +1379,33 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
            channelStatus.setDetails(channelStatusData);
 | 
					            channelStatus.setDetails(channelStatusData);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ((EquipmentChannelStatusData) channelStatus.getDetails()).getChannelNumberStatusDataMap().put(radioState.getFreqBand(), radioState.getChannel());
 | 
					        ((EquipmentChannelStatusData) channelStatus.getDetails()).getChannelNumberStatusDataMap().put(radioState.getFreqBand(), radioState.getChannel());
 | 
				
			||||||
 | 
					        ChannelBandwidth channelBandwidth = convertHtModeToChannelBandwidth(radioState.getHtMode());
 | 
				
			||||||
 | 
					        ((EquipmentChannelStatusData) channelStatus.getDetails()).getChannelBandwidthStatusDataMap().put(radioState.getFreqBand(), channelBandwidth);
 | 
				
			||||||
        ((EquipmentChannelStatusData) channelStatus.getDetails()).getTxPowerDataMap().put(radioState.getFreqBand(), radioState.getTxPower());
 | 
					        ((EquipmentChannelStatusData) channelStatus.getDetails()).getTxPowerDataMap().put(radioState.getFreqBand(), radioState.getTxPower());
 | 
				
			||||||
        return channelStatus;
 | 
					        return channelStatus;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    private ChannelBandwidth convertHtModeToChannelBandwidth(String htMode) {
 | 
				
			||||||
 | 
					        if (htMode == null) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        switch (htMode) {
 | 
				
			||||||
 | 
					            case "HT20":
 | 
				
			||||||
 | 
					                return ChannelBandwidth.is20MHz;
 | 
				
			||||||
 | 
					            case "HT40":
 | 
				
			||||||
 | 
					            case "HT40-":
 | 
				
			||||||
 | 
					            case "HT40+":
 | 
				
			||||||
 | 
					                return ChannelBandwidth.is40MHz;
 | 
				
			||||||
 | 
					            case "HT80":
 | 
				
			||||||
 | 
					                return ChannelBandwidth.is80MHz;
 | 
				
			||||||
 | 
					            case "HT160":
 | 
				
			||||||
 | 
					                return ChannelBandwidth.is160MHz;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                LOG.warn("Unrecognized channel HtMode {}", htMode);
 | 
				
			||||||
 | 
					                return ChannelBandwidth.UNSUPPORTED;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    private boolean updateChannelPowerLevels(String apId, ApElementConfiguration apElementConfiguration, OpensyncAPRadioState radioState) {
 | 
					    private boolean updateChannelPowerLevels(String apId, ApElementConfiguration apElementConfiguration, OpensyncAPRadioState radioState) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        boolean configStateMismatch = false;
 | 
					        boolean configStateMismatch = false;
 | 
				
			||||||
@@ -1404,7 +1455,7 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
            apElementConfiguration.getRadioMap().get(radioState.getFreqBand()).setAllowedChannelsPowerLevels(channelPowerLevels);
 | 
					            apElementConfiguration.getRadioMap().get(radioState.getFreqBand()).setAllowedChannelsPowerLevels(channelPowerLevels);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        LOG.debug("Updated AllowedChannels from Wifi_Radio_State table change for AP {}", apId);
 | 
					        LOG.debug("Updated AllowedChannels from Wifi_Radio_State table change for AP {} configStateMismatch {}", apId, configStateMismatch);
 | 
				
			||||||
        return configStateMismatch;
 | 
					        return configStateMismatch;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1435,8 +1486,10 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
        if (currentActiveBSSIDs == null) {
 | 
					        if (currentActiveBSSIDs == null) {
 | 
				
			||||||
            currentActiveBSSIDs = new ArrayList<>();
 | 
					            currentActiveBSSIDs = new ArrayList<>();
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            currentActiveBSSIDs = currentActiveBSSIDs.stream().filter(p -> (p.getRadioType() != null && p.getSsid() != null))
 | 
					            currentActiveBSSIDs = currentActiveBSSIDs.stream()
 | 
				
			||||||
                    .filter(p -> !p.getRadioType().equals(freqBand) || !p.getSsid().equals(ssid)).collect(Collectors.toList());
 | 
					            		.filter(p -> (p.getRadioType() != null && p.getSsid() != null))
 | 
				
			||||||
 | 
					                    .filter(p -> !(p.getRadioType().equals(freqBand) && p.getSsid().equals(ssid)) )
 | 
				
			||||||
 | 
					                    .collect(Collectors.toList());
 | 
				
			||||||
            LOG.debug("Processing Wifi_VIF_State table update for AP {}, activeBSSIDs bssidList without current radio freq {} and ssid {}", apId,
 | 
					            LOG.debug("Processing Wifi_VIF_State table update for AP {}, activeBSSIDs bssidList without current radio freq {} and ssid {}", apId,
 | 
				
			||||||
                    currentActiveBSSIDs, ssid);
 | 
					                    currentActiveBSSIDs, ssid);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1773,7 +1826,7 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
                clientSession.setLocationId(ce.getLocationId());
 | 
					                clientSession.setLocationId(ce.getLocationId());
 | 
				
			||||||
                clientSession.setDetails(new ClientSessionDetails());
 | 
					                clientSession.setDetails(new ClientSessionDetails());
 | 
				
			||||||
                long derivedSessionId = WiFiSessionUtility.encodeWiFiAssociationId(timestamp / 1000, clientInstance.getMacAddress().getAddressAsLong());
 | 
					                long derivedSessionId = WiFiSessionUtility.encodeWiFiAssociationId(timestamp / 1000, clientInstance.getMacAddress().getAddressAsLong());
 | 
				
			||||||
                clientSession.getDetails().setSessionId(Long.toUnsignedString(derivedSessionId));
 | 
					                clientSession.getDetails().setSessionId(DERIVED_SESSION_ID_PREFIX + Long.toUnsignedString(derivedSessionId));
 | 
				
			||||||
                clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(derivedSessionId)));
 | 
					                clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(derivedSessionId)));
 | 
				
			||||||
                clientSession.getDetails().setAssociationState(AssociationState._802_11_Associated);
 | 
					                clientSession.getDetails().setAssociationState(AssociationState._802_11_Associated);
 | 
				
			||||||
                clientSession.getDetails().setIsReassociation(false);
 | 
					                clientSession.getDetails().setIsReassociation(false);
 | 
				
			||||||
@@ -2222,10 +2275,13 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
                Client client = clientServiceInterface.getOrNull(customerId, clientMacAddress);
 | 
					                Client client = clientServiceInterface.getOrNull(customerId, clientMacAddress);
 | 
				
			||||||
                if (client == null) {
 | 
					                if (client == null) {
 | 
				
			||||||
                    LOG.info("Cannot find client instance for {}", clientMacAddress);
 | 
					                    LOG.info("Cannot find client instance for {}", clientMacAddress);
 | 
				
			||||||
                    ClientSession session = clientServiceInterface.getSessionOrNull(customerId, equipmentId, clientMacAddress);
 | 
					                    ClientSession clientSession = clientServiceInterface.getSessionOrNull(customerId, equipmentId, clientMacAddress);
 | 
				
			||||||
                    if (session != null) {
 | 
					                    if (clientSession != null && clientSession.getDetails() != null && clientSession.getDetails().getAssociationState() != null) {
 | 
				
			||||||
                        LOG.info("Delete clientSession for client that was removed from the Dhcp_Leased_IP table {}",
 | 
					                        if (!clientSession.getDetails().getAssociationState().equals(AssociationState.Disconnected)) {
 | 
				
			||||||
                                clientServiceInterface.deleteSession(customerId, equipmentId, clientMacAddress));
 | 
					                            clientSession.getDetails().setAssociationState(AssociationState.Disconnected);
 | 
				
			||||||
 | 
					                            clientSession = clientServiceInterface.updateSession(clientSession);
 | 
				
			||||||
 | 
					                            LOG.info("Session {} for client {} is now disconnected.", clientSession, clientSession.getMacAddress());
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else if (clientMacAddress.equals(equipmentServiceInterface.get(equipmentId).getBaseMacAddress())) {
 | 
					                } else if (clientMacAddress.equals(equipmentServiceInterface.get(equipmentId).getBaseMacAddress())) {
 | 
				
			||||||
                    LOG.info("Not a client device {} ", dhcpLeasedIps);
 | 
					                    LOG.info("Not a client device {} ", dhcpLeasedIps);
 | 
				
			||||||
@@ -2407,6 +2463,83 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra
 | 
				
			|||||||
        // TODO: will handle changes from Command_State table
 | 
					        // TODO: will handle changes from Command_State table
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public long getConfigVersionFromStatus(String apId) {
 | 
				
			||||||
 | 
					        long ret = 0;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ovsdbSession == null) {
 | 
				
			||||||
 | 
					            LOG.debug("getConfigVersionFromStatus::Cannot get Session for AP {}", apId);
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        long equipmentId = ovsdbSession.getEquipmentId();
 | 
				
			||||||
 | 
					        Equipment ce = equipmentServiceInterface.getOrNull(equipmentId);
 | 
				
			||||||
 | 
					        if (ce == null) {
 | 
				
			||||||
 | 
					            LOG.debug("getConfigVersionFromStatus Cannot get customer Equipment for {}", apId);
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int customerId = ce.getCustomerId();
 | 
				
			||||||
 | 
					        if ((customerId < 0) || (equipmentId < 0)) {
 | 
				
			||||||
 | 
					            LOG.debug("getConfigVersionFromStatus::Cannot get valid CustomerId {} or EquipmentId {} for AP {}", customerId, equipmentId, apId);
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        Status protocolStatus = statusServiceInterface.getOrNull(customerId, equipmentId, StatusDataType.PROTOCOL);
 | 
				
			||||||
 | 
					        if(protocolStatus != null) {
 | 
				
			||||||
 | 
					            EquipmentProtocolStatusData epsd = (EquipmentProtocolStatusData) protocolStatus.getDetails();
 | 
				
			||||||
 | 
					            if(epsd!=null && epsd.getReportedCfgDataVersion()!=null) {
 | 
				
			||||||
 | 
					                ret = epsd.getReportedCfgDataVersion();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void updateConfigVersionInStatus(String apId, long configVersionFromProfiles) {
 | 
				
			||||||
 | 
					        OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ovsdbSession == null) {
 | 
				
			||||||
 | 
					            LOG.debug("updateConfigVersionInStatus::Cannot get Session for AP {}", apId);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        long equipmentId = ovsdbSession.getEquipmentId();
 | 
				
			||||||
 | 
					        Equipment ce = equipmentServiceInterface.getOrNull(equipmentId);
 | 
				
			||||||
 | 
					        if (ce == null) {
 | 
				
			||||||
 | 
					            LOG.debug("updateConfigVersionInStatus Cannot get customer Equipment for {}", apId);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int customerId = ce.getCustomerId();
 | 
				
			||||||
 | 
					        if ((customerId < 0) || (equipmentId < 0)) {
 | 
				
			||||||
 | 
					            LOG.debug("updateConfigVersionInStatus::Cannot get valid CustomerId {} or EquipmentId {} for AP {}", customerId, equipmentId, apId);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        Status protocolStatus = statusServiceInterface.getOrNull(customerId, equipmentId, StatusDataType.PROTOCOL);
 | 
				
			||||||
 | 
					        if(protocolStatus == null) {
 | 
				
			||||||
 | 
					            protocolStatus = new Status();
 | 
				
			||||||
 | 
					            protocolStatus.setCustomerId(customerId);
 | 
				
			||||||
 | 
					            protocolStatus.setEquipmentId(equipmentId);
 | 
				
			||||||
 | 
					            protocolStatus.setCreatedTimestamp(System.currentTimeMillis());
 | 
				
			||||||
 | 
					            protocolStatus.setLastModifiedTimestamp(protocolStatus.getCreatedTimestamp());
 | 
				
			||||||
 | 
					            protocolStatus.setDetails(new EquipmentProtocolStatusData());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        EquipmentProtocolStatusData epsd = (EquipmentProtocolStatusData) protocolStatus.getDetails();
 | 
				
			||||||
 | 
					        if(epsd==null) {
 | 
				
			||||||
 | 
					            epsd = new EquipmentProtocolStatusData();
 | 
				
			||||||
 | 
					            protocolStatus.setDetails(epsd);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        epsd.setReportedCfgDataVersion(configVersionFromProfiles);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        statusServiceInterface.update(protocolStatus);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Clear the EquipmentStatus for this AP, and set all client sessions to
 | 
					     * Clear the EquipmentStatus for this AP, and set all client sessions to
 | 
				
			||||||
     * disconnected. Done as part of a reconfiguration/configuration change
 | 
					     * disconnected. Done as part of a reconfiguration/configuration change
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ import com.telecominfraproject.wlan.client.session.models.ClientSession;
 | 
				
			|||||||
import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
 | 
					import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
 | 
				
			||||||
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
 | 
					import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
 | 
				
			||||||
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
 | 
					import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationCloud;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.util.OvsdbToWlanCloudTypeMappingUtility;
 | 
					import com.telecominfraproject.wlan.opensync.util.OvsdbToWlanCloudTypeMappingUtility;
 | 
				
			||||||
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetric;
 | 
					import com.telecominfraproject.wlan.servicemetric.models.ServiceMetric;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,10 +106,10 @@ public class AsyncPublishService {
 | 
				
			|||||||
                    processClientAssocEvent(customerId, equipmentId, locationId, apEventClientSession);
 | 
					                    processClientAssocEvent(customerId, equipmentId, locationId, apEventClientSession);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (apEventClientSession.hasClientIpEvent()) {
 | 
					                if (apEventClientSession.hasClientIpEvent()) {
 | 
				
			||||||
                    processClientIpEvent(customerId, equipmentId, locationId, apEventClientSession);
 | 
					                    processClientIpEvent(apId, customerId, equipmentId, locationId, apEventClientSession);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (apEventClientSession.hasClientDisconnectEvent()) {
 | 
					                if (apEventClientSession.hasClientDisconnectEvent()) {
 | 
				
			||||||
                    processClientDisconnectEvent(customerId, equipmentId, locationId, apEventClientSession);
 | 
					                    processClientDisconnectEvent(apId, customerId, equipmentId, locationId, apEventClientSession);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            realtimeEventPublisher.publishChannelHopEvents(customerId, equipmentId, locationId, eventReport);
 | 
					            realtimeEventPublisher.publishChannelHopEvents(customerId, equipmentId, locationId, eventReport);
 | 
				
			||||||
@@ -152,6 +153,9 @@ public class AsyncPublishService {
 | 
				
			|||||||
        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
					        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
				
			||||||
        clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
 | 
					        clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
 | 
				
			||||||
        clientSession.getDetails().setSsid(apClientEvent.getSsid());
 | 
					        clientSession.getDetails().setSsid(apClientEvent.getSsid());
 | 
				
			||||||
 | 
					        if (apClientEvent.hasBssid()) {
 | 
				
			||||||
 | 
					            clientSession.getDetails().setBssid(MacAddress.valueOf(apClientEvent.getBssid()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (apClientEvent.hasAuthStatus()) {
 | 
					        if (apClientEvent.hasAuthStatus()) {
 | 
				
			||||||
            clientSession.getDetails().setAssociationStatus(apClientEvent.getAuthStatus());
 | 
					            clientSession.getDetails().setAssociationStatus(apClientEvent.getAuthStatus());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -202,6 +206,9 @@ public class AsyncPublishService {
 | 
				
			|||||||
        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
					        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
				
			||||||
        clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
 | 
					        clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
 | 
				
			||||||
        clientSession.getDetails().setSsid(apClientEvent.getSsid());
 | 
					        clientSession.getDetails().setSsid(apClientEvent.getSsid());
 | 
				
			||||||
 | 
					        if (apClientEvent.hasBssid()) {
 | 
				
			||||||
 | 
					            clientSession.getDetails().setBssid(MacAddress.valueOf(apClientEvent.getBssid()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (apClientEvent.hasStatus()) {
 | 
					        if (apClientEvent.hasStatus()) {
 | 
				
			||||||
            clientSession.getDetails().setAssociationStatus(apClientEvent.getStatus());
 | 
					            clientSession.getDetails().setAssociationStatus(apClientEvent.getStatus());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -232,7 +239,7 @@ public class AsyncPublishService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    private void processClientIpEvent(int customerId, long equipmentId, long locationId, sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
 | 
					    private void processClientIpEvent(String apId, int customerId, long equipmentId, long locationId, sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
 | 
				
			||||||
        ClientIpEvent apClientEvent = apEventClientSession.getClientIpEvent();
 | 
					        ClientIpEvent apClientEvent = apEventClientSession.getClientIpEvent();
 | 
				
			||||||
        com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
 | 
					        com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
 | 
				
			||||||
        if (client == null) {
 | 
					        if (client == null) {
 | 
				
			||||||
@@ -257,12 +264,16 @@ public class AsyncPublishService {
 | 
				
			|||||||
        if (clientSession.getDetails().getPriorEquipmentId() == null) {
 | 
					        if (clientSession.getDetails().getPriorEquipmentId() == null) {
 | 
				
			||||||
            clientSession.getDetails().setPriorEquipmentId(clientSession.getEquipmentId());
 | 
					            clientSession.getDetails().setPriorEquipmentId(clientSession.getEquipmentId());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (clientSession.getDetails().getPriorSessionId() == null) {
 | 
					        
 | 
				
			||||||
            if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId())))
 | 
					        String sessionId = clientSession.getDetails().getSessionId();
 | 
				
			||||||
                clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
 | 
					        if (!Objects.equal(sessionId, Long.toUnsignedString(apEventClientSession.getSessionId()))) {
 | 
				
			||||||
 | 
					            if (sessionId != null && !sessionId.startsWith(OpensyncExternalIntegrationCloud.DERIVED_SESSION_ID_PREFIX)) {
 | 
				
			||||||
 | 
					                LOG.info("Ignored clientIpEvent for different session ID for AP {}, clientMac {}: currentSessionId {}, ipSessionID {} ", apId,
 | 
				
			||||||
 | 
					                        apClientEvent.getStaMac(), sessionId, apEventClientSession.getSessionId());
 | 
				
			||||||
 | 
					                realtimeEventPublisher.publishClientIpEvent(customerId, equipmentId, locationId, apEventClientSession.getClientIpEvent());
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId()))) {
 | 
					            clientSession.getDetails().setPriorSessionId(sessionId);
 | 
				
			||||||
            clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
					        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
				
			||||||
        if (apClientEvent.hasIpAddr()) {
 | 
					        if (apClientEvent.hasIpAddr()) {
 | 
				
			||||||
@@ -288,7 +299,7 @@ public class AsyncPublishService {
 | 
				
			|||||||
        realtimeEventPublisher.publishClientIpEvent(customerId, equipmentId, locationId, apEventClientSession.getClientIpEvent());
 | 
					        realtimeEventPublisher.publishClientIpEvent(customerId, equipmentId, locationId, apEventClientSession.getClientIpEvent());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    private void processClientDisconnectEvent(int customerId, long equipmentId, long locationId,
 | 
					    private void processClientDisconnectEvent(String apId, int customerId, long equipmentId, long locationId,
 | 
				
			||||||
            sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
 | 
					            sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
 | 
				
			||||||
        ClientDisconnectEvent apClientEvent = apEventClientSession.getClientDisconnectEvent();
 | 
					        ClientDisconnectEvent apClientEvent = apEventClientSession.getClientDisconnectEvent();
 | 
				
			||||||
        com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
 | 
					        com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
 | 
				
			||||||
@@ -310,16 +321,22 @@ public class AsyncPublishService {
 | 
				
			|||||||
            clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(apEventClientSession.getSessionId())));
 | 
					            clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(apEventClientSession.getSessionId())));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (clientSession.getDetails().getPriorSessionId() == null) {
 | 
					        String sessionId = clientSession.getDetails().getSessionId();
 | 
				
			||||||
            if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId())))
 | 
					        if (!Objects.equal(sessionId, Long.toUnsignedString(apEventClientSession.getSessionId()))) {
 | 
				
			||||||
                clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
 | 
					            if (sessionId != null && !sessionId.startsWith(OpensyncExternalIntegrationCloud.DERIVED_SESSION_ID_PREFIX)) {
 | 
				
			||||||
 | 
					                LOG.info("Ignored clientDisconnectEvent for different session ID for AP {}, clientMac {}: currentSessionId {}, disconnectSessionID {} ", apId,
 | 
				
			||||||
 | 
					                        apClientEvent.getStaMac(), sessionId, apEventClientSession.getSessionId());
 | 
				
			||||||
 | 
					                realtimeEventPublisher.publishClientDisconnectEvent(customerId, equipmentId, locationId, apEventClientSession.getClientDisconnectEvent());
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId()))) {
 | 
					            clientSession.getDetails().setPriorSessionId(sessionId);
 | 
				
			||||||
            clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
					        clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
 | 
				
			||||||
        clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
 | 
					        clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
 | 
				
			||||||
        clientSession.getDetails().setSsid(apClientEvent.getSsid());
 | 
					        clientSession.getDetails().setSsid(apClientEvent.getSsid());
 | 
				
			||||||
 | 
					        if (apClientEvent.hasBssid()) {
 | 
				
			||||||
 | 
					            clientSession.getDetails().setBssid(MacAddress.valueOf(apClientEvent.getBssid()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (apClientEvent.hasDevType()) {
 | 
					        if (apClientEvent.hasDevType()) {
 | 
				
			||||||
            if (apClientEvent.getDevType().equals(DeviceType.DEV_AP)) {
 | 
					            if (apClientEvent.getDevType().equals(DeviceType.DEV_AP)) {
 | 
				
			||||||
                clientSession.getDetails().setDisconnectByApTimestamp(apClientEvent.getTimestampMs());
 | 
					                clientSession.getDetails().setDisconnectByApTimestamp(apClientEvent.getTimestampMs());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -520,15 +520,18 @@ public class MqttStatsPublisher implements StatsPublisherInterface {
 | 
				
			|||||||
                    if (apNodeMetrics.getSourceTimestampMs() < survey.getTimestampMs())
 | 
					                    if (apNodeMetrics.getSourceTimestampMs() < survey.getTimestampMs())
 | 
				
			||||||
                        apNodeMetrics.setSourceTimestampMs(survey.getTimestampMs());
 | 
					                        apNodeMetrics.setSourceTimestampMs(survey.getTimestampMs());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    int pctBusyTx = busyTx / totalDurationMs;
 | 
					                    float pctBusyTx = (float)busyTx / totalDurationMs;
 | 
				
			||||||
                    checkIfOutOfBound("pctBusyTx", pctBusyTx, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
					                    checkIfOutOfBound("pctBusyTx", pctBusyTx, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
				
			||||||
 | 
					                    radioUtil.setAssocClientTx(Math.round(pctBusyTx));
 | 
				
			||||||
                    
 | 
					                    
 | 
				
			||||||
                    radioUtil.setAssocClientTx(pctBusyTx);
 | 
					                    float pctBusyRx = (float) busyRx / totalDurationMs;
 | 
				
			||||||
                    int pctBusyRx = busySelf / totalDurationMs;
 | 
					 | 
				
			||||||
                    checkIfOutOfBound("pctBusyRx", pctBusyRx, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
					                    checkIfOutOfBound("pctBusyRx", pctBusyRx, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
				
			||||||
                    radioUtil.setAssocClientRx(pctBusyRx);
 | 
					 | 
				
			||||||
                    
 | 
					                    
 | 
				
			||||||
                    double pctIBSS = (busyTx + busySelf) / totalDurationMs;
 | 
					                    float pctBusySelf = (float) busySelf / totalDurationMs;
 | 
				
			||||||
 | 
					                    checkIfOutOfBound("pctBusySelf", pctBusySelf, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
				
			||||||
 | 
					                    radioUtil.setAssocClientRx(Math.round(pctBusySelf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    double pctIBSS = (double) (busyTx + busySelf) / totalDurationMs;
 | 
				
			||||||
                    if (pctIBSS > 100D || pctIBSS < 0D) {
 | 
					                    if (pctIBSS > 100D || pctIBSS < 0D) {
 | 
				
			||||||
                        LOG.warn(
 | 
					                        LOG.warn(
 | 
				
			||||||
                                "Calculated value for {} {} is out of bounds on totalDurationMs {} for survey.getBand {}. busyTx {} busyRx {} busy {} busySelf {} "
 | 
					                                "Calculated value for {} {} is out of bounds on totalDurationMs {} for survey.getBand {}. busyTx {} busyRx {} busy {} busySelf {} "
 | 
				
			||||||
@@ -538,13 +541,13 @@ public class MqttStatsPublisher implements StatsPublisherInterface {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    radioUtil.setIbss(pctIBSS);
 | 
					                    radioUtil.setIbss(pctIBSS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    int nonWifi = (busy - (busyTx + busyRx)) / totalDurationMs;
 | 
					                    float nonWifi = (float) (busy - (busyTx + busyRx)) / totalDurationMs;
 | 
				
			||||||
                    checkIfOutOfBound("nonWifi", nonWifi, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
					                    checkIfOutOfBound("nonWifi", nonWifi, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
				
			||||||
                    radioUtil.setNonWifi(nonWifi);
 | 
					                    radioUtil.setNonWifi(Math.round(nonWifi));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    int pctOBSSAndSelfErrors = (busyRx - busySelf) / totalDurationMs;
 | 
					                    float pctOBSSAndSelfErrors = (float) (busyRx - busySelf) / totalDurationMs;
 | 
				
			||||||
                    checkIfOutOfBound("OBSSAndSelfErrors", pctOBSSAndSelfErrors, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
					                    checkIfOutOfBound("OBSSAndSelfErrors", pctOBSSAndSelfErrors, survey, totalDurationMs, busyTx, busyRx, busy, busySelf);
 | 
				
			||||||
                    radioUtil.setUnassocClientRx(pctOBSSAndSelfErrors);
 | 
					                    radioUtil.setUnassocClientRx(Math.round(pctOBSSAndSelfErrors));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    radioType = OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(survey.getBand());
 | 
					                    radioType = OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(survey.getBand());
 | 
				
			||||||
                    if (radioType != RadioType.UNSUPPORTED) {
 | 
					                    if (radioType != RadioType.UNSUPPORTED) {
 | 
				
			||||||
@@ -559,7 +562,7 @@ public class MqttStatsPublisher implements StatsPublisherInterface {
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        Long totalUtilization = Math.round((double) busy / totalDurationMs);
 | 
					                        Long totalUtilization = Math.round((double) busy / totalDurationMs);
 | 
				
			||||||
                        Long totalNonWifi = totalUtilization - ((busyTx + busyRx) / totalDurationMs);
 | 
					                        Long totalNonWifi = Math.round((double) (busy - (busyTx + busyRx)) / totalDurationMs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        EquipmentCapacityDetails cap = new EquipmentCapacityDetails();
 | 
					                        EquipmentCapacityDetails cap = new EquipmentCapacityDetails();
 | 
				
			||||||
                        cap.setUnavailableCapacity(totalNonWifi.intValue());
 | 
					                        cap.setUnavailableCapacity(totalNonWifi.intValue());
 | 
				
			||||||
@@ -623,8 +626,8 @@ public class MqttStatsPublisher implements StatsPublisherInterface {
 | 
				
			|||||||
        alarm = alarmServiceInterface.create(alarm);
 | 
					        alarm = alarmServiceInterface.create(alarm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void checkIfOutOfBound(String checkedType, int checkedValue, Survey survey, int totalDurationMs, int busyTx, int busyRx, int busy, int busySelf) {
 | 
					    private void checkIfOutOfBound(String checkedType, float checkedValue, Survey survey, int totalDurationMs, int busyTx, int busyRx, int busy, int busySelf) {
 | 
				
			||||||
        if (checkedValue > 100 || checkedValue < 0) {
 | 
					        if (checkedValue > 100F || checkedValue < 0F) {
 | 
				
			||||||
            LOG.warn(
 | 
					            LOG.warn(
 | 
				
			||||||
                    "Calculated value for {} {} is out of bounds on totalDurationMs {} for survey.getBand {}. busyTx {} busyRx {} busy {} busySelf {} "
 | 
					                    "Calculated value for {} {} is out of bounds on totalDurationMs {} for survey.getBand {}. busyTx {} busyRx {} busy {} busySelf {} "
 | 
				
			||||||
                            + " survey.getTimestampMs {}, survey.getSurveyListList {}",
 | 
					                            + " survey.getTimestampMs {}, survey.getSurveyListList {}",
 | 
				
			||||||
@@ -1187,12 +1190,12 @@ public class MqttStatsPublisher implements StatsPublisherInterface {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        String[] parts = topic.split("/");
 | 
					        String[] parts = topic.split("/");
 | 
				
			||||||
        if (parts.length < 3) {
 | 
					        if (parts.length < 4) {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // apId is the third element in the topic
 | 
					        // apId is the third element in the topic
 | 
				
			||||||
        return parts[2];
 | 
					        return parts[3];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -394,7 +394,7 @@ public class OpensyncExternalIntegrationCloudTest {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    public void testApDisconnected() {
 | 
					    public void testApDisconnected() {
 | 
				
			||||||
        opensyncExternalIntegrationCloud.apDisconnected("Test_Client_21P10C68818122");
 | 
					        opensyncExternalIntegrationCloud.apDisconnected("Test_Client_21P10C68818122", 0L);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,11 @@ public interface OpensyncExternalIntegrationInterface {
 | 
				
			|||||||
        INIT, INSERT, DELETE, MODIFY
 | 
					        INIT, INSERT, DELETE, MODIFY
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void apDisconnected(String apId);
 | 
					    void apDisconnected(String apId, Long ctxRoutingId);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    Long getLatestRoutingId(String apId);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    void removeRoutingRecord(Long routingId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OpensyncAPConfig getApConfig(String apId);
 | 
					    OpensyncAPConfig getApConfig(String apId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,4 +60,8 @@ public interface OpensyncExternalIntegrationInterface {
 | 
				
			|||||||
    void clearEquipmentStatus(String apId);
 | 
					    void clearEquipmentStatus(String apId);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    void processMqttMessage(String topic, Report report);
 | 
					    void processMqttMessage(String topic, Report report);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    long getConfigVersionFromStatus(String apId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void updateConfigVersionInStatus(String apId, long configVersionFromProfiles);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
package com.telecominfraproject.wlan.opensync.external.integration;
 | 
					package com.telecominfraproject.wlan.opensync.external.integration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.concurrent.atomic.AtomicInteger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.vmware.ovsdb.service.OvsdbClient;
 | 
					import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class OvsdbSession {
 | 
					public class OvsdbSession {
 | 
				
			||||||
@@ -7,6 +9,7 @@ public class OvsdbSession {
 | 
				
			|||||||
    private String apId;
 | 
					    private String apId;
 | 
				
			||||||
    private long routingId;
 | 
					    private long routingId;
 | 
				
			||||||
    private long equipmentId;
 | 
					    private long equipmentId;
 | 
				
			||||||
 | 
					    private AtomicInteger currentConfigNumInFlight = new AtomicInteger();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    public OvsdbClient getOvsdbClient() {
 | 
					    public OvsdbClient getOvsdbClient() {
 | 
				
			||||||
        return ovsdbClient;
 | 
					        return ovsdbClient;
 | 
				
			||||||
@@ -33,4 +36,8 @@ public class OvsdbSession {
 | 
				
			|||||||
        this.equipmentId = equipmentId;
 | 
					        this.equipmentId = equipmentId;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    public AtomicInteger getCurrentConfigNumInFlight() {
 | 
				
			||||||
 | 
					        return currentConfigNumInFlight;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,8 @@ import java.util.Objects;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public class ConnectNodeInfo implements Cloneable {
 | 
					public class ConnectNodeInfo implements Cloneable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static String CONFIG_VERSION_PROPERTY_NAME = "tip/reportedCfgDataVersion";
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    public Map<String, String> mqttSettings = new HashMap<>();
 | 
					    public Map<String, String> mqttSettings = new HashMap<>();
 | 
				
			||||||
    public Map<String, String> versionMatrix = new HashMap<>();
 | 
					    public Map<String, String> versionMatrix = new HashMap<>();
 | 
				
			||||||
    public Map<String, String> wifiRadioStates = new HashMap<>();
 | 
					    public Map<String, String> wifiRadioStates = new HashMap<>();
 | 
				
			||||||
@@ -35,6 +37,18 @@ public class ConnectNodeInfo implements Cloneable {
 | 
				
			|||||||
    public String manufacturerDate;
 | 
					    public String manufacturerDate;
 | 
				
			||||||
    public String certificationRegion;
 | 
					    public String certificationRegion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public long getConfigVersion() {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        long ret = 0;
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            ret = Long.parseLong(versionMatrix.get(CONFIG_VERSION_PROPERTY_NAME));
 | 
				
			||||||
 | 
					        } catch(Exception e) {
 | 
				
			||||||
 | 
					            //do nothing
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public ConnectNodeInfo clone() {
 | 
					    public ConnectNodeInfo clone() {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package com.telecominfraproject.wlan.opensync.external.integration.models;
 | 
					package com.telecominfraproject.wlan.opensync.external.integration.models;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.HashSet;
 | 
					import java.util.HashSet;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Objects;
 | 
					import java.util.Objects;
 | 
				
			||||||
@@ -45,8 +46,66 @@ public class OpensyncAPConfig extends OpensyncAPBase {
 | 
				
			|||||||
    private List<Profile> captiveProfiles;
 | 
					    private List<Profile> captiveProfiles;
 | 
				
			||||||
    private List<Profile> bonjourGatewayProfiles;
 | 
					    private List<Profile> bonjourGatewayProfiles;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    private long configVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private List<MacAddress> blockedClients;
 | 
					    private List<MacAddress> blockedClients;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public long getConfigVersion() {
 | 
				
			||||||
 | 
					        //go through all child objects and get the most recent lastModifiedTimestamp from them
 | 
				
			||||||
 | 
					        configVersion = 0;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if(customerEquipment!=null && customerEquipment.getLastModifiedTimestamp()> configVersion) {
 | 
				
			||||||
 | 
					            configVersion = customerEquipment.getLastModifiedTimestamp();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if(hotspotConfig!=null) {
 | 
				
			||||||
 | 
					            configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20OperatorSet());
 | 
				
			||||||
 | 
					            configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20ProfileSet());
 | 
				
			||||||
 | 
					            configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20ProviderSet());
 | 
				
			||||||
 | 
					            configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20VenueSet());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, apProfile);
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, rfProfile);
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, ssidProfile);
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, metricsProfile);
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, radiusProfiles);
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, wiredEthernetPortProfile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(equipmentLocation!=null && equipmentLocation.getLastModifiedTimestamp()> configVersion) {
 | 
				
			||||||
 | 
					            configVersion = equipmentLocation.getLastModifiedTimestamp();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, captiveProfiles);
 | 
				
			||||||
 | 
					        configVersion = getLatestLastMod(configVersion, bonjourGatewayProfiles);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return configVersion;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private long getLatestLastMod(long incomingLastMod, Collection<Profile> profiles) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if(profiles!=null) {
 | 
				
			||||||
 | 
					            for(Profile p: profiles) {
 | 
				
			||||||
 | 
					                if(incomingLastMod < p.getLastModifiedTimestamp()) {
 | 
				
			||||||
 | 
					                    incomingLastMod = p.getLastModifiedTimestamp();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return incomingLastMod;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private long getLatestLastMod(long incomingLastMod, Profile profile) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if(profile!=null) {
 | 
				
			||||||
 | 
					            if(incomingLastMod < profile.getLastModifiedTimestamp()) {
 | 
				
			||||||
 | 
					                incomingLastMod = profile.getLastModifiedTimestamp();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return incomingLastMod;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public OpensyncAPConfig clone() {
 | 
					    public OpensyncAPConfig clone() {
 | 
				
			||||||
        OpensyncAPConfig ret = (OpensyncAPConfig) super.clone();
 | 
					        OpensyncAPConfig ret = (OpensyncAPConfig) super.clone();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@ public class OpensyncAPRadioState extends OpensyncAPBase {
 | 
				
			|||||||
    public Map<String, String> hwConfig;
 | 
					    public Map<String, String> hwConfig;
 | 
				
			||||||
    public int channel;
 | 
					    public int channel;
 | 
				
			||||||
    public int txPower;
 | 
					    public int txPower;
 | 
				
			||||||
    public String htMode;
 | 
					    public String htMode; // used in channel bandwidth
 | 
				
			||||||
    public int thermalDowngradeTemp;
 | 
					    public int thermalDowngradeTemp;
 | 
				
			||||||
    public String hwMode;
 | 
					    public String hwMode;
 | 
				
			||||||
    public boolean enabled;
 | 
					    public boolean enabled;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,7 +64,7 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
 | 
				
			|||||||
        LOG.info("ConnectNodeInfo {}", connectNodeInfo);
 | 
					        LOG.info("ConnectNodeInfo {}", connectNodeInfo);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void apDisconnected(String apId) {
 | 
					    public void apDisconnected(String apId, Long ctxRoutingId) {
 | 
				
			||||||
        LOG.info("AP {} got disconnected from the gateway", apId);
 | 
					        LOG.info("AP {} got disconnected from the gateway", apId);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -212,4 +212,25 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
 | 
				
			|||||||
        LOG.info("nodeStateDbTableUpdate for AP {}", apId);
 | 
					        LOG.info("nodeStateDbTableUpdate for AP {}", apId);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public long getConfigVersionFromStatus(String inventoryId) {
 | 
				
			||||||
 | 
					        //0 means always push config to ap, do not do the version check for the configuration before pushing it
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void updateConfigVersionInStatus(String apId, long configVersionFromProfiles) {
 | 
				
			||||||
 | 
					        // do nothing here
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Long getLatestRoutingId(String apId) {
 | 
				
			||||||
 | 
					        LOG.info("getLatestRoutingId for AP {}", apId);
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void removeRoutingRecord(Long routingId) {
 | 
				
			||||||
 | 
					        LOG.info("removeRoutingRecord for routingId {}", routingId);        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
<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">
 | 
					<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>
 | 
						<modelVersion>4.0.0</modelVersion>
 | 
				
			||||||
	<parent>
 | 
						<parent>
 | 
				
			||||||
		<groupId>com.telecominfraproject.wlan</groupId>
 | 
							<groupId>com.telecominfraproject.wlan</groupId>
 | 
				
			||||||
@@ -70,6 +72,33 @@
 | 
				
			|||||||
		</dependency>
 | 
							</dependency>
 | 
				
			||||||
		<!-- MQTT dependencies END -->
 | 
							<!-- MQTT dependencies END -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<!-- Test Dependencies BEGIN -->
 | 
				
			||||||
 | 
							<dependency>
 | 
				
			||||||
 | 
								<artifactId>status-service-local</artifactId>
 | 
				
			||||||
 | 
								<groupId>com.telecominfraproject.wlan</groupId>
 | 
				
			||||||
 | 
								<version>1.2.0-SNAPSHOT</version>
 | 
				
			||||||
 | 
								<scope>test</scope>
 | 
				
			||||||
 | 
							</dependency>
 | 
				
			||||||
 | 
							<dependency>
 | 
				
			||||||
 | 
								<artifactId>status-service</artifactId>
 | 
				
			||||||
 | 
								<groupId>com.telecominfraproject.wlan</groupId>
 | 
				
			||||||
 | 
								<version>1.2.0-SNAPSHOT</version>
 | 
				
			||||||
 | 
								<scope>test</scope>
 | 
				
			||||||
 | 
							</dependency>
 | 
				
			||||||
 | 
							<dependency>
 | 
				
			||||||
 | 
								<artifactId>status-datastore-inmemory</artifactId>
 | 
				
			||||||
 | 
								<groupId>com.telecominfraproject.wlan</groupId>
 | 
				
			||||||
 | 
								<version>1.2.0-SNAPSHOT</version>
 | 
				
			||||||
 | 
								<scope>test</scope>
 | 
				
			||||||
 | 
							</dependency>
 | 
				
			||||||
 | 
							<dependency>
 | 
				
			||||||
 | 
								<artifactId>cloud-event-dispatcher-empty</artifactId>
 | 
				
			||||||
 | 
								<groupId>com.telecominfraproject.wlan</groupId>
 | 
				
			||||||
 | 
								<version>1.2.0-SNAPSHOT</version>
 | 
				
			||||||
 | 
								<scope>test</scope>
 | 
				
			||||||
 | 
							</dependency>
 | 
				
			||||||
 | 
							<!-- Test Dependencies END -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	</dependencies>
 | 
						</dependencies>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,6 +60,9 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private OpensyncExternalIntegrationInterface opensyncExternalIntegrationInterface;
 | 
					    private OpensyncExternalIntegrationInterface opensyncExternalIntegrationInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Value("${tip.wlan.internalHostName:localhost}") 
 | 
				
			||||||
 | 
					    private String internalHostName;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    // dtop: use anonymous constructor to ensure that the following code always
 | 
					    // dtop: use anonymous constructor to ensure that the following code always
 | 
				
			||||||
    // get executed,
 | 
					    // get executed,
 | 
				
			||||||
    // even when somebody adds another constructor in here
 | 
					    // even when somebody adds another constructor in here
 | 
				
			||||||
@@ -138,7 +141,7 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
 | 
				
			|||||||
                        MQTT mqtt = new MQTT();
 | 
					                        MQTT mqtt = new MQTT();
 | 
				
			||||||
                        mqtt.setHost("tls://" + mqttBrokerAddress + ":" + mqttBrokerListenPort);
 | 
					                        mqtt.setHost("tls://" + mqttBrokerAddress + ":" + mqttBrokerListenPort);
 | 
				
			||||||
                        LOG.info("Connecting to MQTT broker at {}", mqtt.getHost());
 | 
					                        LOG.info("Connecting to MQTT broker at {}", mqtt.getHost());
 | 
				
			||||||
                        mqtt.setClientId("opensync_mqtt");
 | 
					                        mqtt.setClientId("opensync_mqtt_" + internalHostName);
 | 
				
			||||||
                        mqtt.setUserName(username);
 | 
					                        mqtt.setUserName(username);
 | 
				
			||||||
                        mqtt.setPassword(password);
 | 
					                        mqtt.setPassword(password);
 | 
				
			||||||
                        blockingConnection = mqtt.blockingConnection();
 | 
					                        blockingConnection = mqtt.blockingConnection();
 | 
				
			||||||
@@ -147,7 +150,7 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
 | 
				
			|||||||
                        LOG.debug("Connected to MQTT broker at {}", mqtt.getHost());
 | 
					                        LOG.debug("Connected to MQTT broker at {}", mqtt.getHost());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        // NB. setting to AT_MOST_ONCE to match the APs message level
 | 
					                        // NB. setting to AT_MOST_ONCE to match the APs message level
 | 
				
			||||||
                        Topic[] topics = {new Topic("/ap/#", QoS.AT_MOST_ONCE),};
 | 
					                        Topic[] topics = {new Topic("/ap/opensync_mqtt_" + internalHostName + "/#", QoS.AT_MOST_ONCE),};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        blockingConnection.subscribe(topics);
 | 
					                        blockingConnection.subscribe(topics);
 | 
				
			||||||
                        LOG.info("Subscribed to mqtt topics {}", Arrays.asList(topics));
 | 
					                        LOG.info("Subscribed to mqtt topics {}", Arrays.asList(topics));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,7 @@ import com.telecominfraproject.wlan.opensync.external.integration.models.*;
 | 
				
			|||||||
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
 | 
					import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbClientWithMetrics;
 | 
					import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbClientWithMetrics;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbMetrics;
 | 
					import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbMetrics;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.opensync.util.OvsdbClientUtil;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.util.OvsdbStringConstants;
 | 
					import com.telecominfraproject.wlan.opensync.util.OvsdbStringConstants;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.util.SslUtil;
 | 
					import com.telecominfraproject.wlan.opensync.util.SslUtil;
 | 
				
			||||||
import com.vmware.ovsdb.callback.ConnectionCallback;
 | 
					import com.vmware.ovsdb.callback.ConnectionCallback;
 | 
				
			||||||
@@ -72,6 +73,12 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
    @org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultCommandDurationSec:3600}")
 | 
					    @org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultCommandDurationSec:3600}")
 | 
				
			||||||
    private long defaultCommandDurationSec;
 | 
					    private long defaultCommandDurationSec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @org.springframework.beans.factory.annotation.Value("${tip.wlan.checkConfigVersionFromStatus:true}")
 | 
				
			||||||
 | 
					    private boolean checkBeforePushConfigVersionFromStatus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @org.springframework.beans.factory.annotation.Value("${tip.wlan.checkConfigVersionFromAp:true}")
 | 
				
			||||||
 | 
					    private boolean checkBeforePushConfigVersionFromAp;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private SslContext sslContext;
 | 
					    private SslContext sslContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -135,6 +142,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
					subjectDn = ((X509Certificate) remoteCertificate).getSubjectDN().getName();
 | 
										subjectDn = ((X509Certificate) remoteCertificate).getSubjectDN().getName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    String clientCn = SslUtil.extractCN(subjectDn);
 | 
					                    String clientCn = SslUtil.extractCN(subjectDn);
 | 
				
			||||||
 | 
					                    if (clientCn != null && !clientCn.isEmpty()) {
 | 
				
			||||||
                        LOG.info("ovsdbClient connecting from {} on port {} clientCn {}", remoteHost, localPort, clientCn);
 | 
					                        LOG.info("ovsdbClient connecting from {} on port {} clientCn {}", remoteHost, localPort, clientCn);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
                        ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
 | 
					                        ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
 | 
				
			||||||
@@ -143,9 +151,11 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
                        // connectedClients table
 | 
					                        // connectedClients table
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
                        String key = alterClientCnIfRequired(clientCn, connectNodeInfo);
 | 
					                        String key = alterClientCnIfRequired(clientCn, connectNodeInfo);
 | 
				
			||||||
                    ovsdbSessionMapInterface.newSession(key, ovsdbClient);
 | 
					                        OvsdbSession ovsdbSession = ovsdbSessionMapInterface.newSession(key, ovsdbClient);
 | 
				
			||||||
 | 
					 | 
				
			||||||
                        extIntegrationInterface.apConnected(key, connectNodeInfo);
 | 
					                        extIntegrationInterface.apConnected(key, connectNodeInfo);
 | 
				
			||||||
 | 
					                        // DT: at this point the routing Id is associated with the session, let's store it into the
 | 
				
			||||||
 | 
					                        // connectionInfo object so that the disconnect handler has access to it
 | 
				
			||||||
 | 
					                        OvsdbClientUtil.setRoutingId(ovsdbClient, ovsdbSession.getRoutingId());
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
                        processConnectRequest(ovsdbClient, clientCn, connectNodeInfo);
 | 
					                        processConnectRequest(ovsdbClient, clientCn, connectNodeInfo);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -154,6 +164,9 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
                        connectionsCreated.increment();
 | 
					                        connectionsCreated.increment();
 | 
				
			||||||
                        LOG.info("ovsdbClient connected from {} on port {} AP {} ", remoteHost, localPort, key);
 | 
					                        LOG.info("ovsdbClient connected from {} on port {} AP {} ", remoteHost, localPort, key);
 | 
				
			||||||
                        LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
 | 
					                        LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        LOG.debug("ovsdbClient: clientCn is empty - not connecting.");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    
 | 
					                    
 | 
				
			||||||
                } catch (IllegalStateException e) {
 | 
					                } catch (IllegalStateException e) {
 | 
				
			||||||
                    connectionsFailed.increment();
 | 
					                    connectionsFailed.increment();
 | 
				
			||||||
@@ -175,6 +188,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
                connectionsDropped.increment();
 | 
					                connectionsDropped.increment();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                String remoteHost;
 | 
					                String remoteHost;
 | 
				
			||||||
 | 
					                int remotePort;
 | 
				
			||||||
                int localPort;
 | 
					                int localPort;
 | 
				
			||||||
                String clientCn;
 | 
					                String clientCn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -190,6 +204,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
 | 
					                    remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
 | 
				
			||||||
 | 
					                    remotePort = ovsdbClient.getConnectionInfo().getRemotePort();
 | 
				
			||||||
                    localPort = ovsdbClient.getConnectionInfo().getLocalPort();
 | 
					                    localPort = ovsdbClient.getConnectionInfo().getLocalPort();
 | 
				
			||||||
                    String subjectDn = null;
 | 
					                    String subjectDn = null;
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
@@ -200,17 +215,63 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
                        // do nothing
 | 
					                        // do nothing
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    clientCn = SslUtil.extractCN(subjectDn);
 | 
					                    clientCn = SslUtil.extractCN(subjectDn);
 | 
				
			||||||
                    key = ovsdbSessionMapInterface.lookupClientId(ovsdbClient);
 | 
					                    if (clientCn != null && !clientCn.isEmpty()) {
 | 
				
			||||||
                    if (key != null) {
 | 
					                        Long ctxRoutingId =  OvsdbClientUtil.getRoutingId(ovsdbClient);
 | 
				
			||||||
 | 
					                        Long latestDbRoutingId = extIntegrationInterface.getLatestRoutingId(clientCn);
 | 
				
			||||||
 | 
					                        OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(clientCn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        LOG.info("Determine true disconnect with AP {} ctxRoutingId {} latestDbRoutingId {} ", clientCn, ctxRoutingId, latestDbRoutingId);
 | 
				
			||||||
 | 
					                        // Determine whether this is a true disconnect based on latest routing record
 | 
				
			||||||
 | 
					                        if (ctxRoutingId != null && latestDbRoutingId != null) {
 | 
				
			||||||
 | 
					                            // if context matches latest DB routingId, this is a true disconnect
 | 
				
			||||||
 | 
					                            if (ctxRoutingId.equals(latestDbRoutingId)) {
 | 
				
			||||||
                                try {
 | 
					                                try {
 | 
				
			||||||
                            extIntegrationInterface.apDisconnected(key);
 | 
					                                    extIntegrationInterface.apDisconnected(clientCn, ctxRoutingId);
 | 
				
			||||||
                            ovsdbSessionMapInterface.removeSession(key);
 | 
					                                    ovsdbSessionMapInterface.removeSession(clientCn);
 | 
				
			||||||
                                } catch (Exception e) {
 | 
					                                } catch (Exception e) {
 | 
				
			||||||
                                    LOG.debug("Unable to process ap disconnect. {}", e);
 | 
					                                    LOG.debug("Unable to process ap disconnect. {}", e);
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                if (ovsdbSession != null) {
 | 
				
			||||||
 | 
					                                    if (!latestDbRoutingId.equals(ovsdbSession.getRoutingId())) {
 | 
				
			||||||
 | 
					                                        ovsdbSessionMapInterface.removeSession(clientCn);
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                    LOG.info("ovsdbClient disconnected from {} on port {} clientCn {} AP {} ", remoteHost, localPort, clientCn, key);
 | 
					                                }
 | 
				
			||||||
 | 
					                                
 | 
				
			||||||
 | 
					                                extIntegrationInterface.removeRoutingRecord(ctxRoutingId);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            
 | 
				
			||||||
 | 
					                        // else, clearly handle all other cases
 | 
				
			||||||
 | 
					                        } else if (ctxRoutingId == null && latestDbRoutingId != null) {
 | 
				
			||||||
 | 
					                            // session was not initialized properly in connect path, we can remove this session
 | 
				
			||||||
 | 
					                            LOG.debug("ctxRoutingId null latestDbRoutingId {}, remove non-initialized session for AP {} ", latestDbRoutingId, clientCn);
 | 
				
			||||||
 | 
					                            if (ovsdbSession != null) {
 | 
				
			||||||
 | 
					                                if (ovsdbSession.getRoutingId() == 0L) {
 | 
				
			||||||
 | 
					                                    ovsdbSessionMapInterface.removeSession(clientCn);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            
 | 
				
			||||||
 | 
					                        } else if (ctxRoutingId != null && latestDbRoutingId == null) {
 | 
				
			||||||
 | 
					                            // no routing exist at all, so we know this session is not using any routing record, we can remove this session
 | 
				
			||||||
 | 
					                            LOG.debug("ctxRoutingId {} latestDbRoutingId null, no routing exists, remove session for AP {} ", latestDbRoutingId, clientCn);
 | 
				
			||||||
 | 
					                            if (ovsdbSession != null) {
 | 
				
			||||||
 | 
					                                if (ctxRoutingId.equals(ovsdbSession.getRoutingId())) {
 | 
				
			||||||
 | 
					                                    ovsdbSessionMapInterface.removeSession(clientCn);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            // ctxRoutingId == null && latestDbRoutingId == null
 | 
				
			||||||
 | 
					                            // This session is not initialized properly and no routings exist for any session
 | 
				
			||||||
 | 
					                            // We can remove this session without any checks
 | 
				
			||||||
 | 
					                            LOG.debug("ctxRoutingId null latestDbRoutingId null, remove session for AP {} ", latestDbRoutingId, clientCn);
 | 
				
			||||||
 | 
					                            ovsdbSessionMapInterface.removeSession(clientCn);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        
 | 
				
			||||||
 | 
					                        LOG.info("ovsdbClient disconnected from {} on local port {} remote port {} clientCn {} ", remoteHost, localPort,
 | 
				
			||||||
 | 
					                                remotePort, clientCn);
 | 
				
			||||||
                        LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
 | 
					                        LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                } finally {
 | 
					                } finally {
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        ovsdbClient.shutdown();
 | 
					                        ovsdbClient.shutdown();
 | 
				
			||||||
@@ -240,16 +301,71 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        LOG.debug("Client {} connect for AP {}", clientCn, apId);
 | 
					        LOG.debug("Client {} connect for AP {}", clientCn, apId);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //get last known configVersion from the AP
 | 
				
			||||||
 | 
					        long configVersionFromAp = checkBeforePushConfigVersionFromAp ? connectNodeInfo.getConfigVersion() : 0;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //get last known configVersion from the EquipmentProtocolStatusData        
 | 
				
			||||||
 | 
					        long configVersionFromStatus = checkBeforePushConfigVersionFromStatus ? extIntegrationInterface.getConfigVersionFromStatus(apId) : 0;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //get current configVersion from the profiles and equipment
 | 
				
			||||||
 | 
					        long configVersionFromProfiles = opensyncAPConfig.getConfigVersion();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        boolean needToPushConfigToAP = needToPushToAp(configVersionFromAp, configVersionFromStatus, configVersionFromProfiles);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if(needToPushConfigToAP) {
 | 
				
			||||||
 | 
					            pushConfigToAp(ovsdbClient, opensyncAPConfig, apId, configVersionFromProfiles);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        LOG.debug("Client connect Done");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private boolean needToPushToAp(long configVersionFromAp, long configVersionFromStatus, long configVersionFromProfiles) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        boolean ret = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(configVersionFromAp == 0) {
 | 
				
			||||||
 | 
					            LOG.debug("do not know what is on AP, let's push new config");
 | 
				
			||||||
 | 
					            ret = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if(checkBeforePushConfigVersionFromAp && configVersionFromAp < configVersionFromProfiles ) {
 | 
				
			||||||
 | 
					            LOG.debug("our profiles are more recent than what was pushed  to AP previously, let's push new config");
 | 
				
			||||||
 | 
					            ret = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(checkBeforePushConfigVersionFromStatus && configVersionFromStatus < configVersionFromProfiles) {
 | 
				
			||||||
 | 
					           LOG.debug("our profiles are more recent than the version stored in the protocol status, let's push new config");
 | 
				
			||||||
 | 
					           ret = true;
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					       if(!checkBeforePushConfigVersionFromAp && !checkBeforePushConfigVersionFromStatus) {
 | 
				
			||||||
 | 
					           LOG.debug("we do not do any checks for config versions - let's push new config");
 | 
				
			||||||
 | 
					           ret = true;
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					       if(!ret) {
 | 
				
			||||||
 | 
					           LOG.debug("no need to push new config to AP");
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					       return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private void pushConfigToAp(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig, String apInventoryId, long configVersionFromProfiles) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
 | 
					        ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
 | 
				
			||||||
        ovsdbDao.removeAllSsids(ovsdbClient); // always
 | 
					        ovsdbDao.removeAllSsids(ovsdbClient); // always
 | 
				
			||||||
        ovsdbDao.removeAllInetConfigs(ovsdbClient);
 | 
					        ovsdbDao.removeAllInetConfigs(ovsdbClient);
 | 
				
			||||||
 | 
					        if(opensyncAPConfig!=null) {
 | 
				
			||||||
 | 
					            ovsdbDao.resetWiredPorts(ovsdbClient, opensyncAPConfig); // need to run this first before remove Status
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        ovsdbDao.removeWifiRrm(ovsdbClient);
 | 
					        ovsdbDao.removeWifiRrm(ovsdbClient);
 | 
				
			||||||
        ovsdbDao.removeRadsecRadiusAndRealmConfigs(ovsdbClient);
 | 
					        ovsdbDao.removeRadsecRadiusAndRealmConfigs(ovsdbClient);
 | 
				
			||||||
        ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
 | 
					        ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        extIntegrationInterface.clearEquipmentStatus(apId);
 | 
					        extIntegrationInterface.clearEquipmentStatus(apInventoryId);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (opensyncAPConfig != null) {
 | 
					        if (opensyncAPConfig != null) {
 | 
				
			||||||
            ovsdbDao.configureNode(ovsdbClient, opensyncAPConfig);
 | 
					            ovsdbDao.configureNode(ovsdbClient, opensyncAPConfig);
 | 
				
			||||||
@@ -274,10 +390,15 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
            ovsdbDao.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
 | 
					            ovsdbDao.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            LOG.info("No Configuration available for {}", apId);
 | 
					            LOG.info("No Configuration available for {}", apInventoryId);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        LOG.debug("Client connect Done");
 | 
					        //after a successful config push let's update the configVersion on the AP and in the EquipmentProtocolStatusData
 | 
				
			||||||
 | 
					        if(checkBeforePushConfigVersionFromStatus) {
 | 
				
			||||||
 | 
					            extIntegrationInterface.updateConfigVersionInStatus(apInventoryId, configVersionFromProfiles);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        ovsdbDao.updateConfigVersionInNode(ovsdbClient, configVersionFromProfiles);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
@@ -319,6 +440,13 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        OvsdbClient ovsdbClient = ovsdbSession.getOvsdbClient();
 | 
					        OvsdbClient ovsdbClient = ovsdbSession.getOvsdbClient();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int currentConfigCount = ovsdbSession.getCurrentConfigNumInFlight().get();
 | 
				
			||||||
 | 
					        if (currentConfigCount == 0L) {
 | 
				
			||||||
 | 
					            // Current count is 0, start this config push
 | 
				
			||||||
 | 
					            // Increment other incoming configs into the count until this config push is done
 | 
				
			||||||
 | 
					            currentConfigCount = ovsdbSession.getCurrentConfigNumInFlight().incrementAndGet();
 | 
				
			||||||
 | 
					            do {
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
                    OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
 | 
					                    OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
 | 
				
			||||||
                    
 | 
					                    
 | 
				
			||||||
                    if (opensyncAPConfig == null) {
 | 
					                    if (opensyncAPConfig == null) {
 | 
				
			||||||
@@ -326,37 +454,42 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
        ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
 | 
					                    //get last known configVersion from the AP
 | 
				
			||||||
        ovsdbDao.removeAllSsids(ovsdbClient); // always
 | 
					                    long configVersionFromAp = checkBeforePushConfigVersionFromAp ? ovsdbDao.getConfigVersionFromNode(ovsdbClient) : 0;
 | 
				
			||||||
        ovsdbDao.removeAllInetConfigs(ovsdbClient);
 | 
					 | 
				
			||||||
        ovsdbDao.removeWifiRrm(ovsdbClient);
 | 
					 | 
				
			||||||
        ovsdbDao.removeRadsecRadiusAndRealmConfigs(ovsdbClient);
 | 
					 | 
				
			||||||
        ovsdbDao.removeAllStatsConfigs(ovsdbClient);
 | 
					 | 
				
			||||||
                    
 | 
					                    
 | 
				
			||||||
        extIntegrationInterface.clearEquipmentStatus(apId);
 | 
					                    //get last known configVersion from the EquipmentProtocolStatusData        
 | 
				
			||||||
 | 
					                    long configVersionFromStatus = checkBeforePushConfigVersionFromStatus ? extIntegrationInterface.getConfigVersionFromStatus(apId) : 0;
 | 
				
			||||||
                    
 | 
					                    
 | 
				
			||||||
        ovsdbDao.configureNode(ovsdbClient, opensyncAPConfig);
 | 
					                    //get current configVersion from the profiles and equipment
 | 
				
			||||||
        ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
 | 
					                    long configVersionFromProfiles = opensyncAPConfig.getConfigVersion();
 | 
				
			||||||
        ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
 | 
					                    
 | 
				
			||||||
        ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
 | 
					                    boolean needToPushConfigToAP = needToPushToAp(configVersionFromAp, configVersionFromStatus, configVersionFromProfiles);
 | 
				
			||||||
        ovsdbDao.configureWiredPort(ovsdbClient, opensyncAPConfig);
 | 
					            
 | 
				
			||||||
        ovsdbDao.configureRadsecRadiusAndRealm(ovsdbClient, opensyncAPConfig);
 | 
					                    if(needToPushConfigToAP) {
 | 
				
			||||||
        ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
 | 
					                        pushConfigToAp(ovsdbClient, opensyncAPConfig, apId, configVersionFromProfiles);
 | 
				
			||||||
        if (opensyncAPConfig.getHotspotConfig() != null) {
 | 
					 | 
				
			||||||
            ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig);
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        ovsdbDao.configureInterfaces(ovsdbClient);
 | 
					 | 
				
			||||||
        ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig);
 | 
					 | 
				
			||||||
        if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
 | 
					 | 
				
			||||||
            ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
 | 
					 | 
				
			||||||
        ovsdbDao.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
                    LOG.debug("Finished processConfigChanged for {}", apId);
 | 
					                    LOG.debug("Finished processConfigChanged for {}", apId);
 | 
				
			||||||
 | 
					                } catch (Exception ex) {
 | 
				
			||||||
 | 
					                    // If anything fails in the ovsdb config push, clean up count and exit
 | 
				
			||||||
 | 
					                    ovsdbSession.getCurrentConfigNumInFlight().set(0);
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                int checkCount = ovsdbSession.getCurrentConfigNumInFlight().get();
 | 
				
			||||||
 | 
					                if (checkCount == currentConfigCount) {
 | 
				
			||||||
 | 
					                    // Count didn't change from pre-config push, we can clean up and exit
 | 
				
			||||||
 | 
					                    if (ovsdbSession.getCurrentConfigNumInFlight().compareAndSet(currentConfigCount, 0)) {
 | 
				
			||||||
 | 
					                        return;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // Count has changed, update the currentConfigCount and rerun config push
 | 
				
			||||||
 | 
					                    ovsdbSession.getCurrentConfigNumInFlight().incrementAndGet();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } while (ovsdbSession.getCurrentConfigNumInFlight().get() != 0);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // Count is not 0, another request is being processed for this OvsdbSession
 | 
				
			||||||
 | 
					            // Remember this request, and the other thread will check the count when it's done
 | 
				
			||||||
 | 
					            ovsdbSession.getCurrentConfigNumInFlight().incrementAndGet();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
@@ -463,12 +596,12 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
                            for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
 | 
					                            for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                if (rowUpdate.getNew() == null) {
 | 
					                                if (rowUpdate.getNew() == null) {
 | 
				
			||||||
 | 
					                                    // delete
 | 
				
			||||||
                                    Map<String, String> rowMap = new HashMap<>();
 | 
					                                    Map<String, String> rowMap = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                    rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
 | 
					                                    rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                    delete.add(rowMap);
 | 
					                                    delete.add(rowMap);
 | 
				
			||||||
                                    // delete
 | 
					 | 
				
			||||||
                                } else if (rowUpdate.getOld() == null) {
 | 
					                                } else if (rowUpdate.getOld() == null) {
 | 
				
			||||||
                                    // insert
 | 
					                                    // insert
 | 
				
			||||||
                                    Map<String, String> rowMap = new HashMap<>();
 | 
					                                    Map<String, String> rowMap = new HashMap<>();
 | 
				
			||||||
@@ -477,15 +610,13 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                                    insert.add(rowMap);
 | 
					                                    insert.add(rowMap);
 | 
				
			||||||
                                } else {
 | 
					                                } else {
 | 
				
			||||||
 | 
					                                    // update
 | 
				
			||||||
                                    // insert
 | 
					 | 
				
			||||||
                                    Map<String, String> rowMap = new HashMap<>();
 | 
					                                    Map<String, String> rowMap = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                    rowUpdate.getOld().getColumns().putAll(rowUpdate.getNew().getColumns());
 | 
					                                    rowUpdate.getOld().getColumns().putAll(rowUpdate.getNew().getColumns());
 | 
				
			||||||
                                    rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
 | 
					                                    rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                    update.add(rowMap);
 | 
					                                    update.add(rowMap);
 | 
				
			||||||
 | 
					 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -509,7 +640,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        awCf.join();
 | 
					        extIntegrationInterface.dhcpLeasedIpDbTableUpdate(ovsdbDao.getInitialOpensyncDhcpLeasedIp(awCf.join(), key, ovsdbClient), key, RowUpdateOperation.INIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -691,7 +822,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
    private void monitorWifiVifStateDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
 | 
					    private void monitorWifiVifStateDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        CompletableFuture<TableUpdates> vsCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiVifStateDbTable + "_" + key,
 | 
					        CompletableFuture<TableUpdates> vsCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiVifStateDbTable + "_" + key,
 | 
				
			||||||
                new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable, new MonitorRequest(new MonitorSelect(false, true, true, true)))),
 | 
					                new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))),
 | 
				
			||||||
                tableUpdates -> {
 | 
					                tableUpdates -> {
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        LOG.info(OvsdbDao.wifiVifStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
 | 
					                        LOG.info(OvsdbDao.wifiVifStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
 | 
				
			||||||
@@ -729,7 +860,19 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
        vsCf.join();
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            List<OpensyncAPVIFState> vifsToInsert = new ArrayList<>();
 | 
				
			||||||
 | 
					            TableUpdates initialTableUpdates = vsCf.join();
 | 
				
			||||||
 | 
					            for (TableUpdate tableUpdate : initialTableUpdates.getTableUpdates().values()) {
 | 
				
			||||||
 | 
					                for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
 | 
				
			||||||
 | 
					                    vifsToInsert.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(rowUpdate, key, ovsdbClient));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            extIntegrationInterface.wifiVIFStateDbTableUpdate(vifsToInsert, key);
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            LOG.error("initial wifiVIFStateDbTableUpdate failed", e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -96,6 +96,7 @@ public class OvsdbDao extends OvsdbDaoBase {
 | 
				
			|||||||
        processBlinkRequest(ovsdbClient, opensyncAPConfig.getCustomerEquipment().getInventoryId(),
 | 
					        processBlinkRequest(ovsdbClient, opensyncAPConfig.getCustomerEquipment().getInventoryId(),
 | 
				
			||||||
                ((ApElementConfiguration) opensyncAPConfig.getCustomerEquipment().getDetails()).isBlinkAllLEDs());
 | 
					                ((ApElementConfiguration) opensyncAPConfig.getCustomerEquipment().getDetails()).isBlinkAllLEDs());
 | 
				
			||||||
        ovsdbNodeConfig.processLedControlEnabled(ovsdbClient, opensyncAPConfig);
 | 
					        ovsdbNodeConfig.processLedControlEnabled(ovsdbClient, opensyncAPConfig);
 | 
				
			||||||
 | 
					        processApcConfig(ovsdbClient, opensyncAPConfig);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    void configureNtpServer(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
 | 
					    void configureNtpServer(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
 | 
				
			||||||
@@ -152,6 +153,11 @@ public class OvsdbDao extends OvsdbDaoBase {
 | 
				
			|||||||
        return ovsdbMonitor.getInitialOpensyncWifiAssociatedClients(join, key, ovsdbClient);
 | 
					        return ovsdbMonitor.getInitialOpensyncWifiAssociatedClients(join, key, ovsdbClient);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    public List<Map<String, String>> getInitialOpensyncDhcpLeasedIp(TableUpdates join, String key,
 | 
				
			||||||
 | 
					            OvsdbClient ovsdbClient) {
 | 
				
			||||||
 | 
					        return ovsdbMonitor.getInitialOpensyncDhcpLeasedIp(join, key, ovsdbClient);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Collection<? extends OpensyncAPInetState> getOpensyncApInetStateForRowUpdate(RowUpdate rowUpdate, String key,
 | 
					    public Collection<? extends OpensyncAPInetState> getOpensyncApInetStateForRowUpdate(RowUpdate rowUpdate, String key,
 | 
				
			||||||
            OvsdbClient ovsdbClient) {
 | 
					            OvsdbClient ovsdbClient) {
 | 
				
			||||||
        return ovsdbMonitor.getOpensyncApInetStateForRowUpdate(rowUpdate, key, ovsdbClient);
 | 
					        return ovsdbMonitor.getOpensyncApInetStateForRowUpdate(rowUpdate, key, ovsdbClient);
 | 
				
			||||||
@@ -211,6 +217,10 @@ public class OvsdbDao extends OvsdbDaoBase {
 | 
				
			|||||||
        ovsdbNetwork.removeAllInetConfigs(ovsdbClient);
 | 
					        ovsdbNetwork.removeAllInetConfigs(ovsdbClient);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    public void resetWiredPorts(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
 | 
				
			||||||
 | 
					    	ovsdbNetwork.resetWiredPorts(ovsdbClient, opensyncApConfig);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void removeAllPasspointConfigs(OvsdbClient ovsdbClient) {
 | 
					    public void removeAllPasspointConfigs(OvsdbClient ovsdbClient) {
 | 
				
			||||||
        ovsdbHotspot.removeAllPasspointConfigs(ovsdbClient);
 | 
					        ovsdbHotspot.removeAllPasspointConfigs(ovsdbClient);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -250,4 +260,16 @@ public class OvsdbDao extends OvsdbDaoBase {
 | 
				
			|||||||
        return ovsdbNodeConfig.processBlinkRequest(ovsdbClient, apId, blinkAllLEDs);
 | 
					        return ovsdbNodeConfig.processBlinkRequest(ovsdbClient, apId, blinkAllLEDs);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    public void processApcConfig(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
 | 
				
			||||||
 | 
					        ovsdbNodeConfig.configureDynamicRadiusProxyToAPC(ovsdbClient, opensyncAPConfig);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public long getConfigVersionFromNode(OvsdbClient ovsdbClient) {
 | 
				
			||||||
 | 
					        return ovsdbNode.getConfigVersionFromNode(ovsdbClient);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void updateConfigVersionInNode(OvsdbClient ovsdbClient, long configVersionFromProfiles) {
 | 
				
			||||||
 | 
					        ovsdbNode.updateConfigVersionInNode(ovsdbClient, configVersionFromProfiles);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,11 +40,26 @@ public class OvsdbGet extends OvsdbDaoBase {
 | 
				
			|||||||
    Map<String, Set<Integer>> getAllowedChannels(OvsdbClient ovsdbClient) {
 | 
					    Map<String, Set<Integer>> getAllowedChannels(OvsdbClient ovsdbClient) {
 | 
				
			||||||
        Map<String, Set<Integer>> allowedChannels = new HashMap<>();
 | 
					        Map<String, Set<Integer>> allowedChannels = new HashMap<>();
 | 
				
			||||||
        for (Row row : getOvsdbTableRowsForCondition(ovsdbClient, wifiRadioStateDbTable, null)) {
 | 
					        for (Row row : getOvsdbTableRowsForCondition(ovsdbClient, wifiRadioStateDbTable, null)) {
 | 
				
			||||||
            allowedChannels.put(getSingleValueFromSet(row, "freq_band"), row.getSetColumn("allowed_channels"));
 | 
					            Set<Integer> channels = new HashSet<>();
 | 
				
			||||||
 | 
					            if (row.getMapColumn("channels").containsKey("allowed")) {
 | 
				
			||||||
 | 
					                for (String c : row.getMapColumn("channels").get("allowed").toString().split(",")) {
 | 
				
			||||||
 | 
					                    if (c != null)
 | 
				
			||||||
 | 
					                        channels.add(Integer.valueOf(c));
 | 
				
			||||||
 | 
					                } ;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (row.getMapColumn("channels").containsKey("radar_detection")) {
 | 
				
			||||||
 | 
					                for (String c : row.getMapColumn("channels").get("radar_detection").toString().split(",")) {
 | 
				
			||||||
 | 
					                    if (c != null)
 | 
				
			||||||
 | 
					                        channels.add(Integer.valueOf(c));
 | 
				
			||||||
 | 
					                } ;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            allowedChannels.put(getSingleValueFromSet(row, "freq_band"), channels);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return allowedChannels;
 | 
					        return allowedChannels;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get all Rows from given table that satisfy the conditions.
 | 
					     * Get all Rows from given table that satisfy the conditions.
 | 
				
			||||||
     * 
 | 
					     * 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,6 +84,33 @@ public class OvsdbMonitor extends OvsdbDaoBase {
 | 
				
			|||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    List<Map<String, String>> getInitialOpensyncDhcpLeasedIp(TableUpdates tableUpdates, String apId,
 | 
				
			||||||
 | 
					            OvsdbClient ovsdbClient) {
 | 
				
			||||||
 | 
					        LOG.debug("getInitialOpensyncDhcpLeasedIp:");
 | 
				
			||||||
 | 
					        List<Map<String, String>> ret = new ArrayList<>();
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            LOG.debug(dhcpLeasedIpDbTable + "_" + apId + " initial monitor table state received {}",
 | 
				
			||||||
 | 
					                    tableUpdates);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
 | 
				
			||||||
 | 
					                for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (rowUpdate.getNew() != null) {
 | 
				
			||||||
 | 
					                        
 | 
				
			||||||
 | 
					                        Map<String, String> rowMap = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        rowUpdate.getNew().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        ret.add(rowMap);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            throw (e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    List<OpensyncAPInetState> getOpensyncApInetStateForRowUpdate(RowUpdate rowUpdate, String apId,
 | 
					    List<OpensyncAPInetState> getOpensyncApInetStateForRowUpdate(RowUpdate rowUpdate, String apId,
 | 
				
			||||||
            OvsdbClient ovsdbClient) {
 | 
					            OvsdbClient ovsdbClient) {
 | 
				
			||||||
        List<OpensyncAPInetState> ret = new ArrayList<>();
 | 
					        List<OpensyncAPInetState> ret = new ArrayList<>();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,11 @@ import com.telecominfraproject.wlan.profile.models.Profile;
 | 
				
			|||||||
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.StatusServiceInterface;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.equipment.report.models.WiredEthernetPortStatusData;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.equipment.report.models.WiredPortStatus;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.models.Status;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.models.StatusDataType;
 | 
				
			||||||
import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
					import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.Delete;
 | 
					import com.vmware.ovsdb.protocol.operation.Delete;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.Insert;
 | 
					import com.vmware.ovsdb.protocol.operation.Insert;
 | 
				
			||||||
@@ -48,6 +53,8 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private OvsdbGet ovsdbGet;
 | 
					    private OvsdbGet ovsdbGet;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private StatusServiceInterface statusServiceInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final String VLAN_IF_TYPE = "vlan";
 | 
					    private static final String VLAN_IF_TYPE = "vlan";
 | 
				
			||||||
    private static final String VLAN_TRUNK_IF_TYPE = "vlan_trunk";
 | 
					    private static final String VLAN_TRUNK_IF_TYPE = "vlan_trunk";
 | 
				
			||||||
@@ -172,6 +179,9 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private void handleEthernetPortConfiguration(OvsdbClient ovsdbClient, Set<WiredPort> desiredWiredPorts) {
 | 
						private void handleEthernetPortConfiguration(OvsdbClient ovsdbClient, Set<WiredPort> desiredWiredPorts) {
 | 
				
			||||||
 | 
					        // lists are for more than one lan port moving to wan ("eth0 eth1 eth2")
 | 
				
			||||||
 | 
					        Set<String> availableLanEthNames = new HashSet<>();
 | 
				
			||||||
 | 
					        Set<String> availableWanEthNames = new HashSet<>();
 | 
				
			||||||
        if (desiredWiredPorts == null) {
 | 
					        if (desiredWiredPorts == null) {
 | 
				
			||||||
            LOG.info("Cannot handle the EthernetPort config for null desired Wired Ports. Exiting");
 | 
					            LOG.info("Cannot handle the EthernetPort config for null desired Wired Ports. Exiting");
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -182,22 +192,35 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
 | 
				
			|||||||
            LOG.error("Cannot find the default wan port from the desired list of ports {}" , desiredWiredPorts);
 | 
					            LOG.error("Cannot find the default wan port from the desired list of ports {}" , desiredWiredPorts);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        for (WiredPort port: desiredWiredPorts) {
 | 
				
			||||||
 | 
					        	if (port.getIfName().contains(LAN_IF_NAME)) { // for AP has ifName lan1, lan2 instead of lan
 | 
				
			||||||
 | 
					        		availableLanEthNames.add(port.getName());
 | 
				
			||||||
 | 
					        	} else if (WAN_IF_NAME.equals(port.getIfName())) {
 | 
				
			||||||
 | 
					        		availableWanEthNames.add(port.getName());
 | 
				
			||||||
 | 
					        	}
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        for (WiredPort desiredPort : desiredWiredPorts) {
 | 
					        for (WiredPort desiredPort : desiredWiredPorts) {
 | 
				
			||||||
            if (!desiredPort.equals(wanPort)) {
 | 
					            if (!desiredPort.equals(wanPort)) {
 | 
				
			||||||
                if (isLanToBridgeConversion(desiredPort) && !desiredPort.isTrunkEnabled()) {
 | 
					                if (isLanToBridgeConversion(desiredPort) && !desiredPort.isTrunkEnabled()) {
 | 
				
			||||||
                    // Flow 1: Desired Bridge + Access
 | 
					                    // Flow 1: Desired Bridge + Access
 | 
				
			||||||
                    LOG.debug("Desired Config is Bridge with Access Mode");
 | 
					                    LOG.debug("Desired Config is Bridge with Access Mode");
 | 
				
			||||||
                    changeLanToWan(ovsdbClient, desiredPort, wanPort);
 | 
					                    availableLanEthNames.remove(desiredPort.getName());
 | 
				
			||||||
 | 
					                    availableWanEthNames.add(desiredPort.getName());
 | 
				
			||||||
 | 
					                    changeLanToWan(ovsdbClient, availableLanEthNames, availableWanEthNames, wanPort.getName());
 | 
				
			||||||
                    createVlanTag(ovsdbClient, desiredPort);
 | 
					                    createVlanTag(ovsdbClient, desiredPort);
 | 
				
			||||||
                } else if (isLanToBridgeConversion(desiredPort) && desiredPort.isTrunkEnabled()) {
 | 
					                } else if (isLanToBridgeConversion(desiredPort) && desiredPort.isTrunkEnabled()) {
 | 
				
			||||||
                    // Flow 2: Desired Bridge + Trunk
 | 
					                    // Flow 2: Desired Bridge + Trunk
 | 
				
			||||||
                    LOG.debug("Desired Config is Bridge with Trunk Mode");
 | 
					                    LOG.debug("Desired Config is Bridge with Trunk Mode");
 | 
				
			||||||
                    changeLanToWan(ovsdbClient, desiredPort, wanPort);
 | 
					                    availableLanEthNames.remove(desiredPort.getName());
 | 
				
			||||||
 | 
					                    availableWanEthNames.add(desiredPort.getName());
 | 
				
			||||||
 | 
					                    changeLanToWan(ovsdbClient, availableLanEthNames, availableWanEthNames, wanPort.getName());
 | 
				
			||||||
                    createTrunkInterface(ovsdbClient, desiredPort);
 | 
					                    createTrunkInterface(ovsdbClient, desiredPort);
 | 
				
			||||||
                } else if (!BRIDGE_IF_TYPE.equalsIgnoreCase(desiredPort.getIfType())) {
 | 
					                } else if (!BRIDGE_IF_TYPE.equalsIgnoreCase(desiredPort.getIfType())) {
 | 
				
			||||||
                    // Flow 3: Desired ifType is NAT
 | 
					                    // Flow 3: Desired ifType is NAT
 | 
				
			||||||
                    LOG.debug("Desired Config is NAT (LAN) mode. Desired Port {} may still be tagged to WAN interface. Convert to LAN mode", desiredPort.getIfName());
 | 
					                    LOG.debug("Desired Config is NAT (LAN) mode. Desired Port {} may still be tagged to WAN interface. Convert to LAN mode", desiredPort.getIfName());
 | 
				
			||||||
                    changeWanToLan(ovsdbClient, desiredPort, wanPort);
 | 
					                    availableLanEthNames.add(desiredPort.getName());
 | 
				
			||||||
 | 
					                    availableWanEthNames.remove(desiredPort.getName());
 | 
				
			||||||
 | 
					                    changeWanToLan(ovsdbClient, availableLanEthNames, availableWanEthNames, wanPort.getName());
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    LOG.info("Not a supported Config change requested for the port {}", desiredPort);
 | 
					                    LOG.info("Not a supported Config change requested for the port {}", desiredPort);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -228,17 +251,23 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
 | 
				
			|||||||
		return wanWiredPort;
 | 
							return wanWiredPort;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void changeLanToWan(OvsdbClient ovsdbClient, WiredPort desiredWiredPort, WiredPort wanPort) {
 | 
						void changeLanToWan(OvsdbClient ovsdbClient, Set<String> lanPortsToUpdate, Set<String> wanPortsToUpdate, String wanEthName) {
 | 
				
			||||||
        LOG.debug("Moving Port {} with current ifName {} to WAN", desiredWiredPort.getName(), desiredWiredPort.getIfName());
 | 
							LOG.debug("Calling changeLanToWan: moving port {} to LAN and {} to WAN", lanPortsToUpdate, wanPortsToUpdate);
 | 
				
			||||||
		List<Operation> operations = new ArrayList<>();
 | 
							List<Operation> operations = new ArrayList<>();
 | 
				
			||||||
		// Step1: remove lan from eth_ports
 | 
							// Step1: remove lan from eth_ports
 | 
				
			||||||
		// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:=" " -w if_name==lan
 | 
							// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:=" " -w if_name==lan
 | 
				
			||||||
		addEthPortsOperation(operations, SEPARATOR, LAN_IF_NAME);
 | 
							// or cases like: /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth2" -w if_name==lan
 | 
				
			||||||
 | 
							String lanPortsString = String.join(SEPARATOR,  lanPortsToUpdate);
 | 
				
			||||||
 | 
							addEthPortsOperation(operations, lanPortsString.equals("")? SEPARATOR : lanPortsString, LAN_IF_NAME);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// Step2: make lan to a wan port
 | 
							// Step2: make lan to a wan port
 | 
				
			||||||
		// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth0 eth1" -w if_name==wan
 | 
							// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth0 eth1" -w if_name==wan
 | 
				
			||||||
		// eth_ports syntax is set by AP (i.e, eth0 eth1)
 | 
							// eth_ports syntax is set by AP (i.e, eth0 eth1)
 | 
				
			||||||
		addEthPortsOperation(operations, desiredWiredPort.getName() + SEPARATOR + wanPort.getName(), WAN_IF_NAME);
 | 
					        // AP needs the original wan port be the first port in the string. Since we will hard code it, we remove
 | 
				
			||||||
 | 
					        // original wan name from the set to avoid duplication
 | 
				
			||||||
 | 
					        wanPortsToUpdate.remove(wanEthName);
 | 
				
			||||||
 | 
							// trim() is used when wanPortsToUpdate is empty (i.e. we want "eth0" instead of "eth0 ")
 | 
				
			||||||
 | 
							addEthPortsOperation(operations, (wanEthName + SEPARATOR + String.join(SEPARATOR,  wanPortsToUpdate)).trim(), WAN_IF_NAME);
 | 
				
			||||||
		sendOperationsToAP(ovsdbClient, operations, "changeLanToWan");
 | 
							sendOperationsToAP(ovsdbClient, operations, "changeLanToWan");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -315,15 +344,19 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
 | 
				
			|||||||
        return desiredWiredPort.getAllowedVlanIds().stream().map(String::valueOf).collect(Collectors.joining(SEPARATOR));
 | 
					        return desiredWiredPort.getAllowedVlanIds().stream().map(String::valueOf).collect(Collectors.joining(SEPARATOR));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void changeWanToLan(OvsdbClient ovsdbClient, WiredPort desiredWiredPort, WiredPort wanPort) {
 | 
						void changeWanToLan(OvsdbClient ovsdbClient, Set<String> lanPortsToUpdate, Set<String> wanPortsToUpdate, String wanEthName) {
 | 
				
			||||||
 | 
							LOG.debug("Calling changeWanToLan: Moving port {} to LAN and {} to WAN", lanPortsToUpdate, wanPortsToUpdate);
 | 
				
			||||||
		// Step1: set the correct port to lan
 | 
							// Step1: set the correct port to lan
 | 
				
			||||||
		// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth0" -w if_name==lan
 | 
							// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth0" -w if_name==lan
 | 
				
			||||||
		List<Operation> operations = new ArrayList<>();
 | 
							List<Operation> operations = new ArrayList<>();
 | 
				
			||||||
		addEthPortsOperation(operations, desiredWiredPort.getName(), LAN_IF_NAME);
 | 
							addEthPortsOperation(operations, String.join(SEPARATOR,  lanPortsToUpdate), LAN_IF_NAME);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Step2: set the correct port to wan
 | 
							// Step2: set the correct port to wan
 | 
				
			||||||
		// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth1" -w if_name==wan
 | 
							// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth1" -w if_name==wan
 | 
				
			||||||
		addEthPortsOperation(operations, wanPort.getName(), WAN_IF_NAME);
 | 
					        // AP needs the original wan port be the first port in the string. Since we will hard code it, we remove
 | 
				
			||||||
 | 
					        // original wan name from the set to avoid duplication
 | 
				
			||||||
 | 
							wanPortsToUpdate.remove(wanEthName);
 | 
				
			||||||
 | 
							addEthPortsOperation(operations, (wanEthName + SEPARATOR + String.join(SEPARATOR,  wanPortsToUpdate)).trim(), WAN_IF_NAME);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sendOperationsToAP(ovsdbClient, operations, "changeWanToLan");
 | 
							sendOperationsToAP(ovsdbClient, operations, "changeWanToLan");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -543,4 +576,56 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
 | 
				
			|||||||
            throw new RuntimeException(e);
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
						// Reset all LAN ports from WAN back to LAN (NAT mode)
 | 
				
			||||||
 | 
						void resetWiredPorts(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
 | 
				
			||||||
 | 
							LOG.debug("Calling resetWiredPorts");
 | 
				
			||||||
 | 
							// e.g. eth1
 | 
				
			||||||
 | 
							Map<String, List<WiredPortStatus>> interfacePortStatusMap = getInterfacePortStatus(
 | 
				
			||||||
 | 
									opensyncApConfig.getCustomerEquipment().getCustomerId(),
 | 
				
			||||||
 | 
									opensyncApConfig.getCustomerEquipment().getId());
 | 
				
			||||||
 | 
							if (interfacePortStatusMap == null) {
 | 
				
			||||||
 | 
								LOG.info("No InterfacePort(EthernetPort) Status. Exiting");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							List<WiredPortStatus> wanPortStatusList = interfacePortStatusMap.get(WAN_IF_NAME);
 | 
				
			||||||
 | 
							if (wanPortStatusList == null) {
 | 
				
			||||||
 | 
								LOG.info("No wan interface status available. Exiting");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							WiredPortStatus originalWanPortStatus = wanPortStatusList.stream()
 | 
				
			||||||
 | 
									.filter(wan -> WAN_IF_NAME.equals(wan.getOriginalIfName())).findFirst().orElse(null);
 | 
				
			||||||
 | 
							if (originalWanPortStatus == null) {
 | 
				
			||||||
 | 
								LOG.info("No original wan port available. Exiting");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							String wanEthName = originalWanPortStatus.getName();
 | 
				
			||||||
 | 
							Set<String> lanEthNames = new HashSet<>();
 | 
				
			||||||
 | 
							for (WiredPortStatus wanPortStatus : wanPortStatusList) {
 | 
				
			||||||
 | 
								if (wanPortStatus.getOriginalIfName().contains(LAN_IF_NAME)) {
 | 
				
			||||||
 | 
									lanEthNames.add(wanPortStatus.getName());
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (!lanEthNames.isEmpty()) {
 | 
				
			||||||
 | 
					            Set<String> wanEthNameSet = new HashSet<String>();
 | 
				
			||||||
 | 
					            wanEthNameSet.add(wanEthName);
 | 
				
			||||||
 | 
					            changeWanToLan(ovsdbClient, lanEthNames, wanEthNameSet, wanEthName);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private Map<String, List<WiredPortStatus>> getInterfacePortStatus(int customerId, long equipmentId) {
 | 
				
			||||||
 | 
							Map<String, List<WiredPortStatus>> interfacePortStatus = null;
 | 
				
			||||||
 | 
							// Getting the status from the current AP
 | 
				
			||||||
 | 
							Status existingPortStatus = statusServiceInterface.getOrNull(customerId, equipmentId,
 | 
				
			||||||
 | 
									StatusDataType.WIRED_ETHERNET_PORT);
 | 
				
			||||||
 | 
							if (existingPortStatus != null && existingPortStatus.getDetails() instanceof WiredEthernetPortStatusData) {
 | 
				
			||||||
 | 
								interfacePortStatus = ((WiredEthernetPortStatusData) existingPortStatus.getDetails())
 | 
				
			||||||
 | 
										.getInterfacePortStatusMap();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (interfacePortStatus == null || interfacePortStatus.isEmpty()) {
 | 
				
			||||||
 | 
								LOG.info("No ethernetPortStatus found for customer {}, equipment {}", customerId, equipmentId);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return interfacePortStatus;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,10 @@ import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Component
 | 
					@Component
 | 
				
			||||||
public class OvsdbNode extends OvsdbDaoBase {
 | 
					public class OvsdbNode extends OvsdbDaoBase {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@org.springframework.beans.factory.annotation.Value("${tip.wlan.internalHostName:localhost}") 
 | 
				
			||||||
 | 
					    private String internalHostName;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
    String changeRedirectorAddress(OvsdbClient ovsdbClient, String apId, String newRedirectorAddress) {
 | 
					    String changeRedirectorAddress(OvsdbClient ovsdbClient, String apId, String newRedirectorAddress) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            List<Operation> operations = new ArrayList<>();
 | 
					            List<Operation> operations = new ArrayList<>();
 | 
				
			||||||
@@ -380,7 +384,7 @@ public class OvsdbNode extends OvsdbDaoBase {
 | 
				
			|||||||
            Map<String, String> newMqttSettings = new HashMap<>();
 | 
					            Map<String, String> newMqttSettings = new HashMap<>();
 | 
				
			||||||
            newMqttSettings.put("broker", mqttBrokerAddress);
 | 
					            newMqttSettings.put("broker", mqttBrokerAddress);
 | 
				
			||||||
            String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired(clientCn, incomingConnectNodeInfo, preventCnAlteration);
 | 
					            String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired(clientCn, incomingConnectNodeInfo, preventCnAlteration);
 | 
				
			||||||
            newMqttSettings.put("topics", "/ap/" + mqttClientName + "/opensync");
 | 
					            newMqttSettings.put("topics", "/ap/opensync_mqtt_" + internalHostName + "/" + mqttClientName + "/opensync");
 | 
				
			||||||
            newMqttSettings.put("port", "" + mqttBrokerExternalPort);
 | 
					            newMqttSettings.put("port", "" + mqttBrokerExternalPort);
 | 
				
			||||||
            newMqttSettings.put("compress", "zlib");
 | 
					            newMqttSettings.put("compress", "zlib");
 | 
				
			||||||
            newMqttSettings.put("qos", "0");
 | 
					            newMqttSettings.put("qos", "0");
 | 
				
			||||||
@@ -417,4 +421,96 @@ public class OvsdbNode extends OvsdbDaoBase {
 | 
				
			|||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public long getConfigVersionFromNode(OvsdbClient ovsdbClient) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        long ret = 0;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        Map<String, String> versionMatrix = getVersionMatrixFromNode(ovsdbClient);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            ret = Long.parseLong(versionMatrix.get(ConnectNodeInfo.CONFIG_VERSION_PROPERTY_NAME));
 | 
				
			||||||
 | 
					        } catch(Exception e) {
 | 
				
			||||||
 | 
					            //do nothing
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        LOG.debug("getConfigVersionFromNode {}", ret);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Map<String, String> getVersionMatrixFromNode(OvsdbClient ovsdbClient) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        Map<String, String> ret = new HashMap<>();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            List<Operation> operations = new ArrayList<>();
 | 
				
			||||||
 | 
					            List<Condition> conditions = new ArrayList<>();
 | 
				
			||||||
 | 
					            List<String> columns = new ArrayList<>();
 | 
				
			||||||
 | 
					            columns.add("version_matrix");
 | 
				
			||||||
 | 
					            columns.add("id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            operations.add(new Select(awlanNodeDbTable, conditions, columns));
 | 
				
			||||||
 | 
					            CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
 | 
				
			||||||
 | 
					            OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (LOG.isDebugEnabled()) {
 | 
				
			||||||
 | 
					                LOG.debug("Select from {}:", awlanNodeDbTable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (OperationResult res : result) {
 | 
				
			||||||
 | 
					                    LOG.debug("Op Result {}", res);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Row row = null;
 | 
				
			||||||
 | 
					            if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult) && !((SelectResult) result[0]).getRows().isEmpty()) {
 | 
				
			||||||
 | 
					                row = ((SelectResult) result[0]).getRows().iterator().next();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if( row != null ) {
 | 
				
			||||||
 | 
					                ret = row.getMapColumn("version_matrix");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        LOG.debug("getVersionMatrixFromNode {}", ret);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public void updateConfigVersionInNode(OvsdbClient ovsdbClient, long configVersionFromProfiles) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            //get original version_matrix map value
 | 
				
			||||||
 | 
					            Map<String, String> versionMatrix = getVersionMatrixFromNode(ovsdbClient);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update our config version in version_matrix map
 | 
				
			||||||
 | 
					            versionMatrix.put(ConnectNodeInfo.CONFIG_VERSION_PROPERTY_NAME, Long.toString(configVersionFromProfiles));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //update the version_matrix column
 | 
				
			||||||
 | 
					            List<Operation> operations = new ArrayList<>();
 | 
				
			||||||
 | 
					            Map<String, Value> updateColumns = new HashMap<>();
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            @SuppressWarnings("unchecked")
 | 
				
			||||||
 | 
					            com.vmware.ovsdb.protocol.operation.notation.Map<String, String> ovsdbVersionMatrix =
 | 
				
			||||||
 | 
					                    com.vmware.ovsdb.protocol.operation.notation.Map.of(versionMatrix);
 | 
				
			||||||
 | 
					            updateColumns.put("version_matrix", ovsdbVersionMatrix);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Row row = new Row(updateColumns);
 | 
				
			||||||
 | 
					            operations.add(new Update(awlanNodeDbTable, row));
 | 
				
			||||||
 | 
					            CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
 | 
				
			||||||
 | 
					            OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (OperationResult r : result) {
 | 
				
			||||||
 | 
					                LOG.debug("Op Result {}", r);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					            LOG.debug("updateConfigVersionInNode {}", configVersionFromProfiles);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException  e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
 | 
					package com.telecominfraproject.wlan.opensync.ovsdb.dao;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Arrays;
 | 
				
			||||||
import java.util.HashMap;
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
@@ -13,8 +14,8 @@ import java.util.concurrent.TimeoutException;
 | 
				
			|||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.stereotype.Component;
 | 
					import org.springframework.stereotype.Component;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.telecominfraproject.wlan.core.model.equipment.LedStatus;
 | 
					 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
 | 
					import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiVifConfigInfo;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
				
			||||||
import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
					import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.Delete;
 | 
					import com.vmware.ovsdb.protocol.operation.Delete;
 | 
				
			||||||
@@ -26,6 +27,7 @@ import com.vmware.ovsdb.protocol.operation.notation.Condition;
 | 
				
			|||||||
import com.vmware.ovsdb.protocol.operation.notation.Function;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Function;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.notation.Row;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Row;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.notation.Value;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Value;
 | 
				
			||||||
 | 
					import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.result.InsertResult;
 | 
					import com.vmware.ovsdb.protocol.operation.result.InsertResult;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
					import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
 | 
					import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
 | 
				
			||||||
@@ -145,8 +147,24 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
 | 
				
			|||||||
					List.of(new Condition("module", Function.EQUALS, new Atom<>("led"))), new Row(columns)));
 | 
										List.of(new Condition("module", Function.EQUALS, new Atom<>("led"))), new Row(columns)));
 | 
				
			||||||
			CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
 | 
								CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
 | 
				
			||||||
			OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
 | 
								OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
 | 
				
			||||||
 | 
								long numUpdates = 0;
 | 
				
			||||||
			for (OperationResult res : result) {
 | 
								for (OperationResult res : result) {
 | 
				
			||||||
				LOG.debug("processLedControlEnabled result {}", res);
 | 
									if (res instanceof UpdateResult) {
 | 
				
			||||||
 | 
										numUpdates += ((UpdateResult) res).getCount();
 | 
				
			||||||
 | 
										LOG.debug("processLedControlEnabled update result {}", res);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (numUpdates == 0) {
 | 
				
			||||||
 | 
									// no records existed, insert the row instead
 | 
				
			||||||
 | 
									operations.clear();
 | 
				
			||||||
 | 
									operations.add(new Insert(nodeConfigTable, new Row(columns)));
 | 
				
			||||||
 | 
									fResult = ovsdbClient.transact(ovsdbName, operations);
 | 
				
			||||||
 | 
									result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
 | 
				
			||||||
 | 
									for (OperationResult res : result) {
 | 
				
			||||||
 | 
										if (res instanceof InsertResult) {
 | 
				
			||||||
 | 
											LOG.debug("processLedControlEnabled insert result {}", res);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
 | 
							} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
 | 
				
			||||||
			throw new RuntimeException(e);
 | 
								throw new RuntimeException(e);
 | 
				
			||||||
@@ -199,4 +217,31 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
 | 
				
			|||||||
            throw new RuntimeException(e);
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
						   
 | 
				
			||||||
 | 
					    public void configureDynamicRadiusProxyToAPC(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        ApNetworkConfiguration apNetworkConfig = (ApNetworkConfiguration) opensyncAPConfig.getApProfile()
 | 
				
			||||||
 | 
					                .getDetails();
 | 
				
			||||||
 | 
					        if (apNetworkConfig.isDynamicRadiusProxyEnabled() == null) {
 | 
				
			||||||
 | 
					            LOG.info("Cannot configure isDynamicRadiusProxyEnabled to null value. {}", apNetworkConfig);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        Boolean isApcEnabled = apNetworkConfig.isDynamicRadiusProxyEnabled();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(apcConfigDbTable)) {
 | 
				
			||||||
 | 
					                Map<String, Value> columns = new HashMap<>();
 | 
				
			||||||
 | 
					                columns.put("enabled", new Atom<>(isApcEnabled));
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                List<Operation> operations = new ArrayList<>();
 | 
				
			||||||
 | 
					                operations.add(new Update(apcConfigDbTable, new Row(columns)));
 | 
				
			||||||
 | 
					                CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
 | 
				
			||||||
 | 
					                OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
 | 
				
			||||||
 | 
					                LOG.debug("configureDynamicRadiusProxyToAPC result {} ", Arrays.toString(result));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (InterruptedException | ExecutionException | OvsdbClientException | TimeoutException e) {
 | 
				
			||||||
 | 
					            LOG.error("Unable to configureDynamicRadiusProxyToAPC on AP.", e);
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,6 @@ import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
				
			|||||||
import com.vmware.ovsdb.protocol.operation.Delete;
 | 
					import com.vmware.ovsdb.protocol.operation.Delete;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.Insert;
 | 
					import com.vmware.ovsdb.protocol.operation.Insert;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.Operation;
 | 
					import com.vmware.ovsdb.protocol.operation.Operation;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.Update;
 | 
					 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.notation.Atom;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Atom;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.notation.Row;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Row;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.notation.Set;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Set;
 | 
				
			||||||
@@ -37,24 +36,6 @@ public class OvsdbRadiusProxyConfig extends OvsdbDaoBase {
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    OvsdbGet getProvisionedData;
 | 
					    OvsdbGet getProvisionedData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void configureApc(OvsdbClient ovsdbClient, Boolean enable, List<Operation> operations) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(apcConfigDbTable)) {
 | 
					 | 
				
			||||||
                Map<String, Value> updateColumns = new HashMap<>();
 | 
					 | 
				
			||||||
                updateColumns.put("enabled", new Atom<>(enable));
 | 
					 | 
				
			||||||
                Row row = new Row(updateColumns);
 | 
					 | 
				
			||||||
                Update update = new Update(apcConfigDbTable, row);
 | 
					 | 
				
			||||||
                if (!operations.contains(update)) {
 | 
					 | 
				
			||||||
                    // only need to do 1 update of this kind
 | 
					 | 
				
			||||||
                    operations.add(new Update(apcConfigDbTable, row));
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } catch (InterruptedException | ExecutionException | OvsdbClientException e) {
 | 
					 | 
				
			||||||
            LOG.error("Exception getting schema for ovsdb.", e);
 | 
					 | 
				
			||||||
            throw new RuntimeException(e);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void configureRadius(OvsdbClient ovsdbClient, OpensyncAPConfig apConfig) {
 | 
					    void configureRadius(OvsdbClient ovsdbClient, OpensyncAPConfig apConfig) {
 | 
				
			||||||
        List<Operation> operations = new ArrayList<>();
 | 
					        List<Operation> operations = new ArrayList<>();
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
@@ -118,11 +99,14 @@ public class OvsdbRadiusProxyConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                updateColumns.put("acct_server", new Atom<>(rsc.getAcctServer().getHostAddress()));
 | 
					                updateColumns.put("acct_server", new Atom<>(rsc.getAcctServer().getHostAddress()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (rsc.getSharedSecret() != null) {
 | 
					            if (rsc.getSharedSecret() != null) {
 | 
				
			||||||
                updateColumns.put("acct_secret", new Atom<>(rsc.getSharedSecret()));
 | 
					                updateColumns.put("acct_secret", new Atom<>(rsc.getAcctSharedSecret()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (rsc.getAcctPort() != null) {
 | 
					            if (rsc.getAcctPort() != null) {
 | 
				
			||||||
                updateColumns.put("acct_port", new Atom<>(rsc.getAcctPort()));
 | 
					                updateColumns.put("acct_port", new Atom<>(rsc.getAcctPort()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (rsc.getRadiusProxySecret() != null) {
 | 
				
			||||||
 | 
					                updateColumns.put("proxy_secret", new Atom<>(rsc.getRadiusProxySecret()));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if (databaseSchema.getTables().get(radiusConfigDbTable).getColumns().containsKey("auto_discover")) {
 | 
					            if (databaseSchema.getTables().get(radiusConfigDbTable).getColumns().containsKey("auto_discover")) {
 | 
				
			||||||
                if (rsc.getUseRadSec() != null && rsc.getUseRadSec() && rsc.getDynamicDiscovery() != null &&  rsc.getDynamicDiscovery()) {
 | 
					                if (rsc.getUseRadSec() != null && rsc.getUseRadSec() && rsc.getDynamicDiscovery() != null &&  rsc.getDynamicDiscovery()) {
 | 
				
			||||||
                    // if useRadSec && dynamicDiscovery enabled, do not send server information
 | 
					                    // if useRadSec && dynamicDiscovery enabled, do not send server information
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@ import com.telecominfraproject.wlan.profile.models.common.FileType;
 | 
				
			|||||||
import com.telecominfraproject.wlan.profile.models.common.ManagedFileInfo;
 | 
					import com.telecominfraproject.wlan.profile.models.common.ManagedFileInfo;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.profile.network.models.RadiusProxyConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile;
 | 
					import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.radius.models.RadiusServer;
 | 
					import com.telecominfraproject.wlan.profile.radius.models.RadiusServer;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
 | 
				
			||||||
@@ -59,8 +60,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
    OvsdbNetworkConfig networkConfig;
 | 
					    OvsdbNetworkConfig networkConfig;
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    OvsdbNode ovsdbNode;
 | 
					    OvsdbNode ovsdbNode;
 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    OvsdbRadiusProxyConfig radsecConfig;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected void getEnabledRadios(OvsdbClient ovsdbClient, List<RadioType> radios) {
 | 
					    protected void getEnabledRadios(OvsdbClient ovsdbClient, List<RadioType> radios) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
@@ -491,6 +490,11 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
 | 
					                boolean useRadiusProxy = false;
 | 
				
			||||||
 | 
					                if (ssidConfig.getUseRadiusProxy() != null) {
 | 
				
			||||||
 | 
					                    useRadiusProxy = ssidConfig.getUseRadiusProxy();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Map<String, String> security = new HashMap<>();
 | 
					                Map<String, String> security = new HashMap<>();
 | 
				
			||||||
                String ssidSecurityMode = ssidConfig.getSecureMode().name();
 | 
					                String ssidSecurityMode = ssidConfig.getSecureMode().name();
 | 
				
			||||||
                String opensyncSecurityMode = "OPEN";
 | 
					                String opensyncSecurityMode = "OPEN";
 | 
				
			||||||
@@ -500,7 +504,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                String radiusOperName = null;
 | 
					                String radiusOperName = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                opensyncSecurityMode = getOpensyncSecurityMode(ssidSecurityMode, opensyncSecurityMode);
 | 
					                opensyncSecurityMode = getOpensyncSecurityMode(ssidSecurityMode, opensyncSecurityMode);
 | 
				
			||||||
                populateSecurityMap(opensyncApConfig, ssidConfig, security, ssidSecurityMode, opensyncSecurityMode);
 | 
					                populateSecurityMap(opensyncApConfig, ssidConfig, useRadiusProxy, security, ssidSecurityMode, opensyncSecurityMode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                int dynamicVlan = 0;
 | 
					                int dynamicVlan = 0;
 | 
				
			||||||
                if (opensyncSecurityMode.endsWith("EAP")) {
 | 
					                if (opensyncSecurityMode.endsWith("EAP")) {
 | 
				
			||||||
@@ -548,10 +552,16 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                    interfacesPerFreqBand.put(freqBand, 1);
 | 
					                    interfacesPerFreqBand.put(freqBand, 1);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                boolean useRadiusProxy = false;
 | 
					                if (useRadiusProxy) {
 | 
				
			||||||
                if (ssidConfig.getUseRadiusProxy() != null) {
 | 
					                    // AP requires proxy secret in security during auto radius proxy
 | 
				
			||||||
                    useRadiusProxy = ssidConfig.getUseRadiusProxy();
 | 
					                    for (RadiusProxyConfiguration rsc : ((ApNetworkConfiguration) opensyncApConfig.getApProfile().getDetails()).getRadiusProxyConfigurations()) {
 | 
				
			||||||
 | 
					                        if (rsc.getRadiusProxySecret() != null) {
 | 
				
			||||||
 | 
					                            security.put("radius_server_secret", rsc.getRadiusProxySecret());
 | 
				
			||||||
 | 
					                            security.put("radius_acct_secret", rsc.getRadiusProxySecret());
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
                boolean enableProxyArpForHotspot = false;
 | 
					                boolean enableProxyArpForHotspot = false;
 | 
				
			||||||
                if (ssidConfig.getEnableProxyArpForHotspot() != null) {
 | 
					                if (ssidConfig.getEnableProxyArpForHotspot() != null) {
 | 
				
			||||||
                    enableProxyArpForHotspot = ssidConfig.getEnableProxyArpForHotspot();
 | 
					                    enableProxyArpForHotspot = ssidConfig.getEnableProxyArpForHotspot();
 | 
				
			||||||
@@ -564,11 +574,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    networkConfig.configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode(), operations);
 | 
					                    networkConfig.configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode(), operations);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (useRadiusProxy) {
 | 
					 | 
				
			||||||
                        // make sure it's enabled if we are going to use it
 | 
					 | 
				
			||||||
                        radsecConfig.configureApc(ovsdbClient, useRadiusProxy, operations);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                } catch (IllegalStateException e) {
 | 
					                } catch (IllegalStateException e) {
 | 
				
			||||||
                    // could not provision this SSID, but still can go on
 | 
					                    // could not provision this SSID, but still can go on
 | 
				
			||||||
                    LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand);
 | 
					                    LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand);
 | 
				
			||||||
@@ -780,11 +785,11 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
        if (radiusProfileList.size() > 0) {
 | 
					        if (radiusProfileList.size() > 0) {
 | 
				
			||||||
            Profile profileRadius = radiusProfileList.get(0);
 | 
					            Profile profileRadius = radiusProfileList.get(0);
 | 
				
			||||||
            RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails());
 | 
					            RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails());
 | 
				
			||||||
            RadiusServer rServer = profileDetails.getPrimaryRadiusAccountingServer();
 | 
					            RadiusServer radiusAcctServerPrimary = profileDetails.getPrimaryRadiusAccountingServer();
 | 
				
			||||||
            if (rServer != null) {
 | 
					            if (radiusAcctServerPrimary != null) {
 | 
				
			||||||
                security.put("radius_acct_ip", rServer.getIpAddress() != null ? rServer.getIpAddress().getHostAddress() : null);
 | 
					                security.put("radius_acct_ip", radiusAcctServerPrimary.getIpAddress() != null ? radiusAcctServerPrimary.getIpAddress().getHostAddress() : null);
 | 
				
			||||||
                security.put("radius_acct_port", rServer.getPort() != null ? String.valueOf(rServer.getPort()) : null);
 | 
					                security.put("radius_acct_port", radiusAcctServerPrimary.getPort() != null ? String.valueOf(radiusAcctServerPrimary.getPort()) : null);
 | 
				
			||||||
                security.put("radius_acct_secret", rServer.getSecret());
 | 
					                security.put("radius_acct_secret", radiusAcctServerPrimary.getSecret());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (ssidConfig.getRadiusAcountingServiceInterval() != null && ssidConfig.getRadiusAcountingServiceInterval() > 0) {
 | 
					                if (ssidConfig.getRadiusAcountingServiceInterval() != null && ssidConfig.getRadiusAcountingServiceInterval() > 0) {
 | 
				
			||||||
                    // if the value is present, use the
 | 
					                    // if the value is present, use the
 | 
				
			||||||
@@ -792,11 +797,23 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                    security.put("radius_acct_interval", ssidConfig.getRadiusAcountingServiceInterval().toString());
 | 
					                    security.put("radius_acct_interval", ssidConfig.getRadiusAcountingServiceInterval().toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                LOG.info("set Radius Accounting server attributes radius_acct_ip {} radius_acct_port {} radius_acct_secret {} radius_acct_interval {}",
 | 
					                LOG.info("Set Primary Radius Accounting server attributes radius_acct_ip {} radius_acct_port {} radius_acct_secret {} radius_acct_interval {}",
 | 
				
			||||||
                        security.get("radius_acct_ip"), security.get("radius_acct_port"), security.get("radius_acct_secret"),
 | 
					                        security.get("radius_acct_ip"), security.get("radius_acct_port"), security.get("radius_acct_secret"),
 | 
				
			||||||
                        security.get("radius_acct_interval"));
 | 
					                        security.get("radius_acct_interval"));
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                LOG.info("No Radius Accounting Server defined in Radius Profile");
 | 
					                LOG.info("No Primary Radius Accounting Server defined in Radius Profile");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            RadiusServer radiusAcctServerSecondary = profileDetails.getSecondaryRadiusAccountingServer();
 | 
				
			||||||
 | 
					            if (radiusAcctServerSecondary != null) {
 | 
				
			||||||
 | 
					                security.put("radius_acct_ip_secondary", radiusAcctServerSecondary.getIpAddress() != null ? radiusAcctServerSecondary.getIpAddress().getHostAddress() : null);
 | 
				
			||||||
 | 
					                security.put("radius_acct_port_secondary", radiusAcctServerSecondary.getPort() != null ? String.valueOf(radiusAcctServerSecondary.getPort()) : null);
 | 
				
			||||||
 | 
					                security.put("radius_acct_secret_secondary", radiusAcctServerSecondary.getSecret());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                LOG.info("Set Secondary Radius Accounting server attributes radius_acct_ip_secondary {} radius_acct_port_secondary {} radius_acct_secret_secondary {}",
 | 
				
			||||||
 | 
					                        security.get("radius_acct_ip_secondary"), security.get("radius_acct_port_secondary"), security.get("radius_acct_secret_secondary"));
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                LOG.info("No Secondary Radius Accounting Server defined in Radius Profile");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@@ -821,8 +838,19 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
            security.put("radius_server_ip", radiusServer.getIpAddress() != null ? radiusServer.getIpAddress().getHostAddress() : null);
 | 
					            security.put("radius_server_ip", radiusServer.getIpAddress() != null ? radiusServer.getIpAddress().getHostAddress() : null);
 | 
				
			||||||
            security.put("radius_server_port", radiusServer.getPort() != null ? String.valueOf(radiusServer.getPort()) : null);
 | 
					            security.put("radius_server_port", radiusServer.getPort() != null ? String.valueOf(radiusServer.getPort()) : null);
 | 
				
			||||||
            security.put("radius_server_secret", radiusServer.getSecret());           
 | 
					            security.put("radius_server_secret", radiusServer.getSecret());           
 | 
				
			||||||
            LOG.info("set Radius server attributes radius_server_ip {} radius_server_port {} radius_server_secret {}", security.get("radius_server_ip"),
 | 
					            LOG.info("Set Primary Radius server attributes radius_server_ip {} radius_server_port {} radius_server_secret {}", security.get("radius_server_ip"),
 | 
				
			||||||
                    security.get("radius_server_port"), security.get("radius_server_secret"));
 | 
					                    security.get("radius_server_port"), security.get("radius_server_secret"));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            RadiusServer radiusServerSecondary = profileDetails.getSecondaryRadiusAuthServer();
 | 
				
			||||||
 | 
					            if (radiusServerSecondary != null) {
 | 
				
			||||||
 | 
					                security.put("radius_server_ip_secondary", radiusServerSecondary.getIpAddress() != null ? radiusServerSecondary.getIpAddress().getHostAddress() : null);
 | 
				
			||||||
 | 
					                security.put("radius_server_port_secondary", radiusServerSecondary.getPort() != null ? String.valueOf(radiusServerSecondary.getPort()) : null);
 | 
				
			||||||
 | 
					                security.put("radius_server_secret_secondary", radiusServerSecondary.getSecret());           
 | 
				
			||||||
 | 
					                LOG.info("Set Secondary Radius server attributes radius_server_ip_secondary {} radius_server_port_secondary {} radius_server_secret_secondary {}", 
 | 
				
			||||||
 | 
					                        security.get("radius_server_ip_secondary"), security.get("radius_server_port_secondary"), security.get("radius_server_secret_secondary"));
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                LOG.info("No Secondary Radius Authentication Server defined in Radius Profile");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(), opensyncApConfig.getRadiusProfiles());
 | 
					            LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(), opensyncApConfig.getRadiusProfiles());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -838,7 +866,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
     * @param ssidSecurityMode
 | 
					     * @param ssidSecurityMode
 | 
				
			||||||
     * @param opensyncSecurityMode
 | 
					     * @param opensyncSecurityMode
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<String, String> security, String ssidSecurityMode,
 | 
					    void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Boolean useRadiusProxy, Map<String, String> security, String ssidSecurityMode,
 | 
				
			||||||
            String opensyncSecurityMode) {
 | 
					            String opensyncSecurityMode) {
 | 
				
			||||||
        security.put("encryption", opensyncSecurityMode);
 | 
					        security.put("encryption", opensyncSecurityMode);
 | 
				
			||||||
        // key and mode is N/A for OPEN security
 | 
					        // key and mode is N/A for OPEN security
 | 
				
			||||||
@@ -865,21 +893,21 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                case "wpa2OnlyEAP":
 | 
					                case "wpa2OnlyEAP":
 | 
				
			||||||
                case "wpa2OnlyRadius":
 | 
					                case "wpa2OnlyRadius":
 | 
				
			||||||
                    security.put("mode", "2");
 | 
					                    security.put("mode", "2");
 | 
				
			||||||
                    if (!ssidConfig.getUseRadiusProxy()) {
 | 
					                    if (!useRadiusProxy) {
 | 
				
			||||||
                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case "wpa3OnlyEAP":
 | 
					                case "wpa3OnlyEAP":
 | 
				
			||||||
                    security.put("mode", "3");
 | 
					                    security.put("mode", "3");
 | 
				
			||||||
                    if (!ssidConfig.getUseRadiusProxy()) {
 | 
					                    if (!useRadiusProxy) {
 | 
				
			||||||
                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case "wpa3OnlyEAP192":
 | 
					                case "wpa3OnlyEAP192":
 | 
				
			||||||
                    security.put("mode", "3");
 | 
					                    security.put("mode", "3");
 | 
				
			||||||
                    if (!ssidConfig.getUseRadiusProxy()) {
 | 
					                    if (!useRadiusProxy) {
 | 
				
			||||||
                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -888,7 +916,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                case "wpa2Radius":
 | 
					                case "wpa2Radius":
 | 
				
			||||||
                case "wpa3MixedEAP":
 | 
					                case "wpa3MixedEAP":
 | 
				
			||||||
                    security.put("mode", "mixed");
 | 
					                    security.put("mode", "mixed");
 | 
				
			||||||
                    if (!ssidConfig.getUseRadiusProxy()) {
 | 
					                    if (!useRadiusProxy) {
 | 
				
			||||||
                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -896,7 +924,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
 | 
				
			|||||||
                case "wpaEAP":
 | 
					                case "wpaEAP":
 | 
				
			||||||
                case "wpaRadius":
 | 
					                case "wpaRadius":
 | 
				
			||||||
                    security.put("mode", "1");
 | 
					                    security.put("mode", "1");
 | 
				
			||||||
                    if (!ssidConfig.getUseRadiusProxy()) {
 | 
					                    if (!useRadiusProxy) {
 | 
				
			||||||
                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
					                        getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,10 @@ public class OvsdbClientWithMetrics implements OvsdbClient {
 | 
				
			|||||||
        this.metrics = metrics;
 | 
					        this.metrics = metrics;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    public OvsdbClient getDelegate() {
 | 
				
			||||||
 | 
					        return delegate;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CompletableFuture<String[]> listDatabases() throws OvsdbClientException {
 | 
					    public CompletableFuture<String[]> listDatabases() throws OvsdbClientException {
 | 
				
			||||||
        metrics.listDatabases.increment();
 | 
					        metrics.listDatabases.increment();
 | 
				
			||||||
        return delegate.listDatabases();
 | 
					        return delegate.listDatabases();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					package com.telecominfraproject.wlan.opensync.util;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.lang.reflect.Field;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbClientWithMetrics;
 | 
				
			||||||
 | 
					import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			||||||
 | 
					import com.vmware.ovsdb.service.impl.OvsdbClientImpl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.netty.channel.Channel;
 | 
				
			||||||
 | 
					import io.netty.util.AttributeKey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Uses reflection to associate routingId with low-level netty channel.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author dtop
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class OvsdbClientUtil {
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public static final AttributeKey<String> routingRecordIdAttrKey = AttributeKey.valueOf("routingRecordId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void setRoutingId(OvsdbClient ovsdbClient, long routingId) {
 | 
				
			||||||
 | 
					        Channel channel = getChannel(ovsdbClient);
 | 
				
			||||||
 | 
					        channel.attr(routingRecordIdAttrKey).set(Long.toString(routingId));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static Long getRoutingId(OvsdbClient ovsdbClient) {
 | 
				
			||||||
 | 
					        Channel channel = getChannel(ovsdbClient);
 | 
				
			||||||
 | 
					        String strVal = channel.attr(routingRecordIdAttrKey).get();
 | 
				
			||||||
 | 
					        return strVal==null?null:Long.parseLong(strVal);        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private static Channel getChannel(OvsdbClient ovsdbClient) {
 | 
				
			||||||
 | 
					        if(ovsdbClient instanceof OvsdbClientWithMetrics) {
 | 
				
			||||||
 | 
					            //unwrap the object, if needed
 | 
				
			||||||
 | 
					            ovsdbClient = ((OvsdbClientWithMetrics) ovsdbClient).getDelegate();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if(! (ovsdbClient instanceof OvsdbClientImpl)) {
 | 
				
			||||||
 | 
					            throw new RuntimeException("Do not know how to handle "+ ovsdbClient.getClass().getName()+" - expected OvsdbClientImpl");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Field jsonRpcClientField = ovsdbClient.getClass().getDeclaredField("jsonRpcClient");
 | 
				
			||||||
 | 
					            jsonRpcClientField.setAccessible(true);
 | 
				
			||||||
 | 
					            Object jsonRpcClientObj = jsonRpcClientField.get(ovsdbClient);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Field transporterField = jsonRpcClientObj.getClass().getDeclaredField("transporter");
 | 
				
			||||||
 | 
					            transporterField.setAccessible(true);
 | 
				
			||||||
 | 
					            Object transporterObj = transporterField.get(jsonRpcClientObj);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Field channelField = transporterObj.getClass().getDeclaredField("val$channel");
 | 
				
			||||||
 | 
					            channelField.setAccessible(true);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Channel channel = (Channel) channelField.get(transporterObj);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return channel;
 | 
				
			||||||
 | 
					        }catch(Exception e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException("Cannot get the channel for the ovsdbClient "+ ovsdbClient, e);            
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -123,7 +123,6 @@ public class OpensyncGatewayTipWlanOvsdbClientTest {
 | 
				
			|||||||
        Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(ovsdbSession);
 | 
					        Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(ovsdbSession);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        OpensyncAPConfig apConfig = Mockito.mock(OpensyncAPConfig.class, Mockito.RETURNS_DEEP_STUBS);
 | 
					        OpensyncAPConfig apConfig = Mockito.mock(OpensyncAPConfig.class, Mockito.RETURNS_DEEP_STUBS);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        Mockito.when(apConfig.getApProfile().getDetails()).thenReturn(Mockito.mock(ApNetworkConfiguration.class));
 | 
					        Mockito.when(apConfig.getApProfile().getDetails()).thenReturn(Mockito.mock(ApNetworkConfiguration.class));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Mockito.when(opensyncExternalIntegrationInterface.getApConfig(Mockito.anyString())).thenReturn(apConfig);
 | 
					        Mockito.when(opensyncExternalIntegrationInterface.getApConfig(Mockito.anyString())).thenReturn(apConfig);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@ import org.springframework.context.annotation.Import;
 | 
				
			|||||||
import org.springframework.test.context.ActiveProfiles;
 | 
					import org.springframework.test.context.ActiveProfiles;
 | 
				
			||||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
					import org.springframework.test.context.junit4.SpringRunner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
 | 
				
			||||||
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
 | 
					import com.telecominfraproject.wlan.core.model.equipment.RadioType;
 | 
				
			||||||
import com.telecominfraproject.wlan.location.models.Location;
 | 
					import com.telecominfraproject.wlan.location.models.Location;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
 | 
					import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
 | 
				
			||||||
@@ -43,6 +44,9 @@ import com.telecominfraproject.wlan.profile.models.ProfileType;
 | 
				
			|||||||
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.StatusServiceLocal;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.controller.StatusController;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
 | 
				
			||||||
import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
					import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.notation.Row;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Row;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.notation.Uuid;
 | 
					import com.vmware.ovsdb.protocol.operation.notation.Uuid;
 | 
				
			||||||
@@ -63,8 +67,8 @@ import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			|||||||
@Import(
 | 
					@Import(
 | 
				
			||||||
        value = {OvsdbDao.class, OvsdbDaoTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class, OvsdbHotspotConfig.class, OvsdbCommandConfig.class,
 | 
					        value = {OvsdbDao.class, OvsdbDaoTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class, OvsdbHotspotConfig.class, OvsdbCommandConfig.class,
 | 
				
			||||||
                OvsdbMonitor.class, OvsdbFirmwareConfig.class, OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
 | 
					                OvsdbMonitor.class, OvsdbFirmwareConfig.class, OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
 | 
				
			||||||
                OvsdbNodeConfig.class, OvsdbRadiusProxyConfig.class
 | 
					                OvsdbNodeConfig.class, OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
 | 
				
			||||||
 | 
					                CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
public class OvsdbDaoTest {
 | 
					public class OvsdbDaoTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -104,7 +104,7 @@ public class OvsdbDaoTestUtilities {
 | 
				
			|||||||
        ((PasspointProfile) passpointHotspotConfig.getDetails()).setOsuSsidProfileId(profileSsidOpen.getId());
 | 
					        ((PasspointProfile) passpointHotspotConfig.getDetails()).setOsuSsidProfileId(profileSsidOpen.getId());
 | 
				
			||||||
        profileSsidPsk.getChildProfileIds().add(passpointHotspotConfig.getId());
 | 
					        profileSsidPsk.getChildProfileIds().add(passpointHotspotConfig.getId());
 | 
				
			||||||
        ((PasspointProfile) passpointHotspotConfig.getDetails())
 | 
					        ((PasspointProfile) passpointHotspotConfig.getDetails())
 | 
				
			||||||
                .setAssociatedAccessSsidProfileIds(List.of(profileSsidPsk.getId()));
 | 
					                .setAssociatedAccessSsidProfileIds(Set.of(profileSsidPsk.getId()));
 | 
				
			||||||
        return passpointHotspotConfig;
 | 
					        return passpointHotspotConfig;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,11 @@ import com.telecominfraproject.wlan.profile.ethernetport.models.WiredEthernetPor
 | 
				
			|||||||
import com.telecominfraproject.wlan.profile.ethernetport.models.WiredPort;
 | 
					import com.telecominfraproject.wlan.profile.ethernetport.models.WiredPort;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.models.Profile;
 | 
					import com.telecominfraproject.wlan.profile.models.Profile;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.models.ProfileType;
 | 
					import com.telecominfraproject.wlan.profile.models.ProfileType;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.StatusServiceInterface;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.equipment.report.models.WiredEthernetPortStatusData;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.equipment.report.models.WiredPortStatus;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.models.Status;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.models.StatusDataType;
 | 
				
			||||||
import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
					import com.vmware.ovsdb.exception.OvsdbClientException;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
					import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
 | 
					import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
 | 
				
			||||||
@@ -27,6 +32,7 @@ import org.springframework.test.context.ActiveProfiles;
 | 
				
			|||||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
					import org.springframework.test.context.junit4.SpringRunner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.concurrent.CompletableFuture;
 | 
					import java.util.concurrent.CompletableFuture;
 | 
				
			||||||
import java.util.concurrent.ExecutionException;
 | 
					import java.util.concurrent.ExecutionException;
 | 
				
			||||||
@@ -53,6 +59,9 @@ public class OvsdbNetworkConfigTest {
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    OvsdbNetworkConfig ovsdbNetworkConfig;
 | 
					    OvsdbNetworkConfig ovsdbNetworkConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @MockBean(answer = Answers.RETURNS_MOCKS)
 | 
				
			||||||
 | 
					    StatusServiceInterface statusServiceInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @MockBean(answer = Answers.RETURNS_MOCKS)
 | 
					    @MockBean(answer = Answers.RETURNS_MOCKS)
 | 
				
			||||||
    OvsdbGet ovsdbGet;
 | 
					    OvsdbGet ovsdbGet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,9 +70,11 @@ public class OvsdbNetworkConfigTest {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private MockitoSession mockito;
 | 
					    private MockitoSession mockito;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    private static final String LAN_IF_NAME = "lan";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Before
 | 
					    @Before
 | 
				
			||||||
    public void setUp() throws Exception {
 | 
					    public void setUp() throws Exception {
 | 
				
			||||||
        mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.STRICT_STUBS).startMocking();
 | 
					        mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.WARN).startMocking();
 | 
				
			||||||
        Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
 | 
					        Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -112,6 +123,41 @@ public class OvsdbNetworkConfigTest {
 | 
				
			|||||||
        Mockito.verify(ovsdbClient, times(1)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
 | 
					        Mockito.verify(ovsdbClient, times(1)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Case when ETH port is in BRIDGE + Trunk and Profile is removed so we convert
 | 
				
			||||||
 | 
						// it in NAT (LAN)
 | 
				
			||||||
 | 
						@Test
 | 
				
			||||||
 | 
						public void testResetWiredPorts_BridgeTrunkToNAT()
 | 
				
			||||||
 | 
								throws ExecutionException, InterruptedException, TimeoutException, OvsdbClientException {
 | 
				
			||||||
 | 
							// at the beginning LAN's currentIfName is wan
 | 
				
			||||||
 | 
							Mockito.when(statusServiceInterface.getOrNull(Mockito.anyInt(), Mockito.anyLong(),
 | 
				
			||||||
 | 
									Mockito.any(StatusDataType.class))).thenReturn(createWiredEthernetPortStatus("wan"));
 | 
				
			||||||
 | 
							OperationResult[] updateResult = new OperationResult[] { new UpdateResult(1) };
 | 
				
			||||||
 | 
							Mockito.when(futureResult.get(ovsdbNetworkConfig.ovsdbTimeoutSec, TimeUnit.SECONDS)).thenReturn(updateResult);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ovsdbNetworkConfig.resetWiredPorts(ovsdbClient, createOpensyncApConfig(true, "bridge"));
 | 
				
			||||||
 | 
							// transact() execute 1 time as we move LAN from wan interface back to lan
 | 
				
			||||||
 | 
							// interface
 | 
				
			||||||
 | 
							// (vlan interface will be removed in inetC table directly)
 | 
				
			||||||
 | 
							Mockito.verify(ovsdbClient, times(1)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Case when ETH port is in NAT + Access and Profile is removed we don't do
 | 
				
			||||||
 | 
						// anything
 | 
				
			||||||
 | 
						@Test
 | 
				
			||||||
 | 
						public void testResetWiredPorts_NATToNAT()
 | 
				
			||||||
 | 
								throws ExecutionException, InterruptedException, TimeoutException, OvsdbClientException {
 | 
				
			||||||
 | 
							// at the beginning LAN's currentIfName is wan
 | 
				
			||||||
 | 
							Mockito.when(statusServiceInterface.getOrNull(Mockito.anyInt(), Mockito.anyLong(),
 | 
				
			||||||
 | 
									Mockito.any(StatusDataType.class))).thenReturn(createWiredEthernetPortStatus("lan"));
 | 
				
			||||||
 | 
							OperationResult[] updateResult = new OperationResult[] { new UpdateResult(1) };
 | 
				
			||||||
 | 
							Mockito.when(futureResult.get(ovsdbNetworkConfig.ovsdbTimeoutSec, TimeUnit.SECONDS)).thenReturn(updateResult);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ovsdbNetworkConfig.resetWiredPorts(ovsdbClient, createOpensyncApConfig(false, "NAT"));
 | 
				
			||||||
 | 
							// Note: Strictness set to WARN in setup() rather than STRICT_STUB as we are
 | 
				
			||||||
 | 
							// adding unnecessary stubbings above to test if any transact() is called.
 | 
				
			||||||
 | 
							Mockito.verify(ovsdbClient, times(0)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private OpensyncAPConfig createOpensyncApConfig(boolean isTrunkEnabled, String ifType) {
 | 
					    private OpensyncAPConfig createOpensyncApConfig(boolean isTrunkEnabled, String ifType) {
 | 
				
			||||||
        OpensyncAPConfig opensyncApConfig = new OpensyncAPConfig();
 | 
					        OpensyncAPConfig opensyncApConfig = new OpensyncAPConfig();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -157,4 +203,43 @@ public class OvsdbNetworkConfigTest {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return wiredPort;
 | 
					        return wiredPort;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private Status createWiredEthernetPortStatus(String lanPortIfName) {
 | 
				
			||||||
 | 
					        WiredEthernetPortStatusData statusDetails = new WiredEthernetPortStatusData();
 | 
				
			||||||
 | 
					        if (lanPortIfName.equals(LAN_IF_NAME)) {
 | 
				
			||||||
 | 
					        	WiredPortStatus wiredPortStatusLan = createWiredPortStatus(lanPortIfName, "NAT", false, 0, null, "eth0", "lan", "up");
 | 
				
			||||||
 | 
					        	WiredPortStatus wiredPortStatusWan = createWiredPortStatus("wan", "bridge", true, 0, null, "eth1", "wan", "up");
 | 
				
			||||||
 | 
					            statusDetails.setInterfacePortStatusMap(Map.of("lan", List.of(wiredPortStatusLan), "wan", List.of(wiredPortStatusWan)));
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					        	WiredPortStatus wiredPortStatusLan = createWiredPortStatus(lanPortIfName, "bridge", true, 10, List.of(100,200), "eth0", "lan", "up");
 | 
				
			||||||
 | 
					        	WiredPortStatus wiredPortStatusWan = createWiredPortStatus("wan", "bridge", true, 0, null, "eth1", "wan", "up");
 | 
				
			||||||
 | 
					            statusDetails.setInterfacePortStatusMap(Map.of("lan", List.of(), "wan", List.of(wiredPortStatusLan, wiredPortStatusWan)));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Status status = new Status();
 | 
				
			||||||
 | 
					        status.setCustomerId(1);
 | 
				
			||||||
 | 
					        status.setEquipmentId(1L);
 | 
				
			||||||
 | 
					        status.setStatusDataType(StatusDataType.WIRED_ETHERNET_PORT);
 | 
				
			||||||
 | 
					        status.setDetails(statusDetails);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return status;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
						private WiredPortStatus createWiredPortStatus(String ifName, String ifType, boolean isTrunkEnabled, int vlanId,
 | 
				
			||||||
 | 
								List<Integer> allowedVlans, String name, String originalIfName, String operationalState) {
 | 
				
			||||||
 | 
							WiredPortStatus status = new WiredPortStatus();
 | 
				
			||||||
 | 
							status.setIfType(ifType);
 | 
				
			||||||
 | 
							status.setCurrentIfName(ifName);
 | 
				
			||||||
 | 
							status.setOriginalIfName(originalIfName);
 | 
				
			||||||
 | 
							status.setName(name);
 | 
				
			||||||
 | 
							status.setAllowedVlanIds(allowedVlans);
 | 
				
			||||||
 | 
							status.setDuplex("full");
 | 
				
			||||||
 | 
							status.setSpeed(1000);
 | 
				
			||||||
 | 
							status.setTrunkEnabled(isTrunkEnabled);
 | 
				
			||||||
 | 
							status.setOperationalState(operationalState);
 | 
				
			||||||
 | 
							status.setVlanId(vlanId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return status;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -14,6 +14,7 @@ import org.mockito.Mockito;
 | 
				
			|||||||
import org.mockito.MockitoSession;
 | 
					import org.mockito.MockitoSession;
 | 
				
			||||||
import org.mockito.quality.Strictness;
 | 
					import org.mockito.quality.Strictness;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Value;
 | 
				
			||||||
import org.springframework.boot.test.context.SpringBootTest;
 | 
					import org.springframework.boot.test.context.SpringBootTest;
 | 
				
			||||||
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 | 
					import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 | 
				
			||||||
import org.springframework.boot.test.mock.mockito.MockBean;
 | 
					import org.springframework.boot.test.mock.mockito.MockBean;
 | 
				
			||||||
@@ -23,8 +24,12 @@ import org.springframework.context.annotation.Import;
 | 
				
			|||||||
import org.springframework.test.context.ActiveProfiles;
 | 
					import org.springframework.test.context.ActiveProfiles;
 | 
				
			||||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
					import org.springframework.test.context.junit4.SpringRunner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo;
 | 
					import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.util.OvsdbToWlanCloudTypeMappingUtility;
 | 
					import com.telecominfraproject.wlan.opensync.util.OvsdbToWlanCloudTypeMappingUtility;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.StatusServiceLocal;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.controller.StatusController;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
					import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
				
			||||||
import com.vmware.ovsdb.service.OvsdbClient;
 | 
					import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,7 +41,8 @@ import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			|||||||
@Import(value = { OvsdbDao.class, OvsdbNodeTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class,
 | 
					@Import(value = { OvsdbDao.class, OvsdbNodeTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class,
 | 
				
			||||||
        OvsdbHotspotConfig.class, OvsdbCommandConfig.class, OvsdbMonitor.class, OvsdbFirmwareConfig.class,
 | 
					        OvsdbHotspotConfig.class, OvsdbCommandConfig.class, OvsdbMonitor.class, OvsdbFirmwareConfig.class,
 | 
				
			||||||
        OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
 | 
					        OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
 | 
				
			||||||
        OvsdbNodeConfig.class,OvsdbRadiusProxyConfig.class
 | 
					        OvsdbNodeConfig.class,OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
 | 
				
			||||||
 | 
					        CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
public class OvsdbNodeTest {
 | 
					public class OvsdbNodeTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -81,6 +87,9 @@ public class OvsdbNodeTest {
 | 
				
			|||||||
    @MockBean(answer = Answers.RETURNS_MOCKS)
 | 
					    @MockBean(answer = Answers.RETURNS_MOCKS)
 | 
				
			||||||
    OvsdbGet ovsdbGet;
 | 
					    OvsdbGet ovsdbGet;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    @Value("${tip.wlan.internalHostName:localhost}") 
 | 
				
			||||||
 | 
					    private String internalHostName;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    MockitoSession mockito;
 | 
					    MockitoSession mockito;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Configuration
 | 
					    @Configuration
 | 
				
			||||||
@@ -117,7 +126,7 @@ public class OvsdbNodeTest {
 | 
				
			|||||||
        newMqttSettings.put("broker", ovsdbNode.mqttBrokerAddress);
 | 
					        newMqttSettings.put("broker", ovsdbNode.mqttBrokerAddress);
 | 
				
			||||||
        String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired("AP-1", connectNodeInfo,
 | 
					        String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired("AP-1", connectNodeInfo,
 | 
				
			||||||
                false);
 | 
					                false);
 | 
				
			||||||
        newMqttSettings.put("topics", "/ap/" + mqttClientName + "/opensync");
 | 
					        newMqttSettings.put("topics", "/ap/opensync_mqtt_" + internalHostName + "/" + mqttClientName + "/opensync");
 | 
				
			||||||
        newMqttSettings.put("port", "" + ovsdbNode.mqttBrokerExternalPort);
 | 
					        newMqttSettings.put("port", "" + ovsdbNode.mqttBrokerExternalPort);
 | 
				
			||||||
        newMqttSettings.put("compress", "zlib");
 | 
					        newMqttSettings.put("compress", "zlib");
 | 
				
			||||||
        newMqttSettings.put("qos", "0");
 | 
					        newMqttSettings.put("qos", "0");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,12 +24,16 @@ import org.springframework.context.annotation.Import;
 | 
				
			|||||||
import org.springframework.test.context.ActiveProfiles;
 | 
					import org.springframework.test.context.ActiveProfiles;
 | 
				
			||||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
					import org.springframework.test.context.junit4.SpringRunner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
 | 
				
			||||||
import com.telecominfraproject.wlan.location.models.Location;
 | 
					import com.telecominfraproject.wlan.location.models.Location;
 | 
				
			||||||
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
 | 
					import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.models.Profile;
 | 
					import com.telecominfraproject.wlan.profile.models.Profile;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.models.ProfileType;
 | 
					import com.telecominfraproject.wlan.profile.models.ProfileType;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile;
 | 
					import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile;
 | 
				
			||||||
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
					import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.StatusServiceLocal;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.controller.StatusController;
 | 
				
			||||||
 | 
					import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
 | 
				
			||||||
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
					import com.vmware.ovsdb.protocol.operation.result.OperationResult;
 | 
				
			||||||
import com.vmware.ovsdb.service.OvsdbClient;
 | 
					import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,7 +45,8 @@ import com.vmware.ovsdb.service.OvsdbClient;
 | 
				
			|||||||
@Import(value = { OvsdbDao.class, OvsdbSsidConfigTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class,
 | 
					@Import(value = { OvsdbDao.class, OvsdbSsidConfigTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class,
 | 
				
			||||||
        OvsdbHotspotConfig.class, OvsdbCommandConfig.class, OvsdbMonitor.class, OvsdbFirmwareConfig.class,
 | 
					        OvsdbHotspotConfig.class, OvsdbCommandConfig.class, OvsdbMonitor.class, OvsdbFirmwareConfig.class,
 | 
				
			||||||
        OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
 | 
					        OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
 | 
				
			||||||
        OvsdbNodeConfig.class,OvsdbRadiusProxyConfig.class
 | 
					        OvsdbNodeConfig.class, OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
 | 
				
			||||||
 | 
					        CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
public class OvsdbSsidConfigTest {
 | 
					public class OvsdbSsidConfigTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user