diff --git a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java index 5500de4..e0c402c 100644 --- a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java +++ b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java @@ -764,6 +764,8 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra ret.setSsidProfile( profileContainer.getChildrenOfType(equipmentConfig.getProfileId(), ProfileType.ssid)); + + ret.setMetricsProfiles(profileContainer.getChildrenOfType(equipmentConfig.getProfileId(), ProfileType.metrics)); Set radiusSet = new HashSet<>(); Set captiveProfileIds = new HashSet<>(); diff --git a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java index 3cb1a2f..5c405d2 100644 --- a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java +++ b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java @@ -31,6 +31,7 @@ public class OpensyncAPConfig extends BaseJsonModel { private Profile apProfile; private Profile rfProfile; private List ssidProfile; + private List metricsProfile; private List radiusProfiles; private Location equipmentLocation; private EquipmentRoutingRecord equipmentRouting; @@ -195,6 +196,13 @@ public class OpensyncAPConfig extends BaseJsonModel { } ret.ssidProfile = ssidList; } + if (metricsProfile != null) { + List metricsList = new ArrayList(); + for (Profile profile : metricsProfile) { + metricsList.add(profile.clone()); + } + ret.metricsProfile = metricsList; + } if (bonjourGatewayProfiles != null) { List bonjourGatewayProfilesList = new ArrayList(); for (Profile profile : bonjourGatewayProfiles) { @@ -255,4 +263,12 @@ public class OpensyncAPConfig extends BaseJsonModel { public void setBlockedClients(List blockedClients) { this.blockedClients = blockedClients; } + + public void setMetricsProfiles(List metricsProfileList) { + metricsProfile = metricsProfileList; + } + + public List getMetricsProfiles() { + return metricsProfile; + } } diff --git a/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java b/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java index 3519c1e..f32eb6a 100644 --- a/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java +++ b/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java @@ -45,6 +45,9 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr @Value("${tip.wlan.ovsdb.ssidProfileFileName:/app/config/ProfileSsid.json}") private String ssidProfileFileName; + @Value("${tip.wlan.ovsdb.ssidProfileFileName:/app/config/ProfileMetrics.json}") + private String metricsProfileFileName; + @Value("${tip.wlan.ovsdb.radiusProfileFileName:/app/config/ProfileRadius.json}") private String radiusProfileFileName; @@ -99,6 +102,9 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr .listFromFile(ssidProfileFileName, com.telecominfraproject.wlan.profile.models.Profile.class); ssidProfiles.stream().forEach(p -> apProfile.getChildProfileIds().add(p.getId())); + + List metricsProfiles = com.telecominfraproject.wlan.profile.models.Profile + .listFromFile(metricsProfileFileName, com.telecominfraproject.wlan.profile.models.Profile.class); List radiusProfiles = com.telecominfraproject.wlan.profile.models.Profile .listFromFile(radiusProfileFileName, com.telecominfraproject.wlan.profile.models.Profile.class); @@ -132,6 +138,7 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr ret.setCustomerEquipment(equipment); ret.setApProfile(apProfile); ret.setRfProfile(rfProfile); + ret.setMetricsProfiles(metricsProfiles); ret.setSsidProfile(ssidProfiles); ret.setRadiusProfiles(radiusProfiles); ret.setEquipmentLocation(location); diff --git a/opensync-ext-static/src/main/resources/ProfileMetrics.json b/opensync-ext-static/src/main/resources/ProfileMetrics.json new file mode 100644 index 0000000..4b38dbb --- /dev/null +++ b/opensync-ext-static/src/main/resources/ProfileMetrics.json @@ -0,0 +1,53 @@ +[ +{ + "model_type": "Profile", + "id": 222, + "customerId": 2, + "profileType": "metrics", + "name": "Metrics-Profile-3-radios", + "details": { + "model_type": "ServiceMetricsCollectionConfigProfile", + "radioTypeList": [ + "is2dot4GHz", + "is5GHzL", + "is5GHzU" + ], + "metricConfigParameterMap": { + "Neighbour": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Neighbour", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApSsid": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApSsid", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Channel": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Channel", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApNode": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApNode", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Client": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Client", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + } + }, + "profileType": "metrics" + }, + "createdTimestamp": 1601066846980, + "lastModifiedTimestamp": 1601066846980, + "childProfileIds": [] +} +] \ No newline at end of file diff --git a/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json index 5eb69c5..5f5e88b 100644 --- a/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json +++ b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json @@ -201,6 +201,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzU": { @@ -241,6 +242,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzL": { @@ -281,6 +283,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null } } diff --git a/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/ProfileMetrics.json b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/ProfileMetrics.json new file mode 100644 index 0000000..4b38dbb --- /dev/null +++ b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/ProfileMetrics.json @@ -0,0 +1,53 @@ +[ +{ + "model_type": "Profile", + "id": 222, + "customerId": 2, + "profileType": "metrics", + "name": "Metrics-Profile-3-radios", + "details": { + "model_type": "ServiceMetricsCollectionConfigProfile", + "radioTypeList": [ + "is2dot4GHz", + "is5GHzL", + "is5GHzU" + ], + "metricConfigParameterMap": { + "Neighbour": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Neighbour", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApSsid": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApSsid", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Channel": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Channel", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApNode": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApNode", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Client": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Client", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + } + }, + "profileType": "metrics" + }, + "createdTimestamp": 1601066846980, + "lastModifiedTimestamp": 1601066846980, + "childProfileIds": [] +} +] \ No newline at end of file diff --git a/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json b/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json index 5eb69c5..5f5e88b 100644 --- a/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json +++ b/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json @@ -201,6 +201,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzU": { @@ -241,6 +242,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzL": { @@ -281,6 +283,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null } } diff --git a/opensync-gateway-static-docker/src/main/docker/app/opensync/ProfileMetrics.json b/opensync-gateway-static-docker/src/main/docker/app/opensync/ProfileMetrics.json new file mode 100644 index 0000000..4b38dbb --- /dev/null +++ b/opensync-gateway-static-docker/src/main/docker/app/opensync/ProfileMetrics.json @@ -0,0 +1,53 @@ +[ +{ + "model_type": "Profile", + "id": 222, + "customerId": 2, + "profileType": "metrics", + "name": "Metrics-Profile-3-radios", + "details": { + "model_type": "ServiceMetricsCollectionConfigProfile", + "radioTypeList": [ + "is2dot4GHz", + "is5GHzL", + "is5GHzU" + ], + "metricConfigParameterMap": { + "Neighbour": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Neighbour", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApSsid": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApSsid", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Channel": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Channel", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApNode": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApNode", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Client": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Client", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + } + }, + "profileType": "metrics" + }, + "createdTimestamp": 1601066846980, + "lastModifiedTimestamp": 1601066846980, + "childProfileIds": [] +} +] \ No newline at end of file diff --git a/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json b/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json index 5eb69c5..5f5e88b 100644 --- a/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json +++ b/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json @@ -201,6 +201,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzU": { @@ -241,6 +242,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzL": { @@ -281,6 +283,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null } } diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java index 39da67d..82c8720 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java @@ -208,7 +208,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface { } ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always - ovsdbDao.configureStats(ovsdbClient); + ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig); // Check if device stats is configured in Wifi_Stats_Config table, // provision it @@ -273,7 +273,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface { ovsdbDao.configureInterfaces(ovsdbClient); ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig); ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig); - ovsdbDao.configureStats(ovsdbClient); + ovsdbDao.configureStatsFromProfile(ovsdbClient,opensyncAPConfig); // Check if device stats is configured in Wifi_Stats_Config table, // provision it diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java index 3564052..846a769 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java @@ -60,6 +60,8 @@ import com.telecominfraproject.wlan.profile.bonjour.models.BonjourServiceSet; import com.telecominfraproject.wlan.profile.captiveportal.models.CaptivePortalAuthenticationType; import com.telecominfraproject.wlan.profile.captiveportal.models.CaptivePortalConfiguration; import com.telecominfraproject.wlan.profile.captiveportal.models.ManagedFileInfo; +import com.telecominfraproject.wlan.profile.metrics.ServiceMetricConfigParameters; +import com.telecominfraproject.wlan.profile.metrics.ServiceMetricsCollectionConfigProfile; import com.telecominfraproject.wlan.profile.models.Profile; import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile; import com.telecominfraproject.wlan.profile.radius.models.RadiusServer; @@ -2383,8 +2385,8 @@ public class OvsdbDao { int keyRefresh, boolean uapsdEnabled, boolean apBridge, NetworkForwardMode networkForwardMode, String gateway, String inet, Map dns, String ipAssignScheme, List macBlockList, boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit, - int rtsCtsThreshold, int fragThresholdBytes, int dtimPeriod, Map captiveMap, List walledGardenAllowlist, - Map> bonjourServiceMap) { + int rtsCtsThreshold, int fragThresholdBytes, int dtimPeriod, Map captiveMap, + List walledGardenAllowlist, Map> bonjourServiceMap) { List operations = new ArrayList<>(); Map updateColumns = new HashMap<>(); @@ -2484,10 +2486,10 @@ public class OvsdbDao { customOptions.put("ssid_dl_limit", String.valueOf(ssidDlLimit * 1000)); customOptions.put("client_dl_limit", String.valueOf(clientDlLimit * 1000)); customOptions.put("client_ul_limit", String.valueOf(clientUlLimit * 1000)); - customOptions.put("rts_threshold", String.valueOf(rtsCtsThreshold)); + customOptions.put("rts_threshold", String.valueOf(rtsCtsThreshold)); customOptions.put("frag_threshold", String.valueOf(fragThresholdBytes)); customOptions.put("dtim_period", String.valueOf(dtimPeriod)); - + if (enable80211k) { customOptions.put("ieee80211k", String.valueOf(1)); @@ -2903,8 +2905,8 @@ public class OvsdbDao { ssidConfig.getVlanId(), rrmEnabled, enable80211r, mobilityDomain, enable80211v, enable80211k, minHwMode, enabled, keyRefresh, uapsdEnabled, apBridge, ssidConfig.getForwardMode(), gateway, inet, dns, ipAssignScheme, macBlockList, - rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold,fragThresholdBytes,dtimPeriod, - captiveMap, walledGardenAllowlist, bonjourServiceMap); + rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold, + fragThresholdBytes, dtimPeriod, captiveMap, walledGardenAllowlist, bonjourServiceMap); } catch (IllegalStateException e) { // could not provision this SSID, but still can go on @@ -3228,6 +3230,38 @@ public class OvsdbDao { } + public void configureStatsFromProfile(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) { + + + if (opensyncApConfig.getMetricsProfiles().isEmpty()) { + configureStats(ovsdbClient); + } else { + + for (Profile metricsProfile : opensyncApConfig.getMetricsProfiles()) { + + + ServiceMetricsCollectionConfigProfile details = ((ServiceMetricsCollectionConfigProfile) metricsProfile + .getDetails()); + + for (Entry entry : details.getMetricConfigParameterMap() + .entrySet()) { + + //TODO: implement me + LOG.debug("Metrics Config Map Entry {}", entry); + configureStats(ovsdbClient); // replace with profile values + + + } + + + } + + + } + + + } + public void configureStats(OvsdbClient ovsdbClient) { try { diff --git a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java index adee147..a320796 100644 --- a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java +++ b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java @@ -130,7 +130,7 @@ public class OpensyncGatewayTipWlanOvsdbClientTest { Mockito.verify(ovsdbDao).removeAllStatsConfigs(ovsdbClient); Mockito.verify(ovsdbDao).configureWifiRadios(ovsdbClient, apConfig); Mockito.verify(ovsdbDao).configureSsids(ovsdbClient, apConfig); - Mockito.verify(ovsdbDao).configureStats(ovsdbClient); + Mockito.verify(ovsdbDao).configureStatsFromProfile(ovsdbClient, apConfig); }