Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose client tools auto update for find endpoint #46785

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

vapopov
Copy link
Contributor

@vapopov vapopov commented Sep 19, 2024

In this PR added exposing client auto update fields (is enabled, and required client tools version for update)

Related: https://github.com/gravitational/teleport/pull/39805/files#diff-8d3c0408dd826f27e9f13cd15f09f4d7e89202862f0b13ce131a2e3072c2a40dR49-R53

@vapopov vapopov force-pushed the vapopov/add-webapi-find-autoupdate-fields branch from 21709ac to 61b2b93 Compare September 19, 2024 20:29
Copy link
Contributor

@rosstimothy rosstimothy left a comment

Choose a reason for hiding this comment

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

Can you add test coverage?

}, nil
}

autoUpdateConfig, err := h.GetAccessPoint().GetAutoUpdateConfig(r.Context())
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: the auth preference above is retrieved using h.cfg.AccessPoint, let's pick one and be consistent

Comment on lines 300 to 303
// ToolsVersion defines the version of {tsh, tctl} for client auto update.
ToolsVersion string `json:"tools_version"`
// ToolsAutoupdate enables client auto update feature.
ToolsAutoupdate bool `json:"tools_autoupdate"`
Copy link
Contributor

Choose a reason for hiding this comment

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

Should the auto update information all be contained within another struct instead of adding each individual field to the response?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

grouping fields to another struct would be better, will change this one

}

autoUpdateConfig, err := h.GetAccessPoint().GetAutoUpdateConfig(r.Context())
if err != nil && !trace.IsNotFound(err) {
Copy link
Contributor

Choose a reason for hiding this comment

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

I think it may also be possible to get a NotImplemented error back if the Proxy is newer than Auth. Even though this should be reading from the cache most of the time, a cluster admin can disable the cache, in which case this would make an RPC request to the old auth instance that doesn't implement the autoupdate service.

Comment on lines 1533 to 1540
return nil, trace.Wrap(err)
} else if err == nil {
response.ToolsAutoupdate = autoUpdateConfig.GetSpec().GetToolsAutoupdate()
}

autoUpdateVersion, err := h.GetAccessPoint().GetAutoUpdateVersion(r.Context())
if err != nil && !trace.IsNotFound(err) {
return nil, trace.Wrap(err)
Copy link
Contributor

Choose a reason for hiding this comment

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

Should failing to retrieve auto update information prevent the response entirely?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I added logging instead, but we might generate a lot of log messages with this error message in frequent requests to this endpoint

Log error instead returning error
Add tests auto update settings in find endpoint
Add check for not implemented error
// ToolsVersion defines the version of {tsh, tctl} for client auto update.
ToolsVersion string `json:"tools_version"`
// ToolsAutoupdate enables client auto update feature.
ToolsAutoupdate bool `json:"tools_autoupdate"`
Copy link
Contributor

Choose a reason for hiding this comment

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

The json tag for the AutoUpdate field in the PingResponse is auto_update - we should be consistent with the tag here.

Suggested change
ToolsAutoupdate bool `json:"tools_autoupdate"`
ToolsAutoUpdate bool `json:"tools_auto_update"`

}

autoUpdateConfig, err := h.cfg.AccessPoint.GetAutoUpdateConfig(r.Context())
// TODO(vapopov) DELETE IN v18.0.0
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: make the deletion note clearer that its only the not found and not implemented checks that should be removed in v18

}

autoUpdateVersion, err := h.cfg.AccessPoint.GetAutoUpdateVersion(r.Context())
// TODO(vapopov) DELETE IN v18.0.0
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: make the deletion note clearer that its only the not found and not implemented checks that should be removed in v18

Comment on lines 288 to 289
assert.True(t, pr.AutoUpdate.ToolsAutoupdate, "tools_autoupdate must be enabled")
assert.Equal(t, teleport.Version, pr.AutoUpdate.ToolsVersion, "tools_version must be equal to current version")
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: decouple the json tags from the message

Suggested change
assert.True(t, pr.AutoUpdate.ToolsAutoupdate, "tools_autoupdate must be enabled")
assert.Equal(t, teleport.Version, pr.AutoUpdate.ToolsVersion, "tools_version must be equal to current version")
assert.True(t, pr.AutoUpdate.ToolsAutoupdate, "tools auto update must be enabled")
assert.Equal(t, teleport.Version, pr.AutoUpdate.ToolsVersion, "tools version must be equal to current version")

_, err = env.server.Auth().UpsertAutoUpdateVersion(ctx, version)
require.NoError(t, err)

req, err := http.NewRequest(http.MethodGet, proxy.newClient(t).Endpoint("webapi", "find"), nil)
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: add a test case that covers the default values when none of the auto update configurations are populated or there is an error retrieving the configurations?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants