Full Changelog 1.0.2

Released 2026-07-25 · v7.1.1 sprint · 63 issues · 2 features · 50 fixes

The complete record: every commit in the release, grouped by type, including work that never reaches a customer-facing note. The external changelog is the readable summary of the same release.

Jira References

  • DEV-1165 - Java Northbound API > Active connection determination > Change logic

  • DEV-1931 - Java Northbound API > api/Task/Pending> No pending tasks > Incorrect ErrorCode

  • DEV-2071 - Java Northbound API > REST / SOAP > Oracle > Any failed SPV task on device > POST /api/Task/Failed > Internal server error is returned

  • DEV-2075 - Java Northbound API > REST / SOAP > Any failed SPV task on device > POST /api/Task/Failed > Incorrect "TaskName" value

  • DEV-2143 - Java Northbound API > STUN enabled and configured > POST /api/Device/ActiveConnection > Incorrect active connection is returned for "UDPConnectionRequestAddress"

  • DEV-2145 - Java Northbound API > REST/SOAP > Group update methods > Descriptions are absent

  • DEV-2148 - Java Northbound API > STUN disabled > Local IP "ConnectionRequestURL" > Global connection exists > POST /api/Device/ActiveConnection > Incorrect active connection is returned

  • DEV-2218 - Java Northbound API > api/Device/Info > Error: response status is 500

  • DEV-2252 - Java Northbound API > REST/SOAP > /iot-webservice/iotw/GroupUpdate/condition/items > Request is missing

  • DEV-2257 - Java Northbound API > /api/Device/info > response missing hardware information

  • DEV-2276 - Java Northbound API > REST / SOAP > Any failed SPV task on device > POST /api/Task/Failed > "ErrorCode" value is missing from Task object

  • DEV-2283 - Java Northbound API > Create condition > Angular project > Management portal > Group Update > Add/Edit > Condition is missing

  • DEV-2290 - Java Northbound API > Oracle > Run > Failed to start

  • DEV-2292 - Java Northbound API > SOAP > Open Swagger > Absent Group Update methods

  • DEV-2298 - Java Northbound API > SOAP > Docs Portal > Absent Group Update methods

  • DEV-2370 - Java Northbound API > REST API > POST "api/Device/Info" >device has hardware version parameter > HardwareVersion=null "returned

  • DEV-2410 - Java Northbound API > REST > PUT /api/Parameter > No "EndSession" field > Incorrect "Message" returned

  • DEV-2413 - Java Northbound API > REST > PUT /api/File/Download > No "Delay" field > Incorrect "Message" returned

  • DEV-2415 - Java Northbound API > SOAP > FTAddObject > "Value" is absent > Server returned HTTP response code: 500

  • DEV-2416 - Java Northbound API > SOAP > FTAddObject > "Name" is absent > Incorrect response code 203 must be 204

  • DEV-2418 - Java Northbound API > SOAP > FTSetProvisionDeviceParameters > Incorrect tag name in response "FTSetDeviceParametersResult"

  • DEV-2419 - Java Northbound API > REST > POST /api/UserInfo > Field name and structure differences

  • DEV-2420 - Java Northbound API > SOAP > FTRPCInvoke > Exception in response

  • DEV-2423 - Java Northbound API > SOAP > FTGetUserDetailsFromDevice > Incorrect “devicesn” > Exception in response

  • DEV-2425 - Java Northbound API > SOAP > FTSetDeviceParameters > Parameter name is empty / absent > Server returned HTTP response code: 500

  • DEV-2426 - Java Northbound API > SOAP > FTSetDeviceParameters > More than one parameter > One parameter name is empty / absent > Server returned HTTP response code: 500

  • DEV-2429 - Java Northbound REST API > POST /api/Device/Value > Unification request

  • DEV-2431 - Java Northbound REST API > TR-069 > PUT /api/Rpc > Field names difference

  • DEV-2432 - Java Northbound REST API > POST /api/Device/History > Response array is empty

  • DEV-2433 - Java Northbound REST API > POST /api/Device/Activity > Response array is empty

  • DEV-2434 - Java Northbound REST API > PUT /api/Device/Backup > Task rejected

  • DEV-2435 - Java Northbound REST API > POST /api/Device/BackupStatus > HTTP code 500 returned

  • DEV-2436 - Northbound REST API > POST /api/Device/FindDeviceAdvanced > Lowercase for "key" / "value" > HTTP code 500 returned

  • DEV-2439 - Java Northbound API > Swagger > SOAP > "FTGroupUpdateActivate" > ID not exist > No error occurred

  • DEV-2440 - Java Northbound REST API > PUT /api/Parameter/Provision > Incorrect structure > HTTP code 500 returned

  • DEV-2441 - Java Northbound REST API > POST /api/Device/Ip > Incorrect IP > Error code 204

  • DEV-2444 - Java Northbound REST API > POST /api/Transaction > Incorrect response message

  • DEV-2447 - Java Northbound REST API > PUT /api/Rpc > "Reprovision": 2 > HTTP code 500 returned

  • DEV-2452 - Java Northbound REST API > PUT /api/Rpc > Incorrect "Content" structure > ErrorCode 100 returned

  • DEV-2454 - Java Northbound REST API > POST /api/Transaction/Task/Pending > No "Sn" > Incorrect message returned

  • DEV-2458 - Java Northbound REST API > PUT /api/Parameter > empty or absent "Name" > Incorrect message returned

  • DEV-2462 - Java Northbound API > Swagger > SOAP > "FTViewGroupUpdateDetails" > Valid ID > Error occurred

  • DEV-2467 - Java Northbound REST API > POST /api/Task/Pending > Non-existent "TransactionId" > Incorrect error code and message returned

  • DEV-2476 - Java Northbound REST API > POST /api/Diagnostic > Upload diagnostic > The response is incomplete

  • DEV-2478 - Java Northbound REST API > POST /api/Parameter > non-existent "Sn" > Incorrect error code returned

  • DEV-2480 - Java Northbound REST API > POST /api/Parameter > Incorrect "ModelName" and / or "Oui" > Incorrect error code returned

  • DEV-2484 - Java Northbound REST API > POST /api/Task/Pending/Transaction > Incorrect "TransactionId" > Error code 100 returned

  • DEV-2488 - Java Northbound REST API > POST /api/Task/Failed > "StartTime" = date only > HTTP code 500 returned

  • DEV-2491 - Java Northbound REST API > POST /api/Transaction > Empty "TransactionId" field > HTTP code 500 returned

  • DEV-2499 - Java Northbound REST API > POST /api/Parameter > Offline device > "Source" = 0, "IgnoreDeviceIsOffline" = true > Incorrect message returned

  • DEV-2501 - Java Northbound REST API > POST /api/Diagnostic > "TransactionId" = string of letters > HTTP code 500 returned

  • DEV-2502 - Java Northbound REST API > PUT /api/Device/Backup > "DeletePrevious" = true > HTTP code 500 returned

  • DEV-2507 - Java Northbound REST API > POST /api/Device/FindDeviceAdvanced > Empty parameter value > Redundant message returned

  • DEV-2509 - Java Northbound REST API > POST /api/Device/FindDeviceAdvanced > non-existing domain > Irrelevant search result returned

  • DEV-2524 - Java Northbound API > SOAP > "FTCreateGroupUpdate" > "Source type"="1" > An error occurred

  • DEV-2544 - Java Northbound API > /api/UserInfo > Error: response status 500 > NullPointerException "username is null" when updating device user info

  • DEV-2581 - Java Northbound API > SOAP / REST > "FTGroupUpdateActivate" > ID not exist > Execute > "id" is written in lowercase

  • DEV-2618 - Java Northbound REST API > POST /api/Task/Pending/Transaction > "TransactionId" = non-pending task > Error code 100 returned

  • DEV-2619 - Java Northbound REST API > POST /api/Device/Activity > Incorrect "ModelName" and / or "Oui" > Irrelevant response

  • DEV-2620 - Java Northbound REST API > PUT api/Userinfo > "latitude" / "longitude" > Values are not set

  • DEV-2622 - Java Northbound REST API > POST /api/Device/Activity > "AmountOfDays" = string > HTTP code 500 returned

  • DEV-2623 - Java Northbound REST API > POST /api/Device/History > Incorrect "EventTypeValueChange" > HTTP code 500 returned

  • DEV-669 - Java Northbound API > REST > /api/Device/Info > Excessive "HardwareVersion" parameter in response

Features

  • DEV-1165 - Java Northbound API > Active connection determination > Change logic

  • DEV-2292 - Java Northbound API > SOAP > Open Swagger > Absent Group Update methods

Bug Fixes

  • DEV-1931 - Java Northbound API > api/Task/Pending> No pending tasks > Incorrect ErrorCode

  • Drop local CLOB workaround, use api-orm 0.0.67

  • Restore dynamic TaskName for failed/rejected tasks

    Revert hardcoded "SetParameterValues-Device" introduced in 0240219; read CPE_FAILED_TASK.TASK_NAME / CPE_REJECTED_TASK.TASK_NAME from DB and clean it via clearParamName(), matching the pending tasks flow.

    Also covers SOAP FTGetCPEFailedTasks / FTGetCPERejectedTasks since they delegate to the same TaskService.

  • CreateGroupUpdateCondition NPE и Hibernate 7.x совместимость

    GroupUpdateApiService.createCondition: добавлена нормализация columnKey "lastConnection" → "updated" перед сохранением view и построением Specification. UI-alias "lastConnection" не имел маппинга в FieldPath, PARAMETER_NAMES_SEARCH или CUSTOM_DEVICE_PARAMS, что приводило к NPE в DeviceViewUtil.getPredicateFromCondition. Логика повторяет changeLastConnectionToUpdatedIfNeeded из oneiot_web_backend.

    QueryUtil.translateToSqlAndCollectParams: совместимость с Hibernate 7.x. - session.createQuery(criteria) → session.createSelectionQuery(criteria): первый возвращает SqmQueryImpl и приводит к ClassCastException. - Query.unwrap(SqmSelectionQueryImpl.class) → direct cast: unwrap к internal-классам в 7.x бросает "Unrecognized unwrap type". - (SqlAstCreationContext) sfi → sfi.getSqlTranslationEngine(): SessionFactoryImpl больше не реализует SqlAstCreationContext, его наследник SqlTranslationEngine получают через getSqlTranslationEngine().

  • DEV-2218 - Java Northbound API > api/Device/Info > Error: response status is 500

  • Default per-task ErrorCode to SUCCESS for failed/pending/rejected tasks

    The task items returned by the Failed/Pending/Rejected task queries were serialized with a null ErrorCode (and Message), whereas the original FTACSWS returns the success default (100) because TaskApi inherits an errorCode pre-initialized to Result.Success. The source query exposes no per-parameter error code, so success is the only faithful value.

    Centralize TaskResponse construction in a single helper that defaults ErrorCode to 100 and Message to "", covering the REST endpoints, the FTGetCPE*Tasks SOAP methods (TaskWSDL) and USP, which all delegate here.

  • Route iotw datasource to dedicated iotw schema

    The iotw datasource shared the same connection target as the acs datasource (MYSQL_JDBC_URL / MYSQL_SCHEMA, defaulting to the ftacs schema). Group Update condition views are persisted via the @DataSourceSchema("iotw") repository with no hibernate.default_schema, so iotw_view was written into ftacs while the Management Portal reads iotw_view from the dedicated iotw schema. As a result, conditions created through the Northbound API never appeared in the portal.

    Point the iotw datasource at the iotw schema, mirroring ui-backend: - MySQL: MYSQL_SCHEMA_IOTW (default iotw), optional MYSQL_URL_IOTW override - Oracle: connect as ORACLE_USER_IOTW (default iotw) - local: jdbc url targets the iotw schema

    + The acs datasource keeps targeting the ftacs schema.

  • DEV-2290 - Java Northbound API > Oracle > Run > Failed to start

  • DEV-2370 - Java Northbound API > REST API > POST "api/Device/Info" >device has hardware version parameter > HardwareVersion=null "returned

  • Persist group update views as Management Portal client type

    The Group Update flow hardcoded ClientType.sc (Support Portal) when creating view/condition entries, so they were written under the wrong client type and stayed invisible in the Management Portal. Switch the persistence, uniqueness lookup and user resolution to ClientType.mc.

  • DEV-2410 - Java Northbound API > REST > PUT /api/Parameter > No "EndSession" field > Incorrect "Message" returned

  • DEV-2413 - Java Northbound API > REST > PUT /api/File/Download > No "Delay" field > Incorrect "Message" returned

  • DEV-2415 - Java Northbound API > SOAP > FTAddObject > "Value" is absent > Server returned HTTP response code: 500

  • DEV-2418 - Java Northbound API > SOAP > FTSetProvisionDeviceParameters > Incorrect tag name in response "FTSetDeviceParametersResult"

  • DEV-2419 - Java Northbound API > REST > POST /api/UserInfo > Field name and structure differences

  • DEV-2420 - Java Northbound API > SOAP > FTRPCInvoke > Exception in response

  • DEV-2423 - Java Northbound API > SOAP > FTGetUserDetailsFromDevice > Incorrect “devicesn” > Exception in response

  • DEV-2425 - Java Northbound API > SOAP > FTSetDeviceParameters > Parameter name is empty / absent > Server returned HTTP response code: 500

  • DEV-2429 - Java Northbound REST API > POST /api/Device/Value > Unification request

  • DEV-2431 - Java Northbound REST API > TR-069 > PUT /api/Rpc > Field names difference

  • DEV-2452 - Java Northbound REST API > PUT /api/Rpc > Incorrect "Content" structure > ErrorCode 100 returned

  • DEV-2454 - Java Northbound REST API > POST /api/Transaction/Task/Pending > No "Sn" > Incorrect message returned

  • DEV-2462 - Java Northbound API > Swagger > SOAP > "FTViewGroupUpdateDetails" > Valid ID > Error occurred

  • DEV-2432 - Java Northbound REST API > POST /api/Device/History > Response array is empty

  • DEV-2433 - Java Northbound REST API > POST /api/Device/Activity > Response array is empty

  • DEV-2434 - Java Northbound REST API > PUT /api/Device/Backup > Task rejected

  • DEV-2439 - Java Northbound API > Swagger > SOAP > "FTGroupUpdateActivate" > ID not exist > No error occurred

  • DEV-2435 - Java Northbound REST API > POST /api/Device/BackupStatus > HTTP code 500 returned

  • DEV-2436 - Northbound REST API > POST /api/Device/FindDeviceAdvanced > Lowercase for "key" / "value" > HTTP code 500 returned

  • DEV-2441 - Java Northbound REST API > POST /api/Device/Ip > Incorrect IP > Error code 204

  • DEV-2444 - Java Northbound REST API > POST /api/Transaction > Incorrect response message

  • DEV-2467 - Java Northbound REST API > POST /api/Task/Pending > Non-existent "TransactionId" > Incorrect error code and message returned

  • Align ISP subdomain username parsing with .NET (strip '@' before lookup)

    UpdateGroupUtil.getDomainId parsed the ISP-subdomain login as creator.substring(0, ++i), so the '@' separator was included in the username (e.g. "john@acme" → "john@" instead of "john"). Compute the username as substring(0, atPos) before advancing past '@', matching the .NET reference (Session.cs:277-278). The domain part and the trailing boolean argument are unchanged.

  • DEV-2476 - Java Northbound REST API > POST /api/Diagnostic > Upload diagnostic > The response is incomplete

  • DEV-2478 - Java Northbound REST API > POST /api/Parameter > non-existent "Sn" > Incorrect error code returned

  • DEV-2488 - Java Northbound REST API > POST /api/Task/Failed > "StartTime" = date only > HTTP code 500 returned

  • DEV-2447 - Java Northbound REST API > PUT /api/Rpc > "Reprovision": 2 > HTTP code 500 returned

  • DEV-2491 - Java Northbound REST API > POST /api/Transaction > Empty "TransactionId" field > HTTP code 500 returned

  • DEV-2499 - Java Northbound REST API > POST /api/Parameter > Offline device > "Source" = 0, "IgnoreDeviceIsOffline" = true > Incorrect message returned

  • DEV-2501 - Java Northbound REST API > POST /api/Diagnostic > "TransactionId" = string of letters > HTTP code 500 returned

  • DEV-2502 - Java Northbound REST API > PUT /api/Device/Backup > "DeletePrevious" = true > HTTP code 500 returned

  • DEV-2507 - Java Northbound REST API > POST /api/Device/FindDeviceAdvanced > Empty parameter value > Redundant message returned

  • DEV-2509 - Java Northbound REST API > POST /api/Device/FindDeviceAdvanced > non-existing domain > Irrelevant search result returned

  • DEV-2484 - Java Northbound REST API > POST /api/Task/Pending/Transaction > Incorrect "TransactionId" > Error code 100 returned

  • DEV-2524 - Java Northbound API > SOAP > "FTCreateGroupUpdate" > "Source type"="1" > An error occurred

  • FRD-10258 align Group Update periods and condition validation

    Align CreateGroupUpdate/CreateGroupUpdateCondition with FRD-10258 and the oneiot reference. Periods live only under Activation: the dead top-level UpdateGroup.Period input field is removed and details responses now return periods under Activation, mirroring the create shape per FRD 7.7. Condition filters gain per-family operator validation (fail-closed 203 instead of the silent coercion of unknown operators to Equal), correct date operator mapping (Day/Before/After to OnDay/PriorTo/LaterThan; Between composed as an inclusive LaterThan+PriorTo pair since shared-dto has no Between), range separator hardening (en-dash or hyphen, malformed 203), Domain All handling (empty value required, maps to the all-domains hierarchy branch instead of NumberFormat crash), an explicit validator call on the SOAP createCondition path, and a size cap on condition arrays. Random placement and the flat TasksList shape stay canonical per the reference; both FRD deviations are documented on the Group update pages.

    refs(FRD-10258)

  • DEV-2620 - Java Northbound REST API > PUT api/Userinfo > "latitude" / "longitude" > Values are not set

  • DEV-2622 - Java Northbound REST API > POST /api/Device/Activity > "AmountOfDays" = string > HTTP code 500 returned

  • DEV-2623 - Java Northbound REST API > POST /api/Device/History > Incorrect "EventTypeValueChange" > HTTP code 500 returned

  • DEV-2618 - Java Northbound REST API > POST /api/Task/Pending/Transaction > "TransactionId" = non-pending task > Error code 100 returned

Documentation

  • Update antora version to 1.0.1 (dev)

  • DEV-2145 - Java Northbound API > REST/SOAP > Group update methods > Descriptions are absent

  • Expand changelog index with release format guide

  • DEV-2252 - Java Northbound API > REST/SOAP > /iot-webservice/iotw/GroupUpdate/condition/items > Request is missing

  • Update antora version to 1.0.1

  • Add changelog for release 1.0.1

  • Update antora version to 1.0.2 (dev)

  • Document iotw datasource environment variables

    The Group Update API relies on a second 'iotw' datasource (OneIoT web back-end schema), but the docs only listed non-existent IOTW_DATABASE_* variables that the application never reads.

    Document the real variables driving the iotw datasource: - MySQL: MYSQL_SCHEMA_IOTW, MYSQL_URL_IOTW (shares host/port/credentials with the ACS datasource) - Oracle: ORACLE_USER_IOTW/ORACLE_PASSWORD_IOTW plus the now-split ORACLE_USER_FTACS/ORACLE_PASSWORD_FTACS accounts

    + Update the .env examples and variable tables in installation.adoc and rewrite the IOTW section in configuration.adoc, replacing the bogus IOTW_DATABASE_* names with a profile-driven explanation.

  • DEV-2298 - Java Northbound API > SOAP > Docs Portal > Absent Group Update methods

  • DEV-2416 - Java Northbound API > SOAP > FTAddObject > "Name" is absent > Incorrect response code 203 must be 204

  • DEV-2458 - Java Northbound REST API > PUT /api/Parameter > empty or absent "Name" > Incorrect message returned

  • Update antora version to 1.0.2

  • Update antora version to 1.0.3 (dev)

  • Add changelog for release 1.0.2

Chores

  • DEV-2143 - Java Northbound API > STUN enabled and configured > POST /api/Device/ActiveConnection > Incorrect active connection is returned for "UDPConnectionRequestAddress"

  • DEV-2148 - Java Northbound API > STUN disabled > Local IP "ConnectionRequestURL" > Global connection exists > POST /api/Device/ActiveConnection > Incorrect active connection is returned

  • Bump version to 1.0.2

Refactoring

  • Move deviceTemplatesPath from FTApiConfig to FtAcsApiClient constructor

    • Removed deviceTemplatesPath from FTApiConfig and injected it directly into FtAcsApiClient via constructor.

    • Updated tests and usage references accordingly.

Performance

  • Build jar in job and pack via Dockerfile.simple

    Gradle was building inside docker build, so dependencies were re-fetched on every run: type=gha caches only Docker layers, not the BuildKit cache mount holding the Gradle cache, which did not survive builder recreation on the self-hosted runner. Combined with a double Gradle run and a 210MB build context (build/ and .gradle/ not ignored), this hit the 20-minute timeout.

    Build the boot jar in a job step with actions/setup-java and gradle/actions/setup-gradle for a reliable native ~/.gradle cache, then let Dockerfile.simple only COPY the jar. Drop the now-unused build secrets and pass GitHub Packages credentials via env. Trim the build context by ignoring build/ (keeping the boot jar) and .gradle/.

    Also pass workflow inputs through env in the tag-prep step to avoid shell injection.

Tests

  • DEV-2426 - Java Northbound API > SOAP > FTSetDeviceParameters > More than one parameter > One parameter name is empty / absent > Server returned HTTP response code: 500

  • DEV-2480 - Java Northbound REST API > POST /api/Parameter > Incorrect "ModelName" and / or "Oui" > Incorrect error code returned

CI

  • Set cache-to to ignore errors in build-callable workflow

Docker Images

northbound-api

Image

hub.friendly-tech.com/api/northbound-api:v1.0.2-b0.0.1

SHA256

sha256:c670f5312f189518308adb4a8f1c126d0732c48b5b7053dc6c83cef03867d26a

Pull from Registry

docker pull hub.friendly-tech.com/api/northbound-api:v1.0.2-b0.0.1

Download for Offline Use

docker pull hub.friendly-tech.com/api/northbound-api:v1.0.2-b0.0.1
docker save hub.friendly-tech.com/api/northbound-api:v1.0.2-b0.0.1 -o northbound-api-v1.0.2-b0.0.1.tar

gzip northbound-api-v1.0.2-b0.0.1.tar

Load on Closed Network

gunzip northbound-api-v1.0.2-b0.0.1.tar.gz
docker load -i northbound-api-v1.0.2-b0.0.1.tar

Dependencies

  • ACS → FT Configs Service v1.0.1-b0.0.1

  • FT Configs UI → FT Configs Service v1.0.1-b0.0.1

  • Northbound API → ACS v7.1.1-b0.0.1

  • FT Device Network → ACS v7.1.1-b0.0.1

  • FT Device Network → UI Backend v7.1.1-b0.0.1

  • UI Portals → UI Backend v7.1.1-b0.0.1

  • UI AI Agent → UI Backend v7.1.1-b0.0.1

  • UI AI Agent → FT Device Network v1.0.2-b0.0.1

  • UI Backend → ACS v7.1.1-b0.0.1