-
Notifications
You must be signed in to change notification settings - Fork 178
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
fix(app,robot-server): Account for failed commands not having a pipetteId #16859
Conversation
# todo(mm, 2024-11-15): Are all of these pass-through methods helpful? | ||
# Can we delete them and make callers just call .run_orchestrator.play(), etc.? | ||
|
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.
@TamarZanzouri Is this a good idea, or does this conflict with any future vision you had for the orchestrator stuff?
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.
DIscussed in-person. I think we're both a little confused about this, but:
RunOrchestratorStore
is largely a glorified RunOrchestrator | None
variable. And from that perspective, yes, all of these methods are redundant boilerplate, not offering any abstraction. We can replace RunOrchestrator.foo()
with RunOrchestrator.run_orchestrator.foo()
without losing anything.
There is then a question of, well, why even have RunOrchestratorStore
. The answer is that other than all of these wrapper methods, it also provides access to a "default RunOrchestrator
" for the "stateless command" endpoints, and it gates that access behind there not already being some other, run-controlled, RunOrchestrator
already active. That is a good thing for the server to do, but I wonder if it still makes sense at this layer, now that we have maintenance runs. We might want one higher-level thing mediating between runs, maintenance runs, and stateless commands.
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 stateless commands are not a thing we use anymore I'm pretty sure - we replaced them with maintenance runs because it turns out we need state for most stuff we want to do.
e71f740
to
fab4401
Compare
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 to me and makes sense.
# todo(mm, 2024-11-15): Are all of these pass-through methods helpful? | ||
# Can we delete them and make callers just call .run_orchestrator.play(), etc.? | ||
|
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 stateless commands are not a thing we use anymore I'm pretty sure - we replaced them with maintenance runs because it turns out we need state for most stuff we want to do.
Overview
Closes RQA-3599.
Test Plan and Hands on Testing
GET
requests to/runs/{id}/currentState
throughout a run and watch the newtipState
field change over time. Make sure it's correct.Changelog
Expose the robot's idea of whether there's a tip logically attached, via the
GET /runs/{id}/currentState
endpoint.Use that to replace some code in the frontend that was reading command-level information to try to get the
pipetteId
involved in an error.That code could not account for gripper failures, where the failed
moveLabware
command does not have apipetteId
. That's what was causing RQA-3599.Review requests
See comments below.
Risk assessment
Low?