-
Notifications
You must be signed in to change notification settings - Fork 111
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
implement initial discover service #4665
base: main
Are you sure you want to change the base?
Conversation
go.mod
Outdated
@@ -431,3 +431,5 @@ require ( | |||
github.com/ziutek/mymysql v1.5.4 // indirect | |||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e | |||
) | |||
|
|||
replace go.viam.com/api => github.com/johnn193/api v0.0.0-20241231164642-99f059defc82 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
will revert once api is merged
services/discovery/server_test.go
Outdated
return discovery.NewRPCServiceServer(injectSvc).(pb.DiscoveryServiceServer), injectDiscovery, injectDiscovery2, nil | ||
} | ||
|
||
func TestDiscoveryDo(t *testing.T) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
since this is literally copy/paste from the generic service I should probably remove this test, but I'm also fine with leaving it in case we are worried this will somehow break
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is good to test all APIs of a service to ensure that there is adequate coverage. I can't imagine it breaking - but say someone with no context joins viam in the future and removes the DoCommands accidentally - good to have all these tests fail :) . It does not have to be separate from your other test, you can add an injected DoCommand to the injected service in your test.
Good test to have with DoComamnd are: 1. test that it returns errors if no DoCommand is implemented with resource.Named, and 2. responds with the expected responses when a DoCommand is implemented.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah I just copied the testing structure that other services had, which is why it was separate. Moved all tests into the same test function based on feedback.
services/discovery/server_test.go
Outdated
// this was taken from proto_conversion_test.go | ||
// | ||
//nolint:thelper | ||
func validateComponent(t *testing.T, actual, expected resource.Config) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is the same function as in proto_conversion_test.go
unsure if theres a good spot to put this function to use it in both spots, or if its fine to leave here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good with a few nits. I think we use pointers when we want to return structs very fast, check with Nick S if that return type should be changed to just an array of resource.Configs
rather than an array of pointers.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few nits - almost there!
DiscoverResourcesFunc func(ctx context.Context, extra map[string]any) ([]resource.Config, error) | ||
DoFunc func(ctx context.Context, cmd map[string]interface{}) (map[string]interface{}, error) | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We also usually have a New
function for the injected resource. Maybe this wasn't added to all of the inject utils, but it's good the add to create a new injected service - usually takes a name - here's an example of implementation:
Line 30 in a8263b2
func NewBase(name string) *Base { |
@@ -101,18 +101,22 @@ func usageCostTypeToProto(costType UsageCostType) pb.UsageCostType { | |||
case UsageCostTypeUnspecified: | |||
return pb.UsageCostType_USAGE_COST_TYPE_UNSPECIFIED | |||
case UsageCostTypeDataUpload: | |||
//nolint:deprecated,staticcheck |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jr22, heads up, we're adding points here to unblock John's pr so the linter doesn't yell at uss - I see the API pr deprecating these constants was merged yesterday https://github.com/viamrobotics/api/pull/612/files
if err != nil { | ||
return nil, err | ||
} | ||
discoveredConfigs := []resource.Config{} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move this above line 64 so it's closer to where it's populated.
workingDiscovery := &inject.DiscoveryService{} | ||
failingDiscovery := &inject.DiscoveryService{} | ||
|
||
testComponents := []resource.Config{createTestComponent("component-1"), createTestComponent("component-2")} | ||
|
||
workingDiscovery.DiscoverResourcesFunc = func(ctx context.Context, extra map[string]any) ([]resource.Config, error) { | ||
return testComponents, nil | ||
} | ||
failingDiscovery.DiscoverResourcesFunc = func(ctx context.Context, extra map[string]any) ([]resource.Config, error) { | ||
return nil, errDiscoverFailed | ||
} | ||
workingDiscovery.DoFunc = testutils.EchoFunc | ||
failingDiscovery.DoFunc = func( | ||
ctx context.Context, | ||
cmd map[string]interface{}, | ||
) ( | ||
map[string]interface{}, | ||
error, | ||
) { | ||
return nil, errDoFailed | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like this organization better because the working service and failing service functions are grouped together - but if you like yours please feel free to leave as is and resolve this comment. Very minor point here as this is a test.
workingDiscovery := &inject.DiscoveryService{} | |
failingDiscovery := &inject.DiscoveryService{} | |
testComponents := []resource.Config{createTestComponent("component-1"), createTestComponent("component-2")} | |
workingDiscovery.DiscoverResourcesFunc = func(ctx context.Context, extra map[string]any) ([]resource.Config, error) { | |
return testComponents, nil | |
} | |
failingDiscovery.DiscoverResourcesFunc = func(ctx context.Context, extra map[string]any) ([]resource.Config, error) { | |
return nil, errDiscoverFailed | |
} | |
workingDiscovery.DoFunc = testutils.EchoFunc | |
failingDiscovery.DoFunc = func( | |
ctx context.Context, | |
cmd map[string]interface{}, | |
) ( | |
map[string]interface{}, | |
error, | |
) { | |
return nil, errDoFailed | |
} | |
testComponents := []resource.Config{createTestComponent("component-1"), createTestComponent("component-2")} | |
workingDiscovery := &inject.DiscoveryService{} | |
workingDiscovery.DiscoverResourcesFunc = func(ctx context.Context, extra map[string]any) ([]resource.Config, error) { | |
return testComponents, nil | |
} | |
workingDiscovery.DoFunc = testutils.EchoFunc | |
failingDiscovery := &inject.DiscoveryService{} | |
failingDiscovery.DiscoverResourcesFunc = func(ctx context.Context, extra map[string]any) ([]resource.Config, error) { | |
return nil, errDiscoverFailed | |
} | |
failingDiscovery.DoFunc = func( | |
ctx context.Context, | |
cmd map[string]interface{}, | |
) ( | |
map[string]interface{}, | |
error, | |
) { | |
return nil, errDoFailed | |
} |
Initial implementation of the discover service in Go. Currently working on GetModelsFromModules in a separate branch to make it easier on reviewers
ticket: https://viam.atlassian.net/browse/RSDK-9620