balena-io / open-balena-api

The core API of openBalena
https://balena.io/open
GNU Affero General Public License v3.0
58 stars 29 forks source link

v14.17.0 causes `balena device <uuid>` command to fail #1610

Closed maurits-inuits closed 5 months ago

maurits-inuits commented 5 months ago

Hi

During the recent upgrade of our API, we encountered an issue with the balena device <uuid> command in the Balena CLI. The command has stopped functioning as expected:

➜  ~ balena device d783166
BalenaRequestError: Request error: The request was unsuccessful

Additional information may be available with the `--debug` flag.

For further help or support, visit:
https://www.balena.io/docs/reference/balena-cli/#support-faq-and-troubleshooting

This also caused the following error message in the API logs (full version below):

GET SyntaxError: Could not resolve relationship mapping from 'device' to 'is web accessible'

We did some testing across multiple versions of the balena CLI (16.x.x, 17.x.x, 18.x.x), and the issue persists across all tested versions . This suggests that the problem is not specific to a particular version of the Balena CLI.

Upon further investigation, we have traced the origin of the issue to the API itself. It appears that the introduction of v14.17.0 is what caused the command to stop working. This version added v6 hooks and translations. ( https://github.com/balena-io/open-balena-api/releases/tag/v14.17.0 )

From what I understand Balena Cloud attributes like is web accessible were previously handled by a shim and this somehow broke in v14.17.0. I'm not really familiar with the API codebase so I hope some of the developers can shed some light on.


Full API error message:

Apr 18 13:11:46 9283533da890 api[1667]: Failed to translate url:  {                                                                                                                           
Apr 18 13:11:46 9283533da890 api[1667]:         "resource": "device",                                                                                                                         
Apr 18 13:11:46 9283533da890 api[1667]:         "options": {                                                                                                                                  
Apr 18 13:11:46 9283533da890 api[1667]:                 "$select": {
Apr 18 13:11:46 9283533da890 api[1667]:                         "properties": [
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "device_name",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "id",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "overall_status",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "is_online",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "ip_address",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "mac_address",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "last_connectivity_event",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "uuid", 
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },                                                                                                                    
Apr 18 13:11:46 9283533da890 api[1667]:                                 {                                                                                                                     
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "supervisor_version",                                                                                 
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null                                                                                              
Apr 18 13:11:46 9283533da890 api[1667]:                                 },                                                                                                                    
Apr 18 13:11:46 9283533da890 api[1667]:                                 {                                                                                                                     
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "is_web_accessible",                                                                                  
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "note", 
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "os_version",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "memory_usage",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "memory_total",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "public_address",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "storage_block_device",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "storage_usage",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "storage_total",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "cpu_usage",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "cpu_temp",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "cpu_id",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "is_undervolted",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                         ]
Apr 18 13:11:46 9283533da890 api[1667]:                 },
Apr 18 13:11:46 9283533da890 api[1667]:                 "$filter": [
Apr 18 13:11:46 9283533da890 api[1667]:                         "call",
Apr 18 13:11:46 9283533da890 api[1667]:                         {
Apr 18 13:11:46 9283533da890 api[1667]:                                 "args": [
Apr 18 13:11:46 9283533da890 api[1667]:                                         {
Apr 18 13:11:46 9283533da890 api[1667]:                                                 "name": "uuid",
Apr 18 13:11:46 9283533da890 api[1667]:                                                 "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                         },
Apr 18 13:11:46 9283533da890 api[1667]:                                         {
Apr 18 13:11:46 9283533da890 api[1667]:                                                 "bind": 0
Apr 18 13:11:46 9283533da890 api[1667]:                                         }
Apr 18 13:11:46 9283533da890 api[1667]:                                 ],
Apr 18 13:11:46 9283533da890 api[1667]:                                 "method": "startswith"
Apr 18 13:11:46 9283533da890 api[1667]:                         }
Apr 18 13:11:46 9283533da890 api[1667]:                 ],
Apr 18 13:11:46 9283533da890 api[1667]:                 "$expand": {
Apr 18 13:11:46 9283533da890 api[1667]:                         "properties": [
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "belongs_to__application",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null,
Apr 18 13:11:46 9283533da890 api[1667]:                                         "count": null,
Apr 18 13:11:46 9283533da890 api[1667]:                                         "options": {
Apr 18 13:11:46 9283533da890 api[1667]:                                                 "$select": {
Apr 18 13:11:46 9283533da890 api[1667]:                                                         "properties": [
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "name": "app_name",
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "name": "slug",
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                                                         ]
Apr 18 13:11:46 9283533da890 api[1667]:                                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                                         }
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "is_of__device_type",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null,
Apr 18 13:11:46 9283533da890 api[1667]:                                         "count": null,
Apr 18 13:11:46 9283533da890 api[1667]:                                         "options": {
Apr 18 13:11:46 9283533da890 api[1667]:                                                 "$select": {
Apr 18 13:11:46 9283533da890 api[1667]:                                                         "properties": [
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "name": "slug",
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                                                         ]
Apr 18 13:11:46 9283533da890 api[1667]:                                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                                         }
Apr 18 13:11:46 9283533da890 api[1667]:                                 },
Apr 18 13:11:46 9283533da890 api[1667]:                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                         "name": "is_running__release",
Apr 18 13:11:46 9283533da890 api[1667]:                                         "property": null,
Apr 18 13:11:46 9283533da890 api[1667]:                                         "count": null,
Apr 18 13:11:46 9283533da890 api[1667]:                                         "options": {
Apr 18 13:11:46 9283533da890 api[1667]:                                                 "$select": {
Apr 18 13:11:46 9283533da890 api[1667]:                                                         "properties": [
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 {
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "name": "commit",
Apr 18 13:11:46 9283533da890 api[1667]:                                                                         "property": null
Apr 18 13:11:46 9283533da890 api[1667]:                                                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                                                         ]
Apr 18 13:11:46 9283533da890 api[1667]:                                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                                         }
Apr 18 13:11:46 9283533da890 api[1667]:                                 }
Apr 18 13:11:46 9283533da890 api[1667]:                         ]
Apr 18 13:11:46 9283533da890 api[1667]:                 }
Apr 18 13:11:46 9283533da890 api[1667]:         }
Apr 18 13:11:46 9283533da890 api[1667]: } GET SyntaxError: Could not resolve relationship mapping from 'device' to 'is web accessible'
Apr 18 13:11:46 9283533da890 api[1667]:     at OData2AbstractSQL.ResolveRelationship (/usr/src/app/node_modules/@balena/odata-to-abstract-sql/src/odata-to-abstract-sql.ts:963:10)
Apr 18 13:11:46 9283533da890 api[1667]:     at OData2AbstractSQL.ReferencedField (/usr/src/app/node_modules/@balena/odata-to-abstract-sql/src/odata-to-abstract-sql.ts:1057:37)
Apr 18 13:11:46 9283533da890 api[1667]:     at OData2AbstractSQL.AliasSelectField (/usr/src/app/node_modules/@balena/odata-to-abstract-sql/src/odata-to-abstract-sql.ts:1039:32)
Apr 18 13:11:46 9283533da890 api[1667]:     at /usr/src/app/node_modules/@balena/odata-to-abstract-sql/src/odata-to-abstract-sql.ts:1006:24
Apr 18 13:11:46 9283533da890 api[1667]:     at Array.map (<anonymous>)
Apr 18 13:11:46 9283533da890 api[1667]:     at OData2AbstractSQL.AddSelectFields (/usr/src/app/node_modules/@balena/odata-to-abstract-sql/src/odata-to-abstract-sql.ts:1006:5)
Apr 18 13:11:46 9283533da890 api[1667]:     at OData2AbstractSQL.PathSegment (/usr/src/app/node_modules/@balena/odata-to-abstract-sql/src/odata-to-abstract-sql.ts:701:9)
Apr 18 13:11:46 9283533da890 api[1667]:     at OData2AbstractSQL.match (/usr/src/app/node_modules/@balena/odata-to-abstract-sql/src/odata-to-abstract-sql.ts:423:24)
Apr 18 13:11:46 9283533da890 api[1667]:     at /usr/src/app/node_modules/@balena/pinejs/src/sbvr-api/uri-parser.ts:172:43
Apr 18 13:11:46 9283533da890 api[1667]:     at /usr/src/app/node_modules/es5-ext/function/#/partial.js:12:16
Apr 18 13:11:46 9283533da890 api[1667]:     at /usr/src/app/node_modules/memoizee/lib/configure-map.js:61:24
Apr 18 13:11:46 9283533da890 api[1667]:     at /usr/src/app/node_modules/memoizee/lib/weak.js:87:21
Apr 18 13:11:46 9283533da890 api[1667]:     at /usr/src/app/node_modules/@balena/pinejs/src/sbvr-api/uri-parser.ts:253:50
Apr 18 13:11:46 9283533da890 api[1667]:     at Object.translateUri (/usr/src/app/node_modules/@balena/pinejs/src/sbvr-api/uri-parser.ts:419:28)
Apr 18 13:11:46 9283533da890 api[1667]:     at prepareRequest (/usr/src/app/node_modules/@balena/pinejs/src/sbvr-api/sbvr-utils.ts:1313:48)
Apr 18 13:11:46 9283533da890 api[1667]:     at async /usr/src/app/node_modules/@balena/pinejs/src/sbvr-api/sbvr-utils.ts:1330:16
Apr 18 13:11:46 9283533da890 api[1667]: 2024-04-18T11:11:46.630Z 172.20.0.1 a/2 GET /v6/device?$filter=startswith(uuid,%27416fa9e%27)&$select=device_name,id,overall_status,is_online,ip_address,mac_address,last_connectivity_event,uuid,supervisor_version,is_web_accessible,note,os_version,memory_usage,memory_total,public_address,storage_block_device,storage_usage,storage_total,cpu_usage,cpu_temp,cpu_id,is_undervolted&$expand=belongs_to__application($select=app_name,slug),is_of__device_type($select=slug),is_running__release($select=commit) 500 44.728ms balena-sdk/17.12.1
thgreasi commented 5 months ago

Hi, Thanks for raising this and the detailed report about it. It seems that this was an accidental change. #1611 should fix this issue.

Kind regards, Thodoris

maurits-inuits commented 5 months ago

Many thanks for quick response. Looking forward to the next release!

thgreasi commented 5 months ago

Fixed by https://github.com/balena-io/open-balena-api/pull/1611