Skip to content

Conversation

@martacarbone
Copy link

@martacarbone martacarbone commented Nov 6, 2025

Motivation

When running arduino-app-cli version instead of only returning the version of the currently run executable (the CLI) we should also return the version of the server (the daemon/service running and waiting for HTTP API requests).

Change description

This change make a version request to the running daemon and adds the output to the arduino-app-cli version command.
It also adds "daemon_version" and rename "appName" to "name" from the json output.

Additional Notes

Test done with a daemon with version 8.8.8-server-dev running on port 8080. The output is:

% ./arduino-app-cli version
Warning: cannot get the running daemon version on localhost:8800

Arduino App CLI version 0.0.0-dev
% ./arduino-app-cli version --port 8080
Arduino App CLI version 0.0.0-dev
daemon version: 8.8.8-server-dev
./arduino-app-cli version --format=json 
{
  "name": "Arduino App CLI",
  "version": "0.0.0-dev",
  "warnings": [
    "Warning: cannot get the running daemon version on localhost:8800\n"
  ]
}
% ./arduino-app-cli version --port 8080 --format=json
{
  "name": "Arduino App CLI",
  "version": "0.0.0-dev",
  "daemon_version": "8.8.8-server-dev"
}
./arduino-app-cli version  --port 1234 
Warning: cannot get the running daemon version on localhost:1234

Arduino App CLI version 0.0.0-dev

The http server part is unaffected:

% curl http://localhost:8080/v1/version
{"version":"8.8.8-server-dev"}

Reviewer checklist

  • PR addresses a single concern.
  • PR title and description are properly filled.
  • Changes will be merged in main.
  • Changes are covered by tests.
  • Logging is meaningful in case of troubleshooting.

@CLAassistant
Copy link

CLAassistant commented Nov 6, 2025

CLA assistant check
All committers have signed the CLA.

Copy link
Contributor

@lucarin91 lucarin91 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, I added some minor suggestions to make it more readable (in my opinion)

@per1234 per1234 added the enhancement New feature or request label Nov 8, 2025
Copy link
Contributor

@dido18 dido18 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rename the serverVersion into daemonVersion all over the place

return net.JoinHostPort(h, p), nil
}

func getServerVersion(httpClient http.Client, url string) string {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be useful to log DEBUG/WARN message with the error of this check.

Proposal:
The function returns a string, error.
If there is an error, the caller logs it, assigns the "empty" daemon version and prints a generic "error on get daemon version" in the cli response.

}

if daemonVersion == "" {
return result, fmt.Errorf("cannot connect to %s", hostAndPort)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This hardcoded error could be misleading if it's not a connection error.
See the proposal to return the error and log it in the comment below

AppName string `json:"appName"`
Version string `json:"version"`
Name string `json:"name"`
ClientVersion string `json:"client_version"`
Copy link
Contributor

@dido18 dido18 Nov 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This client_version is a breaking change in the JSON response.

Current:

GET http://127.0.0.1:8800/v1/version
{
"version":"v0.2.3"
}

Proposal: leave the version and add the name and daemon_version

GET http://127.0.0.1:8800/v1/version
{
"name": "Arduino App CLI",
"version":"v0.2.3"
"daemon_version": "v0.2.3"  
}

Comment on lines 136 to 137
serverMessage := fmt.Sprintf("%s client version %s",
ProgramName, r.ClientVersion)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
serverMessage := fmt.Sprintf("%s client version %s",
ProgramName, r.ClientVersion)
serverMessage := fmt.Sprintf("%s client version %s", ProgramName, r.ClientVersion)

Comment on lines 140 to 141
serverMessage = fmt.Sprintf("%s\ndaemon version: %s",
serverMessage, r.DaemonVersion)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
serverMessage = fmt.Sprintf("%s\ndaemon version: %s",
serverMessage, r.DaemonVersion)
serverMessage = fmt.Sprintf("%s\ndaemon version: %s", serverMessage, r.DaemonVersion)


// Leverage the http.Client's RoundTripper
// to return a canned response and bypass network calls.
type Tripper func(*http.Request) (*http.Response, error)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I usually prefer using the httptest module instead of mocking the http client

Comment on lines +106 to +107
resultMessage = fmt.Sprintf("%s\ndaemon version: %s",
resultMessage, r.DaemonVersion)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit

Suggested change
resultMessage = fmt.Sprintf("%s\ndaemon version: %s",
resultMessage, r.DaemonVersion)
resultMessage = fmt.Sprintf("%s\ndaemon version: %s", resultMessage, r.DaemonVersion)

martacarbone and others added 3 commits November 11, 2025 10:59
Co-authored-by: Luca Rinaldi <l.rinaldi@arduino.cc>
Co-authored-by: Luca Rinaldi <l.rinaldi@arduino.cc>
Co-authored-by: Luca Rinaldi <l.rinaldi@arduino.cc>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve the arduino-app-cli version command by adding the "server version"

6 participants