From d1894166a4e28f6f33c465571a8becf55cfab042 Mon Sep 17 00:00:00 2001 From: Caleb Hoyoul Kang Date: Wed, 20 Nov 2024 07:02:56 -0700 Subject: [PATCH] chore: revert select all (#10208) --- harness/determined/common/api/bindings.py | 936 +------ master/internal/api_searches.go | 768 ------ master/internal/api_searches_intg_test.go | 1215 --------- proto/buf.image.bin | Bin 665762 -> 652964 bytes proto/pkg/apiv1/api.pb.go | 2164 +++++++---------- proto/pkg/apiv1/api.pb.gw.go | 708 +----- proto/pkg/apiv1/run.pb.go | 248 +- proto/pkg/apiv1/search.pb.go | 1457 ----------- proto/pkg/apiv1/tensorboard.pb.go | 311 +-- proto/src/determined/api/v1/api.proto | 104 +- proto/src/determined/api/v1/run.proto | 30 +- proto/src/determined/api/v1/search.proto | 202 -- proto/src/determined/api/v1/tensorboard.proto | 28 - .../components/ComparisonView.test.mock.tsx | 7 - webui/react/src/components/ComparisonView.tsx | 34 +- .../components/ExperimentActionDropdown.tsx | 1 - .../components/ExperimentCreateModal.test.tsx | 5 +- .../src/components/ExperimentCreateModal.tsx | 4 +- .../src/components/ExperimentMoveModal.tsx | 76 +- ...dal.tsx => ExperimentTensorBoardModal.tsx} | 23 +- .../src/components/LoadableCount.test.tsx | 3 - webui/react/src/components/LoadableCount.tsx | 45 +- .../src/components/RunActionDropdown.tsx | 3 +- ...nFilterInterstitialModalComponent.test.tsx | 4 +- .../RunFilterInterstitialModalComponent.tsx | 15 +- .../src/components/Searches/Searches.tsx | 177 +- webui/react/src/components/TableActionBar.tsx | 152 +- .../src/e2e/models/common/hew/DataGrid.ts | 21 +- .../e2e/models/components/TableActionBar.ts | 2 - .../src/e2e/models/pages/ProjectDetails.ts | 4 +- .../src/e2e/tests/experimentList.spec.ts | 25 +- webui/react/src/hooks/useSelection.ts | 201 -- .../ExperimentDetailsHeader.tsx | 1 - webui/react/src/pages/ExperimentList.tsx | 1 - .../src/pages/F_ExpList/F_ExperimentList.tsx | 205 +- .../FlatRuns/FlatRunActionButton.test.tsx | 3 - .../pages/FlatRuns/FlatRunActionButton.tsx | 58 +- .../pages/FlatRuns/FlatRunMoveModal.test.tsx | 25 +- .../src/pages/FlatRuns/FlatRunMoveModal.tsx | 55 +- webui/react/src/pages/FlatRuns/FlatRuns.tsx | 273 ++- webui/react/src/services/api-ts-sdk/api.ts | 1172 +-------- webui/react/src/services/api.ts | 71 +- webui/react/src/services/apiConfig.ts | 98 - webui/react/src/services/types.ts | 18 - webui/react/src/utils/experiment.ts | 2 +- webui/react/src/utils/task.ts | 19 +- 46 files changed, 1790 insertions(+), 9184 deletions(-) delete mode 100644 master/internal/api_searches.go delete mode 100644 master/internal/api_searches_intg_test.go delete mode 100644 proto/pkg/apiv1/search.pb.go delete mode 100644 proto/src/determined/api/v1/search.proto rename webui/react/src/components/{SearchTensorBoardModal.tsx => ExperimentTensorBoardModal.tsx} (54%) delete mode 100644 webui/react/src/hooks/useSelection.ts diff --git a/harness/determined/common/api/bindings.py b/harness/determined/common/api/bindings.py index b6384d66a20..0602c47a0d9 100644 --- a/harness/determined/common/api/bindings.py +++ b/harness/determined/common/api/bindings.py @@ -1726,40 +1726,36 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: class v1ArchiveRunsRequest(Printable): filter: "typing.Optional[str]" = None - runIds: "typing.Optional[typing.Sequence[int]]" = None def __init__( self, *, projectId: int, + runIds: "typing.Sequence[int]", filter: "typing.Union[str, None, Unset]" = _unset, - runIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, ): self.projectId = projectId + self.runIds = runIds if not isinstance(filter, Unset): self.filter = filter - if not isinstance(runIds, Unset): - self.runIds = runIds @classmethod def from_json(cls, obj: Json) -> "v1ArchiveRunsRequest": kwargs: "typing.Dict[str, typing.Any]" = { "projectId": obj["projectId"], + "runIds": obj["runIds"], } if "filter" in obj: kwargs["filter"] = obj["filter"] - if "runIds" in obj: - kwargs["runIds"] = obj["runIds"] return cls(**kwargs) def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out: "typing.Dict[str, typing.Any]" = { "projectId": self.projectId, + "runIds": self.runIds, } if not omit_unset or "filter" in vars(self): out["filter"] = self.filter - if not omit_unset or "runIds" in vars(self): - out["runIds"] = self.runIds return out class v1ArchiveRunsResponse(Printable): @@ -1785,67 +1781,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1ArchiveSearchesRequest(Printable): - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - projectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.projectId = projectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - - @classmethod - def from_json(cls, obj: Json) -> "v1ArchiveSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - return out - -class v1ArchiveSearchesResponse(Printable): - """Response to ArchiveSearchesRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1SearchActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1ArchiveSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - class v1AssignMultipleGroupsRequest(Printable): """Add and remove multiple users from multiple groups.""" @@ -2147,68 +2082,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1CancelSearchesRequest(Printable): - """Cancel searches.""" - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - projectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.projectId = projectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - - @classmethod - def from_json(cls, obj: Json) -> "v1CancelSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - return out - -class v1CancelSearchesResponse(Printable): - """Response to CancelSearchesRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1SearchActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1CancelSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - class v1Checkpoint(Printable): """Checkpoint a collection of files saved by a task.""" allocationId: "typing.Optional[str]" = None @@ -3374,40 +3247,40 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: class v1DeleteRunsRequest(Printable): """Delete runs.""" filter: "typing.Optional[str]" = None - runIds: "typing.Optional[typing.Sequence[int]]" = None + projectId: "typing.Optional[int]" = None def __init__( self, *, - projectId: int, + runIds: "typing.Sequence[int]", filter: "typing.Union[str, None, Unset]" = _unset, - runIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, + projectId: "typing.Union[int, None, Unset]" = _unset, ): - self.projectId = projectId + self.runIds = runIds if not isinstance(filter, Unset): self.filter = filter - if not isinstance(runIds, Unset): - self.runIds = runIds + if not isinstance(projectId, Unset): + self.projectId = projectId @classmethod def from_json(cls, obj: Json) -> "v1DeleteRunsRequest": kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], + "runIds": obj["runIds"], } if "filter" in obj: kwargs["filter"] = obj["filter"] - if "runIds" in obj: - kwargs["runIds"] = obj["runIds"] + if "projectId" in obj: + kwargs["projectId"] = obj["projectId"] return cls(**kwargs) def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, + "runIds": self.runIds, } if not omit_unset or "filter" in vars(self): out["filter"] = self.filter - if not omit_unset or "runIds" in vars(self): - out["runIds"] = self.runIds + if not omit_unset or "projectId" in vars(self): + out["projectId"] = self.projectId return out class v1DeleteRunsResponse(Printable): @@ -3433,68 +3306,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1DeleteSearchesRequest(Printable): - """Delete searches.""" - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - projectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.projectId = projectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - - @classmethod - def from_json(cls, obj: Json) -> "v1DeleteSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - return out - -class v1DeleteSearchesResponse(Printable): - """Response to DeleteSearchesRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1SearchActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1DeleteSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - class v1DeleteWorkspaceResponse(Printable): """Response to DeleteWorkspaceRequest.""" @@ -7920,43 +7731,39 @@ class v1KillRunsRequest(Printable): """Kill runs.""" filter: "typing.Optional[str]" = None projectId: "typing.Optional[int]" = None - runIds: "typing.Optional[typing.Sequence[int]]" = None def __init__( self, *, + runIds: "typing.Sequence[int]", filter: "typing.Union[str, None, Unset]" = _unset, projectId: "typing.Union[int, None, Unset]" = _unset, - runIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, ): + self.runIds = runIds if not isinstance(filter, Unset): self.filter = filter if not isinstance(projectId, Unset): self.projectId = projectId - if not isinstance(runIds, Unset): - self.runIds = runIds @classmethod def from_json(cls, obj: Json) -> "v1KillRunsRequest": kwargs: "typing.Dict[str, typing.Any]" = { + "runIds": obj["runIds"], } if "filter" in obj: kwargs["filter"] = obj["filter"] if "projectId" in obj: kwargs["projectId"] = obj["projectId"] - if "runIds" in obj: - kwargs["runIds"] = obj["runIds"] return cls(**kwargs) def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out: "typing.Dict[str, typing.Any]" = { + "runIds": self.runIds, } if not omit_unset or "filter" in vars(self): out["filter"] = self.filter if not omit_unset or "projectId" in vars(self): out["projectId"] = self.projectId - if not omit_unset or "runIds" in vars(self): - out["runIds"] = self.runIds return out class v1KillRunsResponse(Printable): @@ -7982,68 +7789,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1KillSearchesRequest(Printable): - """Kill searches.""" - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - projectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.projectId = projectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - - @classmethod - def from_json(cls, obj: Json) -> "v1KillSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - return out - -class v1KillSearchesResponse(Printable): - """Response to KillSearchesRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1SearchActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1KillSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - class v1KillShellResponse(Printable): """Response to KillShellRequest.""" shell: "typing.Optional[v1Shell]" = None @@ -8490,108 +8235,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out["warnings"] = None if self.warnings is None else [x.value for x in self.warnings] return out -class v1LaunchTensorboardSearchesRequest(Printable): - """Request to launch a tensorboard using searches matching a filter.""" - config: "typing.Optional[typing.Dict[str, typing.Any]]" = None - files: "typing.Optional[typing.Sequence[v1File]]" = None - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - templateName: "typing.Optional[str]" = None - workspaceId: "typing.Optional[int]" = None - - def __init__( - self, - *, - config: "typing.Union[typing.Dict[str, typing.Any], None, Unset]" = _unset, - files: "typing.Union[typing.Sequence[v1File], None, Unset]" = _unset, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - templateName: "typing.Union[str, None, Unset]" = _unset, - workspaceId: "typing.Union[int, None, Unset]" = _unset, - ): - if not isinstance(config, Unset): - self.config = config - if not isinstance(files, Unset): - self.files = files - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - if not isinstance(templateName, Unset): - self.templateName = templateName - if not isinstance(workspaceId, Unset): - self.workspaceId = workspaceId - - @classmethod - def from_json(cls, obj: Json) -> "v1LaunchTensorboardSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - } - if "config" in obj: - kwargs["config"] = obj["config"] - if "files" in obj: - kwargs["files"] = [v1File.from_json(x) for x in obj["files"]] if obj["files"] is not None else None - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - if "templateName" in obj: - kwargs["templateName"] = obj["templateName"] - if "workspaceId" in obj: - kwargs["workspaceId"] = obj["workspaceId"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - } - if not omit_unset or "config" in vars(self): - out["config"] = self.config - if not omit_unset or "files" in vars(self): - out["files"] = None if self.files is None else [x.to_json(omit_unset) for x in self.files] - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - if not omit_unset or "templateName" in vars(self): - out["templateName"] = self.templateName - if not omit_unset or "workspaceId" in vars(self): - out["workspaceId"] = self.workspaceId - return out - -class v1LaunchTensorboardSearchesResponse(Printable): - """Response to LaunchTensorboardSearchesRequest.""" - warnings: "typing.Optional[typing.Sequence[v1LaunchWarning]]" = None - - def __init__( - self, - *, - config: "typing.Dict[str, typing.Any]", - tensorboard: "v1Tensorboard", - warnings: "typing.Union[typing.Sequence[v1LaunchWarning], None, Unset]" = _unset, - ): - self.config = config - self.tensorboard = tensorboard - if not isinstance(warnings, Unset): - self.warnings = warnings - - @classmethod - def from_json(cls, obj: Json) -> "v1LaunchTensorboardSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "config": obj["config"], - "tensorboard": v1Tensorboard.from_json(obj["tensorboard"]), - } - if "warnings" in obj: - kwargs["warnings"] = [v1LaunchWarning(x) for x in obj["warnings"]] if obj["warnings"] is not None else None - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "config": self.config, - "tensorboard": self.tensorboard.to_json(omit_unset), - } - if not omit_unset or "warnings" in vars(self): - out["warnings"] = None if self.warnings is None else [x.value for x in self.warnings] - return out - class v1LaunchWarning(DetEnum): """Enum values for warnings when launching commands. - LAUNCH_WARNING_UNSPECIFIED: Default value @@ -9609,24 +9252,22 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: class v1MoveRunsRequest(Printable): """Request to move the run to a different project.""" filter: "typing.Optional[str]" = None - runIds: "typing.Optional[typing.Sequence[int]]" = None skipMultitrial: "typing.Optional[bool]" = None def __init__( self, *, destinationProjectId: int, + runIds: "typing.Sequence[int]", sourceProjectId: int, filter: "typing.Union[str, None, Unset]" = _unset, - runIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, skipMultitrial: "typing.Union[bool, None, Unset]" = _unset, ): self.destinationProjectId = destinationProjectId + self.runIds = runIds self.sourceProjectId = sourceProjectId if not isinstance(filter, Unset): self.filter = filter - if not isinstance(runIds, Unset): - self.runIds = runIds if not isinstance(skipMultitrial, Unset): self.skipMultitrial = skipMultitrial @@ -9634,12 +9275,11 @@ def __init__( def from_json(cls, obj: Json) -> "v1MoveRunsRequest": kwargs: "typing.Dict[str, typing.Any]" = { "destinationProjectId": obj["destinationProjectId"], + "runIds": obj["runIds"], "sourceProjectId": obj["sourceProjectId"], } if "filter" in obj: kwargs["filter"] = obj["filter"] - if "runIds" in obj: - kwargs["runIds"] = obj["runIds"] if "skipMultitrial" in obj: kwargs["skipMultitrial"] = obj["skipMultitrial"] return cls(**kwargs) @@ -9647,12 +9287,11 @@ def from_json(cls, obj: Json) -> "v1MoveRunsRequest": def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out: "typing.Dict[str, typing.Any]" = { "destinationProjectId": self.destinationProjectId, + "runIds": self.runIds, "sourceProjectId": self.sourceProjectId, } if not omit_unset or "filter" in vars(self): out["filter"] = self.filter - if not omit_unset or "runIds" in vars(self): - out["runIds"] = self.runIds if not omit_unset or "skipMultitrial" in vars(self): out["skipMultitrial"] = self.skipMultitrial return out @@ -9680,72 +9319,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1MoveSearchesRequest(Printable): - """Request to move the search to a different project.""" - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - destinationProjectId: int, - sourceProjectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.destinationProjectId = destinationProjectId - self.sourceProjectId = sourceProjectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - - @classmethod - def from_json(cls, obj: Json) -> "v1MoveSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "destinationProjectId": obj["destinationProjectId"], - "sourceProjectId": obj["sourceProjectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "destinationProjectId": self.destinationProjectId, - "sourceProjectId": self.sourceProjectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - return out - -class v1MoveSearchesResponse(Printable): - """Response to MoveSearchesRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1SearchActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1MoveSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - class v1Note(Printable): """Note is a user comment connected to a project.""" @@ -11027,76 +10600,14 @@ class v1PauseExperimentsResponse(Printable): def __init__( self, *, - results: "typing.Sequence[v1ExperimentActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1PauseExperimentsResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1ExperimentActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - -class v1PauseRunsRequest(Printable): - """Request to pause the experiment associated witha run.""" - filter: "typing.Optional[str]" = None - runIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - projectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - runIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.projectId = projectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(runIds, Unset): - self.runIds = runIds - - @classmethod - def from_json(cls, obj: Json) -> "v1PauseRunsRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "runIds" in obj: - kwargs["runIds"] = obj["runIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "runIds" in vars(self): - out["runIds"] = self.runIds - return out - -class v1PauseRunsResponse(Printable): - """Response to PauseRunsRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1RunActionResult]", + results: "typing.Sequence[v1ExperimentActionResult]", ): self.results = results @classmethod - def from_json(cls, obj: Json) -> "v1PauseRunsResponse": + def from_json(cls, obj: Json) -> "v1PauseExperimentsResponse": kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1RunActionResult.from_json(x) for x in obj["results"]], + "results": [v1ExperimentActionResult.from_json(x) for x in obj["results"]], } return cls(**kwargs) @@ -11106,59 +10617,55 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1PauseSearchesRequest(Printable): - """Request to pause the experiment associated witha search.""" +class v1PauseRunsRequest(Printable): + """Request to pause the experiment associated witha run.""" filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None def __init__( self, *, projectId: int, + runIds: "typing.Sequence[int]", filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, ): self.projectId = projectId + self.runIds = runIds if not isinstance(filter, Unset): self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds @classmethod - def from_json(cls, obj: Json) -> "v1PauseSearchesRequest": + def from_json(cls, obj: Json) -> "v1PauseRunsRequest": kwargs: "typing.Dict[str, typing.Any]" = { "projectId": obj["projectId"], + "runIds": obj["runIds"], } if "filter" in obj: kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] return cls(**kwargs) def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out: "typing.Dict[str, typing.Any]" = { "projectId": self.projectId, + "runIds": self.runIds, } if not omit_unset or "filter" in vars(self): out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds return out -class v1PauseSearchesResponse(Printable): - """Response to PauseSearchesRequest.""" +class v1PauseRunsResponse(Printable): + """Response to PauseRunsRequest.""" def __init__( self, *, - results: "typing.Sequence[v1SearchActionResult]", + results: "typing.Sequence[v1RunActionResult]", ): self.results = results @classmethod - def from_json(cls, obj: Json) -> "v1PauseSearchesResponse": + def from_json(cls, obj: Json) -> "v1PauseRunsResponse": kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], + "results": [v1RunActionResult.from_json(x) for x in obj["results"]], } return cls(**kwargs) @@ -14121,40 +13628,36 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: class v1ResumeRunsRequest(Printable): """Request to unpause the experiment associated witha run.""" filter: "typing.Optional[str]" = None - runIds: "typing.Optional[typing.Sequence[int]]" = None def __init__( self, *, projectId: int, + runIds: "typing.Sequence[int]", filter: "typing.Union[str, None, Unset]" = _unset, - runIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, ): self.projectId = projectId + self.runIds = runIds if not isinstance(filter, Unset): self.filter = filter - if not isinstance(runIds, Unset): - self.runIds = runIds @classmethod def from_json(cls, obj: Json) -> "v1ResumeRunsRequest": kwargs: "typing.Dict[str, typing.Any]" = { "projectId": obj["projectId"], + "runIds": obj["runIds"], } if "filter" in obj: kwargs["filter"] = obj["filter"] - if "runIds" in obj: - kwargs["runIds"] = obj["runIds"] return cls(**kwargs) def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out: "typing.Dict[str, typing.Any]" = { "projectId": self.projectId, + "runIds": self.runIds, } if not omit_unset or "filter" in vars(self): out["filter"] = self.filter - if not omit_unset or "runIds" in vars(self): - out["runIds"] = self.runIds return out class v1ResumeRunsResponse(Printable): @@ -14180,68 +13683,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1ResumeSearchesRequest(Printable): - """Request to unpause the experiment associated witha search.""" - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - projectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.projectId = projectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - - @classmethod - def from_json(cls, obj: Json) -> "v1ResumeSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - return out - -class v1ResumeSearchesResponse(Printable): - """Response to ResumeSearchesRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1SearchActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1ResumeSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - class v1Role(Printable): name: "typing.Optional[str]" = None permissions: "typing.Optional[typing.Sequence[v1Permission]]" = None @@ -14592,33 +14033,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out["workspace"] = self.workspace return out -class v1SearchActionResult(Printable): - """Message for results of individual searches in a multi-search action.""" - - def __init__( - self, - *, - error: str, - id: int, - ): - self.error = error - self.id = id - - @classmethod - def from_json(cls, obj: Json) -> "v1SearchActionResult": - kwargs: "typing.Dict[str, typing.Any]" = { - "error": obj["error"], - "id": obj["id"], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "error": self.error, - "id": self.id, - } - return out - class v1SearchExperimentExperiment(Printable): bestTrial: "typing.Optional[trialv1Trial]" = None @@ -16960,40 +16374,36 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: class v1UnarchiveRunsRequest(Printable): filter: "typing.Optional[str]" = None - runIds: "typing.Optional[typing.Sequence[int]]" = None def __init__( self, *, projectId: int, + runIds: "typing.Sequence[int]", filter: "typing.Union[str, None, Unset]" = _unset, - runIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, ): self.projectId = projectId + self.runIds = runIds if not isinstance(filter, Unset): self.filter = filter - if not isinstance(runIds, Unset): - self.runIds = runIds @classmethod def from_json(cls, obj: Json) -> "v1UnarchiveRunsRequest": kwargs: "typing.Dict[str, typing.Any]" = { "projectId": obj["projectId"], + "runIds": obj["runIds"], } if "filter" in obj: kwargs["filter"] = obj["filter"] - if "runIds" in obj: - kwargs["runIds"] = obj["runIds"] return cls(**kwargs) def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: out: "typing.Dict[str, typing.Any]" = { "projectId": self.projectId, + "runIds": self.runIds, } if not omit_unset or "filter" in vars(self): out["filter"] = self.filter - if not omit_unset or "runIds" in vars(self): - out["runIds"] = self.runIds return out class v1UnarchiveRunsResponse(Printable): @@ -17019,67 +16429,6 @@ def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: } return out -class v1UnarchiveSearchesRequest(Printable): - filter: "typing.Optional[str]" = None - searchIds: "typing.Optional[typing.Sequence[int]]" = None - - def __init__( - self, - *, - projectId: int, - filter: "typing.Union[str, None, Unset]" = _unset, - searchIds: "typing.Union[typing.Sequence[int], None, Unset]" = _unset, - ): - self.projectId = projectId - if not isinstance(filter, Unset): - self.filter = filter - if not isinstance(searchIds, Unset): - self.searchIds = searchIds - - @classmethod - def from_json(cls, obj: Json) -> "v1UnarchiveSearchesRequest": - kwargs: "typing.Dict[str, typing.Any]" = { - "projectId": obj["projectId"], - } - if "filter" in obj: - kwargs["filter"] = obj["filter"] - if "searchIds" in obj: - kwargs["searchIds"] = obj["searchIds"] - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "projectId": self.projectId, - } - if not omit_unset or "filter" in vars(self): - out["filter"] = self.filter - if not omit_unset or "searchIds" in vars(self): - out["searchIds"] = self.searchIds - return out - -class v1UnarchiveSearchesResponse(Printable): - """Response to UnarchiveSearchesRequest.""" - - def __init__( - self, - *, - results: "typing.Sequence[v1SearchActionResult]", - ): - self.results = results - - @classmethod - def from_json(cls, obj: Json) -> "v1UnarchiveSearchesResponse": - kwargs: "typing.Dict[str, typing.Any]" = { - "results": [v1SearchActionResult.from_json(x) for x in obj["results"]], - } - return cls(**kwargs) - - def to_json(self, omit_unset: bool = False) -> typing.Dict[str, typing.Any]: - out: "typing.Dict[str, typing.Any]" = { - "results": [x.to_json(omit_unset) for x in self.results], - } - return out - class v1UnbindRPFromWorkspaceRequest(Printable): """Unbind a resource pool to workspaces.""" workspaceIds: "typing.Optional[typing.Sequence[int]]" = None @@ -18221,27 +17570,6 @@ def post_ArchiveRuns( return v1ArchiveRunsResponse.from_json(_resp.json()) raise APIHttpError("post_ArchiveRuns", _resp) -def post_ArchiveSearches( - session: "api.BaseSession", - *, - body: "v1ArchiveSearchesRequest", -) -> "v1ArchiveSearchesResponse": - """Archive searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/archive", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1ArchiveSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_ArchiveSearches", _resp) - def post_ArchiveWorkspace( session: "api.BaseSession", *, @@ -18405,27 +17733,6 @@ def post_CancelExperiments( return v1CancelExperimentsResponse.from_json(_resp.json()) raise APIHttpError("post_CancelExperiments", _resp) -def post_CancelSearches( - session: "api.BaseSession", - *, - body: "v1CancelSearchesRequest", -) -> "v1CancelSearchesResponse": - """Cancel searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/cancel", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1CancelSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_CancelSearches", _resp) - def post_CheckpointsRemoveFiles( session: "api.BaseSession", *, @@ -18940,7 +18247,7 @@ def post_DeleteRuns( *, body: "v1DeleteRunsRequest", ) -> "v1DeleteRunsResponse": - """Delete runs.""" + """Delete a list of runs.""" _params = None _resp = session._do_request( method="POST", @@ -18956,27 +18263,6 @@ def post_DeleteRuns( return v1DeleteRunsResponse.from_json(_resp.json()) raise APIHttpError("post_DeleteRuns", _resp) -def post_DeleteSearches( - session: "api.BaseSession", - *, - body: "v1DeleteSearchesRequest", -) -> "v1DeleteSearchesResponse": - """Delete searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/delete", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1DeleteSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_DeleteSearches", _resp) - def delete_DeleteTemplate( session: "api.BaseSession", *, @@ -22422,27 +21708,6 @@ def post_KillRuns( return v1KillRunsResponse.from_json(_resp.json()) raise APIHttpError("post_KillRuns", _resp) -def post_KillSearches( - session: "api.BaseSession", - *, - body: "v1KillSearchesRequest", -) -> "v1KillSearchesResponse": - """Kill searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/kill", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1KillSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_KillSearches", _resp) - def post_KillShell( session: "api.BaseSession", *, @@ -22603,27 +21868,6 @@ def post_LaunchTensorboard( return v1LaunchTensorboardResponse.from_json(_resp.json()) raise APIHttpError("post_LaunchTensorboard", _resp) -def post_LaunchTensorboardSearches( - session: "api.BaseSession", - *, - body: "v1LaunchTensorboardSearchesRequest", -) -> "v1LaunchTensorboardSearchesResponse": - """Launch a tensorboard for one or more searches using bulk search filters.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/tensorboards", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1LaunchTensorboardSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_LaunchTensorboardSearches", _resp) - def get_ListRPsBoundToWorkspace( session: "api.BaseSession", *, @@ -23030,27 +22274,6 @@ def post_MoveRuns( return v1MoveRunsResponse.from_json(_resp.json()) raise APIHttpError("post_MoveRuns", _resp) -def post_MoveSearches( - session: "api.BaseSession", - *, - body: "v1MoveSearchesRequest", -) -> "v1MoveSearchesResponse": - """Move searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/move", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1MoveSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_MoveSearches", _resp) - def post_NotifyContainerRunning( session: "api.BaseSession", *, @@ -23556,27 +22779,6 @@ def post_PauseRuns( return v1PauseRunsResponse.from_json(_resp.json()) raise APIHttpError("post_PauseRuns", _resp) -def post_PauseSearches( - session: "api.BaseSession", - *, - body: "v1PauseSearchesRequest", -) -> "v1PauseSearchesResponse": - """Pause experiment associated with provided searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/pause", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1PauseSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_PauseSearches", _resp) - def post_PinWorkspace( session: "api.BaseSession", *, @@ -24617,27 +23819,6 @@ def post_ResumeRuns( return v1ResumeRunsResponse.from_json(_resp.json()) raise APIHttpError("post_ResumeRuns", _resp) -def post_ResumeSearches( - session: "api.BaseSession", - *, - body: "v1ResumeSearchesRequest", -) -> "v1ResumeSearchesResponse": - """Unpause experiment associated with provided searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/resume", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1ResumeSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_ResumeSearches", _resp) - def post_RunPrepareForReporting( session: "api.BaseSession", *, @@ -25484,27 +24665,6 @@ def post_UnarchiveRuns( return v1UnarchiveRunsResponse.from_json(_resp.json()) raise APIHttpError("post_UnarchiveRuns", _resp) -def post_UnarchiveSearches( - session: "api.BaseSession", - *, - body: "v1UnarchiveSearchesRequest", -) -> "v1UnarchiveSearchesResponse": - """Unarchive searches.""" - _params = None - _resp = session._do_request( - method="POST", - path="/api/v1/searches/unarchive", - params=_params, - json=body.to_json(True), - data=None, - headers=None, - timeout=None, - stream=False, - ) - if _resp.status_code == 200: - return v1UnarchiveSearchesResponse.from_json(_resp.json()) - raise APIHttpError("post_UnarchiveSearches", _resp) - def post_UnarchiveWorkspace( session: "api.BaseSession", *, diff --git a/master/internal/api_searches.go b/master/internal/api_searches.go deleted file mode 100644 index 2a285c95842..00000000000 --- a/master/internal/api_searches.go +++ /dev/null @@ -1,768 +0,0 @@ -package internal - -import ( - "context" - "database/sql" - "encoding/json" - "fmt" - - "github.com/pkg/errors" - log "github.com/sirupsen/logrus" - "github.com/uptrace/bun" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/determined-ai/determined/master/internal/db" - "github.com/determined-ai/determined/master/internal/experiment" - "github.com/determined-ai/determined/master/internal/grpcutil" - "github.com/determined-ai/determined/master/pkg/model" - "github.com/determined-ai/determined/master/pkg/set" - "github.com/determined-ai/determined/proto/pkg/apiv1" - "github.com/determined-ai/determined/proto/pkg/rbacv1" -) - -type searchCandidateResult struct { - Archived bool - ID int32 - IsTerminal bool -} - -func filterSearchQuery(getQ *bun.SelectQuery, filter *string) (*bun.SelectQuery, error) { - var efr experimentFilterRoot - err := json.Unmarshal([]byte(*filter), &efr) - if err != nil { - return nil, err - } - getQ = getQ.WhereGroup(" AND ", func(q *bun.SelectQuery) *bun.SelectQuery { - _, err = efr.toSQL(q) - return q - }).WhereGroup(" AND ", func(q *bun.SelectQuery) *bun.SelectQuery { - if !efr.ShowArchived { - return q.Where(`NOT e.archived`) - } - return q - }) - if err != nil { - return nil, err - } - return getQ, nil -} - -func getSelectSearchesQueryTables() *bun.SelectQuery { - return db.Bun().NewSelect(). - ModelTableExpr("experiments AS e"). - Join("JOIN projects p ON e.project_id = p.id"). - Join("JOIN workspaces w ON p.workspace_id = w.id") -} - -func (a *apiServer) MoveSearches( - ctx context.Context, req *apiv1.MoveSearchesRequest, -) (*apiv1.MoveSearchesResponse, error) { - curUser, _, err := grpcutil.GetUser(ctx) - if err != nil { - return nil, err - } - // check that user can view source project - srcProject, err := a.GetProjectByID(ctx, req.SourceProjectId, *curUser) - if err != nil { - return nil, err - } - if srcProject.Archived { - return nil, errors.Errorf("project (%v) is archived and cannot have searches moved from it", - srcProject.Id) - } - - // check suitable destination project - destProject, err := a.GetProjectByID(ctx, req.DestinationProjectId, *curUser) - if err != nil { - return nil, err - } - if destProject.Archived { - return nil, errors.Errorf("project (%v) is archived and cannot add new searches", - req.DestinationProjectId) - } - if err = experiment.AuthZProvider.Get().CanCreateExperiment(ctx, *curUser, destProject); err != nil { - return nil, status.Error(codes.PermissionDenied, err.Error()) - } - - if req.SourceProjectId == req.DestinationProjectId { - return &apiv1.MoveSearchesResponse{Results: []*apiv1.SearchActionResult{}}, nil - } - - var searchChecks []searchCandidateResult - getQ := db.Bun().NewSelect(). - ModelTableExpr("experiments AS e"). - Model(&searchChecks). - Column("e.id"). - ColumnExpr("COALESCE((e.archived OR p.archived OR w.archived), FALSE) AS archived"). - ColumnExpr("e.state IN (?) AS is_terminal", bun.In(model.StatesToStrings(model.TerminalStates))). - Join("JOIN projects p ON e.project_id = p.id"). - Join("JOIN workspaces w ON p.workspace_id = w.id"). - Where("e.project_id = ?", req.SourceProjectId) - - if req.Filter == nil { - getQ = getQ.Where("e.id IN (?)", bun.In(req.SearchIds)) - } else { - getQ, err = filterSearchQuery(getQ, req.Filter) - if err != nil { - return nil, err - } - } - - if getQ, err = experiment.AuthZProvider.Get().FilterExperimentsQuery(ctx, *curUser, nil, getQ, - []rbacv1.PermissionType{ - rbacv1.PermissionType_PERMISSION_TYPE_VIEW_EXPERIMENT_METADATA, - rbacv1.PermissionType_PERMISSION_TYPE_DELETE_EXPERIMENT, - }); err != nil { - return nil, err - } - - err = getQ.Scan(ctx) - if err != nil { - return nil, err - } - - var results []*apiv1.SearchActionResult - visibleIDs := set.New[int32]() - var validIDs []int32 - for _, check := range searchChecks { - visibleIDs.Insert(check.ID) - if check.Archived { - results = append(results, &apiv1.SearchActionResult{ - Error: "Search is archived.", - Id: check.ID, - }) - continue - } - validIDs = append(validIDs, check.ID) - } - if req.Filter == nil { - for _, originalID := range req.SearchIds { - if !visibleIDs.Contains(originalID) { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Search with id '%d' not found in project with id '%d'", originalID, req.SourceProjectId), - Id: originalID, - }) - } - } - } - if len(validIDs) > 0 { - expMoveResults, err := experiment.MoveExperiments(ctx, srcProject.Id, validIDs, nil, req.DestinationProjectId) - if err != nil { - return nil, err - } - failedExpMoveIds := []int32{-1} - successExpMoveIds := []int32{-1} - for _, res := range expMoveResults { - if res.Error != nil { - failedExpMoveIds = append(failedExpMoveIds, res.ID) - } else { - successExpMoveIds = append(successExpMoveIds, res.ID) - } - } - - tx, err := db.Bun().BeginTx(ctx, nil) - if err != nil { - return nil, err - } - defer func() { - txErr := tx.Rollback() - if txErr != nil && txErr != sql.ErrTxDone { - log.WithError(txErr).Error("error rolling back transaction in MoveSearches") - } - }() - - if err = db.RemoveOutdatedProjectHparams(ctx, tx, int(req.SourceProjectId)); err != nil { - return nil, err - } - - var failedSearchIDs []int32 - if err = tx.NewSelect().Table("experiments"). - Column("id"). - Where("experiments.id IN (?)", bun.In(validIDs)). - Where("experiments.id IN (?)", bun.In(failedExpMoveIds)). - Scan(ctx, &failedSearchIDs); err != nil { - return nil, fmt.Errorf("getting failed experiment move IDs: %w", err) - } - for _, failedSearchID := range failedSearchIDs { - results = append(results, &apiv1.SearchActionResult{ - Error: "Failed to move experiment", - Id: failedSearchID, - }) - } - - var successSearchIDs []int32 - if err = tx.NewSelect().Table("experiments"). - Column("id"). - Where("experiments.id IN (?)", bun.In(successExpMoveIds)). - Scan(ctx, &successSearchIDs); err != nil { - return nil, fmt.Errorf("getting failed experiment move search IDs: %w", err) - } - for _, successSearchID := range successSearchIDs { - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: successSearchID, - }) - } - if err = tx.Commit(); err != nil { - return nil, err - } - } - return &apiv1.MoveSearchesResponse{Results: results}, nil -} - -func (a *apiServer) CancelSearches(ctx context.Context, req *apiv1.CancelSearchesRequest, -) (*apiv1.CancelSearchesResponse, error) { - results, validIDs, err := validateBulkSearchActionCandidates(ctx, req.ProjectId, req.SearchIds, req.Filter) - if err != nil { - return nil, err - } - - for _, searchID := range validIDs { - // Could use a.CancelExperiments instead, but would still need to - // iterate over results to build out response structure - _, err = a.CancelExperiment(ctx, &apiv1.CancelExperimentRequest{ - Id: searchID, - }) - if err != nil { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Failed to cancel search: %s", err), - Id: searchID, - }) - } else { - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: searchID, - }) - } - } - return &apiv1.CancelSearchesResponse{Results: results}, nil -} - -func (a *apiServer) KillSearches(ctx context.Context, req *apiv1.KillSearchesRequest, -) (*apiv1.KillSearchesResponse, error) { - results, validIDs, err := validateBulkSearchActionCandidates(ctx, req.ProjectId, req.SearchIds, req.Filter) - if err != nil { - return nil, err - } - for _, searchID := range validIDs { - _, err = a.KillExperiment(ctx, &apiv1.KillExperimentRequest{ - Id: searchID, - }) - if err != nil { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Failed to kill search: %s", err), - Id: searchID, - }) - } else { - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: searchID, - }) - } - } - return &apiv1.KillSearchesResponse{Results: results}, nil -} - -func (a *apiServer) DeleteSearches(ctx context.Context, req *apiv1.DeleteSearchesRequest, -) (*apiv1.DeleteSearchesResponse, error) { - if len(req.SearchIds) > 0 && req.Filter != nil { - return nil, fmt.Errorf("if filter is provided search id list must be empty") - } - curUser, _, err := grpcutil.GetUser(ctx) - if err != nil { - return nil, err - } - // get searches to delete - var deleteCandidates []searchCandidateResult - getQ := getSelectSearchesQueryTables(). - Model(&deleteCandidates). - Column("e.id"). - ColumnExpr("COALESCE((e.archived OR p.archived OR w.archived), FALSE) AS archived"). - ColumnExpr("e.state IN (?) AS is_terminal", bun.In(model.StatesToStrings(model.TerminalStates))). - Where("e.project_id = ?", req.ProjectId) - - if req.Filter == nil { - getQ = getQ.Where("e.id IN (?)", bun.In(req.SearchIds)) - } else { - getQ, err = filterSearchQuery(getQ, req.Filter) - if err != nil { - return nil, err - } - } - - if getQ, err = experiment.AuthZProvider.Get().FilterExperimentsQuery(ctx, *curUser, nil, getQ, - []rbacv1.PermissionType{ - rbacv1.PermissionType_PERMISSION_TYPE_DELETE_EXPERIMENT, - }); err != nil { - return nil, err - } - - err = getQ.Scan(ctx) - if err != nil { - return nil, err - } - - var results []*apiv1.SearchActionResult - visibleIDs := set.New[int32]() - var validIDs []int32 - for _, cand := range deleteCandidates { - visibleIDs.Insert(cand.ID) - if !cand.IsTerminal { - results = append(results, &apiv1.SearchActionResult{ - Error: "Search is not in a terminal state.", - Id: cand.ID, - }) - } else { - validIDs = append(validIDs, cand.ID) - } - } - if req.Filter == nil { - for _, originalID := range req.SearchIds { - if !visibleIDs.Contains(originalID) { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Search with id '%d' not found in project with id '%d'", originalID, req.ProjectId), - Id: originalID, - }) - } - } - } - if len(validIDs) == 0 { - return &apiv1.DeleteSearchesResponse{Results: results}, nil - } - tx, err := db.Bun().BeginTx(ctx, nil) - if err != nil { - return nil, err - } - defer func() { - txErr := tx.Rollback() - if txErr != nil && txErr != sql.ErrTxDone { - log.WithError(txErr).Error("error rolling back transaction in DeleteSearches") - } - }() - - var deleteRunIDs []int32 - getQ = db.Bun().NewSelect(). - TableExpr("runs AS r"). - Model(&deleteRunIDs). - Column("r.id"). - Where("r.experiment_id IN (?)", bun.In(validIDs)) - - err = getQ.Scan(ctx) - if err != nil { - return nil, err - } - - // delete run logs - if _, err = tx.NewDelete().Table("trial_logs"). - Where("trial_logs.trial_id IN (?)", bun.In(deleteRunIDs)). - Exec(ctx); err != nil { - return nil, fmt.Errorf("delete run logs: %w", err) - } - - // delete task logs - trialTaskQuery := tx.NewSelect().Table("run_id_task_id"). - ColumnExpr("task_id"). - Where("run_id IN (?)", bun.In(deleteRunIDs)) - if _, err = tx.NewDelete().Table("task_logs"). - Where("task_logs.task_id IN (?)", trialTaskQuery). - Exec(ctx); err != nil { - return nil, fmt.Errorf("delete task logs: %w", err) - } - - // delete runs - if _, err = tx.NewDelete().Table("runs"). - Where("runs.id IN (?)", bun.In(deleteRunIDs)). - Exec(ctx); err != nil { - return nil, fmt.Errorf("delete runs: %w", err) - } - - var acceptedIDs []int - if _, err = tx.NewDelete().Table("experiments"). - Where("id IN (?)", bun.In(validIDs)). - Returning("id"). - Model(&acceptedIDs). - Exec(ctx); err != nil { - return nil, fmt.Errorf("delete runs: %w", err) - } - - for _, acceptID := range acceptedIDs { - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: int32(acceptID), - }) - } - - // delete run hparams - if _, err = tx.NewDelete().Table("run_hparams"). - Where("run_id IN (?)", bun.In(deleteRunIDs)). - Exec(ctx); err != nil { - return nil, fmt.Errorf("deleting run hparams: %w", err) - } - // remove project hparams - if err = db.RemoveOutdatedProjectHparams(ctx, tx, int(req.ProjectId)); err != nil { - return nil, err - } - - if err = tx.Commit(); err != nil { - return nil, err - } - - return &apiv1.DeleteSearchesResponse{Results: results}, nil -} - -func (a *apiServer) ArchiveSearches( - ctx context.Context, req *apiv1.ArchiveSearchesRequest, -) (*apiv1.ArchiveSearchesResponse, error) { - results, err := archiveUnarchiveSearchAction(ctx, true, req.SearchIds, req.ProjectId, req.Filter) - if err != nil { - return nil, err - } - return &apiv1.ArchiveSearchesResponse{Results: results}, nil -} - -func (a *apiServer) UnarchiveSearches( - ctx context.Context, req *apiv1.UnarchiveSearchesRequest, -) (*apiv1.UnarchiveSearchesResponse, error) { - results, err := archiveUnarchiveSearchAction(ctx, false, req.SearchIds, req.ProjectId, req.Filter) - if err != nil { - return nil, err - } - return &apiv1.UnarchiveSearchesResponse{Results: results}, nil -} - -func archiveUnarchiveSearchAction(ctx context.Context, archive bool, runIDs []int32, - projectID int32, filter *string, -) ([]*apiv1.SearchActionResult, error) { - if len(runIDs) > 0 && filter != nil { - return nil, fmt.Errorf("if filter is provided run id list must be empty") - } - curUser, _, err := grpcutil.GetUser(ctx) - if err != nil { - return nil, err - } - - var searchCandidates []searchCandidateResult - query := db.Bun().NewSelect(). - ModelTableExpr("experiments AS e"). - Model(&searchCandidates). - Column("e.id"). - ColumnExpr("COALESCE((e.archived OR p.archived OR w.archived), FALSE) AS archived"). - ColumnExpr("e.state IN (?) AS is_terminal", bun.In(model.StatesToStrings(model.TerminalStates))). - Join("JOIN projects p ON e.project_id = p.id"). - Join("JOIN workspaces w ON p.workspace_id = w.id"). - Where("e.project_id = ?", projectID) - - if filter == nil { - query = query.Where("e.id IN (?)", bun.In(runIDs)) - } else { - query, err = filterSearchQuery(query, filter) - if err != nil { - return nil, err - } - } - - query, err = experiment.AuthZProvider.Get(). - FilterExperimentsQuery(ctx, *curUser, nil, query, - []rbacv1.PermissionType{rbacv1.PermissionType_PERMISSION_TYPE_UPDATE_EXPERIMENT_METADATA}) - if err != nil { - return nil, err - } - - err = query.Scan(ctx) - if err != nil { - return nil, err - } - - var results []*apiv1.SearchActionResult - visibleIDs := set.New[int32]() - var validIDs []int32 - for _, cand := range searchCandidates { - visibleIDs.Insert(cand.ID) - switch { - case !cand.IsTerminal: - results = append(results, &apiv1.SearchActionResult{ - Error: "Search is not in terminal state.", - Id: cand.ID, - }) - case cand.Archived == archive: - results = append(results, &apiv1.SearchActionResult{ - Id: cand.ID, - }) - default: - validIDs = append(validIDs, cand.ID) - } - } - - if filter == nil { - for _, originalID := range runIDs { - if !visibleIDs.Contains(originalID) { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Search with id '%d' not found in project with id '%d'", originalID, projectID), - Id: originalID, - }) - } - } - } - - if len(validIDs) > 0 { - var acceptedIDs []int32 - _, err = db.Bun().NewUpdate(). - ModelTableExpr("experiments as e"). - Set("archived = ?", archive). - Where("id IN (?)", bun.In(validIDs)). - Returning("id"). - Model(&acceptedIDs). - Exec(ctx) - if err != nil { - return nil, fmt.Errorf("failed to archive/unarchive searches: %w", err) - } - for _, acceptID := range acceptedIDs { - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: acceptID, - }) - } - } - - return results, nil -} - -func (a *apiServer) PauseSearches(ctx context.Context, req *apiv1.PauseSearchesRequest, -) (*apiv1.PauseSearchesResponse, error) { - results, err := pauseResumeSearchAction(ctx, true, req.ProjectId, req.SearchIds, req.Filter) - if err != nil { - return nil, err - } - return &apiv1.PauseSearchesResponse{Results: results}, nil -} - -func (a *apiServer) ResumeSearches(ctx context.Context, req *apiv1.ResumeSearchesRequest, -) (*apiv1.ResumeSearchesResponse, error) { - results, err := pauseResumeSearchAction(ctx, false, req.ProjectId, req.SearchIds, req.Filter) - if err != nil { - return nil, err - } - return &apiv1.ResumeSearchesResponse{Results: results}, nil -} - -func pauseResumeSearchAction(ctx context.Context, isPause bool, projectID int32, - searchIds []int32, filter *string) ( - []*apiv1.SearchActionResult, error, -) { - if len(searchIds) > 0 && filter != nil { - return nil, fmt.Errorf("if filter is provided search id list must be empty") - } - // Get experiment ids - var err error - var searchCandidates []searchCandidateResult - isSearchIDAction := (len(searchIds) > 0) - getQ := db.Bun().NewSelect(). - ModelTableExpr("experiments AS e"). - Model(&searchCandidates). - Column("e.id"). - ColumnExpr("COALESCE((e.archived OR p.archived OR w.archived), FALSE) AS archived"). - ColumnExpr("e.state IN (?) AS is_terminal", bun.In(model.StatesToStrings(model.TerminalStates))). - Join("JOIN projects p ON e.project_id = p.id"). - Join("JOIN workspaces w ON p.workspace_id = w.id"). - Where("e.project_id = ?", projectID) - - if isSearchIDAction { - getQ = getQ.Where("e.id IN (?)", bun.In(searchIds)) - } else { - getQ, err = filterSearchQuery(getQ, filter) - if err != nil { - return nil, err - } - } - - err = getQ.Scan(ctx) - if err != nil { - return nil, err - } - - var results []*apiv1.SearchActionResult - visibleIDs := set.New[int32]() - expIDs := set.New[int32]() - for _, cand := range searchCandidates { - visibleIDs.Insert(cand.ID) - if cand.Archived { - results = append(results, &apiv1.SearchActionResult{ - Error: "Search is archived.", - Id: cand.ID, - }) - continue - } - expIDs.Insert(cand.ID) - } - if isSearchIDAction { - for _, originalID := range searchIds { - if !visibleIDs.Contains(originalID) { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Search with id '%d' not found in project with id '%d'", originalID, projectID), - Id: originalID, - }) - } - } - } - // Pause/Resume experiments - var expResults []experiment.ExperimentActionResult - var errMsg string - if isPause { - expResults, err = experiment.PauseExperiments(ctx, projectID, expIDs.ToSlice(), nil) - errMsg = "Failed to pause experiment: %s" - } else { - expResults, err = experiment.ActivateExperiments(ctx, projectID, expIDs.ToSlice(), nil) - errMsg = "Failed to resume experiment: %s" - } - if err != nil { - return nil, err - } - for _, expRes := range expResults { - if expRes.Error != nil { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf(errMsg, expRes.Error), - Id: expRes.ID, - }) - } else { - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: expRes.ID, - }) - } - } - return results, nil -} - -func validateBulkSearchActionCandidates( - ctx context.Context, projectID int32, searchIds []int32, filter *string, -) ([]*apiv1.SearchActionResult, []int32, error) { - if len(searchIds) > 0 && filter != nil { - return nil, nil, fmt.Errorf("if filter is provided search id list must be empty") - } - curUser, _, err := grpcutil.GetUser(ctx) - if err != nil { - return nil, nil, err - } - - type searchResult struct { - ID int32 - IsTerminal bool - } - - var candidates []searchResult - getQ := getSelectSearchesQueryTables(). - Model(&candidates). - Column("e.id"). - ColumnExpr("e.state IN (?) AS is_terminal", bun.In(model.StatesToStrings(model.TerminalStates))). - Where("e.project_id = ?", projectID) - - if filter == nil { - getQ = getQ.Where("e.id IN (?)", bun.In(searchIds)) - } else { - getQ, err = filterSearchQuery(getQ, filter) - if err != nil { - return nil, nil, err - } - } - - if getQ, err = experiment.AuthZProvider.Get(). - FilterExperimentsQuery(ctx, *curUser, nil, getQ, - []rbacv1.PermissionType{rbacv1.PermissionType_PERMISSION_TYPE_UPDATE_EXPERIMENT}); err != nil { - return nil, nil, err - } - - err = getQ.Scan(ctx) - if err != nil { - return nil, nil, err - } - - var results []*apiv1.SearchActionResult - visibleIDs := set.New[int32]() - var validIDs []int32 - for _, cand := range candidates { - visibleIDs.Insert(cand.ID) - switch { - case cand.IsTerminal: - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: cand.ID, - }) - default: - validIDs = append(validIDs, cand.ID) - } - } - if filter == nil { - for _, originalID := range searchIds { - if !visibleIDs.Contains(originalID) { - results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Search with id '%d' not found", originalID), - Id: originalID, - }) - } - } - } - return results, validIDs, nil -} - -func (a *apiServer) LaunchTensorboardSearches(ctx context.Context, req *apiv1.LaunchTensorboardSearchesRequest, -) (*apiv1.LaunchTensorboardSearchesResponse, error) { - _, _, err := grpcutil.GetUser(ctx) - if err != nil { - return nil, status.Errorf(codes.Internal, "failed to get the user: %s", err) - } - - var expIds []int32 - - if req.Filter != nil { - expIds, err = getSearchIdsFromFilter(ctx, req.WorkspaceId, req.Filter) - if err != nil { - return nil, status.Errorf(codes.Internal, "failed to build search id list from filter: %s", err) - } - } else { - expIds = req.SearchIds - } - - launchResp, err := a.LaunchTensorboard(ctx, &apiv1.LaunchTensorboardRequest{ - ExperimentIds: expIds, - Config: req.GetConfig(), - TemplateName: req.GetTemplateName(), - Files: req.GetFiles(), - WorkspaceId: req.GetWorkspaceId(), - }) - - return &apiv1.LaunchTensorboardSearchesResponse{ - Tensorboard: launchResp.GetTensorboard(), - Config: launchResp.GetConfig(), - Warnings: launchResp.GetWarnings(), - }, err -} - -func getSearchIdsFromFilter(ctx context.Context, workspaceID int32, filter *string) ([]int32, error) { - type searchResult struct { - ID int32 - } - - var targets []searchResult - getQ := getSelectSearchesQueryTables(). - Model(&targets). - Column("e.id"). - Where("w.id = ?", workspaceID). - Where("e.state NOT IN (?)", bun.In(model.StatesToStrings(model.TerminalStates))) - - getQ, err := filterSearchQuery(getQ, filter) - if err != nil { - return nil, err - } - - err = getQ.Scan(ctx) - if err != nil { - return nil, err - } - - expIds := make([]int32, len(targets)) - for i := range expIds { - expIds[i] = targets[i].ID - } - return expIds, nil -} diff --git a/master/internal/api_searches_intg_test.go b/master/internal/api_searches_intg_test.go deleted file mode 100644 index ff5ca16a5e7..00000000000 --- a/master/internal/api_searches_intg_test.go +++ /dev/null @@ -1,1215 +0,0 @@ -//go:build integration -// +build integration - -package internal - -import ( - "encoding/json" - "fmt" - "slices" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - - "github.com/determined-ai/determined/master/internal/db" - "github.com/determined-ai/determined/master/internal/experiment" - "github.com/determined-ai/determined/master/pkg/model" - "github.com/determined-ai/determined/master/pkg/ptrs" - "github.com/determined-ai/determined/master/pkg/schemas" - "github.com/determined-ai/determined/master/pkg/schemas/expconf" - "github.com/determined-ai/determined/proto/pkg/apiv1" - "github.com/determined-ai/determined/proto/pkg/trialv1" -) - -// experimentMock inherits all the methods of the Experiment -// interface, but only implements the ones we care about -// for testing. -type experimentMock struct { - mock.Mock - experiment.Experiment -} - -func (m *experimentMock) ActivateExperiment() error { - returns := m.Called() - return returns.Error(0) -} - -func (m *experimentMock) PauseExperiment() error { - returns := m.Called() - return returns.Error(0) -} - -// nolint: exhaustruct -func createTestSearchWithHParams( - t *testing.T, api *apiServer, curUser model.User, projectID int, hparams map[string]any, -) *model.Experiment { - experimentConfig := expconf.ExperimentConfig{ - RawDescription: ptrs.Ptr("desc"), - RawName: expconf.Name{RawString: ptrs.Ptr("name")}, - } - - b, err := json.Marshal(hparams) - require.NoError(t, err) - err = json.Unmarshal(b, &experimentConfig.RawHyperparameters) - require.NoError(t, err) - - activeConfig := schemas.WithDefaults(schemas.Merge(minExpConfig, experimentConfig)) - return createTestExpWithActiveConfig(t, api, curUser, projectID, activeConfig) -} - -func TestMoveSearchesIds(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - sourceprojectID := int32(1) - destprojectID := int32(projectIDInt) - - search1 := createTestExp(t, api, curUser) - search2 := createTestExp(t, api, curUser) - - moveIds := []int32{int32(search1.ID)} - - moveReq := &apiv1.MoveSearchesRequest{ - SearchIds: moveIds, - SourceProjectId: sourceprojectID, - DestinationProjectId: destprojectID, - } - - moveResp, err := api.MoveSearches(ctx, moveReq) - require.NoError(t, err) - require.Len(t, moveResp.Results, 1) - require.Equal(t, "", moveResp.Results[0].Error) - - // run no longer in old project - filter := fmt.Sprintf(`{"filterGroup":{"children":[{"columnName":"id","kind":"field",`+ - `"location":"LOCATION_TYPE_EXPERIMENT","operator":"=","type":"COLUMN_TYPE_NUMBER","value":%d}],`+ - `"conjunction":"and","kind":"group"},"showArchived":false}`, int32(search2.ID)) - req := &apiv1.SearchExperimentsRequest{ - ProjectId: &sourceprojectID, - Filter: &filter, - } - resp, err := api.SearchExperiments(ctx, req) - require.NoError(t, err) - require.Len(t, resp.Experiments, 1) - require.Equal(t, int32(search2.ID), resp.Experiments[0].Experiment.Id) - - // runs in new project - req = &apiv1.SearchExperimentsRequest{ - ProjectId: &destprojectID, - Sort: ptrs.Ptr("id=desc"), - } - - resp, err = api.SearchExperiments(ctx, req) - require.NoError(t, err) - require.Len(t, resp.Experiments, 1) - require.Equal(t, moveIds[0], resp.Experiments[0].Experiment.Id) -} - -func TestMoveSearchesSameIds(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - sourceprojectID := int32(1) - - search1 := createTestExp(t, api, curUser) - moveIds := []int32{int32(search1.ID)} - - moveReq := &apiv1.MoveSearchesRequest{ - SearchIds: moveIds, - SourceProjectId: sourceprojectID, - DestinationProjectId: sourceprojectID, - } - - moveResp, err := api.MoveSearches(ctx, moveReq) - require.NoError(t, err) - require.Empty(t, moveResp.Results) -} - -func TestMoveSearchesFilter(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - _, projectID2Int := createProjectAndWorkspace(ctx, t, api) - sourceprojectID := int32(projectIDInt) - destprojectID := int32(projectID2Int) - - hyperparameters1 := map[string]any{"global_batch_size": 1, "test1": map[string]any{"test2": 1}} - hyperparameters2 := map[string]any{"test1": map[string]any{"test2": 5}} - exp1 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters1) - exp2 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters2) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.PausedState, - ExperimentID: exp1.ID, - StartTime: time.Now(), - HParams: hyperparameters1, - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.PausedState, - ExperimentID: exp2.ID, - StartTime: time.Now(), - HParams: hyperparameters2, - }, task2.TaskID)) - - projHparam := getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.True(t, slices.Contains(projHparam, "test1.test2")) - require.True(t, slices.Contains(projHparam, "global_batch_size")) - - req := &apiv1.SearchRunsRequest{ - ProjectId: &sourceprojectID, - Sort: ptrs.Ptr("id=asc"), - } - _, err := api.SearchRuns(ctx, req) - require.NoError(t, err) - - // If provided with filter MoveSearches should ignore these move ids - moveIds := []int32{int32(exp1.ID), int32(exp2.ID)} - - moveReq := &apiv1.MoveSearchesRequest{ - SearchIds: moveIds, - SourceProjectId: sourceprojectID, - DestinationProjectId: destprojectID, - Filter: ptrs.Ptr(`{"filterGroup":{"children":[{"columnName":"hp.test1.test2","kind":"field",` + - `"location":"LOCATION_TYPE_HYPERPARAMETERS","operator":"<=","type":"COLUMN_TYPE_NUMBER","value":1}],` + - `"conjunction":"and","kind":"group"},"showArchived":false}`), - } - - moveResp, err := api.MoveSearches(ctx, moveReq) - require.NoError(t, err) - require.Len(t, moveResp.Results, 1) - require.Equal(t, "", moveResp.Results[0].Error) - - // check 1 run moved in old project - resp, err := api.SearchRuns(ctx, req) - require.NoError(t, err) - require.Len(t, resp.Runs, 1) - - // run in new project - req = &apiv1.SearchRunsRequest{ - ProjectId: &destprojectID, - Sort: ptrs.Ptr("id=asc"), - } - - resp, err = api.SearchRuns(ctx, req) - require.NoError(t, err) - require.Len(t, resp.Runs, 1) - - // Hyperparam moved out of project A - projHparam = getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 1) - require.Equal(t, "test1.test2", projHparam[0]) - - // Hyperparams moved into project B - projHparam = getTestProjectHyperparmeters(ctx, t, projectID2Int) - require.Len(t, projHparam, 2) - require.True(t, slices.Contains(projHparam, "test1.test2")) - require.True(t, slices.Contains(projHparam, "global_batch_size")) - - i := strings.Index(resp.Runs[0].LocalId, "-") - localID := resp.Runs[0].LocalId[i+1:] - require.Equal(t, "1", localID) -} - -func TestDeleteSearchesNonTerminal(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - exp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task2.TaskID)) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Sort: ptrs.Ptr("id=asc"), - } - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) - - searchIDs := []int32{int32(exp.ID)} - req := &apiv1.DeleteSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.DeleteSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "Search is not in a terminal state.", res.Results[0].Error) - - searchReq = &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err = api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) -} - -func TestDeleteSearchesIds(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - projectID, _, _, _, expID := setUpMultiTrialExperiments(ctx, t, api, curUser) //nolint:dogsled - require.NoError(t, completeExp(ctx, expID)) - - expIDs := []int32{expID} - req := &apiv1.DeleteSearchesRequest{ - SearchIds: expIDs, - ProjectId: projectID, - } - res, err := api.DeleteSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "", res.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Empty(t, searchResp.Runs) -} - -func TestDeleteSearchesIdsNonExistent(t *testing.T) { - api, _, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - // delete runs - searchIDs := []int32{-1} - req := &apiv1.DeleteSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.DeleteSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, fmt.Sprintf("Search with id '%d' not found in project with id '%d'", -1, projectID), - res.Results[0].Error) -} - -func TestDeleteSearchesFilter(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - hyperparameters1 := map[string]any{"global_batch_size": 1, "test1": map[string]any{"test2": 1}} - exp1 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters1) - hyperparameters2 := map[string]any{"test1": map[string]any{"test2": 5}} - exp2 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters2) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp1.ID, - StartTime: time.Now(), - HParams: hyperparameters1, - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp2.ID, - StartTime: time.Now(), - HParams: hyperparameters2, - }, task2.TaskID)) - - projHparam := getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.True(t, slices.Contains(projHparam, "test1.test2")) - require.True(t, slices.Contains(projHparam, "global_batch_size")) - - require.NoError(t, completeExp(ctx, int32(exp1.ID))) - require.NoError(t, completeExp(ctx, int32(exp2.ID))) - - filter := `{ - "filterGroup": { - "children": [ - { - "columnName": "hp.test1.test2", - "kind": "field", - "location": "LOCATION_TYPE_HYPERPARAMETERS", - "operator": "<=", - "type": "COLUMN_TYPE_NUMBER", - "value": 1 - } - ], - "conjunction": "and", - "kind": "group" - }, - "showArchived": true - }` - req := &apiv1.DeleteSearchesRequest{ - Filter: &filter, - ProjectId: projectID, - } - res, err := api.DeleteSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "", res.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - projHparam = getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 1) - require.Equal(t, "test1.test2", projHparam[0]) - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 1) -} - -func TestCancelSearchesNonTerminal(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - exp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task2.TaskID)) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Sort: ptrs.Ptr("id=asc"), - } - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) - - searchIDs := []int32{int32(exp.ID)} - req := &apiv1.CancelSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.CancelSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Empty(t, res.Results[0].Error) - require.Equal(t, res.Results[0].Id, searchIDs[0]) - - searchReq = &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err = api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) -} - -func TestCancelSearchesIds(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - projectID, _, _, _, expID := setUpMultiTrialExperiments(ctx, t, api, curUser) //nolint:dogsled - - expIDs := []int32{expID} - req := &apiv1.CancelSearchesRequest{ - SearchIds: expIDs, - ProjectId: projectID, - } - res, err := api.CancelSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "", res.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.GetRuns(), 2) - for _, run := range searchResp.GetRuns() { - require.Equal(t, trialv1.State_STATE_COMPLETED, run.State) - } -} - -func TestCancelSearchesIdsNonExistent(t *testing.T) { - api, _, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - // cancel runs - searchIDs := []int32{-1} - req := &apiv1.CancelSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.CancelSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, fmt.Sprintf("Search with id '%d' not found", -1), - res.Results[0].Error) -} - -func TestCancelSearchesFilter(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - hyperparameters1 := map[string]any{"global_batch_size": 1, "test3": map[string]any{"test4": 1}} - exp1 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters1) - hyperparameters2 := map[string]any{"test3": map[string]any{"test4": 5}} - exp2 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters2) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp1.ID, - StartTime: time.Now(), - HParams: hyperparameters1, - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp2.ID, - StartTime: time.Now(), - HParams: hyperparameters2, - }, task2.TaskID)) - - projHparam := getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.True(t, slices.Contains(projHparam, "test3.test4")) - require.True(t, slices.Contains(projHparam, "global_batch_size")) - - require.NoError(t, completeExp(ctx, int32(exp1.ID))) - require.NoError(t, completeExp(ctx, int32(exp2.ID))) - - filter := `{ - "filterGroup": { - "children": [ - { - "columnName": "hp.test3.test4", - "kind": "field", - "location": "LOCATION_TYPE_HYPERPARAMETERS", - "operator": "<", - "type": "COLUMN_TYPE_NUMBER", - "value": 2 - } - ], - "conjunction": "and", - "kind": "group" - }, - "showArchived": true - }` - req := &apiv1.CancelSearchesRequest{ - Filter: &filter, - ProjectId: projectID, - } - res, err := api.CancelSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "", res.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - projHparam = getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.Contains(t, projHparam, "test3.test4") - require.Contains(t, projHparam, "global_batch_size") - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.GetRuns(), 2) -} - -func TestKillSearchesNonTerminal(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - exp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task2.TaskID)) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Sort: ptrs.Ptr("id=asc"), - } - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.GetRuns(), 2) - - searchIDs := []int32{int32(exp.ID)} - req := &apiv1.KillSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.KillSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Empty(t, res.Results[0].Error) - require.Equal(t, res.Results[0].Id, searchIDs[0]) - - searchReq = &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err = api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) -} - -func TestKillSearchesMixedStates(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - nonTerminalExp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: nonTerminalExp.ID, - StartTime: time.Now(), - }, task1.TaskID)) - - terminalExp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: terminalExp.ID, - StartTime: time.Now(), - }, task2.TaskID)) - require.NoError(t, completeExp(ctx, int32(terminalExp.ID))) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Sort: ptrs.Ptr("id=asc"), - } - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.GetRuns(), 2) - - searchIDs := []int32{int32(nonTerminalExp.ID), int32(terminalExp.ID), int32(-1)} - req := &apiv1.KillSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.KillSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 3) - require.Contains(t, res.Results, &apiv1.SearchActionResult{ - Error: "", - Id: int32(nonTerminalExp.ID), - }) - require.Contains(t, res.Results, &apiv1.SearchActionResult{ - Error: "", - Id: int32(terminalExp.ID), - }) - require.Contains(t, res.Results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Search with id '%d' not found", -1), - Id: int32(-1), - }) - - searchReq = &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err = api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) -} - -func TestKillSearchesIds(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - projectID, _, _, _, expID := setUpMultiTrialExperiments(ctx, t, api, curUser) //nolint:dogsled - - expIDs := []int32{expID} - req := &apiv1.KillSearchesRequest{ - SearchIds: expIDs, - ProjectId: projectID, - } - res, err := api.KillSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "", res.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.GetRuns(), 2) - for _, run := range searchResp.GetRuns() { - require.Equal(t, trialv1.State_STATE_COMPLETED, run.State) - } -} - -func TestKillSearchesIdsNonExistent(t *testing.T) { - api, _, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - // delete runs - searchIDs := []int32{-1} - req := &apiv1.KillSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.KillSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, fmt.Sprintf("Search with id '%d' not found", -1), - res.Results[0].Error) -} - -func TestKillSearchesFilter(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - hyperparameters1 := map[string]any{"global_batch_size": 1, "test5": map[string]any{"test6": 1}} - exp1 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters1) - hyperparameters2 := map[string]any{"test5": map[string]any{"test6": 5}} - exp2 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters2) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp1.ID, - StartTime: time.Now(), - HParams: hyperparameters1, - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp2.ID, - StartTime: time.Now(), - HParams: hyperparameters2, - }, task2.TaskID)) - - projHparam := getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.Contains(t, projHparam, "test5.test6") - require.Contains(t, projHparam, "global_batch_size") - - filter := `{ - "filterGroup": { - "children": [ - { - "columnName": "hp.test5.test6", - "kind": "field", - "location": "LOCATION_TYPE_HYPERPARAMETERS", - "operator": "<=", - "type": "COLUMN_TYPE_NUMBER", - "value": 1 - } - ], - "conjunction": "and", - "kind": "group" - }, - "showArchived": true - }` - req := &apiv1.KillSearchesRequest{ - Filter: &filter, - ProjectId: projectID, - } - res, err := api.KillSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "", res.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - projHparam = getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.Contains(t, projHparam, "test5.test6") - require.Contains(t, projHparam, "global_batch_size") - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.GetRuns(), 2) -} - -func TestPauseSearchesNonTerminal(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - exp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - require.Equal(t, model.PausedState, exp.State) - mock := experimentMock{} - mock.On("ActivateExperiment").Return(nil) - mock.On("PauseExperiment").Return(nil) - require.NoError(t, experiment.ExperimentRegistry.Add(exp.ID, &mock)) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.PausedState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.PausedState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task2.TaskID)) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Sort: ptrs.Ptr("id=asc"), - } - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) - - searchIDs := []int32{int32(exp.ID)} - resumeResp, err := api.ResumeSearches(ctx, &apiv1.ResumeSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - }) - require.NoError(t, err) - require.Len(t, resumeResp.Results, 1) - require.Empty(t, resumeResp.Results[0].Error) - require.Equal(t, resumeResp.Results[0].Id, searchIDs[0]) - pauseResp, err := api.PauseSearches(ctx, &apiv1.PauseSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - }) - require.NoError(t, err) - require.Len(t, pauseResp.Results, 1) - require.Empty(t, pauseResp.Results[0].Error) - require.Equal(t, pauseResp.Results[0].Id, searchIDs[0]) - - searchReq = &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err = api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) -} - -func TestPauseSearchesIds(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - terminalExp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - require.NoError(t, completeExp(ctx, int32(terminalExp.ID))) - - nonTerminalExp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - mock := experimentMock{} - mock.On("ActivateExperiment").Return(nil) - mock.On("PauseExperiment").Return(nil) - require.NoError(t, experiment.ExperimentRegistry.Add(nonTerminalExp.ID, &mock)) - - expIDs := []int32{int32(terminalExp.ID), int32(nonTerminalExp.ID)} - req := &apiv1.PauseSearchesRequest{ - SearchIds: expIDs, - ProjectId: projectID, - } - res, err := api.PauseSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 2) - require.Contains(t, res.Results, &apiv1.SearchActionResult{ - Error: "", - Id: int32(nonTerminalExp.ID), - }) - require.Contains(t, res.Results, &apiv1.SearchActionResult{ - Error: "Failed to pause experiment: rpc error: code = FailedPrecondition desc = experiment in terminal state", - Id: int32(terminalExp.ID), - }) -} - -func TestPauseSearchesIdsNonExistent(t *testing.T) { - api, _, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - // cancel runs - searchIDs := []int32{-1} - req := &apiv1.PauseSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - res, err := api.PauseSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, fmt.Sprintf("Search with id '%d' not found in project with id '%d'", -1, projectID), - res.Results[0].Error) -} - -func TestPauseSearchesFilter(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - hyperparameters1 := map[string]any{"global_batch_size": 1, "test3": map[string]any{"test4": 1}} - exp1 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters1) - mock := experimentMock{} - mock.On("ActivateExperiment").Return(nil) - mock.On("PauseExperiment").Return(nil) - require.NoError(t, experiment.ExperimentRegistry.Add(exp1.ID, &mock)) - - hyperparameters2 := map[string]any{"test3": map[string]any{"test4": 5}} - exp2 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters2) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp1.ID, - StartTime: time.Now(), - HParams: hyperparameters1, - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp2.ID, - StartTime: time.Now(), - HParams: hyperparameters2, - }, task2.TaskID)) - - projHparam := getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.True(t, slices.Contains(projHparam, "test3.test4")) - require.True(t, slices.Contains(projHparam, "global_batch_size")) - - filter := `{ - "filterGroup": { - "children": [ - { - "columnName": "hp.test3.test4", - "kind": "field", - "location": "LOCATION_TYPE_HYPERPARAMETERS", - "operator": "<=", - "type": "COLUMN_TYPE_NUMBER", - "value": 1 - } - ], - "conjunction": "and", - "kind": "group" - }, - "showArchived": true - }` - req := &apiv1.PauseSearchesRequest{ - Filter: &filter, - ProjectId: projectID, - } - res, err := api.PauseSearches(ctx, req) - require.NoError(t, err) - require.Len(t, res.Results, 1) - require.Equal(t, "", res.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":true}`), - Sort: ptrs.Ptr("id=asc"), - } - - projHparam = getTestProjectHyperparmeters(ctx, t, projectIDInt) - require.Len(t, projHparam, 2) - require.Contains(t, projHparam, "test3.test4") - require.Contains(t, projHparam, "global_batch_size") - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.GetRuns(), 2) -} - -func TestArchiveUnarchiveSearchIds(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - projectID, _, _, _, expID := setUpMultiTrialExperiments(ctx, t, api, curUser) //nolint:dogsled - require.NoError(t, completeExp(ctx, expID)) - - searchIDs := []int32{expID} - archReq := &apiv1.ArchiveSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - archRes, err := api.ArchiveSearches(ctx, archReq) - require.NoError(t, err) - require.Len(t, archRes.Results, 1) - require.Equal(t, "", archRes.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":false}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Empty(t, searchResp.Runs) - - // Unarchive runs - unarchReq := &apiv1.UnarchiveSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - unarchRes, err := api.UnarchiveSearches(ctx, unarchReq) - require.NoError(t, err) - require.Len(t, unarchRes.Results, 1) - require.Equal(t, "", unarchRes.Results[0].Error) - - searchResp, err = api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) -} - -func TestArchiveUnarchiveSearchFilter(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - hyperparameters1 := map[string]any{"global_batch_size": 1, "test1": map[string]any{"test2": 1}} - exp1 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters1) - hyperparameters2 := map[string]any{"global_batch_size": 1, "test1": map[string]any{"test2": 5}} - exp2 := createTestSearchWithHParams(t, api, curUser, projectIDInt, hyperparameters2) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp1.ID, - StartTime: time.Now(), - HParams: hyperparameters1, - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp2.ID, - StartTime: time.Now(), - HParams: hyperparameters2, - }, task2.TaskID)) - - require.NoError(t, completeExp(ctx, int32(exp1.ID))) - require.NoError(t, completeExp(ctx, int32(exp2.ID))) - - filter := `{"filterGroup":{"children":[{"columnName":"hp.test1.test2","kind":"field",` + - `"location":"LOCATION_TYPE_HYPERPARAMETERS","operator":"<=","type":"COLUMN_TYPE_NUMBER","value":1}],` + - `"conjunction":"and","kind":"group"},"showArchived":true}` - archReq := &apiv1.ArchiveSearchesRequest{ - Filter: &filter, - ProjectId: projectID, - } - archRes, err := api.ArchiveSearches(ctx, archReq) - require.NoError(t, err) - require.Len(t, archRes.Results, 1) - require.Equal(t, "", archRes.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":false}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 1) - - // Unarchive runs - unarchReq := &apiv1.UnarchiveSearchesRequest{ - Filter: &filter, - ProjectId: projectID, - } - unarchRes, err := api.UnarchiveSearches(ctx, unarchReq) - require.NoError(t, err) - require.Len(t, unarchRes.Results, 1) - require.Equal(t, "", unarchRes.Results[0].Error) - - searchResp, err = api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Len(t, searchResp.Runs, 2) -} - -func TestArchiveAlreadyArchivedSearch(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - projectID, _, _, _, expID := setUpMultiTrialExperiments(ctx, t, api, curUser) //nolint:dogsled - require.NoError(t, completeExp(ctx, expID)) - - // Archive runs - searchIDs := []int32{expID} - archReq := &apiv1.ArchiveSearchesRequest{ - SearchIds: searchIDs, - ProjectId: projectID, - } - archRes, err := api.ArchiveSearches(ctx, archReq) - require.NoError(t, err) - require.Len(t, archRes.Results, 1) - require.Equal(t, "", archRes.Results[0].Error) - - searchReq := &apiv1.SearchRunsRequest{ - ProjectId: &projectID, - Filter: ptrs.Ptr(`{"showArchived":false}`), - Sort: ptrs.Ptr("id=asc"), - } - - searchResp, err := api.SearchRuns(ctx, searchReq) - require.NoError(t, err) - require.Empty(t, searchResp.Runs) - - // Try to archive again - archRes, err = api.ArchiveSearches(ctx, archReq) - require.NoError(t, err) - require.Len(t, archRes.Results, 1) - require.Equal(t, "", archRes.Results[0].Error) -} - -func TestArchiveSearchNonTerminalState(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - _, projectIDInt := createProjectAndWorkspace(ctx, t, api) - projectID := int32(projectIDInt) - - exp := createTestExpWithProjectID(t, api, curUser, projectIDInt) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.ActiveState, - ExperimentID: exp.ID, - StartTime: time.Now(), - }, task1.TaskID)) - - archReq := &apiv1.ArchiveSearchesRequest{ - SearchIds: []int32{int32(exp.ID)}, - ProjectId: projectID, - } - archRes, err := api.ArchiveSearches(ctx, archReq) - require.NoError(t, err) - require.Len(t, archRes.Results, 1) - require.Equal(t, "Search is not in terminal state.", archRes.Results[0].Error) -} - -func TestUnarchiveSearchAlreadyUnarchived(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - projectID, _, _, _, exp := setUpMultiTrialExperiments(ctx, t, api, curUser) //nolint:dogsled - require.NoError(t, completeExp(ctx, exp)) - - unarchReq := &apiv1.UnarchiveSearchesRequest{ - SearchIds: []int32{exp}, - ProjectId: projectID, - } - unarchRes, err := api.UnarchiveSearches(ctx, unarchReq) - require.NoError(t, err) - require.Len(t, unarchRes.Results, 1) - require.Equal(t, "", unarchRes.Results[0].Error) -} - -func TestGetSearchIdsFromFilter(t *testing.T) { - api, curUser, ctx := setupAPITest(t, nil) - workspaceID, projectID := createProjectAndWorkspace(ctx, t, api) - - hyperparameters1 := map[string]any{"global_batch_size": 6, "test7": map[string]any{"test8": 9}} - exp1 := createTestSearchWithHParams(t, api, curUser, projectID, hyperparameters1) - hyperparameters2 := map[string]any{"global_batch_size": 10, "test7": map[string]any{"test8": 11}} - exp2 := createTestSearchWithHParams(t, api, curUser, projectID, hyperparameters2) - - task1 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task1)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp1.ID, - StartTime: time.Now(), - HParams: hyperparameters1, - }, task1.TaskID)) - - task2 := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()} - require.NoError(t, db.AddTask(ctx, task2)) - require.NoError(t, db.AddTrial(ctx, &model.Trial{ - State: model.CompletedState, - ExperimentID: exp2.ID, - StartTime: time.Now(), - HParams: hyperparameters2, - }, task2.TaskID)) - - filter := `{"filterGroup":{"children":[{"columnName":"hp.test7.test8","kind":"field",` + - `"location":"LOCATION_TYPE_HYPERPARAMETERS","operator":"<=","type":"COLUMN_TYPE_NUMBER","value":10}],` + - `"conjunction":"and","kind":"group"},"showArchived":true}` - searchIds, err := getSearchIdsFromFilter(ctx, int32(workspaceID), &filter) - require.NoError(t, err) - require.ElementsMatch(t, searchIds, []int32{int32(exp1.ID)}) -} diff --git a/proto/buf.image.bin b/proto/buf.image.bin index 49c522ee0ec0209f8a4586f716f0267ebb04ac23..a89a152e202fafaae1b65345bae0cee1744184ed 100644 GIT binary patch delta 38624 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 determined.api.v1.LoginRequest @@ -3697,402 +3588,384 @@ var file_determined_api_v1_api_proto_depIdxs = []int32{ 141, // 141: determined.api.v1.Determined.KillTensorboard:input_type -> determined.api.v1.KillTensorboardRequest 142, // 142: determined.api.v1.Determined.SetTensorboardPriority:input_type -> determined.api.v1.SetTensorboardPriorityRequest 143, // 143: determined.api.v1.Determined.LaunchTensorboard:input_type -> determined.api.v1.LaunchTensorboardRequest - 144, // 144: determined.api.v1.Determined.LaunchTensorboardSearches:input_type -> determined.api.v1.LaunchTensorboardSearchesRequest - 145, // 145: determined.api.v1.Determined.DeleteTensorboardFiles:input_type -> determined.api.v1.DeleteTensorboardFilesRequest - 146, // 146: determined.api.v1.Determined.GetActiveTasksCount:input_type -> determined.api.v1.GetActiveTasksCountRequest - 147, // 147: determined.api.v1.Determined.GetTask:input_type -> determined.api.v1.GetTaskRequest - 148, // 148: determined.api.v1.Determined.GetTasks:input_type -> determined.api.v1.GetTasksRequest - 149, // 149: determined.api.v1.Determined.GetModel:input_type -> determined.api.v1.GetModelRequest - 150, // 150: determined.api.v1.Determined.PostModel:input_type -> determined.api.v1.PostModelRequest - 151, // 151: determined.api.v1.Determined.PatchModel:input_type -> determined.api.v1.PatchModelRequest - 152, // 152: determined.api.v1.Determined.ArchiveModel:input_type -> determined.api.v1.ArchiveModelRequest - 153, // 153: determined.api.v1.Determined.UnarchiveModel:input_type -> determined.api.v1.UnarchiveModelRequest - 154, // 154: determined.api.v1.Determined.MoveModel:input_type -> determined.api.v1.MoveModelRequest - 155, // 155: determined.api.v1.Determined.DeleteModel:input_type -> determined.api.v1.DeleteModelRequest - 156, // 156: determined.api.v1.Determined.GetModels:input_type -> determined.api.v1.GetModelsRequest - 157, // 157: determined.api.v1.Determined.GetModelLabels:input_type -> determined.api.v1.GetModelLabelsRequest - 158, // 158: determined.api.v1.Determined.GetModelVersion:input_type -> determined.api.v1.GetModelVersionRequest - 159, // 159: determined.api.v1.Determined.GetModelVersions:input_type -> determined.api.v1.GetModelVersionsRequest - 160, // 160: determined.api.v1.Determined.PostModelVersion:input_type -> determined.api.v1.PostModelVersionRequest - 161, // 161: determined.api.v1.Determined.PatchModelVersion:input_type -> determined.api.v1.PatchModelVersionRequest - 162, // 162: determined.api.v1.Determined.DeleteModelVersion:input_type -> determined.api.v1.DeleteModelVersionRequest - 163, // 163: determined.api.v1.Determined.GetTrialMetricsByModelVersion:input_type -> determined.api.v1.GetTrialMetricsByModelVersionRequest - 164, // 164: determined.api.v1.Determined.GetCheckpoint:input_type -> determined.api.v1.GetCheckpointRequest - 165, // 165: determined.api.v1.Determined.PostCheckpointMetadata:input_type -> determined.api.v1.PostCheckpointMetadataRequest - 166, // 166: determined.api.v1.Determined.CheckpointsRemoveFiles:input_type -> determined.api.v1.CheckpointsRemoveFilesRequest - 167, // 167: determined.api.v1.Determined.PatchCheckpoints:input_type -> determined.api.v1.PatchCheckpointsRequest - 168, // 168: determined.api.v1.Determined.DeleteCheckpoints:input_type -> determined.api.v1.DeleteCheckpointsRequest - 169, // 169: determined.api.v1.Determined.GetTrialMetricsByCheckpoint:input_type -> determined.api.v1.GetTrialMetricsByCheckpointRequest - 170, // 170: determined.api.v1.Determined.ExpMetricNames:input_type -> determined.api.v1.ExpMetricNamesRequest - 171, // 171: determined.api.v1.Determined.MetricBatches:input_type -> determined.api.v1.MetricBatchesRequest - 172, // 172: determined.api.v1.Determined.TrialsSnapshot:input_type -> determined.api.v1.TrialsSnapshotRequest - 173, // 173: determined.api.v1.Determined.TrialsSample:input_type -> determined.api.v1.TrialsSampleRequest - 174, // 174: determined.api.v1.Determined.GetResourcePools:input_type -> determined.api.v1.GetResourcePoolsRequest - 175, // 175: determined.api.v1.Determined.GetKubernetesResourceManagers:input_type -> determined.api.v1.GetKubernetesResourceManagersRequest - 176, // 176: determined.api.v1.Determined.ResourceAllocationRaw:input_type -> determined.api.v1.ResourceAllocationRawRequest - 177, // 177: determined.api.v1.Determined.ResourceAllocationAggregated:input_type -> determined.api.v1.ResourceAllocationAggregatedRequest - 178, // 178: determined.api.v1.Determined.GetWorkspace:input_type -> determined.api.v1.GetWorkspaceRequest - 179, // 179: determined.api.v1.Determined.GetWorkspaceProjects:input_type -> determined.api.v1.GetWorkspaceProjectsRequest - 180, // 180: determined.api.v1.Determined.GetWorkspaces:input_type -> determined.api.v1.GetWorkspacesRequest - 181, // 181: determined.api.v1.Determined.PostWorkspace:input_type -> determined.api.v1.PostWorkspaceRequest - 182, // 182: determined.api.v1.Determined.PatchWorkspace:input_type -> determined.api.v1.PatchWorkspaceRequest - 183, // 183: determined.api.v1.Determined.DeleteWorkspace:input_type -> determined.api.v1.DeleteWorkspaceRequest - 184, // 184: determined.api.v1.Determined.ArchiveWorkspace:input_type -> determined.api.v1.ArchiveWorkspaceRequest - 185, // 185: determined.api.v1.Determined.UnarchiveWorkspace:input_type -> determined.api.v1.UnarchiveWorkspaceRequest - 186, // 186: determined.api.v1.Determined.PinWorkspace:input_type -> determined.api.v1.PinWorkspaceRequest - 187, // 187: determined.api.v1.Determined.UnpinWorkspace:input_type -> determined.api.v1.UnpinWorkspaceRequest - 188, // 188: determined.api.v1.Determined.SetWorkspaceNamespaceBindings:input_type -> determined.api.v1.SetWorkspaceNamespaceBindingsRequest - 189, // 189: determined.api.v1.Determined.SetResourceQuotas:input_type -> determined.api.v1.SetResourceQuotasRequest - 190, // 190: determined.api.v1.Determined.ListWorkspaceNamespaceBindings:input_type -> determined.api.v1.ListWorkspaceNamespaceBindingsRequest - 191, // 191: determined.api.v1.Determined.GetWorkspacesWithDefaultNamespaceBindings:input_type -> determined.api.v1.GetWorkspacesWithDefaultNamespaceBindingsRequest - 192, // 192: determined.api.v1.Determined.BulkAutoCreateWorkspaceNamespaceBindings:input_type -> determined.api.v1.BulkAutoCreateWorkspaceNamespaceBindingsRequest - 193, // 193: determined.api.v1.Determined.DeleteWorkspaceNamespaceBindings:input_type -> determined.api.v1.DeleteWorkspaceNamespaceBindingsRequest - 194, // 194: determined.api.v1.Determined.GetKubernetesResourceQuotas:input_type -> determined.api.v1.GetKubernetesResourceQuotasRequest - 195, // 195: determined.api.v1.Determined.GetProject:input_type -> determined.api.v1.GetProjectRequest - 196, // 196: determined.api.v1.Determined.GetProjectByKey:input_type -> determined.api.v1.GetProjectByKeyRequest - 197, // 197: determined.api.v1.Determined.GetProjectColumns:input_type -> determined.api.v1.GetProjectColumnsRequest - 198, // 198: determined.api.v1.Determined.GetProjectNumericMetricsRange:input_type -> determined.api.v1.GetProjectNumericMetricsRangeRequest - 199, // 199: determined.api.v1.Determined.PostProject:input_type -> determined.api.v1.PostProjectRequest - 200, // 200: determined.api.v1.Determined.AddProjectNote:input_type -> determined.api.v1.AddProjectNoteRequest - 201, // 201: determined.api.v1.Determined.PutProjectNotes:input_type -> determined.api.v1.PutProjectNotesRequest - 202, // 202: determined.api.v1.Determined.PatchProject:input_type -> determined.api.v1.PatchProjectRequest - 203, // 203: determined.api.v1.Determined.DeleteProject:input_type -> determined.api.v1.DeleteProjectRequest - 204, // 204: determined.api.v1.Determined.ArchiveProject:input_type -> determined.api.v1.ArchiveProjectRequest - 205, // 205: determined.api.v1.Determined.UnarchiveProject:input_type -> determined.api.v1.UnarchiveProjectRequest - 206, // 206: determined.api.v1.Determined.MoveProject:input_type -> determined.api.v1.MoveProjectRequest - 207, // 207: determined.api.v1.Determined.MoveExperiment:input_type -> determined.api.v1.MoveExperimentRequest - 208, // 208: determined.api.v1.Determined.MoveExperiments:input_type -> determined.api.v1.MoveExperimentsRequest - 209, // 209: determined.api.v1.Determined.GetWebhooks:input_type -> determined.api.v1.GetWebhooksRequest - 210, // 210: determined.api.v1.Determined.PatchWebhook:input_type -> determined.api.v1.PatchWebhookRequest - 211, // 211: determined.api.v1.Determined.PostWebhook:input_type -> determined.api.v1.PostWebhookRequest - 212, // 212: determined.api.v1.Determined.DeleteWebhook:input_type -> determined.api.v1.DeleteWebhookRequest - 213, // 213: determined.api.v1.Determined.TestWebhook:input_type -> determined.api.v1.TestWebhookRequest - 214, // 214: determined.api.v1.Determined.PostWebhookEventData:input_type -> determined.api.v1.PostWebhookEventDataRequest - 215, // 215: determined.api.v1.Determined.GetGroup:input_type -> determined.api.v1.GetGroupRequest - 216, // 216: determined.api.v1.Determined.GetGroups:input_type -> determined.api.v1.GetGroupsRequest - 217, // 217: determined.api.v1.Determined.CreateGroup:input_type -> determined.api.v1.CreateGroupRequest - 218, // 218: determined.api.v1.Determined.UpdateGroup:input_type -> determined.api.v1.UpdateGroupRequest - 219, // 219: determined.api.v1.Determined.DeleteGroup:input_type -> determined.api.v1.DeleteGroupRequest - 220, // 220: determined.api.v1.Determined.GetPermissionsSummary:input_type -> determined.api.v1.GetPermissionsSummaryRequest - 221, // 221: determined.api.v1.Determined.GetGroupsAndUsersAssignedToWorkspace:input_type -> determined.api.v1.GetGroupsAndUsersAssignedToWorkspaceRequest - 222, // 222: determined.api.v1.Determined.GetRolesByID:input_type -> determined.api.v1.GetRolesByIDRequest - 223, // 223: determined.api.v1.Determined.GetRolesAssignedToUser:input_type -> determined.api.v1.GetRolesAssignedToUserRequest - 224, // 224: determined.api.v1.Determined.GetRolesAssignedToGroup:input_type -> determined.api.v1.GetRolesAssignedToGroupRequest - 225, // 225: determined.api.v1.Determined.SearchRolesAssignableToScope:input_type -> determined.api.v1.SearchRolesAssignableToScopeRequest - 226, // 226: determined.api.v1.Determined.ListRoles:input_type -> determined.api.v1.ListRolesRequest - 227, // 227: determined.api.v1.Determined.AssignRoles:input_type -> determined.api.v1.AssignRolesRequest - 228, // 228: determined.api.v1.Determined.RemoveAssignments:input_type -> determined.api.v1.RemoveAssignmentsRequest - 229, // 229: determined.api.v1.Determined.PostUserActivity:input_type -> determined.api.v1.PostUserActivityRequest - 230, // 230: determined.api.v1.Determined.GetProjectsByUserActivity:input_type -> determined.api.v1.GetProjectsByUserActivityRequest - 231, // 231: determined.api.v1.Determined.SearchExperiments:input_type -> determined.api.v1.SearchExperimentsRequest - 232, // 232: determined.api.v1.Determined.BindRPToWorkspace:input_type -> determined.api.v1.BindRPToWorkspaceRequest - 233, // 233: determined.api.v1.Determined.UnbindRPFromWorkspace:input_type -> determined.api.v1.UnbindRPFromWorkspaceRequest - 234, // 234: determined.api.v1.Determined.OverwriteRPWorkspaceBindings:input_type -> determined.api.v1.OverwriteRPWorkspaceBindingsRequest - 235, // 235: determined.api.v1.Determined.ListRPsBoundToWorkspace:input_type -> determined.api.v1.ListRPsBoundToWorkspaceRequest - 236, // 236: determined.api.v1.Determined.ListWorkspacesBoundToRP:input_type -> determined.api.v1.ListWorkspacesBoundToRPRequest - 237, // 237: determined.api.v1.Determined.GetGenericTaskConfig:input_type -> determined.api.v1.GetGenericTaskConfigRequest - 238, // 238: determined.api.v1.Determined.KillGenericTask:input_type -> determined.api.v1.KillGenericTaskRequest - 239, // 239: determined.api.v1.Determined.PauseGenericTask:input_type -> determined.api.v1.PauseGenericTaskRequest - 240, // 240: determined.api.v1.Determined.UnpauseGenericTask:input_type -> determined.api.v1.UnpauseGenericTaskRequest - 241, // 241: determined.api.v1.Determined.SearchRuns:input_type -> determined.api.v1.SearchRunsRequest - 242, // 242: determined.api.v1.Determined.MoveRuns:input_type -> determined.api.v1.MoveRunsRequest - 243, // 243: determined.api.v1.Determined.KillRuns:input_type -> determined.api.v1.KillRunsRequest - 244, // 244: determined.api.v1.Determined.DeleteRuns:input_type -> determined.api.v1.DeleteRunsRequest - 245, // 245: determined.api.v1.Determined.ArchiveRuns:input_type -> determined.api.v1.ArchiveRunsRequest - 246, // 246: determined.api.v1.Determined.UnarchiveRuns:input_type -> determined.api.v1.UnarchiveRunsRequest - 247, // 247: determined.api.v1.Determined.PauseRuns:input_type -> determined.api.v1.PauseRunsRequest - 248, // 248: determined.api.v1.Determined.ResumeRuns:input_type -> determined.api.v1.ResumeRunsRequest - 249, // 249: determined.api.v1.Determined.GetRunMetadata:input_type -> determined.api.v1.GetRunMetadataRequest - 250, // 250: determined.api.v1.Determined.PostRunMetadata:input_type -> determined.api.v1.PostRunMetadataRequest - 251, // 251: determined.api.v1.Determined.GetMetadataValues:input_type -> determined.api.v1.GetMetadataValuesRequest - 252, // 252: determined.api.v1.Determined.PutWorkspaceConfigPolicies:input_type -> determined.api.v1.PutWorkspaceConfigPoliciesRequest - 253, // 253: determined.api.v1.Determined.PutGlobalConfigPolicies:input_type -> determined.api.v1.PutGlobalConfigPoliciesRequest - 254, // 254: determined.api.v1.Determined.GetWorkspaceConfigPolicies:input_type -> determined.api.v1.GetWorkspaceConfigPoliciesRequest - 255, // 255: determined.api.v1.Determined.GetGlobalConfigPolicies:input_type -> determined.api.v1.GetGlobalConfigPoliciesRequest - 256, // 256: determined.api.v1.Determined.DeleteWorkspaceConfigPolicies:input_type -> determined.api.v1.DeleteWorkspaceConfigPoliciesRequest - 257, // 257: determined.api.v1.Determined.DeleteGlobalConfigPolicies:input_type -> determined.api.v1.DeleteGlobalConfigPoliciesRequest - 258, // 258: determined.api.v1.Determined.MoveSearches:input_type -> determined.api.v1.MoveSearchesRequest - 259, // 259: determined.api.v1.Determined.CancelSearches:input_type -> determined.api.v1.CancelSearchesRequest - 260, // 260: determined.api.v1.Determined.KillSearches:input_type -> determined.api.v1.KillSearchesRequest - 261, // 261: determined.api.v1.Determined.DeleteSearches:input_type -> determined.api.v1.DeleteSearchesRequest - 262, // 262: determined.api.v1.Determined.ArchiveSearches:input_type -> determined.api.v1.ArchiveSearchesRequest - 263, // 263: determined.api.v1.Determined.UnarchiveSearches:input_type -> determined.api.v1.UnarchiveSearchesRequest - 264, // 264: determined.api.v1.Determined.PauseSearches:input_type -> determined.api.v1.PauseSearchesRequest - 265, // 265: determined.api.v1.Determined.ResumeSearches:input_type -> determined.api.v1.ResumeSearchesRequest - 266, // 266: determined.api.v1.Determined.PostAccessToken:input_type -> determined.api.v1.PostAccessTokenRequest - 267, // 267: determined.api.v1.Determined.GetAccessTokens:input_type -> determined.api.v1.GetAccessTokensRequest - 268, // 268: determined.api.v1.Determined.PatchAccessToken:input_type -> determined.api.v1.PatchAccessTokenRequest - 269, // 269: determined.api.v1.Determined.Login:output_type -> determined.api.v1.LoginResponse - 270, // 270: determined.api.v1.Determined.CurrentUser:output_type -> determined.api.v1.CurrentUserResponse - 271, // 271: determined.api.v1.Determined.Logout:output_type -> determined.api.v1.LogoutResponse - 272, // 272: determined.api.v1.Determined.GetUsers:output_type -> determined.api.v1.GetUsersResponse - 273, // 273: determined.api.v1.Determined.GetUserSetting:output_type -> determined.api.v1.GetUserSettingResponse - 274, // 274: determined.api.v1.Determined.ResetUserSetting:output_type -> determined.api.v1.ResetUserSettingResponse - 275, // 275: determined.api.v1.Determined.PostUserSetting:output_type -> determined.api.v1.PostUserSettingResponse - 276, // 276: determined.api.v1.Determined.GetUser:output_type -> determined.api.v1.GetUserResponse - 277, // 277: determined.api.v1.Determined.GetUserByUsername:output_type -> determined.api.v1.GetUserByUsernameResponse - 278, // 278: determined.api.v1.Determined.GetMe:output_type -> determined.api.v1.GetMeResponse - 279, // 279: determined.api.v1.Determined.PostUser:output_type -> determined.api.v1.PostUserResponse - 280, // 280: determined.api.v1.Determined.SetUserPassword:output_type -> determined.api.v1.SetUserPasswordResponse - 281, // 281: determined.api.v1.Determined.AssignMultipleGroups:output_type -> determined.api.v1.AssignMultipleGroupsResponse - 282, // 282: determined.api.v1.Determined.PatchUser:output_type -> determined.api.v1.PatchUserResponse - 283, // 283: determined.api.v1.Determined.PatchUsers:output_type -> determined.api.v1.PatchUsersResponse - 284, // 284: determined.api.v1.Determined.GetTelemetry:output_type -> determined.api.v1.GetTelemetryResponse - 285, // 285: determined.api.v1.Determined.GetMaster:output_type -> determined.api.v1.GetMasterResponse - 286, // 286: determined.api.v1.Determined.GetMasterConfig:output_type -> determined.api.v1.GetMasterConfigResponse - 287, // 287: determined.api.v1.Determined.PatchMasterConfig:output_type -> determined.api.v1.PatchMasterConfigResponse - 288, // 288: determined.api.v1.Determined.MasterLogs:output_type -> determined.api.v1.MasterLogsResponse - 289, // 289: determined.api.v1.Determined.GetClusterMessage:output_type -> determined.api.v1.GetClusterMessageResponse - 290, // 290: determined.api.v1.Determined.SetClusterMessage:output_type -> determined.api.v1.SetClusterMessageResponse - 291, // 291: determined.api.v1.Determined.DeleteClusterMessage:output_type -> determined.api.v1.DeleteClusterMessageResponse - 292, // 292: determined.api.v1.Determined.GetAgents:output_type -> determined.api.v1.GetAgentsResponse - 293, // 293: determined.api.v1.Determined.GetAgent:output_type -> determined.api.v1.GetAgentResponse - 294, // 294: determined.api.v1.Determined.GetSlots:output_type -> determined.api.v1.GetSlotsResponse - 295, // 295: determined.api.v1.Determined.GetSlot:output_type -> determined.api.v1.GetSlotResponse - 296, // 296: determined.api.v1.Determined.EnableAgent:output_type -> determined.api.v1.EnableAgentResponse - 297, // 297: determined.api.v1.Determined.DisableAgent:output_type -> determined.api.v1.DisableAgentResponse - 298, // 298: determined.api.v1.Determined.EnableSlot:output_type -> determined.api.v1.EnableSlotResponse - 299, // 299: determined.api.v1.Determined.DisableSlot:output_type -> determined.api.v1.DisableSlotResponse - 300, // 300: determined.api.v1.Determined.CreateGenericTask:output_type -> determined.api.v1.CreateGenericTaskResponse - 301, // 301: determined.api.v1.Determined.CreateExperiment:output_type -> determined.api.v1.CreateExperimentResponse - 302, // 302: determined.api.v1.Determined.PutExperiment:output_type -> determined.api.v1.PutExperimentResponse - 303, // 303: determined.api.v1.Determined.ContinueExperiment:output_type -> determined.api.v1.ContinueExperimentResponse - 304, // 304: determined.api.v1.Determined.GetExperiment:output_type -> determined.api.v1.GetExperimentResponse - 305, // 305: determined.api.v1.Determined.GetExperiments:output_type -> determined.api.v1.GetExperimentsResponse - 306, // 306: determined.api.v1.Determined.PutExperimentRetainLogs:output_type -> determined.api.v1.PutExperimentRetainLogsResponse - 307, // 307: determined.api.v1.Determined.PutExperimentsRetainLogs:output_type -> determined.api.v1.PutExperimentsRetainLogsResponse - 308, // 308: determined.api.v1.Determined.PutTrialRetainLogs:output_type -> determined.api.v1.PutTrialRetainLogsResponse - 309, // 309: determined.api.v1.Determined.GetModelDef:output_type -> determined.api.v1.GetModelDefResponse - 310, // 310: determined.api.v1.Determined.GetTaskContextDirectory:output_type -> determined.api.v1.GetTaskContextDirectoryResponse - 311, // 311: determined.api.v1.Determined.GetModelDefTree:output_type -> determined.api.v1.GetModelDefTreeResponse - 312, // 312: determined.api.v1.Determined.GetModelDefFile:output_type -> determined.api.v1.GetModelDefFileResponse - 313, // 313: determined.api.v1.Determined.GetExperimentLabels:output_type -> determined.api.v1.GetExperimentLabelsResponse - 314, // 314: determined.api.v1.Determined.GetExperimentValidationHistory:output_type -> determined.api.v1.GetExperimentValidationHistoryResponse - 315, // 315: determined.api.v1.Determined.ActivateExperiment:output_type -> determined.api.v1.ActivateExperimentResponse - 316, // 316: determined.api.v1.Determined.ActivateExperiments:output_type -> determined.api.v1.ActivateExperimentsResponse - 317, // 317: determined.api.v1.Determined.PauseExperiment:output_type -> determined.api.v1.PauseExperimentResponse - 318, // 318: determined.api.v1.Determined.PauseExperiments:output_type -> determined.api.v1.PauseExperimentsResponse - 319, // 319: determined.api.v1.Determined.CancelExperiment:output_type -> determined.api.v1.CancelExperimentResponse - 320, // 320: determined.api.v1.Determined.CancelExperiments:output_type -> determined.api.v1.CancelExperimentsResponse - 321, // 321: determined.api.v1.Determined.KillExperiment:output_type -> determined.api.v1.KillExperimentResponse - 322, // 322: determined.api.v1.Determined.KillExperiments:output_type -> determined.api.v1.KillExperimentsResponse - 323, // 323: determined.api.v1.Determined.ArchiveExperiment:output_type -> determined.api.v1.ArchiveExperimentResponse - 324, // 324: determined.api.v1.Determined.ArchiveExperiments:output_type -> determined.api.v1.ArchiveExperimentsResponse - 325, // 325: determined.api.v1.Determined.UnarchiveExperiment:output_type -> determined.api.v1.UnarchiveExperimentResponse - 326, // 326: determined.api.v1.Determined.UnarchiveExperiments:output_type -> determined.api.v1.UnarchiveExperimentsResponse - 327, // 327: determined.api.v1.Determined.PatchExperiment:output_type -> determined.api.v1.PatchExperimentResponse - 328, // 328: determined.api.v1.Determined.DeleteExperiments:output_type -> determined.api.v1.DeleteExperimentsResponse - 329, // 329: determined.api.v1.Determined.DeleteExperiment:output_type -> determined.api.v1.DeleteExperimentResponse - 330, // 330: determined.api.v1.Determined.GetBestSearcherValidationMetric:output_type -> determined.api.v1.GetBestSearcherValidationMetricResponse - 331, // 331: determined.api.v1.Determined.GetExperimentCheckpoints:output_type -> determined.api.v1.GetExperimentCheckpointsResponse - 332, // 332: determined.api.v1.Determined.PutExperimentLabel:output_type -> determined.api.v1.PutExperimentLabelResponse - 333, // 333: determined.api.v1.Determined.DeleteExperimentLabel:output_type -> determined.api.v1.DeleteExperimentLabelResponse - 334, // 334: determined.api.v1.Determined.PreviewHPSearch:output_type -> determined.api.v1.PreviewHPSearchResponse - 335, // 335: determined.api.v1.Determined.GetExperimentTrials:output_type -> determined.api.v1.GetExperimentTrialsResponse - 336, // 336: determined.api.v1.Determined.GetTrialRemainingLogRetentionDays:output_type -> determined.api.v1.GetTrialRemainingLogRetentionDaysResponse - 337, // 337: determined.api.v1.Determined.CompareTrials:output_type -> determined.api.v1.CompareTrialsResponse - 338, // 338: determined.api.v1.Determined.ReportTrialSourceInfo:output_type -> determined.api.v1.ReportTrialSourceInfoResponse - 339, // 339: determined.api.v1.Determined.CreateTrial:output_type -> determined.api.v1.CreateTrialResponse - 340, // 340: determined.api.v1.Determined.PutTrial:output_type -> determined.api.v1.PutTrialResponse - 341, // 341: determined.api.v1.Determined.PatchTrial:output_type -> determined.api.v1.PatchTrialResponse - 342, // 342: determined.api.v1.Determined.StartTrial:output_type -> determined.api.v1.StartTrialResponse - 343, // 343: determined.api.v1.Determined.RunPrepareForReporting:output_type -> determined.api.v1.RunPrepareForReportingResponse - 344, // 344: determined.api.v1.Determined.GetTrial:output_type -> determined.api.v1.GetTrialResponse - 345, // 345: determined.api.v1.Determined.GetTrialByExternalID:output_type -> determined.api.v1.GetTrialByExternalIDResponse - 346, // 346: determined.api.v1.Determined.GetTrialWorkloads:output_type -> determined.api.v1.GetTrialWorkloadsResponse - 347, // 347: determined.api.v1.Determined.TrialLogs:output_type -> determined.api.v1.TrialLogsResponse - 348, // 348: determined.api.v1.Determined.TrialLogsFields:output_type -> determined.api.v1.TrialLogsFieldsResponse - 349, // 349: determined.api.v1.Determined.AllocationReady:output_type -> determined.api.v1.AllocationReadyResponse - 350, // 350: determined.api.v1.Determined.GetAllocation:output_type -> determined.api.v1.GetAllocationResponse - 351, // 351: determined.api.v1.Determined.AllocationWaiting:output_type -> determined.api.v1.AllocationWaitingResponse - 352, // 352: determined.api.v1.Determined.PostTaskLogs:output_type -> determined.api.v1.PostTaskLogsResponse - 353, // 353: determined.api.v1.Determined.TaskLogs:output_type -> determined.api.v1.TaskLogsResponse - 354, // 354: determined.api.v1.Determined.TaskLogsFields:output_type -> determined.api.v1.TaskLogsFieldsResponse - 355, // 355: determined.api.v1.Determined.GetTrialProfilerMetrics:output_type -> determined.api.v1.GetTrialProfilerMetricsResponse - 356, // 356: determined.api.v1.Determined.GetTrialProfilerAvailableSeries:output_type -> determined.api.v1.GetTrialProfilerAvailableSeriesResponse - 357, // 357: determined.api.v1.Determined.PostTrialProfilerMetricsBatch:output_type -> determined.api.v1.PostTrialProfilerMetricsBatchResponse - 358, // 358: determined.api.v1.Determined.GetMetrics:output_type -> determined.api.v1.GetMetricsResponse - 359, // 359: determined.api.v1.Determined.GetTrainingMetrics:output_type -> determined.api.v1.GetTrainingMetricsResponse - 360, // 360: determined.api.v1.Determined.GetValidationMetrics:output_type -> determined.api.v1.GetValidationMetricsResponse - 361, // 361: determined.api.v1.Determined.KillTrial:output_type -> determined.api.v1.KillTrialResponse - 362, // 362: determined.api.v1.Determined.GetTrialCheckpoints:output_type -> determined.api.v1.GetTrialCheckpointsResponse - 363, // 363: determined.api.v1.Determined.CleanupLogs:output_type -> determined.api.v1.CleanupLogsResponse - 364, // 364: determined.api.v1.Determined.AllocationPreemptionSignal:output_type -> determined.api.v1.AllocationPreemptionSignalResponse - 365, // 365: determined.api.v1.Determined.AllocationPendingPreemptionSignal:output_type -> determined.api.v1.AllocationPendingPreemptionSignalResponse - 366, // 366: determined.api.v1.Determined.AckAllocationPreemptionSignal:output_type -> determined.api.v1.AckAllocationPreemptionSignalResponse - 367, // 367: determined.api.v1.Determined.MarkAllocationResourcesDaemon:output_type -> determined.api.v1.MarkAllocationResourcesDaemonResponse - 368, // 368: determined.api.v1.Determined.AllocationRendezvousInfo:output_type -> determined.api.v1.AllocationRendezvousInfoResponse - 369, // 369: determined.api.v1.Determined.PostAllocationProxyAddress:output_type -> determined.api.v1.PostAllocationProxyAddressResponse - 370, // 370: determined.api.v1.Determined.GetTaskAcceleratorData:output_type -> determined.api.v1.GetTaskAcceleratorDataResponse - 371, // 371: determined.api.v1.Determined.PostAllocationAcceleratorData:output_type -> determined.api.v1.PostAllocationAcceleratorDataResponse - 372, // 372: determined.api.v1.Determined.AllocationAllGather:output_type -> determined.api.v1.AllocationAllGatherResponse - 373, // 373: determined.api.v1.Determined.NotifyContainerRunning:output_type -> determined.api.v1.NotifyContainerRunningResponse - 374, // 374: determined.api.v1.Determined.ReportTrialSearcherEarlyExit:output_type -> determined.api.v1.ReportTrialSearcherEarlyExitResponse - 375, // 375: determined.api.v1.Determined.ReportTrialProgress:output_type -> determined.api.v1.ReportTrialProgressResponse - 376, // 376: determined.api.v1.Determined.PostTrialRunnerMetadata:output_type -> determined.api.v1.PostTrialRunnerMetadataResponse - 377, // 377: determined.api.v1.Determined.ReportTrialMetrics:output_type -> determined.api.v1.ReportTrialMetricsResponse - 378, // 378: determined.api.v1.Determined.ReportTrialTrainingMetrics:output_type -> determined.api.v1.ReportTrialTrainingMetricsResponse - 379, // 379: determined.api.v1.Determined.ReportTrialValidationMetrics:output_type -> determined.api.v1.ReportTrialValidationMetricsResponse - 380, // 380: determined.api.v1.Determined.ReportCheckpoint:output_type -> determined.api.v1.ReportCheckpointResponse - 381, // 381: determined.api.v1.Determined.GetJobs:output_type -> determined.api.v1.GetJobsResponse - 382, // 382: determined.api.v1.Determined.GetJobsV2:output_type -> determined.api.v1.GetJobsV2Response - 383, // 383: determined.api.v1.Determined.GetJobQueueStats:output_type -> determined.api.v1.GetJobQueueStatsResponse - 384, // 384: determined.api.v1.Determined.UpdateJobQueue:output_type -> determined.api.v1.UpdateJobQueueResponse - 385, // 385: determined.api.v1.Determined.GetTemplates:output_type -> determined.api.v1.GetTemplatesResponse - 386, // 386: determined.api.v1.Determined.GetTemplate:output_type -> determined.api.v1.GetTemplateResponse - 387, // 387: determined.api.v1.Determined.PutTemplate:output_type -> determined.api.v1.PutTemplateResponse - 388, // 388: determined.api.v1.Determined.PostTemplate:output_type -> determined.api.v1.PostTemplateResponse - 389, // 389: determined.api.v1.Determined.PatchTemplateConfig:output_type -> determined.api.v1.PatchTemplateConfigResponse - 390, // 390: determined.api.v1.Determined.PatchTemplateName:output_type -> determined.api.v1.PatchTemplateNameResponse - 391, // 391: determined.api.v1.Determined.DeleteTemplate:output_type -> determined.api.v1.DeleteTemplateResponse - 392, // 392: determined.api.v1.Determined.GetNotebooks:output_type -> determined.api.v1.GetNotebooksResponse - 393, // 393: determined.api.v1.Determined.GetNotebook:output_type -> determined.api.v1.GetNotebookResponse - 394, // 394: determined.api.v1.Determined.IdleNotebook:output_type -> determined.api.v1.IdleNotebookResponse - 395, // 395: determined.api.v1.Determined.KillNotebook:output_type -> determined.api.v1.KillNotebookResponse - 396, // 396: determined.api.v1.Determined.SetNotebookPriority:output_type -> determined.api.v1.SetNotebookPriorityResponse - 397, // 397: determined.api.v1.Determined.LaunchNotebook:output_type -> determined.api.v1.LaunchNotebookResponse - 398, // 398: determined.api.v1.Determined.GetShells:output_type -> determined.api.v1.GetShellsResponse - 399, // 399: determined.api.v1.Determined.GetShell:output_type -> determined.api.v1.GetShellResponse - 400, // 400: determined.api.v1.Determined.KillShell:output_type -> determined.api.v1.KillShellResponse - 401, // 401: determined.api.v1.Determined.SetShellPriority:output_type -> determined.api.v1.SetShellPriorityResponse - 402, // 402: determined.api.v1.Determined.LaunchShell:output_type -> determined.api.v1.LaunchShellResponse - 403, // 403: determined.api.v1.Determined.GetCommands:output_type -> determined.api.v1.GetCommandsResponse - 404, // 404: determined.api.v1.Determined.GetCommand:output_type -> determined.api.v1.GetCommandResponse - 405, // 405: determined.api.v1.Determined.KillCommand:output_type -> determined.api.v1.KillCommandResponse - 406, // 406: determined.api.v1.Determined.SetCommandPriority:output_type -> determined.api.v1.SetCommandPriorityResponse - 407, // 407: determined.api.v1.Determined.LaunchCommand:output_type -> determined.api.v1.LaunchCommandResponse - 408, // 408: determined.api.v1.Determined.GetTensorboards:output_type -> determined.api.v1.GetTensorboardsResponse - 409, // 409: determined.api.v1.Determined.GetTensorboard:output_type -> determined.api.v1.GetTensorboardResponse - 410, // 410: determined.api.v1.Determined.KillTensorboard:output_type -> determined.api.v1.KillTensorboardResponse - 411, // 411: determined.api.v1.Determined.SetTensorboardPriority:output_type -> determined.api.v1.SetTensorboardPriorityResponse - 412, // 412: determined.api.v1.Determined.LaunchTensorboard:output_type -> determined.api.v1.LaunchTensorboardResponse - 413, // 413: determined.api.v1.Determined.LaunchTensorboardSearches:output_type -> determined.api.v1.LaunchTensorboardSearchesResponse - 414, // 414: determined.api.v1.Determined.DeleteTensorboardFiles:output_type -> determined.api.v1.DeleteTensorboardFilesResponse - 415, // 415: determined.api.v1.Determined.GetActiveTasksCount:output_type -> determined.api.v1.GetActiveTasksCountResponse - 416, // 416: determined.api.v1.Determined.GetTask:output_type -> determined.api.v1.GetTaskResponse - 417, // 417: determined.api.v1.Determined.GetTasks:output_type -> determined.api.v1.GetTasksResponse - 418, // 418: determined.api.v1.Determined.GetModel:output_type -> determined.api.v1.GetModelResponse - 419, // 419: determined.api.v1.Determined.PostModel:output_type -> determined.api.v1.PostModelResponse - 420, // 420: determined.api.v1.Determined.PatchModel:output_type -> determined.api.v1.PatchModelResponse - 421, // 421: determined.api.v1.Determined.ArchiveModel:output_type -> determined.api.v1.ArchiveModelResponse - 422, // 422: determined.api.v1.Determined.UnarchiveModel:output_type -> determined.api.v1.UnarchiveModelResponse - 423, // 423: determined.api.v1.Determined.MoveModel:output_type -> determined.api.v1.MoveModelResponse - 424, // 424: determined.api.v1.Determined.DeleteModel:output_type -> determined.api.v1.DeleteModelResponse - 425, // 425: determined.api.v1.Determined.GetModels:output_type -> determined.api.v1.GetModelsResponse - 426, // 426: determined.api.v1.Determined.GetModelLabels:output_type -> determined.api.v1.GetModelLabelsResponse - 427, // 427: determined.api.v1.Determined.GetModelVersion:output_type -> determined.api.v1.GetModelVersionResponse - 428, // 428: determined.api.v1.Determined.GetModelVersions:output_type -> determined.api.v1.GetModelVersionsResponse - 429, // 429: determined.api.v1.Determined.PostModelVersion:output_type -> determined.api.v1.PostModelVersionResponse - 430, // 430: determined.api.v1.Determined.PatchModelVersion:output_type -> determined.api.v1.PatchModelVersionResponse - 431, // 431: determined.api.v1.Determined.DeleteModelVersion:output_type -> determined.api.v1.DeleteModelVersionResponse - 432, // 432: determined.api.v1.Determined.GetTrialMetricsByModelVersion:output_type -> determined.api.v1.GetTrialMetricsByModelVersionResponse - 433, // 433: determined.api.v1.Determined.GetCheckpoint:output_type -> determined.api.v1.GetCheckpointResponse - 434, // 434: determined.api.v1.Determined.PostCheckpointMetadata:output_type -> determined.api.v1.PostCheckpointMetadataResponse - 435, // 435: determined.api.v1.Determined.CheckpointsRemoveFiles:output_type -> determined.api.v1.CheckpointsRemoveFilesResponse - 436, // 436: determined.api.v1.Determined.PatchCheckpoints:output_type -> determined.api.v1.PatchCheckpointsResponse - 437, // 437: determined.api.v1.Determined.DeleteCheckpoints:output_type -> determined.api.v1.DeleteCheckpointsResponse - 438, // 438: determined.api.v1.Determined.GetTrialMetricsByCheckpoint:output_type -> determined.api.v1.GetTrialMetricsByCheckpointResponse - 439, // 439: determined.api.v1.Determined.ExpMetricNames:output_type -> determined.api.v1.ExpMetricNamesResponse - 440, // 440: determined.api.v1.Determined.MetricBatches:output_type -> determined.api.v1.MetricBatchesResponse - 441, // 441: determined.api.v1.Determined.TrialsSnapshot:output_type -> determined.api.v1.TrialsSnapshotResponse - 442, // 442: determined.api.v1.Determined.TrialsSample:output_type -> determined.api.v1.TrialsSampleResponse - 443, // 443: determined.api.v1.Determined.GetResourcePools:output_type -> determined.api.v1.GetResourcePoolsResponse - 444, // 444: determined.api.v1.Determined.GetKubernetesResourceManagers:output_type -> determined.api.v1.GetKubernetesResourceManagersResponse - 445, // 445: determined.api.v1.Determined.ResourceAllocationRaw:output_type -> determined.api.v1.ResourceAllocationRawResponse - 446, // 446: determined.api.v1.Determined.ResourceAllocationAggregated:output_type -> determined.api.v1.ResourceAllocationAggregatedResponse - 447, // 447: determined.api.v1.Determined.GetWorkspace:output_type -> determined.api.v1.GetWorkspaceResponse - 448, // 448: determined.api.v1.Determined.GetWorkspaceProjects:output_type -> determined.api.v1.GetWorkspaceProjectsResponse - 449, // 449: determined.api.v1.Determined.GetWorkspaces:output_type -> determined.api.v1.GetWorkspacesResponse - 450, // 450: determined.api.v1.Determined.PostWorkspace:output_type -> determined.api.v1.PostWorkspaceResponse - 451, // 451: determined.api.v1.Determined.PatchWorkspace:output_type -> determined.api.v1.PatchWorkspaceResponse - 452, // 452: determined.api.v1.Determined.DeleteWorkspace:output_type -> determined.api.v1.DeleteWorkspaceResponse - 453, // 453: determined.api.v1.Determined.ArchiveWorkspace:output_type -> determined.api.v1.ArchiveWorkspaceResponse - 454, // 454: determined.api.v1.Determined.UnarchiveWorkspace:output_type -> determined.api.v1.UnarchiveWorkspaceResponse - 455, // 455: determined.api.v1.Determined.PinWorkspace:output_type -> determined.api.v1.PinWorkspaceResponse - 456, // 456: determined.api.v1.Determined.UnpinWorkspace:output_type -> determined.api.v1.UnpinWorkspaceResponse - 457, // 457: determined.api.v1.Determined.SetWorkspaceNamespaceBindings:output_type -> determined.api.v1.SetWorkspaceNamespaceBindingsResponse - 458, // 458: determined.api.v1.Determined.SetResourceQuotas:output_type -> determined.api.v1.SetResourceQuotasResponse - 459, // 459: determined.api.v1.Determined.ListWorkspaceNamespaceBindings:output_type -> determined.api.v1.ListWorkspaceNamespaceBindingsResponse - 460, // 460: determined.api.v1.Determined.GetWorkspacesWithDefaultNamespaceBindings:output_type -> determined.api.v1.GetWorkspacesWithDefaultNamespaceBindingsResponse - 461, // 461: determined.api.v1.Determined.BulkAutoCreateWorkspaceNamespaceBindings:output_type -> determined.api.v1.BulkAutoCreateWorkspaceNamespaceBindingsResponse - 462, // 462: determined.api.v1.Determined.DeleteWorkspaceNamespaceBindings:output_type -> determined.api.v1.DeleteWorkspaceNamespaceBindingsResponse - 463, // 463: determined.api.v1.Determined.GetKubernetesResourceQuotas:output_type -> determined.api.v1.GetKubernetesResourceQuotasResponse - 464, // 464: determined.api.v1.Determined.GetProject:output_type -> determined.api.v1.GetProjectResponse - 465, // 465: determined.api.v1.Determined.GetProjectByKey:output_type -> determined.api.v1.GetProjectByKeyResponse - 466, // 466: determined.api.v1.Determined.GetProjectColumns:output_type -> determined.api.v1.GetProjectColumnsResponse - 467, // 467: determined.api.v1.Determined.GetProjectNumericMetricsRange:output_type -> determined.api.v1.GetProjectNumericMetricsRangeResponse - 468, // 468: determined.api.v1.Determined.PostProject:output_type -> determined.api.v1.PostProjectResponse - 469, // 469: determined.api.v1.Determined.AddProjectNote:output_type -> determined.api.v1.AddProjectNoteResponse - 470, // 470: determined.api.v1.Determined.PutProjectNotes:output_type -> determined.api.v1.PutProjectNotesResponse - 471, // 471: determined.api.v1.Determined.PatchProject:output_type -> determined.api.v1.PatchProjectResponse - 472, // 472: determined.api.v1.Determined.DeleteProject:output_type -> determined.api.v1.DeleteProjectResponse - 473, // 473: determined.api.v1.Determined.ArchiveProject:output_type -> determined.api.v1.ArchiveProjectResponse - 474, // 474: determined.api.v1.Determined.UnarchiveProject:output_type -> determined.api.v1.UnarchiveProjectResponse - 475, // 475: determined.api.v1.Determined.MoveProject:output_type -> determined.api.v1.MoveProjectResponse - 476, // 476: determined.api.v1.Determined.MoveExperiment:output_type -> determined.api.v1.MoveExperimentResponse - 477, // 477: determined.api.v1.Determined.MoveExperiments:output_type -> determined.api.v1.MoveExperimentsResponse - 478, // 478: determined.api.v1.Determined.GetWebhooks:output_type -> determined.api.v1.GetWebhooksResponse - 479, // 479: determined.api.v1.Determined.PatchWebhook:output_type -> determined.api.v1.PatchWebhookResponse - 480, // 480: determined.api.v1.Determined.PostWebhook:output_type -> determined.api.v1.PostWebhookResponse - 481, // 481: determined.api.v1.Determined.DeleteWebhook:output_type -> determined.api.v1.DeleteWebhookResponse - 482, // 482: determined.api.v1.Determined.TestWebhook:output_type -> determined.api.v1.TestWebhookResponse - 483, // 483: determined.api.v1.Determined.PostWebhookEventData:output_type -> determined.api.v1.PostWebhookEventDataResponse - 484, // 484: determined.api.v1.Determined.GetGroup:output_type -> determined.api.v1.GetGroupResponse - 485, // 485: determined.api.v1.Determined.GetGroups:output_type -> determined.api.v1.GetGroupsResponse - 486, // 486: determined.api.v1.Determined.CreateGroup:output_type -> determined.api.v1.CreateGroupResponse - 487, // 487: determined.api.v1.Determined.UpdateGroup:output_type -> determined.api.v1.UpdateGroupResponse - 488, // 488: determined.api.v1.Determined.DeleteGroup:output_type -> determined.api.v1.DeleteGroupResponse - 489, // 489: determined.api.v1.Determined.GetPermissionsSummary:output_type -> determined.api.v1.GetPermissionsSummaryResponse - 490, // 490: determined.api.v1.Determined.GetGroupsAndUsersAssignedToWorkspace:output_type -> determined.api.v1.GetGroupsAndUsersAssignedToWorkspaceResponse - 491, // 491: determined.api.v1.Determined.GetRolesByID:output_type -> determined.api.v1.GetRolesByIDResponse - 492, // 492: determined.api.v1.Determined.GetRolesAssignedToUser:output_type -> determined.api.v1.GetRolesAssignedToUserResponse - 493, // 493: determined.api.v1.Determined.GetRolesAssignedToGroup:output_type -> determined.api.v1.GetRolesAssignedToGroupResponse - 494, // 494: determined.api.v1.Determined.SearchRolesAssignableToScope:output_type -> determined.api.v1.SearchRolesAssignableToScopeResponse - 495, // 495: determined.api.v1.Determined.ListRoles:output_type -> determined.api.v1.ListRolesResponse - 496, // 496: determined.api.v1.Determined.AssignRoles:output_type -> determined.api.v1.AssignRolesResponse - 497, // 497: determined.api.v1.Determined.RemoveAssignments:output_type -> determined.api.v1.RemoveAssignmentsResponse - 498, // 498: determined.api.v1.Determined.PostUserActivity:output_type -> determined.api.v1.PostUserActivityResponse - 499, // 499: determined.api.v1.Determined.GetProjectsByUserActivity:output_type -> determined.api.v1.GetProjectsByUserActivityResponse - 500, // 500: determined.api.v1.Determined.SearchExperiments:output_type -> determined.api.v1.SearchExperimentsResponse - 501, // 501: determined.api.v1.Determined.BindRPToWorkspace:output_type -> determined.api.v1.BindRPToWorkspaceResponse - 502, // 502: determined.api.v1.Determined.UnbindRPFromWorkspace:output_type -> determined.api.v1.UnbindRPFromWorkspaceResponse - 503, // 503: determined.api.v1.Determined.OverwriteRPWorkspaceBindings:output_type -> determined.api.v1.OverwriteRPWorkspaceBindingsResponse - 504, // 504: determined.api.v1.Determined.ListRPsBoundToWorkspace:output_type -> determined.api.v1.ListRPsBoundToWorkspaceResponse - 505, // 505: determined.api.v1.Determined.ListWorkspacesBoundToRP:output_type -> determined.api.v1.ListWorkspacesBoundToRPResponse - 506, // 506: determined.api.v1.Determined.GetGenericTaskConfig:output_type -> determined.api.v1.GetGenericTaskConfigResponse - 507, // 507: determined.api.v1.Determined.KillGenericTask:output_type -> determined.api.v1.KillGenericTaskResponse - 508, // 508: determined.api.v1.Determined.PauseGenericTask:output_type -> determined.api.v1.PauseGenericTaskResponse - 509, // 509: determined.api.v1.Determined.UnpauseGenericTask:output_type -> determined.api.v1.UnpauseGenericTaskResponse - 510, // 510: determined.api.v1.Determined.SearchRuns:output_type -> determined.api.v1.SearchRunsResponse - 511, // 511: determined.api.v1.Determined.MoveRuns:output_type -> determined.api.v1.MoveRunsResponse - 512, // 512: determined.api.v1.Determined.KillRuns:output_type -> determined.api.v1.KillRunsResponse - 513, // 513: determined.api.v1.Determined.DeleteRuns:output_type -> determined.api.v1.DeleteRunsResponse - 514, // 514: determined.api.v1.Determined.ArchiveRuns:output_type -> determined.api.v1.ArchiveRunsResponse - 515, // 515: determined.api.v1.Determined.UnarchiveRuns:output_type -> determined.api.v1.UnarchiveRunsResponse - 516, // 516: determined.api.v1.Determined.PauseRuns:output_type -> determined.api.v1.PauseRunsResponse - 517, // 517: determined.api.v1.Determined.ResumeRuns:output_type -> determined.api.v1.ResumeRunsResponse - 518, // 518: determined.api.v1.Determined.GetRunMetadata:output_type -> determined.api.v1.GetRunMetadataResponse - 519, // 519: determined.api.v1.Determined.PostRunMetadata:output_type -> determined.api.v1.PostRunMetadataResponse - 520, // 520: determined.api.v1.Determined.GetMetadataValues:output_type -> determined.api.v1.GetMetadataValuesResponse - 521, // 521: determined.api.v1.Determined.PutWorkspaceConfigPolicies:output_type -> determined.api.v1.PutWorkspaceConfigPoliciesResponse - 522, // 522: determined.api.v1.Determined.PutGlobalConfigPolicies:output_type -> determined.api.v1.PutGlobalConfigPoliciesResponse - 523, // 523: determined.api.v1.Determined.GetWorkspaceConfigPolicies:output_type -> determined.api.v1.GetWorkspaceConfigPoliciesResponse - 524, // 524: determined.api.v1.Determined.GetGlobalConfigPolicies:output_type -> determined.api.v1.GetGlobalConfigPoliciesResponse - 525, // 525: determined.api.v1.Determined.DeleteWorkspaceConfigPolicies:output_type -> determined.api.v1.DeleteWorkspaceConfigPoliciesResponse - 526, // 526: determined.api.v1.Determined.DeleteGlobalConfigPolicies:output_type -> determined.api.v1.DeleteGlobalConfigPoliciesResponse - 527, // 527: determined.api.v1.Determined.MoveSearches:output_type -> determined.api.v1.MoveSearchesResponse - 528, // 528: determined.api.v1.Determined.CancelSearches:output_type -> determined.api.v1.CancelSearchesResponse - 529, // 529: determined.api.v1.Determined.KillSearches:output_type -> determined.api.v1.KillSearchesResponse - 530, // 530: determined.api.v1.Determined.DeleteSearches:output_type -> determined.api.v1.DeleteSearchesResponse - 531, // 531: determined.api.v1.Determined.ArchiveSearches:output_type -> determined.api.v1.ArchiveSearchesResponse - 532, // 532: determined.api.v1.Determined.UnarchiveSearches:output_type -> determined.api.v1.UnarchiveSearchesResponse - 533, // 533: determined.api.v1.Determined.PauseSearches:output_type -> determined.api.v1.PauseSearchesResponse - 534, // 534: determined.api.v1.Determined.ResumeSearches:output_type -> determined.api.v1.ResumeSearchesResponse - 535, // 535: determined.api.v1.Determined.PostAccessToken:output_type -> determined.api.v1.PostAccessTokenResponse - 536, // 536: determined.api.v1.Determined.GetAccessTokens:output_type -> determined.api.v1.GetAccessTokensResponse - 537, // 537: determined.api.v1.Determined.PatchAccessToken:output_type -> determined.api.v1.PatchAccessTokenResponse - 269, // [269:538] is the sub-list for method output_type - 0, // [0:269] is the sub-list for method input_type + 144, // 144: determined.api.v1.Determined.DeleteTensorboardFiles:input_type -> determined.api.v1.DeleteTensorboardFilesRequest + 145, // 145: determined.api.v1.Determined.GetActiveTasksCount:input_type -> determined.api.v1.GetActiveTasksCountRequest + 146, // 146: determined.api.v1.Determined.GetTask:input_type -> determined.api.v1.GetTaskRequest + 147, // 147: determined.api.v1.Determined.GetTasks:input_type -> determined.api.v1.GetTasksRequest + 148, // 148: determined.api.v1.Determined.GetModel:input_type -> determined.api.v1.GetModelRequest + 149, // 149: determined.api.v1.Determined.PostModel:input_type -> determined.api.v1.PostModelRequest + 150, // 150: determined.api.v1.Determined.PatchModel:input_type -> determined.api.v1.PatchModelRequest + 151, // 151: determined.api.v1.Determined.ArchiveModel:input_type -> determined.api.v1.ArchiveModelRequest + 152, // 152: determined.api.v1.Determined.UnarchiveModel:input_type -> determined.api.v1.UnarchiveModelRequest + 153, // 153: determined.api.v1.Determined.MoveModel:input_type -> determined.api.v1.MoveModelRequest + 154, // 154: determined.api.v1.Determined.DeleteModel:input_type -> determined.api.v1.DeleteModelRequest + 155, // 155: determined.api.v1.Determined.GetModels:input_type -> determined.api.v1.GetModelsRequest + 156, // 156: determined.api.v1.Determined.GetModelLabels:input_type -> determined.api.v1.GetModelLabelsRequest + 157, // 157: determined.api.v1.Determined.GetModelVersion:input_type -> determined.api.v1.GetModelVersionRequest + 158, // 158: determined.api.v1.Determined.GetModelVersions:input_type -> determined.api.v1.GetModelVersionsRequest + 159, // 159: determined.api.v1.Determined.PostModelVersion:input_type -> determined.api.v1.PostModelVersionRequest + 160, // 160: determined.api.v1.Determined.PatchModelVersion:input_type -> determined.api.v1.PatchModelVersionRequest + 161, // 161: determined.api.v1.Determined.DeleteModelVersion:input_type -> determined.api.v1.DeleteModelVersionRequest + 162, // 162: determined.api.v1.Determined.GetTrialMetricsByModelVersion:input_type -> determined.api.v1.GetTrialMetricsByModelVersionRequest + 163, // 163: determined.api.v1.Determined.GetCheckpoint:input_type -> determined.api.v1.GetCheckpointRequest + 164, // 164: determined.api.v1.Determined.PostCheckpointMetadata:input_type -> determined.api.v1.PostCheckpointMetadataRequest + 165, // 165: determined.api.v1.Determined.CheckpointsRemoveFiles:input_type -> determined.api.v1.CheckpointsRemoveFilesRequest + 166, // 166: determined.api.v1.Determined.PatchCheckpoints:input_type -> determined.api.v1.PatchCheckpointsRequest + 167, // 167: determined.api.v1.Determined.DeleteCheckpoints:input_type -> determined.api.v1.DeleteCheckpointsRequest + 168, // 168: determined.api.v1.Determined.GetTrialMetricsByCheckpoint:input_type -> determined.api.v1.GetTrialMetricsByCheckpointRequest + 169, // 169: determined.api.v1.Determined.ExpMetricNames:input_type -> determined.api.v1.ExpMetricNamesRequest + 170, // 170: determined.api.v1.Determined.MetricBatches:input_type -> determined.api.v1.MetricBatchesRequest + 171, // 171: determined.api.v1.Determined.TrialsSnapshot:input_type -> determined.api.v1.TrialsSnapshotRequest + 172, // 172: determined.api.v1.Determined.TrialsSample:input_type -> determined.api.v1.TrialsSampleRequest + 173, // 173: determined.api.v1.Determined.GetResourcePools:input_type -> determined.api.v1.GetResourcePoolsRequest + 174, // 174: determined.api.v1.Determined.GetKubernetesResourceManagers:input_type -> determined.api.v1.GetKubernetesResourceManagersRequest + 175, // 175: determined.api.v1.Determined.ResourceAllocationRaw:input_type -> determined.api.v1.ResourceAllocationRawRequest + 176, // 176: determined.api.v1.Determined.ResourceAllocationAggregated:input_type -> determined.api.v1.ResourceAllocationAggregatedRequest + 177, // 177: determined.api.v1.Determined.GetWorkspace:input_type -> determined.api.v1.GetWorkspaceRequest + 178, // 178: determined.api.v1.Determined.GetWorkspaceProjects:input_type -> determined.api.v1.GetWorkspaceProjectsRequest + 179, // 179: determined.api.v1.Determined.GetWorkspaces:input_type -> determined.api.v1.GetWorkspacesRequest + 180, // 180: determined.api.v1.Determined.PostWorkspace:input_type -> determined.api.v1.PostWorkspaceRequest + 181, // 181: determined.api.v1.Determined.PatchWorkspace:input_type -> determined.api.v1.PatchWorkspaceRequest + 182, // 182: determined.api.v1.Determined.DeleteWorkspace:input_type -> determined.api.v1.DeleteWorkspaceRequest + 183, // 183: determined.api.v1.Determined.ArchiveWorkspace:input_type -> determined.api.v1.ArchiveWorkspaceRequest + 184, // 184: determined.api.v1.Determined.UnarchiveWorkspace:input_type -> determined.api.v1.UnarchiveWorkspaceRequest + 185, // 185: determined.api.v1.Determined.PinWorkspace:input_type -> determined.api.v1.PinWorkspaceRequest + 186, // 186: determined.api.v1.Determined.UnpinWorkspace:input_type -> determined.api.v1.UnpinWorkspaceRequest + 187, // 187: determined.api.v1.Determined.SetWorkspaceNamespaceBindings:input_type -> determined.api.v1.SetWorkspaceNamespaceBindingsRequest + 188, // 188: determined.api.v1.Determined.SetResourceQuotas:input_type -> determined.api.v1.SetResourceQuotasRequest + 189, // 189: determined.api.v1.Determined.ListWorkspaceNamespaceBindings:input_type -> determined.api.v1.ListWorkspaceNamespaceBindingsRequest + 190, // 190: determined.api.v1.Determined.GetWorkspacesWithDefaultNamespaceBindings:input_type -> determined.api.v1.GetWorkspacesWithDefaultNamespaceBindingsRequest + 191, // 191: determined.api.v1.Determined.BulkAutoCreateWorkspaceNamespaceBindings:input_type -> determined.api.v1.BulkAutoCreateWorkspaceNamespaceBindingsRequest + 192, // 192: determined.api.v1.Determined.DeleteWorkspaceNamespaceBindings:input_type -> determined.api.v1.DeleteWorkspaceNamespaceBindingsRequest + 193, // 193: determined.api.v1.Determined.GetKubernetesResourceQuotas:input_type -> determined.api.v1.GetKubernetesResourceQuotasRequest + 194, // 194: determined.api.v1.Determined.GetProject:input_type -> determined.api.v1.GetProjectRequest + 195, // 195: determined.api.v1.Determined.GetProjectByKey:input_type -> determined.api.v1.GetProjectByKeyRequest + 196, // 196: determined.api.v1.Determined.GetProjectColumns:input_type -> determined.api.v1.GetProjectColumnsRequest + 197, // 197: determined.api.v1.Determined.GetProjectNumericMetricsRange:input_type -> determined.api.v1.GetProjectNumericMetricsRangeRequest + 198, // 198: determined.api.v1.Determined.PostProject:input_type -> determined.api.v1.PostProjectRequest + 199, // 199: determined.api.v1.Determined.AddProjectNote:input_type -> determined.api.v1.AddProjectNoteRequest + 200, // 200: determined.api.v1.Determined.PutProjectNotes:input_type -> determined.api.v1.PutProjectNotesRequest + 201, // 201: determined.api.v1.Determined.PatchProject:input_type -> determined.api.v1.PatchProjectRequest + 202, // 202: determined.api.v1.Determined.DeleteProject:input_type -> determined.api.v1.DeleteProjectRequest + 203, // 203: determined.api.v1.Determined.ArchiveProject:input_type -> determined.api.v1.ArchiveProjectRequest + 204, // 204: determined.api.v1.Determined.UnarchiveProject:input_type -> determined.api.v1.UnarchiveProjectRequest + 205, // 205: determined.api.v1.Determined.MoveProject:input_type -> determined.api.v1.MoveProjectRequest + 206, // 206: determined.api.v1.Determined.MoveExperiment:input_type -> determined.api.v1.MoveExperimentRequest + 207, // 207: determined.api.v1.Determined.MoveExperiments:input_type -> determined.api.v1.MoveExperimentsRequest + 208, // 208: determined.api.v1.Determined.GetWebhooks:input_type -> determined.api.v1.GetWebhooksRequest + 209, // 209: determined.api.v1.Determined.PatchWebhook:input_type -> determined.api.v1.PatchWebhookRequest + 210, // 210: determined.api.v1.Determined.PostWebhook:input_type -> determined.api.v1.PostWebhookRequest + 211, // 211: determined.api.v1.Determined.DeleteWebhook:input_type -> determined.api.v1.DeleteWebhookRequest + 212, // 212: determined.api.v1.Determined.TestWebhook:input_type -> determined.api.v1.TestWebhookRequest + 213, // 213: determined.api.v1.Determined.PostWebhookEventData:input_type -> determined.api.v1.PostWebhookEventDataRequest + 214, // 214: determined.api.v1.Determined.GetGroup:input_type -> determined.api.v1.GetGroupRequest + 215, // 215: determined.api.v1.Determined.GetGroups:input_type -> determined.api.v1.GetGroupsRequest + 216, // 216: determined.api.v1.Determined.CreateGroup:input_type -> determined.api.v1.CreateGroupRequest + 217, // 217: determined.api.v1.Determined.UpdateGroup:input_type -> determined.api.v1.UpdateGroupRequest + 218, // 218: determined.api.v1.Determined.DeleteGroup:input_type -> determined.api.v1.DeleteGroupRequest + 219, // 219: determined.api.v1.Determined.GetPermissionsSummary:input_type -> determined.api.v1.GetPermissionsSummaryRequest + 220, // 220: determined.api.v1.Determined.GetGroupsAndUsersAssignedToWorkspace:input_type -> determined.api.v1.GetGroupsAndUsersAssignedToWorkspaceRequest + 221, // 221: determined.api.v1.Determined.GetRolesByID:input_type -> determined.api.v1.GetRolesByIDRequest + 222, // 222: determined.api.v1.Determined.GetRolesAssignedToUser:input_type -> determined.api.v1.GetRolesAssignedToUserRequest + 223, // 223: determined.api.v1.Determined.GetRolesAssignedToGroup:input_type -> determined.api.v1.GetRolesAssignedToGroupRequest + 224, // 224: determined.api.v1.Determined.SearchRolesAssignableToScope:input_type -> determined.api.v1.SearchRolesAssignableToScopeRequest + 225, // 225: determined.api.v1.Determined.ListRoles:input_type -> determined.api.v1.ListRolesRequest + 226, // 226: determined.api.v1.Determined.AssignRoles:input_type -> determined.api.v1.AssignRolesRequest + 227, // 227: determined.api.v1.Determined.RemoveAssignments:input_type -> determined.api.v1.RemoveAssignmentsRequest + 228, // 228: determined.api.v1.Determined.PostUserActivity:input_type -> determined.api.v1.PostUserActivityRequest + 229, // 229: determined.api.v1.Determined.GetProjectsByUserActivity:input_type -> determined.api.v1.GetProjectsByUserActivityRequest + 230, // 230: determined.api.v1.Determined.SearchExperiments:input_type -> determined.api.v1.SearchExperimentsRequest + 231, // 231: determined.api.v1.Determined.BindRPToWorkspace:input_type -> determined.api.v1.BindRPToWorkspaceRequest + 232, // 232: determined.api.v1.Determined.UnbindRPFromWorkspace:input_type -> determined.api.v1.UnbindRPFromWorkspaceRequest + 233, // 233: determined.api.v1.Determined.OverwriteRPWorkspaceBindings:input_type -> determined.api.v1.OverwriteRPWorkspaceBindingsRequest + 234, // 234: determined.api.v1.Determined.ListRPsBoundToWorkspace:input_type -> determined.api.v1.ListRPsBoundToWorkspaceRequest + 235, // 235: determined.api.v1.Determined.ListWorkspacesBoundToRP:input_type -> determined.api.v1.ListWorkspacesBoundToRPRequest + 236, // 236: determined.api.v1.Determined.GetGenericTaskConfig:input_type -> determined.api.v1.GetGenericTaskConfigRequest + 237, // 237: determined.api.v1.Determined.KillGenericTask:input_type -> determined.api.v1.KillGenericTaskRequest + 238, // 238: determined.api.v1.Determined.PauseGenericTask:input_type -> determined.api.v1.PauseGenericTaskRequest + 239, // 239: determined.api.v1.Determined.UnpauseGenericTask:input_type -> determined.api.v1.UnpauseGenericTaskRequest + 240, // 240: determined.api.v1.Determined.SearchRuns:input_type -> determined.api.v1.SearchRunsRequest + 241, // 241: determined.api.v1.Determined.MoveRuns:input_type -> determined.api.v1.MoveRunsRequest + 242, // 242: determined.api.v1.Determined.KillRuns:input_type -> determined.api.v1.KillRunsRequest + 243, // 243: determined.api.v1.Determined.DeleteRuns:input_type -> determined.api.v1.DeleteRunsRequest + 244, // 244: determined.api.v1.Determined.ArchiveRuns:input_type -> determined.api.v1.ArchiveRunsRequest + 245, // 245: determined.api.v1.Determined.UnarchiveRuns:input_type -> determined.api.v1.UnarchiveRunsRequest + 246, // 246: determined.api.v1.Determined.PauseRuns:input_type -> determined.api.v1.PauseRunsRequest + 247, // 247: determined.api.v1.Determined.ResumeRuns:input_type -> determined.api.v1.ResumeRunsRequest + 248, // 248: determined.api.v1.Determined.GetRunMetadata:input_type -> determined.api.v1.GetRunMetadataRequest + 249, // 249: determined.api.v1.Determined.PostRunMetadata:input_type -> determined.api.v1.PostRunMetadataRequest + 250, // 250: determined.api.v1.Determined.GetMetadataValues:input_type -> determined.api.v1.GetMetadataValuesRequest + 251, // 251: determined.api.v1.Determined.PutWorkspaceConfigPolicies:input_type -> determined.api.v1.PutWorkspaceConfigPoliciesRequest + 252, // 252: determined.api.v1.Determined.PutGlobalConfigPolicies:input_type -> determined.api.v1.PutGlobalConfigPoliciesRequest + 253, // 253: determined.api.v1.Determined.GetWorkspaceConfigPolicies:input_type -> determined.api.v1.GetWorkspaceConfigPoliciesRequest + 254, // 254: determined.api.v1.Determined.GetGlobalConfigPolicies:input_type -> determined.api.v1.GetGlobalConfigPoliciesRequest + 255, // 255: determined.api.v1.Determined.DeleteWorkspaceConfigPolicies:input_type -> determined.api.v1.DeleteWorkspaceConfigPoliciesRequest + 256, // 256: determined.api.v1.Determined.DeleteGlobalConfigPolicies:input_type -> determined.api.v1.DeleteGlobalConfigPoliciesRequest + 257, // 257: determined.api.v1.Determined.PostAccessToken:input_type -> determined.api.v1.PostAccessTokenRequest + 258, // 258: determined.api.v1.Determined.GetAccessTokens:input_type -> determined.api.v1.GetAccessTokensRequest + 259, // 259: determined.api.v1.Determined.PatchAccessToken:input_type -> determined.api.v1.PatchAccessTokenRequest + 260, // 260: determined.api.v1.Determined.Login:output_type -> determined.api.v1.LoginResponse + 261, // 261: determined.api.v1.Determined.CurrentUser:output_type -> determined.api.v1.CurrentUserResponse + 262, // 262: determined.api.v1.Determined.Logout:output_type -> determined.api.v1.LogoutResponse + 263, // 263: determined.api.v1.Determined.GetUsers:output_type -> determined.api.v1.GetUsersResponse + 264, // 264: determined.api.v1.Determined.GetUserSetting:output_type -> determined.api.v1.GetUserSettingResponse + 265, // 265: determined.api.v1.Determined.ResetUserSetting:output_type -> determined.api.v1.ResetUserSettingResponse + 266, // 266: determined.api.v1.Determined.PostUserSetting:output_type -> determined.api.v1.PostUserSettingResponse + 267, // 267: determined.api.v1.Determined.GetUser:output_type -> determined.api.v1.GetUserResponse + 268, // 268: determined.api.v1.Determined.GetUserByUsername:output_type -> determined.api.v1.GetUserByUsernameResponse + 269, // 269: determined.api.v1.Determined.GetMe:output_type -> determined.api.v1.GetMeResponse + 270, // 270: determined.api.v1.Determined.PostUser:output_type -> determined.api.v1.PostUserResponse + 271, // 271: determined.api.v1.Determined.SetUserPassword:output_type -> determined.api.v1.SetUserPasswordResponse + 272, // 272: determined.api.v1.Determined.AssignMultipleGroups:output_type -> determined.api.v1.AssignMultipleGroupsResponse + 273, // 273: determined.api.v1.Determined.PatchUser:output_type -> determined.api.v1.PatchUserResponse + 274, // 274: determined.api.v1.Determined.PatchUsers:output_type -> determined.api.v1.PatchUsersResponse + 275, // 275: determined.api.v1.Determined.GetTelemetry:output_type -> determined.api.v1.GetTelemetryResponse + 276, // 276: determined.api.v1.Determined.GetMaster:output_type -> determined.api.v1.GetMasterResponse + 277, // 277: determined.api.v1.Determined.GetMasterConfig:output_type -> determined.api.v1.GetMasterConfigResponse + 278, // 278: determined.api.v1.Determined.PatchMasterConfig:output_type -> determined.api.v1.PatchMasterConfigResponse + 279, // 279: determined.api.v1.Determined.MasterLogs:output_type -> determined.api.v1.MasterLogsResponse + 280, // 280: determined.api.v1.Determined.GetClusterMessage:output_type -> determined.api.v1.GetClusterMessageResponse + 281, // 281: determined.api.v1.Determined.SetClusterMessage:output_type -> determined.api.v1.SetClusterMessageResponse + 282, // 282: determined.api.v1.Determined.DeleteClusterMessage:output_type -> determined.api.v1.DeleteClusterMessageResponse + 283, // 283: determined.api.v1.Determined.GetAgents:output_type -> determined.api.v1.GetAgentsResponse + 284, // 284: determined.api.v1.Determined.GetAgent:output_type -> determined.api.v1.GetAgentResponse + 285, // 285: determined.api.v1.Determined.GetSlots:output_type -> determined.api.v1.GetSlotsResponse + 286, // 286: determined.api.v1.Determined.GetSlot:output_type -> determined.api.v1.GetSlotResponse + 287, // 287: determined.api.v1.Determined.EnableAgent:output_type -> determined.api.v1.EnableAgentResponse + 288, // 288: determined.api.v1.Determined.DisableAgent:output_type -> determined.api.v1.DisableAgentResponse + 289, // 289: determined.api.v1.Determined.EnableSlot:output_type -> determined.api.v1.EnableSlotResponse + 290, // 290: determined.api.v1.Determined.DisableSlot:output_type -> determined.api.v1.DisableSlotResponse + 291, // 291: determined.api.v1.Determined.CreateGenericTask:output_type -> determined.api.v1.CreateGenericTaskResponse + 292, // 292: determined.api.v1.Determined.CreateExperiment:output_type -> determined.api.v1.CreateExperimentResponse + 293, // 293: determined.api.v1.Determined.PutExperiment:output_type -> determined.api.v1.PutExperimentResponse + 294, // 294: determined.api.v1.Determined.ContinueExperiment:output_type -> determined.api.v1.ContinueExperimentResponse + 295, // 295: determined.api.v1.Determined.GetExperiment:output_type -> determined.api.v1.GetExperimentResponse + 296, // 296: determined.api.v1.Determined.GetExperiments:output_type -> determined.api.v1.GetExperimentsResponse + 297, // 297: determined.api.v1.Determined.PutExperimentRetainLogs:output_type -> determined.api.v1.PutExperimentRetainLogsResponse + 298, // 298: determined.api.v1.Determined.PutExperimentsRetainLogs:output_type -> determined.api.v1.PutExperimentsRetainLogsResponse + 299, // 299: determined.api.v1.Determined.PutTrialRetainLogs:output_type -> determined.api.v1.PutTrialRetainLogsResponse + 300, // 300: determined.api.v1.Determined.GetModelDef:output_type -> determined.api.v1.GetModelDefResponse + 301, // 301: determined.api.v1.Determined.GetTaskContextDirectory:output_type -> determined.api.v1.GetTaskContextDirectoryResponse + 302, // 302: determined.api.v1.Determined.GetModelDefTree:output_type -> determined.api.v1.GetModelDefTreeResponse + 303, // 303: determined.api.v1.Determined.GetModelDefFile:output_type -> determined.api.v1.GetModelDefFileResponse + 304, // 304: determined.api.v1.Determined.GetExperimentLabels:output_type -> determined.api.v1.GetExperimentLabelsResponse + 305, // 305: determined.api.v1.Determined.GetExperimentValidationHistory:output_type -> determined.api.v1.GetExperimentValidationHistoryResponse + 306, // 306: determined.api.v1.Determined.ActivateExperiment:output_type -> determined.api.v1.ActivateExperimentResponse + 307, // 307: determined.api.v1.Determined.ActivateExperiments:output_type -> determined.api.v1.ActivateExperimentsResponse + 308, // 308: determined.api.v1.Determined.PauseExperiment:output_type -> determined.api.v1.PauseExperimentResponse + 309, // 309: determined.api.v1.Determined.PauseExperiments:output_type -> determined.api.v1.PauseExperimentsResponse + 310, // 310: determined.api.v1.Determined.CancelExperiment:output_type -> determined.api.v1.CancelExperimentResponse + 311, // 311: determined.api.v1.Determined.CancelExperiments:output_type -> determined.api.v1.CancelExperimentsResponse + 312, // 312: determined.api.v1.Determined.KillExperiment:output_type -> determined.api.v1.KillExperimentResponse + 313, // 313: determined.api.v1.Determined.KillExperiments:output_type -> determined.api.v1.KillExperimentsResponse + 314, // 314: determined.api.v1.Determined.ArchiveExperiment:output_type -> determined.api.v1.ArchiveExperimentResponse + 315, // 315: determined.api.v1.Determined.ArchiveExperiments:output_type -> determined.api.v1.ArchiveExperimentsResponse + 316, // 316: determined.api.v1.Determined.UnarchiveExperiment:output_type -> determined.api.v1.UnarchiveExperimentResponse + 317, // 317: determined.api.v1.Determined.UnarchiveExperiments:output_type -> determined.api.v1.UnarchiveExperimentsResponse + 318, // 318: determined.api.v1.Determined.PatchExperiment:output_type -> determined.api.v1.PatchExperimentResponse + 319, // 319: determined.api.v1.Determined.DeleteExperiments:output_type -> determined.api.v1.DeleteExperimentsResponse + 320, // 320: determined.api.v1.Determined.DeleteExperiment:output_type -> determined.api.v1.DeleteExperimentResponse + 321, // 321: determined.api.v1.Determined.GetBestSearcherValidationMetric:output_type -> determined.api.v1.GetBestSearcherValidationMetricResponse + 322, // 322: determined.api.v1.Determined.GetExperimentCheckpoints:output_type -> determined.api.v1.GetExperimentCheckpointsResponse + 323, // 323: determined.api.v1.Determined.PutExperimentLabel:output_type -> determined.api.v1.PutExperimentLabelResponse + 324, // 324: determined.api.v1.Determined.DeleteExperimentLabel:output_type -> determined.api.v1.DeleteExperimentLabelResponse + 325, // 325: determined.api.v1.Determined.PreviewHPSearch:output_type -> determined.api.v1.PreviewHPSearchResponse + 326, // 326: determined.api.v1.Determined.GetExperimentTrials:output_type -> determined.api.v1.GetExperimentTrialsResponse + 327, // 327: determined.api.v1.Determined.GetTrialRemainingLogRetentionDays:output_type -> determined.api.v1.GetTrialRemainingLogRetentionDaysResponse + 328, // 328: determined.api.v1.Determined.CompareTrials:output_type -> determined.api.v1.CompareTrialsResponse + 329, // 329: determined.api.v1.Determined.ReportTrialSourceInfo:output_type -> determined.api.v1.ReportTrialSourceInfoResponse + 330, // 330: determined.api.v1.Determined.CreateTrial:output_type -> determined.api.v1.CreateTrialResponse + 331, // 331: determined.api.v1.Determined.PutTrial:output_type -> determined.api.v1.PutTrialResponse + 332, // 332: determined.api.v1.Determined.PatchTrial:output_type -> determined.api.v1.PatchTrialResponse + 333, // 333: determined.api.v1.Determined.StartTrial:output_type -> determined.api.v1.StartTrialResponse + 334, // 334: determined.api.v1.Determined.RunPrepareForReporting:output_type -> determined.api.v1.RunPrepareForReportingResponse + 335, // 335: determined.api.v1.Determined.GetTrial:output_type -> determined.api.v1.GetTrialResponse + 336, // 336: determined.api.v1.Determined.GetTrialByExternalID:output_type -> determined.api.v1.GetTrialByExternalIDResponse + 337, // 337: determined.api.v1.Determined.GetTrialWorkloads:output_type -> determined.api.v1.GetTrialWorkloadsResponse + 338, // 338: determined.api.v1.Determined.TrialLogs:output_type -> determined.api.v1.TrialLogsResponse + 339, // 339: determined.api.v1.Determined.TrialLogsFields:output_type -> determined.api.v1.TrialLogsFieldsResponse + 340, // 340: determined.api.v1.Determined.AllocationReady:output_type -> determined.api.v1.AllocationReadyResponse + 341, // 341: determined.api.v1.Determined.GetAllocation:output_type -> determined.api.v1.GetAllocationResponse + 342, // 342: determined.api.v1.Determined.AllocationWaiting:output_type -> determined.api.v1.AllocationWaitingResponse + 343, // 343: determined.api.v1.Determined.PostTaskLogs:output_type -> determined.api.v1.PostTaskLogsResponse + 344, // 344: determined.api.v1.Determined.TaskLogs:output_type -> determined.api.v1.TaskLogsResponse + 345, // 345: determined.api.v1.Determined.TaskLogsFields:output_type -> determined.api.v1.TaskLogsFieldsResponse + 346, // 346: determined.api.v1.Determined.GetTrialProfilerMetrics:output_type -> determined.api.v1.GetTrialProfilerMetricsResponse + 347, // 347: determined.api.v1.Determined.GetTrialProfilerAvailableSeries:output_type -> determined.api.v1.GetTrialProfilerAvailableSeriesResponse + 348, // 348: determined.api.v1.Determined.PostTrialProfilerMetricsBatch:output_type -> determined.api.v1.PostTrialProfilerMetricsBatchResponse + 349, // 349: determined.api.v1.Determined.GetMetrics:output_type -> determined.api.v1.GetMetricsResponse + 350, // 350: determined.api.v1.Determined.GetTrainingMetrics:output_type -> determined.api.v1.GetTrainingMetricsResponse + 351, // 351: determined.api.v1.Determined.GetValidationMetrics:output_type -> determined.api.v1.GetValidationMetricsResponse + 352, // 352: determined.api.v1.Determined.KillTrial:output_type -> determined.api.v1.KillTrialResponse + 353, // 353: determined.api.v1.Determined.GetTrialCheckpoints:output_type -> determined.api.v1.GetTrialCheckpointsResponse + 354, // 354: determined.api.v1.Determined.CleanupLogs:output_type -> determined.api.v1.CleanupLogsResponse + 355, // 355: determined.api.v1.Determined.AllocationPreemptionSignal:output_type -> determined.api.v1.AllocationPreemptionSignalResponse + 356, // 356: determined.api.v1.Determined.AllocationPendingPreemptionSignal:output_type -> determined.api.v1.AllocationPendingPreemptionSignalResponse + 357, // 357: determined.api.v1.Determined.AckAllocationPreemptionSignal:output_type -> determined.api.v1.AckAllocationPreemptionSignalResponse + 358, // 358: determined.api.v1.Determined.MarkAllocationResourcesDaemon:output_type -> determined.api.v1.MarkAllocationResourcesDaemonResponse + 359, // 359: determined.api.v1.Determined.AllocationRendezvousInfo:output_type -> determined.api.v1.AllocationRendezvousInfoResponse + 360, // 360: determined.api.v1.Determined.PostAllocationProxyAddress:output_type -> determined.api.v1.PostAllocationProxyAddressResponse + 361, // 361: determined.api.v1.Determined.GetTaskAcceleratorData:output_type -> determined.api.v1.GetTaskAcceleratorDataResponse + 362, // 362: determined.api.v1.Determined.PostAllocationAcceleratorData:output_type -> determined.api.v1.PostAllocationAcceleratorDataResponse + 363, // 363: determined.api.v1.Determined.AllocationAllGather:output_type -> determined.api.v1.AllocationAllGatherResponse + 364, // 364: determined.api.v1.Determined.NotifyContainerRunning:output_type -> determined.api.v1.NotifyContainerRunningResponse + 365, // 365: determined.api.v1.Determined.ReportTrialSearcherEarlyExit:output_type -> determined.api.v1.ReportTrialSearcherEarlyExitResponse + 366, // 366: determined.api.v1.Determined.ReportTrialProgress:output_type -> determined.api.v1.ReportTrialProgressResponse + 367, // 367: determined.api.v1.Determined.PostTrialRunnerMetadata:output_type -> determined.api.v1.PostTrialRunnerMetadataResponse + 368, // 368: determined.api.v1.Determined.ReportTrialMetrics:output_type -> determined.api.v1.ReportTrialMetricsResponse + 369, // 369: determined.api.v1.Determined.ReportTrialTrainingMetrics:output_type -> determined.api.v1.ReportTrialTrainingMetricsResponse + 370, // 370: determined.api.v1.Determined.ReportTrialValidationMetrics:output_type -> determined.api.v1.ReportTrialValidationMetricsResponse + 371, // 371: determined.api.v1.Determined.ReportCheckpoint:output_type -> determined.api.v1.ReportCheckpointResponse + 372, // 372: determined.api.v1.Determined.GetJobs:output_type -> determined.api.v1.GetJobsResponse + 373, // 373: determined.api.v1.Determined.GetJobsV2:output_type -> determined.api.v1.GetJobsV2Response + 374, // 374: determined.api.v1.Determined.GetJobQueueStats:output_type -> determined.api.v1.GetJobQueueStatsResponse + 375, // 375: determined.api.v1.Determined.UpdateJobQueue:output_type -> determined.api.v1.UpdateJobQueueResponse + 376, // 376: determined.api.v1.Determined.GetTemplates:output_type -> determined.api.v1.GetTemplatesResponse + 377, // 377: determined.api.v1.Determined.GetTemplate:output_type -> determined.api.v1.GetTemplateResponse + 378, // 378: determined.api.v1.Determined.PutTemplate:output_type -> determined.api.v1.PutTemplateResponse + 379, // 379: determined.api.v1.Determined.PostTemplate:output_type -> determined.api.v1.PostTemplateResponse + 380, // 380: determined.api.v1.Determined.PatchTemplateConfig:output_type -> determined.api.v1.PatchTemplateConfigResponse + 381, // 381: determined.api.v1.Determined.PatchTemplateName:output_type -> determined.api.v1.PatchTemplateNameResponse + 382, // 382: determined.api.v1.Determined.DeleteTemplate:output_type -> determined.api.v1.DeleteTemplateResponse + 383, // 383: determined.api.v1.Determined.GetNotebooks:output_type -> determined.api.v1.GetNotebooksResponse + 384, // 384: determined.api.v1.Determined.GetNotebook:output_type -> determined.api.v1.GetNotebookResponse + 385, // 385: determined.api.v1.Determined.IdleNotebook:output_type -> determined.api.v1.IdleNotebookResponse + 386, // 386: determined.api.v1.Determined.KillNotebook:output_type -> determined.api.v1.KillNotebookResponse + 387, // 387: determined.api.v1.Determined.SetNotebookPriority:output_type -> determined.api.v1.SetNotebookPriorityResponse + 388, // 388: determined.api.v1.Determined.LaunchNotebook:output_type -> determined.api.v1.LaunchNotebookResponse + 389, // 389: determined.api.v1.Determined.GetShells:output_type -> determined.api.v1.GetShellsResponse + 390, // 390: determined.api.v1.Determined.GetShell:output_type -> determined.api.v1.GetShellResponse + 391, // 391: determined.api.v1.Determined.KillShell:output_type -> determined.api.v1.KillShellResponse + 392, // 392: determined.api.v1.Determined.SetShellPriority:output_type -> determined.api.v1.SetShellPriorityResponse + 393, // 393: determined.api.v1.Determined.LaunchShell:output_type -> determined.api.v1.LaunchShellResponse + 394, // 394: determined.api.v1.Determined.GetCommands:output_type -> determined.api.v1.GetCommandsResponse + 395, // 395: determined.api.v1.Determined.GetCommand:output_type -> determined.api.v1.GetCommandResponse + 396, // 396: determined.api.v1.Determined.KillCommand:output_type -> determined.api.v1.KillCommandResponse + 397, // 397: determined.api.v1.Determined.SetCommandPriority:output_type -> determined.api.v1.SetCommandPriorityResponse + 398, // 398: determined.api.v1.Determined.LaunchCommand:output_type -> determined.api.v1.LaunchCommandResponse + 399, // 399: determined.api.v1.Determined.GetTensorboards:output_type -> determined.api.v1.GetTensorboardsResponse + 400, // 400: determined.api.v1.Determined.GetTensorboard:output_type -> determined.api.v1.GetTensorboardResponse + 401, // 401: determined.api.v1.Determined.KillTensorboard:output_type -> determined.api.v1.KillTensorboardResponse + 402, // 402: determined.api.v1.Determined.SetTensorboardPriority:output_type -> determined.api.v1.SetTensorboardPriorityResponse + 403, // 403: determined.api.v1.Determined.LaunchTensorboard:output_type -> determined.api.v1.LaunchTensorboardResponse + 404, // 404: determined.api.v1.Determined.DeleteTensorboardFiles:output_type -> determined.api.v1.DeleteTensorboardFilesResponse + 405, // 405: determined.api.v1.Determined.GetActiveTasksCount:output_type -> determined.api.v1.GetActiveTasksCountResponse + 406, // 406: determined.api.v1.Determined.GetTask:output_type -> determined.api.v1.GetTaskResponse + 407, // 407: determined.api.v1.Determined.GetTasks:output_type -> determined.api.v1.GetTasksResponse + 408, // 408: determined.api.v1.Determined.GetModel:output_type -> determined.api.v1.GetModelResponse + 409, // 409: determined.api.v1.Determined.PostModel:output_type -> determined.api.v1.PostModelResponse + 410, // 410: determined.api.v1.Determined.PatchModel:output_type -> determined.api.v1.PatchModelResponse + 411, // 411: determined.api.v1.Determined.ArchiveModel:output_type -> determined.api.v1.ArchiveModelResponse + 412, // 412: determined.api.v1.Determined.UnarchiveModel:output_type -> determined.api.v1.UnarchiveModelResponse + 413, // 413: determined.api.v1.Determined.MoveModel:output_type -> determined.api.v1.MoveModelResponse + 414, // 414: determined.api.v1.Determined.DeleteModel:output_type -> determined.api.v1.DeleteModelResponse + 415, // 415: determined.api.v1.Determined.GetModels:output_type -> determined.api.v1.GetModelsResponse + 416, // 416: determined.api.v1.Determined.GetModelLabels:output_type -> determined.api.v1.GetModelLabelsResponse + 417, // 417: determined.api.v1.Determined.GetModelVersion:output_type -> determined.api.v1.GetModelVersionResponse + 418, // 418: determined.api.v1.Determined.GetModelVersions:output_type -> determined.api.v1.GetModelVersionsResponse + 419, // 419: determined.api.v1.Determined.PostModelVersion:output_type -> determined.api.v1.PostModelVersionResponse + 420, // 420: determined.api.v1.Determined.PatchModelVersion:output_type -> determined.api.v1.PatchModelVersionResponse + 421, // 421: determined.api.v1.Determined.DeleteModelVersion:output_type -> determined.api.v1.DeleteModelVersionResponse + 422, // 422: determined.api.v1.Determined.GetTrialMetricsByModelVersion:output_type -> determined.api.v1.GetTrialMetricsByModelVersionResponse + 423, // 423: determined.api.v1.Determined.GetCheckpoint:output_type -> determined.api.v1.GetCheckpointResponse + 424, // 424: determined.api.v1.Determined.PostCheckpointMetadata:output_type -> determined.api.v1.PostCheckpointMetadataResponse + 425, // 425: determined.api.v1.Determined.CheckpointsRemoveFiles:output_type -> determined.api.v1.CheckpointsRemoveFilesResponse + 426, // 426: determined.api.v1.Determined.PatchCheckpoints:output_type -> determined.api.v1.PatchCheckpointsResponse + 427, // 427: determined.api.v1.Determined.DeleteCheckpoints:output_type -> determined.api.v1.DeleteCheckpointsResponse + 428, // 428: determined.api.v1.Determined.GetTrialMetricsByCheckpoint:output_type -> determined.api.v1.GetTrialMetricsByCheckpointResponse + 429, // 429: determined.api.v1.Determined.ExpMetricNames:output_type -> determined.api.v1.ExpMetricNamesResponse + 430, // 430: determined.api.v1.Determined.MetricBatches:output_type -> determined.api.v1.MetricBatchesResponse + 431, // 431: determined.api.v1.Determined.TrialsSnapshot:output_type -> determined.api.v1.TrialsSnapshotResponse + 432, // 432: determined.api.v1.Determined.TrialsSample:output_type -> determined.api.v1.TrialsSampleResponse + 433, // 433: determined.api.v1.Determined.GetResourcePools:output_type -> determined.api.v1.GetResourcePoolsResponse + 434, // 434: determined.api.v1.Determined.GetKubernetesResourceManagers:output_type -> determined.api.v1.GetKubernetesResourceManagersResponse + 435, // 435: determined.api.v1.Determined.ResourceAllocationRaw:output_type -> determined.api.v1.ResourceAllocationRawResponse + 436, // 436: determined.api.v1.Determined.ResourceAllocationAggregated:output_type -> determined.api.v1.ResourceAllocationAggregatedResponse + 437, // 437: determined.api.v1.Determined.GetWorkspace:output_type -> determined.api.v1.GetWorkspaceResponse + 438, // 438: determined.api.v1.Determined.GetWorkspaceProjects:output_type -> determined.api.v1.GetWorkspaceProjectsResponse + 439, // 439: determined.api.v1.Determined.GetWorkspaces:output_type -> determined.api.v1.GetWorkspacesResponse + 440, // 440: determined.api.v1.Determined.PostWorkspace:output_type -> determined.api.v1.PostWorkspaceResponse + 441, // 441: determined.api.v1.Determined.PatchWorkspace:output_type -> determined.api.v1.PatchWorkspaceResponse + 442, // 442: determined.api.v1.Determined.DeleteWorkspace:output_type -> determined.api.v1.DeleteWorkspaceResponse + 443, // 443: determined.api.v1.Determined.ArchiveWorkspace:output_type -> determined.api.v1.ArchiveWorkspaceResponse + 444, // 444: determined.api.v1.Determined.UnarchiveWorkspace:output_type -> determined.api.v1.UnarchiveWorkspaceResponse + 445, // 445: determined.api.v1.Determined.PinWorkspace:output_type -> determined.api.v1.PinWorkspaceResponse + 446, // 446: determined.api.v1.Determined.UnpinWorkspace:output_type -> determined.api.v1.UnpinWorkspaceResponse + 447, // 447: determined.api.v1.Determined.SetWorkspaceNamespaceBindings:output_type -> determined.api.v1.SetWorkspaceNamespaceBindingsResponse + 448, // 448: determined.api.v1.Determined.SetResourceQuotas:output_type -> determined.api.v1.SetResourceQuotasResponse + 449, // 449: determined.api.v1.Determined.ListWorkspaceNamespaceBindings:output_type -> determined.api.v1.ListWorkspaceNamespaceBindingsResponse + 450, // 450: determined.api.v1.Determined.GetWorkspacesWithDefaultNamespaceBindings:output_type -> determined.api.v1.GetWorkspacesWithDefaultNamespaceBindingsResponse + 451, // 451: determined.api.v1.Determined.BulkAutoCreateWorkspaceNamespaceBindings:output_type -> determined.api.v1.BulkAutoCreateWorkspaceNamespaceBindingsResponse + 452, // 452: determined.api.v1.Determined.DeleteWorkspaceNamespaceBindings:output_type -> determined.api.v1.DeleteWorkspaceNamespaceBindingsResponse + 453, // 453: determined.api.v1.Determined.GetKubernetesResourceQuotas:output_type -> determined.api.v1.GetKubernetesResourceQuotasResponse + 454, // 454: determined.api.v1.Determined.GetProject:output_type -> determined.api.v1.GetProjectResponse + 455, // 455: determined.api.v1.Determined.GetProjectByKey:output_type -> determined.api.v1.GetProjectByKeyResponse + 456, // 456: determined.api.v1.Determined.GetProjectColumns:output_type -> determined.api.v1.GetProjectColumnsResponse + 457, // 457: determined.api.v1.Determined.GetProjectNumericMetricsRange:output_type -> determined.api.v1.GetProjectNumericMetricsRangeResponse + 458, // 458: determined.api.v1.Determined.PostProject:output_type -> determined.api.v1.PostProjectResponse + 459, // 459: determined.api.v1.Determined.AddProjectNote:output_type -> determined.api.v1.AddProjectNoteResponse + 460, // 460: determined.api.v1.Determined.PutProjectNotes:output_type -> determined.api.v1.PutProjectNotesResponse + 461, // 461: determined.api.v1.Determined.PatchProject:output_type -> determined.api.v1.PatchProjectResponse + 462, // 462: determined.api.v1.Determined.DeleteProject:output_type -> determined.api.v1.DeleteProjectResponse + 463, // 463: determined.api.v1.Determined.ArchiveProject:output_type -> determined.api.v1.ArchiveProjectResponse + 464, // 464: determined.api.v1.Determined.UnarchiveProject:output_type -> determined.api.v1.UnarchiveProjectResponse + 465, // 465: determined.api.v1.Determined.MoveProject:output_type -> determined.api.v1.MoveProjectResponse + 466, // 466: determined.api.v1.Determined.MoveExperiment:output_type -> determined.api.v1.MoveExperimentResponse + 467, // 467: determined.api.v1.Determined.MoveExperiments:output_type -> determined.api.v1.MoveExperimentsResponse + 468, // 468: determined.api.v1.Determined.GetWebhooks:output_type -> determined.api.v1.GetWebhooksResponse + 469, // 469: determined.api.v1.Determined.PatchWebhook:output_type -> determined.api.v1.PatchWebhookResponse + 470, // 470: determined.api.v1.Determined.PostWebhook:output_type -> determined.api.v1.PostWebhookResponse + 471, // 471: determined.api.v1.Determined.DeleteWebhook:output_type -> determined.api.v1.DeleteWebhookResponse + 472, // 472: determined.api.v1.Determined.TestWebhook:output_type -> determined.api.v1.TestWebhookResponse + 473, // 473: determined.api.v1.Determined.PostWebhookEventData:output_type -> determined.api.v1.PostWebhookEventDataResponse + 474, // 474: determined.api.v1.Determined.GetGroup:output_type -> determined.api.v1.GetGroupResponse + 475, // 475: determined.api.v1.Determined.GetGroups:output_type -> determined.api.v1.GetGroupsResponse + 476, // 476: determined.api.v1.Determined.CreateGroup:output_type -> determined.api.v1.CreateGroupResponse + 477, // 477: determined.api.v1.Determined.UpdateGroup:output_type -> determined.api.v1.UpdateGroupResponse + 478, // 478: determined.api.v1.Determined.DeleteGroup:output_type -> determined.api.v1.DeleteGroupResponse + 479, // 479: determined.api.v1.Determined.GetPermissionsSummary:output_type -> determined.api.v1.GetPermissionsSummaryResponse + 480, // 480: determined.api.v1.Determined.GetGroupsAndUsersAssignedToWorkspace:output_type -> determined.api.v1.GetGroupsAndUsersAssignedToWorkspaceResponse + 481, // 481: determined.api.v1.Determined.GetRolesByID:output_type -> determined.api.v1.GetRolesByIDResponse + 482, // 482: determined.api.v1.Determined.GetRolesAssignedToUser:output_type -> determined.api.v1.GetRolesAssignedToUserResponse + 483, // 483: determined.api.v1.Determined.GetRolesAssignedToGroup:output_type -> determined.api.v1.GetRolesAssignedToGroupResponse + 484, // 484: determined.api.v1.Determined.SearchRolesAssignableToScope:output_type -> determined.api.v1.SearchRolesAssignableToScopeResponse + 485, // 485: determined.api.v1.Determined.ListRoles:output_type -> determined.api.v1.ListRolesResponse + 486, // 486: determined.api.v1.Determined.AssignRoles:output_type -> determined.api.v1.AssignRolesResponse + 487, // 487: determined.api.v1.Determined.RemoveAssignments:output_type -> determined.api.v1.RemoveAssignmentsResponse + 488, // 488: determined.api.v1.Determined.PostUserActivity:output_type -> determined.api.v1.PostUserActivityResponse + 489, // 489: determined.api.v1.Determined.GetProjectsByUserActivity:output_type -> determined.api.v1.GetProjectsByUserActivityResponse + 490, // 490: determined.api.v1.Determined.SearchExperiments:output_type -> determined.api.v1.SearchExperimentsResponse + 491, // 491: determined.api.v1.Determined.BindRPToWorkspace:output_type -> determined.api.v1.BindRPToWorkspaceResponse + 492, // 492: determined.api.v1.Determined.UnbindRPFromWorkspace:output_type -> determined.api.v1.UnbindRPFromWorkspaceResponse + 493, // 493: determined.api.v1.Determined.OverwriteRPWorkspaceBindings:output_type -> determined.api.v1.OverwriteRPWorkspaceBindingsResponse + 494, // 494: determined.api.v1.Determined.ListRPsBoundToWorkspace:output_type -> determined.api.v1.ListRPsBoundToWorkspaceResponse + 495, // 495: determined.api.v1.Determined.ListWorkspacesBoundToRP:output_type -> determined.api.v1.ListWorkspacesBoundToRPResponse + 496, // 496: determined.api.v1.Determined.GetGenericTaskConfig:output_type -> determined.api.v1.GetGenericTaskConfigResponse + 497, // 497: determined.api.v1.Determined.KillGenericTask:output_type -> determined.api.v1.KillGenericTaskResponse + 498, // 498: determined.api.v1.Determined.PauseGenericTask:output_type -> determined.api.v1.PauseGenericTaskResponse + 499, // 499: determined.api.v1.Determined.UnpauseGenericTask:output_type -> determined.api.v1.UnpauseGenericTaskResponse + 500, // 500: determined.api.v1.Determined.SearchRuns:output_type -> determined.api.v1.SearchRunsResponse + 501, // 501: determined.api.v1.Determined.MoveRuns:output_type -> determined.api.v1.MoveRunsResponse + 502, // 502: determined.api.v1.Determined.KillRuns:output_type -> determined.api.v1.KillRunsResponse + 503, // 503: determined.api.v1.Determined.DeleteRuns:output_type -> determined.api.v1.DeleteRunsResponse + 504, // 504: determined.api.v1.Determined.ArchiveRuns:output_type -> determined.api.v1.ArchiveRunsResponse + 505, // 505: determined.api.v1.Determined.UnarchiveRuns:output_type -> determined.api.v1.UnarchiveRunsResponse + 506, // 506: determined.api.v1.Determined.PauseRuns:output_type -> determined.api.v1.PauseRunsResponse + 507, // 507: determined.api.v1.Determined.ResumeRuns:output_type -> determined.api.v1.ResumeRunsResponse + 508, // 508: determined.api.v1.Determined.GetRunMetadata:output_type -> determined.api.v1.GetRunMetadataResponse + 509, // 509: determined.api.v1.Determined.PostRunMetadata:output_type -> determined.api.v1.PostRunMetadataResponse + 510, // 510: determined.api.v1.Determined.GetMetadataValues:output_type -> determined.api.v1.GetMetadataValuesResponse + 511, // 511: determined.api.v1.Determined.PutWorkspaceConfigPolicies:output_type -> determined.api.v1.PutWorkspaceConfigPoliciesResponse + 512, // 512: determined.api.v1.Determined.PutGlobalConfigPolicies:output_type -> determined.api.v1.PutGlobalConfigPoliciesResponse + 513, // 513: determined.api.v1.Determined.GetWorkspaceConfigPolicies:output_type -> determined.api.v1.GetWorkspaceConfigPoliciesResponse + 514, // 514: determined.api.v1.Determined.GetGlobalConfigPolicies:output_type -> determined.api.v1.GetGlobalConfigPoliciesResponse + 515, // 515: determined.api.v1.Determined.DeleteWorkspaceConfigPolicies:output_type -> determined.api.v1.DeleteWorkspaceConfigPoliciesResponse + 516, // 516: determined.api.v1.Determined.DeleteGlobalConfigPolicies:output_type -> determined.api.v1.DeleteGlobalConfigPoliciesResponse + 517, // 517: determined.api.v1.Determined.PostAccessToken:output_type -> determined.api.v1.PostAccessTokenResponse + 518, // 518: determined.api.v1.Determined.GetAccessTokens:output_type -> determined.api.v1.GetAccessTokensResponse + 519, // 519: determined.api.v1.Determined.PatchAccessToken:output_type -> determined.api.v1.PatchAccessTokenResponse + 260, // [260:520] is the sub-list for method output_type + 0, // [0:260] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name @@ -4117,7 +3990,6 @@ func file_determined_api_v1_api_proto_init() { file_determined_api_v1_project_proto_init() file_determined_api_v1_rbac_proto_init() file_determined_api_v1_run_proto_init() - file_determined_api_v1_search_proto_init() file_determined_api_v1_task_proto_init() file_determined_api_v1_template_proto_init() file_determined_api_v1_tensorboard_proto_init() @@ -4484,8 +4356,6 @@ type DeterminedClient interface { SetTensorboardPriority(ctx context.Context, in *SetTensorboardPriorityRequest, opts ...grpc.CallOption) (*SetTensorboardPriorityResponse, error) // Launch a tensorboard. LaunchTensorboard(ctx context.Context, in *LaunchTensorboardRequest, opts ...grpc.CallOption) (*LaunchTensorboardResponse, error) - // Launch a tensorboard for one or more searches using bulk search filters. - LaunchTensorboardSearches(ctx context.Context, in *LaunchTensorboardSearchesRequest, opts ...grpc.CallOption) (*LaunchTensorboardSearchesResponse, error) // Delete tensorboard files. DeleteTensorboardFiles(ctx context.Context, in *DeleteTensorboardFilesRequest, opts ...grpc.CallOption) (*DeleteTensorboardFilesResponse, error) // Get a count of active tasks. @@ -4691,7 +4561,7 @@ type DeterminedClient interface { MoveRuns(ctx context.Context, in *MoveRunsRequest, opts ...grpc.CallOption) (*MoveRunsResponse, error) // Kill runs. KillRuns(ctx context.Context, in *KillRunsRequest, opts ...grpc.CallOption) (*KillRunsResponse, error) - // Delete runs. + // Delete a list of runs. DeleteRuns(ctx context.Context, in *DeleteRunsRequest, opts ...grpc.CallOption) (*DeleteRunsResponse, error) // Archive runs. ArchiveRuns(ctx context.Context, in *ArchiveRunsRequest, opts ...grpc.CallOption) (*ArchiveRunsResponse, error) @@ -4720,22 +4590,6 @@ type DeterminedClient interface { DeleteWorkspaceConfigPolicies(ctx context.Context, in *DeleteWorkspaceConfigPoliciesRequest, opts ...grpc.CallOption) (*DeleteWorkspaceConfigPoliciesResponse, error) // Delete global task config policies. DeleteGlobalConfigPolicies(ctx context.Context, in *DeleteGlobalConfigPoliciesRequest, opts ...grpc.CallOption) (*DeleteGlobalConfigPoliciesResponse, error) - // Move searches. - MoveSearches(ctx context.Context, in *MoveSearchesRequest, opts ...grpc.CallOption) (*MoveSearchesResponse, error) - // Cancel searches. - CancelSearches(ctx context.Context, in *CancelSearchesRequest, opts ...grpc.CallOption) (*CancelSearchesResponse, error) - // Kill searches. - KillSearches(ctx context.Context, in *KillSearchesRequest, opts ...grpc.CallOption) (*KillSearchesResponse, error) - // Delete searches. - DeleteSearches(ctx context.Context, in *DeleteSearchesRequest, opts ...grpc.CallOption) (*DeleteSearchesResponse, error) - // Archive searches. - ArchiveSearches(ctx context.Context, in *ArchiveSearchesRequest, opts ...grpc.CallOption) (*ArchiveSearchesResponse, error) - // Unarchive searches. - UnarchiveSearches(ctx context.Context, in *UnarchiveSearchesRequest, opts ...grpc.CallOption) (*UnarchiveSearchesResponse, error) - // Pause experiment associated with provided searches. - PauseSearches(ctx context.Context, in *PauseSearchesRequest, opts ...grpc.CallOption) (*PauseSearchesResponse, error) - // Unpause experiment associated with provided searches. - ResumeSearches(ctx context.Context, in *ResumeSearchesRequest, opts ...grpc.CallOption) (*ResumeSearchesResponse, error) // Create and get a user's access token PostAccessToken(ctx context.Context, in *PostAccessTokenRequest, opts ...grpc.CallOption) (*PostAccessTokenResponse, error) // Get a list of all access token records. @@ -6284,15 +6138,6 @@ func (c *determinedClient) LaunchTensorboard(ctx context.Context, in *LaunchTens return out, nil } -func (c *determinedClient) LaunchTensorboardSearches(ctx context.Context, in *LaunchTensorboardSearchesRequest, opts ...grpc.CallOption) (*LaunchTensorboardSearchesResponse, error) { - out := new(LaunchTensorboardSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/LaunchTensorboardSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *determinedClient) DeleteTensorboardFiles(ctx context.Context, in *DeleteTensorboardFilesRequest, opts ...grpc.CallOption) (*DeleteTensorboardFilesResponse, error) { out := new(DeleteTensorboardFilesResponse) err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/DeleteTensorboardFiles", in, out, opts...) @@ -7403,78 +7248,6 @@ func (c *determinedClient) DeleteGlobalConfigPolicies(ctx context.Context, in *D return out, nil } -func (c *determinedClient) MoveSearches(ctx context.Context, in *MoveSearchesRequest, opts ...grpc.CallOption) (*MoveSearchesResponse, error) { - out := new(MoveSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/MoveSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *determinedClient) CancelSearches(ctx context.Context, in *CancelSearchesRequest, opts ...grpc.CallOption) (*CancelSearchesResponse, error) { - out := new(CancelSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/CancelSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *determinedClient) KillSearches(ctx context.Context, in *KillSearchesRequest, opts ...grpc.CallOption) (*KillSearchesResponse, error) { - out := new(KillSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/KillSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *determinedClient) DeleteSearches(ctx context.Context, in *DeleteSearchesRequest, opts ...grpc.CallOption) (*DeleteSearchesResponse, error) { - out := new(DeleteSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/DeleteSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *determinedClient) ArchiveSearches(ctx context.Context, in *ArchiveSearchesRequest, opts ...grpc.CallOption) (*ArchiveSearchesResponse, error) { - out := new(ArchiveSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/ArchiveSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *determinedClient) UnarchiveSearches(ctx context.Context, in *UnarchiveSearchesRequest, opts ...grpc.CallOption) (*UnarchiveSearchesResponse, error) { - out := new(UnarchiveSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/UnarchiveSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *determinedClient) PauseSearches(ctx context.Context, in *PauseSearchesRequest, opts ...grpc.CallOption) (*PauseSearchesResponse, error) { - out := new(PauseSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/PauseSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *determinedClient) ResumeSearches(ctx context.Context, in *ResumeSearchesRequest, opts ...grpc.CallOption) (*ResumeSearchesResponse, error) { - out := new(ResumeSearchesResponse) - err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/ResumeSearches", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *determinedClient) PostAccessToken(ctx context.Context, in *PostAccessTokenRequest, opts ...grpc.CallOption) (*PostAccessTokenResponse, error) { out := new(PostAccessTokenResponse) err := c.cc.Invoke(ctx, "/determined.api.v1.Determined/PostAccessToken", in, out, opts...) @@ -7829,8 +7602,6 @@ type DeterminedServer interface { SetTensorboardPriority(context.Context, *SetTensorboardPriorityRequest) (*SetTensorboardPriorityResponse, error) // Launch a tensorboard. LaunchTensorboard(context.Context, *LaunchTensorboardRequest) (*LaunchTensorboardResponse, error) - // Launch a tensorboard for one or more searches using bulk search filters. - LaunchTensorboardSearches(context.Context, *LaunchTensorboardSearchesRequest) (*LaunchTensorboardSearchesResponse, error) // Delete tensorboard files. DeleteTensorboardFiles(context.Context, *DeleteTensorboardFilesRequest) (*DeleteTensorboardFilesResponse, error) // Get a count of active tasks. @@ -8036,7 +7807,7 @@ type DeterminedServer interface { MoveRuns(context.Context, *MoveRunsRequest) (*MoveRunsResponse, error) // Kill runs. KillRuns(context.Context, *KillRunsRequest) (*KillRunsResponse, error) - // Delete runs. + // Delete a list of runs. DeleteRuns(context.Context, *DeleteRunsRequest) (*DeleteRunsResponse, error) // Archive runs. ArchiveRuns(context.Context, *ArchiveRunsRequest) (*ArchiveRunsResponse, error) @@ -8065,22 +7836,6 @@ type DeterminedServer interface { DeleteWorkspaceConfigPolicies(context.Context, *DeleteWorkspaceConfigPoliciesRequest) (*DeleteWorkspaceConfigPoliciesResponse, error) // Delete global task config policies. DeleteGlobalConfigPolicies(context.Context, *DeleteGlobalConfigPoliciesRequest) (*DeleteGlobalConfigPoliciesResponse, error) - // Move searches. - MoveSearches(context.Context, *MoveSearchesRequest) (*MoveSearchesResponse, error) - // Cancel searches. - CancelSearches(context.Context, *CancelSearchesRequest) (*CancelSearchesResponse, error) - // Kill searches. - KillSearches(context.Context, *KillSearchesRequest) (*KillSearchesResponse, error) - // Delete searches. - DeleteSearches(context.Context, *DeleteSearchesRequest) (*DeleteSearchesResponse, error) - // Archive searches. - ArchiveSearches(context.Context, *ArchiveSearchesRequest) (*ArchiveSearchesResponse, error) - // Unarchive searches. - UnarchiveSearches(context.Context, *UnarchiveSearchesRequest) (*UnarchiveSearchesResponse, error) - // Pause experiment associated with provided searches. - PauseSearches(context.Context, *PauseSearchesRequest) (*PauseSearchesResponse, error) - // Unpause experiment associated with provided searches. - ResumeSearches(context.Context, *ResumeSearchesRequest) (*ResumeSearchesResponse, error) // Create and get a user's access token PostAccessToken(context.Context, *PostAccessTokenRequest) (*PostAccessTokenResponse, error) // Get a list of all access token records. @@ -8525,9 +8280,6 @@ func (*UnimplementedDeterminedServer) SetTensorboardPriority(context.Context, *S func (*UnimplementedDeterminedServer) LaunchTensorboard(context.Context, *LaunchTensorboardRequest) (*LaunchTensorboardResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LaunchTensorboard not implemented") } -func (*UnimplementedDeterminedServer) LaunchTensorboardSearches(context.Context, *LaunchTensorboardSearchesRequest) (*LaunchTensorboardSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method LaunchTensorboardSearches not implemented") -} func (*UnimplementedDeterminedServer) DeleteTensorboardFiles(context.Context, *DeleteTensorboardFilesRequest) (*DeleteTensorboardFilesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteTensorboardFiles not implemented") } @@ -8867,30 +8619,6 @@ func (*UnimplementedDeterminedServer) DeleteWorkspaceConfigPolicies(context.Cont func (*UnimplementedDeterminedServer) DeleteGlobalConfigPolicies(context.Context, *DeleteGlobalConfigPoliciesRequest) (*DeleteGlobalConfigPoliciesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteGlobalConfigPolicies not implemented") } -func (*UnimplementedDeterminedServer) MoveSearches(context.Context, *MoveSearchesRequest) (*MoveSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method MoveSearches not implemented") -} -func (*UnimplementedDeterminedServer) CancelSearches(context.Context, *CancelSearchesRequest) (*CancelSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CancelSearches not implemented") -} -func (*UnimplementedDeterminedServer) KillSearches(context.Context, *KillSearchesRequest) (*KillSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method KillSearches not implemented") -} -func (*UnimplementedDeterminedServer) DeleteSearches(context.Context, *DeleteSearchesRequest) (*DeleteSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteSearches not implemented") -} -func (*UnimplementedDeterminedServer) ArchiveSearches(context.Context, *ArchiveSearchesRequest) (*ArchiveSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ArchiveSearches not implemented") -} -func (*UnimplementedDeterminedServer) UnarchiveSearches(context.Context, *UnarchiveSearchesRequest) (*UnarchiveSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UnarchiveSearches not implemented") -} -func (*UnimplementedDeterminedServer) PauseSearches(context.Context, *PauseSearchesRequest) (*PauseSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PauseSearches not implemented") -} -func (*UnimplementedDeterminedServer) ResumeSearches(context.Context, *ResumeSearchesRequest) (*ResumeSearchesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ResumeSearches not implemented") -} func (*UnimplementedDeterminedServer) PostAccessToken(context.Context, *PostAccessTokenRequest) (*PostAccessTokenResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PostAccessToken not implemented") } @@ -11527,24 +11255,6 @@ func _Determined_LaunchTensorboard_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _Determined_LaunchTensorboardSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LaunchTensorboardSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).LaunchTensorboardSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/LaunchTensorboardSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).LaunchTensorboardSearches(ctx, req.(*LaunchTensorboardSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Determined_DeleteTensorboardFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteTensorboardFilesRequest) if err := dec(in); err != nil { @@ -13591,150 +13301,6 @@ func _Determined_DeleteGlobalConfigPolicies_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } -func _Determined_MoveSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MoveSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).MoveSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/MoveSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).MoveSearches(ctx, req.(*MoveSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Determined_CancelSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CancelSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).CancelSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/CancelSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).CancelSearches(ctx, req.(*CancelSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Determined_KillSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(KillSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).KillSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/KillSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).KillSearches(ctx, req.(*KillSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Determined_DeleteSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).DeleteSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/DeleteSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).DeleteSearches(ctx, req.(*DeleteSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Determined_ArchiveSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ArchiveSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).ArchiveSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/ArchiveSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).ArchiveSearches(ctx, req.(*ArchiveSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Determined_UnarchiveSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UnarchiveSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).UnarchiveSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/UnarchiveSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).UnarchiveSearches(ctx, req.(*UnarchiveSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Determined_PauseSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PauseSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).PauseSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/PauseSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).PauseSearches(ctx, req.(*PauseSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Determined_ResumeSearches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ResumeSearchesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DeterminedServer).ResumeSearches(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/determined.api.v1.Determined/ResumeSearches", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DeterminedServer).ResumeSearches(ctx, req.(*ResumeSearchesRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Determined_PostAccessToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PostAccessTokenRequest) if err := dec(in); err != nil { @@ -14329,10 +13895,6 @@ var _Determined_serviceDesc = grpc.ServiceDesc{ MethodName: "LaunchTensorboard", Handler: _Determined_LaunchTensorboard_Handler, }, - { - MethodName: "LaunchTensorboardSearches", - Handler: _Determined_LaunchTensorboardSearches_Handler, - }, { MethodName: "DeleteTensorboardFiles", Handler: _Determined_DeleteTensorboardFiles_Handler, @@ -14769,38 +14331,6 @@ var _Determined_serviceDesc = grpc.ServiceDesc{ MethodName: "DeleteGlobalConfigPolicies", Handler: _Determined_DeleteGlobalConfigPolicies_Handler, }, - { - MethodName: "MoveSearches", - Handler: _Determined_MoveSearches_Handler, - }, - { - MethodName: "CancelSearches", - Handler: _Determined_CancelSearches_Handler, - }, - { - MethodName: "KillSearches", - Handler: _Determined_KillSearches_Handler, - }, - { - MethodName: "DeleteSearches", - Handler: _Determined_DeleteSearches_Handler, - }, - { - MethodName: "ArchiveSearches", - Handler: _Determined_ArchiveSearches_Handler, - }, - { - MethodName: "UnarchiveSearches", - Handler: _Determined_UnarchiveSearches_Handler, - }, - { - MethodName: "PauseSearches", - Handler: _Determined_PauseSearches_Handler, - }, - { - MethodName: "ResumeSearches", - Handler: _Determined_ResumeSearches_Handler, - }, { MethodName: "PostAccessToken", Handler: _Determined_PostAccessToken_Handler, diff --git a/proto/pkg/apiv1/api.pb.gw.go b/proto/pkg/apiv1/api.pb.gw.go index 16d93eff5f8..066b1ffc032 100644 --- a/proto/pkg/apiv1/api.pb.gw.go +++ b/proto/pkg/apiv1/api.pb.gw.go @@ -7483,40 +7483,6 @@ func local_request_Determined_LaunchTensorboard_0(ctx context.Context, marshaler } -func request_Determined_LaunchTensorboardSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LaunchTensorboardSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.LaunchTensorboardSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_LaunchTensorboardSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LaunchTensorboardSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.LaunchTensorboardSearches(ctx, &protoReq) - return msg, metadata, err - -} - func request_Determined_DeleteTensorboardFiles_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DeleteTensorboardFilesRequest var metadata runtime.ServerMetadata @@ -13449,278 +13415,6 @@ func local_request_Determined_DeleteGlobalConfigPolicies_0(ctx context.Context, } -func request_Determined_MoveSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MoveSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.MoveSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_MoveSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MoveSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.MoveSearches(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Determined_CancelSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CancelSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CancelSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_CancelSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CancelSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CancelSearches(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Determined_KillSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq KillSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.KillSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_KillSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq KillSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.KillSearches(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Determined_DeleteSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DeleteSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_DeleteSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DeleteSearches(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Determined_ArchiveSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ArchiveSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ArchiveSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_ArchiveSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ArchiveSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ArchiveSearches(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Determined_UnarchiveSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UnarchiveSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.UnarchiveSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_UnarchiveSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UnarchiveSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.UnarchiveSearches(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Determined_PauseSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PauseSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.PauseSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_PauseSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PauseSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.PauseSearches(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Determined_ResumeSearches_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResumeSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ResumeSearches(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Determined_ResumeSearches_0(ctx context.Context, marshaler runtime.Marshaler, server DeterminedServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResumeSearchesRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ResumeSearches(ctx, &protoReq) - return msg, metadata, err - -} - func request_Determined_PostAccessToken_0(ctx context.Context, marshaler runtime.Marshaler, client DeterminedClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq PostAccessTokenRequest var metadata runtime.ServerMetadata @@ -16616,7 +16310,7 @@ func RegisterDeterminedHandlerServer(ctx context.Context, mux *runtime.ServeMux, }) - mux.Handle("POST", pattern_Determined_LaunchTensorboardSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_Determined_DeleteTensorboardFiles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -16625,34 +16319,14 @@ func RegisterDeterminedHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Determined_LaunchTensorboardSearches_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Determined_DeleteTensorboardFiles_0(rctx, inboundMarshaler, server, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Determined_LaunchTensorboardSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_Determined_DeleteTensorboardFiles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_DeleteTensorboardFiles_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_DeleteTensorboardFiles_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Determined_DeleteTensorboardFiles_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -18844,166 +18518,6 @@ func RegisterDeterminedHandlerServer(ctx context.Context, mux *runtime.ServeMux, }) - mux.Handle("POST", pattern_Determined_MoveSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_MoveSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_MoveSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_CancelSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_CancelSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_CancelSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_KillSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_KillSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_KillSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_DeleteSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_DeleteSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_DeleteSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_ArchiveSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_ArchiveSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_ArchiveSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_UnarchiveSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_UnarchiveSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_UnarchiveSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_PauseSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_PauseSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_PauseSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_ResumeSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Determined_ResumeSearches_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_ResumeSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_Determined_PostAccessToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -21985,26 +21499,6 @@ func RegisterDeterminedHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) - mux.Handle("POST", pattern_Determined_LaunchTensorboardSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_LaunchTensorboardSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_LaunchTensorboardSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("DELETE", pattern_Determined_DeleteTensorboardFiles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -24265,166 +23759,6 @@ func RegisterDeterminedHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) - mux.Handle("POST", pattern_Determined_MoveSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_MoveSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_MoveSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_CancelSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_CancelSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_CancelSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_KillSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_KillSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_KillSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_DeleteSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_DeleteSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_DeleteSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_ArchiveSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_ArchiveSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_ArchiveSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_UnarchiveSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_UnarchiveSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_UnarchiveSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_PauseSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_PauseSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_PauseSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Determined_ResumeSearches_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Determined_ResumeSearches_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Determined_ResumeSearches_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_Determined_PostAccessToken_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -24777,8 +24111,6 @@ var ( pattern_Determined_LaunchTensorboard_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "tensorboards"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Determined_LaunchTensorboardSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "tensorboards"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Determined_DeleteTensorboardFiles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "experiments", "experiment_id", "tensorboard-files"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Determined_GetActiveTasksCount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "tasks", "count"}, "", runtime.AssumeColonVerbOpt(true))) @@ -25005,22 +24337,6 @@ var ( pattern_Determined_DeleteGlobalConfigPolicies_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"api", "v1", "config-policies", "global", "workload_type"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Determined_MoveSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "move"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Determined_CancelSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "cancel"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Determined_KillSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "kill"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Determined_DeleteSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "delete"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Determined_ArchiveSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "archive"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Determined_UnarchiveSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "unarchive"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Determined_PauseSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "pause"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_Determined_ResumeSearches_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "searches", "resume"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Determined_PostAccessToken_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "tokens"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Determined_GetAccessTokens_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "tokens"}, "", runtime.AssumeColonVerbOpt(true))) @@ -25317,8 +24633,6 @@ var ( forward_Determined_LaunchTensorboard_0 = runtime.ForwardResponseMessage - forward_Determined_LaunchTensorboardSearches_0 = runtime.ForwardResponseMessage - forward_Determined_DeleteTensorboardFiles_0 = runtime.ForwardResponseMessage forward_Determined_GetActiveTasksCount_0 = runtime.ForwardResponseMessage @@ -25545,22 +24859,6 @@ var ( forward_Determined_DeleteGlobalConfigPolicies_0 = runtime.ForwardResponseMessage - forward_Determined_MoveSearches_0 = runtime.ForwardResponseMessage - - forward_Determined_CancelSearches_0 = runtime.ForwardResponseMessage - - forward_Determined_KillSearches_0 = runtime.ForwardResponseMessage - - forward_Determined_DeleteSearches_0 = runtime.ForwardResponseMessage - - forward_Determined_ArchiveSearches_0 = runtime.ForwardResponseMessage - - forward_Determined_UnarchiveSearches_0 = runtime.ForwardResponseMessage - - forward_Determined_PauseSearches_0 = runtime.ForwardResponseMessage - - forward_Determined_ResumeSearches_0 = runtime.ForwardResponseMessage - forward_Determined_PostAccessToken_0 = runtime.ForwardResponseMessage forward_Determined_GetAccessTokens_0 = runtime.ForwardResponseMessage diff --git a/proto/pkg/apiv1/run.pb.go b/proto/pkg/apiv1/run.pb.go index 8bcbd5156a9..440d50c270c 100644 --- a/proto/pkg/apiv1/run.pb.go +++ b/proto/pkg/apiv1/run.pb.go @@ -336,7 +336,7 @@ type MoveRunsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the runs being moved. Leave empty if using filter. + // The ids of the runs being moved. RunIds []int32 `protobuf:"varint,1,rep,packed,name=run_ids,json=runIds,proto3" json:"run_ids,omitempty"` // The id of the current parent project. SourceProjectId int32 `protobuf:"varint,2,opt,name=source_project_id,json=sourceProjectId,proto3" json:"source_project_id,omitempty"` @@ -470,7 +470,7 @@ type KillRunsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the runs being killed. Leave empty if using filter. + // The ids of the runs being killed. RunIds []int32 `protobuf:"varint,1,rep,packed,name=run_ids,json=runIds,proto3" json:"run_ids,omitempty"` // Project id of the runs being killed. ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` @@ -586,7 +586,7 @@ type DeleteRunsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the runs being deleted. Leave empty if using filter. + // The ids of the runs being deleted. RunIds []int32 `protobuf:"varint,1,rep,packed,name=run_ids,json=runIds,proto3" json:"run_ids,omitempty"` // Project id of the runs being deleted. ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` @@ -702,7 +702,7 @@ type ArchiveRunsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the runs being archived. Leave empty if using filter. + // The ids of the runs being archived. RunIds []int32 `protobuf:"varint,1,rep,packed,name=run_ids,json=runIds,proto3" json:"run_ids,omitempty"` // The id of the current parent project. ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` @@ -818,7 +818,7 @@ type UnarchiveRunsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the runs being unarchived. Leave empty if using filter. + // The ids of the runs being unarchived. RunIds []int32 `protobuf:"varint,1,rep,packed,name=run_ids,json=runIds,proto3" json:"run_ids,omitempty"` // The id of the current parent project. ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` @@ -934,7 +934,7 @@ type PauseRunsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the runs being paused. Leave empty if using filter. + // The ids of the runs being moved. RunIds []int32 `protobuf:"varint,1,rep,packed,name=run_ids,json=runIds,proto3" json:"run_ids,omitempty"` // The id of the project of the runs being paused. ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` @@ -1050,7 +1050,7 @@ type ResumeRunsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the runs being moved. Leave empty if using filter. + // The ids of the runs being moved. RunIds []int32 `protobuf:"varint,1,rep,packed,name=run_ids,json=runIds,proto3" json:"run_ids,omitempty"` // The id of the project of the runs being unpaused. ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` @@ -1423,7 +1423,7 @@ var file_determined_api_v1_run_proto_rawDesc = []byte{ 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0xd2, 0x01, 0x02, 0x69, 0x64, 0x22, 0x91, 0x02, 0x0a, 0x0f, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x75, + 0xd2, 0x01, 0x02, 0x69, 0x64, 0x22, 0x9b, 0x02, 0x0a, 0x0f, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, @@ -1436,133 +1436,139 @@ var file_determined_api_v1_run_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x3a, 0x32, 0x92, 0x41, 0x2f, 0x0a, - 0x2d, 0xd2, 0x01, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, + 0x37, 0xd2, 0x01, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x16, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x61, 0x0a, 0x10, 0x4d, 0x6f, 0x76, - 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, - 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x8c, 0x01, 0x0a, - 0x0f, 0x4b, 0x69, 0x6c, 0x6c, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x19, 0x92, 0x41, 0x16, 0x0a, 0x14, 0xd2, 0x01, 0x11, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x61, 0x0a, 0x10, 0x4b, - 0x69, 0x6c, 0x6c, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, - 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x87, - 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, - 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, - 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, - 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, - 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x88, 0x01, - 0x0a, 0x12, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, - 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, - 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x64, 0x0a, 0x13, 0x41, 0x72, 0x63, 0x68, - 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, + 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0x61, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x0f, 0x4b, 0x69, 0x6c, 0x6c, 0x52, + 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, + 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, + 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, + 0x23, 0x92, 0x41, 0x20, 0x0a, 0x1e, 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, + 0xd2, 0x01, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, + 0x61, 0x0a, 0x10, 0x4b, 0x69, 0x6c, 0x6c, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, + 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x0f, 0x92, + 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, - 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x8a, - 0x01, 0x0a, 0x14, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, + 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x92, + 0x01, 0x0a, 0x12, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, + 0x17, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, + 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0x64, 0x0a, 0x13, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x75, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, + 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x14, 0x55, 0x6e, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0xd2, 0x01, + 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x07, 0x72, 0x75, + 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x22, 0x66, 0x0a, 0x15, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, + 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x10, 0x50, 0x61, 0x75, + 0x73, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, + 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, + 0x01, 0x01, 0x3a, 0x2e, 0x92, 0x41, 0x2b, 0x0a, 0x29, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, + 0xd2, 0x01, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x74, 0x72, 0x69, + 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x62, 0x0a, + 0x11, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, - 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x15, 0x55, - 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x10, 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x75, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, - 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, - 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x62, 0x0a, 0x11, - 0x50, 0x61, 0x75, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, - 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x87, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, - 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x63, 0x0a, 0x12, 0x52, 0x65, - 0x73, 0x75, 0x6d, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, - 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, - 0x3a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x3a, - 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0xd2, 0x01, 0x02, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7b, 0x0a, 0x16, 0x50, 0x6f, - 0x73, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x3a, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x17, 0x50, 0x6f, 0x73, 0x74, 0x52, + 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x2e, 0x92, 0x41, + 0x2b, 0x0a, 0x29, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0xd2, 0x01, 0x0f, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x63, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x75, 0x6d, + 0x65, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, + 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, + 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x3a, 0x0a, 0x92, 0x41, + 0x07, 0x0a, 0x05, 0xd2, 0x01, 0x02, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, - 0x2d, 0x61, 0x69, 0x2f, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7b, 0x0a, 0x16, 0x50, 0x6f, 0x73, 0x74, 0x52, + 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x15, 0x92, + 0x41, 0x12, 0x0a, 0x10, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x17, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2d, 0x61, 0x69, + 0x2f, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/proto/pkg/apiv1/search.pb.go b/proto/pkg/apiv1/search.pb.go deleted file mode 100644 index 21169abb3fa..00000000000 --- a/proto/pkg/apiv1/search.pb.go +++ /dev/null @@ -1,1457 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// source: determined/api/v1/search.proto - -package apiv1 - -import ( - _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Message for results of individual searches in a multi-search action. -type SearchActionResult struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Optional error message. - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - // search ID. - Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *SearchActionResult) Reset() { - *x = SearchActionResult{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SearchActionResult) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SearchActionResult) ProtoMessage() {} - -func (x *SearchActionResult) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SearchActionResult.ProtoReflect.Descriptor instead. -func (*SearchActionResult) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{0} -} - -func (x *SearchActionResult) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -func (x *SearchActionResult) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -// Request to move the search to a different project. -type MoveSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being moved. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // The id of the current parent project. - SourceProjectId int32 `protobuf:"varint,2,opt,name=source_project_id,json=sourceProjectId,proto3" json:"source_project_id,omitempty"` - // The id of the new parent project. - DestinationProjectId int32 `protobuf:"varint,3,opt,name=destination_project_id,json=destinationProjectId,proto3" json:"destination_project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,4,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *MoveSearchesRequest) Reset() { - *x = MoveSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MoveSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MoveSearchesRequest) ProtoMessage() {} - -func (x *MoveSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MoveSearchesRequest.ProtoReflect.Descriptor instead. -func (*MoveSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{1} -} - -func (x *MoveSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *MoveSearchesRequest) GetSourceProjectId() int32 { - if x != nil { - return x.SourceProjectId - } - return 0 -} - -func (x *MoveSearchesRequest) GetDestinationProjectId() int32 { - if x != nil { - return x.DestinationProjectId - } - return 0 -} - -func (x *MoveSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to MoveSearchesRequest. -type MoveSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *MoveSearchesResponse) Reset() { - *x = MoveSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MoveSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MoveSearchesResponse) ProtoMessage() {} - -func (x *MoveSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MoveSearchesResponse.ProtoReflect.Descriptor instead. -func (*MoveSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{2} -} - -func (x *MoveSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -// Cancel searches. -type CancelSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being canceled. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // Project id of the searches being canceled. - ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *CancelSearchesRequest) Reset() { - *x = CancelSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CancelSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CancelSearchesRequest) ProtoMessage() {} - -func (x *CancelSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CancelSearchesRequest.ProtoReflect.Descriptor instead. -func (*CancelSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{3} -} - -func (x *CancelSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *CancelSearchesRequest) GetProjectId() int32 { - if x != nil { - return x.ProjectId - } - return 0 -} - -func (x *CancelSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to CancelSearchesRequest. -type CancelSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *CancelSearchesResponse) Reset() { - *x = CancelSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CancelSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CancelSearchesResponse) ProtoMessage() {} - -func (x *CancelSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CancelSearchesResponse.ProtoReflect.Descriptor instead. -func (*CancelSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{4} -} - -func (x *CancelSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -// Kill searches. -type KillSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being killed. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // Project id of the searches being killed. - ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *KillSearchesRequest) Reset() { - *x = KillSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *KillSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*KillSearchesRequest) ProtoMessage() {} - -func (x *KillSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use KillSearchesRequest.ProtoReflect.Descriptor instead. -func (*KillSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{5} -} - -func (x *KillSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *KillSearchesRequest) GetProjectId() int32 { - if x != nil { - return x.ProjectId - } - return 0 -} - -func (x *KillSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to KillSearchesRequest. -type KillSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *KillSearchesResponse) Reset() { - *x = KillSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *KillSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*KillSearchesResponse) ProtoMessage() {} - -func (x *KillSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use KillSearchesResponse.ProtoReflect.Descriptor instead. -func (*KillSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{6} -} - -func (x *KillSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -// Delete searches. -type DeleteSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being deleted. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // Project id of the searches being deleted. - ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *DeleteSearchesRequest) Reset() { - *x = DeleteSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteSearchesRequest) ProtoMessage() {} - -func (x *DeleteSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteSearchesRequest.ProtoReflect.Descriptor instead. -func (*DeleteSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{7} -} - -func (x *DeleteSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *DeleteSearchesRequest) GetProjectId() int32 { - if x != nil { - return x.ProjectId - } - return 0 -} - -func (x *DeleteSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to DeleteSearchesRequest. -type DeleteSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *DeleteSearchesResponse) Reset() { - *x = DeleteSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteSearchesResponse) ProtoMessage() {} - -func (x *DeleteSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteSearchesResponse.ProtoReflect.Descriptor instead. -func (*DeleteSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{8} -} - -func (x *DeleteSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -// Request to archive the search -type ArchiveSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being archived. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // The id of the current parent project. - ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *ArchiveSearchesRequest) Reset() { - *x = ArchiveSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ArchiveSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ArchiveSearchesRequest) ProtoMessage() {} - -func (x *ArchiveSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ArchiveSearchesRequest.ProtoReflect.Descriptor instead. -func (*ArchiveSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{9} -} - -func (x *ArchiveSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *ArchiveSearchesRequest) GetProjectId() int32 { - if x != nil { - return x.ProjectId - } - return 0 -} - -func (x *ArchiveSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to ArchiveSearchesRequest. -type ArchiveSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *ArchiveSearchesResponse) Reset() { - *x = ArchiveSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ArchiveSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ArchiveSearchesResponse) ProtoMessage() {} - -func (x *ArchiveSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ArchiveSearchesResponse.ProtoReflect.Descriptor instead. -func (*ArchiveSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{10} -} - -func (x *ArchiveSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -// Request to unarchive the search -type UnarchiveSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being unarchived. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // The id of the current parent project. - ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *UnarchiveSearchesRequest) Reset() { - *x = UnarchiveSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UnarchiveSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UnarchiveSearchesRequest) ProtoMessage() {} - -func (x *UnarchiveSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UnarchiveSearchesRequest.ProtoReflect.Descriptor instead. -func (*UnarchiveSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{11} -} - -func (x *UnarchiveSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *UnarchiveSearchesRequest) GetProjectId() int32 { - if x != nil { - return x.ProjectId - } - return 0 -} - -func (x *UnarchiveSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to UnarchiveSearchesRequest. -type UnarchiveSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *UnarchiveSearchesResponse) Reset() { - *x = UnarchiveSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UnarchiveSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UnarchiveSearchesResponse) ProtoMessage() {} - -func (x *UnarchiveSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UnarchiveSearchesResponse.ProtoReflect.Descriptor instead. -func (*UnarchiveSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{12} -} - -func (x *UnarchiveSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -// Request to pause the experiment associated witha search. -type PauseSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being moved. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // The id of the project of the searches being paused. - ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *PauseSearchesRequest) Reset() { - *x = PauseSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PauseSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PauseSearchesRequest) ProtoMessage() {} - -func (x *PauseSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PauseSearchesRequest.ProtoReflect.Descriptor instead. -func (*PauseSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{13} -} - -func (x *PauseSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *PauseSearchesRequest) GetProjectId() int32 { - if x != nil { - return x.ProjectId - } - return 0 -} - -func (x *PauseSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to PauseSearchesRequest. -type PauseSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *PauseSearchesResponse) Reset() { - *x = PauseSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PauseSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PauseSearchesResponse) ProtoMessage() {} - -func (x *PauseSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PauseSearchesResponse.ProtoReflect.Descriptor instead. -func (*PauseSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{14} -} - -func (x *PauseSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -// Request to unpause the experiment associated witha search. -type ResumeSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being moved. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,1,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` - // The id of the project of the searches being unpaused. - ProjectId int32 `protobuf:"varint,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Filter expression - Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` -} - -func (x *ResumeSearchesRequest) Reset() { - *x = ResumeSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ResumeSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResumeSearchesRequest) ProtoMessage() {} - -func (x *ResumeSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ResumeSearchesRequest.ProtoReflect.Descriptor instead. -func (*ResumeSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{15} -} - -func (x *ResumeSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -func (x *ResumeSearchesRequest) GetProjectId() int32 { - if x != nil { - return x.ProjectId - } - return 0 -} - -func (x *ResumeSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -// Response to ResumeSearchesRequest. -type ResumeSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Details on success or error for each search. - Results []*SearchActionResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *ResumeSearchesResponse) Reset() { - *x = ResumeSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ResumeSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResumeSearchesResponse) ProtoMessage() {} - -func (x *ResumeSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ResumeSearchesResponse.ProtoReflect.Descriptor instead. -func (*ResumeSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{16} -} - -func (x *ResumeSearchesResponse) GetResults() []*SearchActionResult { - if x != nil { - return x.Results - } - return nil -} - -var File_determined_api_v1_search_proto protoreflect.FileDescriptor - -var file_determined_api_v1_search_proto_rawDesc = []byte{ - 0x0a, 0x1e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x11, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, - 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x4e, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x3a, 0x12, 0x92, - 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xd2, 0x01, 0x02, 0x69, - 0x64, 0x22, 0xf2, 0x01, 0x0a, 0x13, 0x4d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x32, 0x92, 0x41, 0x2f, 0x0a, 0x2d, 0xd2, 0x01, - 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x69, 0x64, 0xd2, 0x01, 0x16, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x68, 0x0a, 0x14, 0x4d, 0x6f, 0x76, 0x65, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, - 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, - 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x91, 0x01, 0x0a, 0x15, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x22, 0x6a, 0x0a, 0x16, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, - 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, - 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x8f, 0x01, 0x0a, 0x13, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x22, 0x68, 0x0a, 0x14, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, - 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x91, 0x01, 0x0a, - 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, - 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x22, 0x6a, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, - 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x92, 0x01, 0x0a, - 0x16, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, - 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x22, 0x6b, 0x0a, 0x17, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, - 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x94, - 0x01, 0x0a, 0x18, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x52, - 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x19, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x75, 0x73, 0x65, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, - 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x69, 0x0a, 0x15, 0x50, 0x61, 0x75, 0x73, 0x65, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, - 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, - 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x6a, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2d, 0x61, 0x69, 0x2f, 0x64, - 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, -} - -var ( - file_determined_api_v1_search_proto_rawDescOnce sync.Once - file_determined_api_v1_search_proto_rawDescData = file_determined_api_v1_search_proto_rawDesc -) - -func file_determined_api_v1_search_proto_rawDescGZIP() []byte { - file_determined_api_v1_search_proto_rawDescOnce.Do(func() { - file_determined_api_v1_search_proto_rawDescData = protoimpl.X.CompressGZIP(file_determined_api_v1_search_proto_rawDescData) - }) - return file_determined_api_v1_search_proto_rawDescData -} - -var file_determined_api_v1_search_proto_msgTypes = make([]protoimpl.MessageInfo, 17) -var file_determined_api_v1_search_proto_goTypes = []interface{}{ - (*SearchActionResult)(nil), // 0: determined.api.v1.SearchActionResult - (*MoveSearchesRequest)(nil), // 1: determined.api.v1.MoveSearchesRequest - (*MoveSearchesResponse)(nil), // 2: determined.api.v1.MoveSearchesResponse - (*CancelSearchesRequest)(nil), // 3: determined.api.v1.CancelSearchesRequest - (*CancelSearchesResponse)(nil), // 4: determined.api.v1.CancelSearchesResponse - (*KillSearchesRequest)(nil), // 5: determined.api.v1.KillSearchesRequest - (*KillSearchesResponse)(nil), // 6: determined.api.v1.KillSearchesResponse - (*DeleteSearchesRequest)(nil), // 7: determined.api.v1.DeleteSearchesRequest - (*DeleteSearchesResponse)(nil), // 8: determined.api.v1.DeleteSearchesResponse - (*ArchiveSearchesRequest)(nil), // 9: determined.api.v1.ArchiveSearchesRequest - (*ArchiveSearchesResponse)(nil), // 10: determined.api.v1.ArchiveSearchesResponse - (*UnarchiveSearchesRequest)(nil), // 11: determined.api.v1.UnarchiveSearchesRequest - (*UnarchiveSearchesResponse)(nil), // 12: determined.api.v1.UnarchiveSearchesResponse - (*PauseSearchesRequest)(nil), // 13: determined.api.v1.PauseSearchesRequest - (*PauseSearchesResponse)(nil), // 14: determined.api.v1.PauseSearchesResponse - (*ResumeSearchesRequest)(nil), // 15: determined.api.v1.ResumeSearchesRequest - (*ResumeSearchesResponse)(nil), // 16: determined.api.v1.ResumeSearchesResponse -} -var file_determined_api_v1_search_proto_depIdxs = []int32{ - 0, // 0: determined.api.v1.MoveSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 1: determined.api.v1.CancelSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 2: determined.api.v1.KillSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 3: determined.api.v1.DeleteSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 4: determined.api.v1.ArchiveSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 5: determined.api.v1.UnarchiveSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 6: determined.api.v1.PauseSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 7: determined.api.v1.ResumeSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 8, // [8:8] is the sub-list for method output_type - 8, // [8:8] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name -} - -func init() { file_determined_api_v1_search_proto_init() } -func file_determined_api_v1_search_proto_init() { - if File_determined_api_v1_search_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_determined_api_v1_search_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchActionResult); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MoveSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MoveSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ArchiveSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnarchiveSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnarchiveSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PauseSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PauseSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResumeSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_search_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResumeSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_determined_api_v1_search_proto_msgTypes[1].OneofWrappers = []interface{}{} - file_determined_api_v1_search_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_determined_api_v1_search_proto_msgTypes[5].OneofWrappers = []interface{}{} - file_determined_api_v1_search_proto_msgTypes[7].OneofWrappers = []interface{}{} - file_determined_api_v1_search_proto_msgTypes[9].OneofWrappers = []interface{}{} - file_determined_api_v1_search_proto_msgTypes[11].OneofWrappers = []interface{}{} - file_determined_api_v1_search_proto_msgTypes[13].OneofWrappers = []interface{}{} - file_determined_api_v1_search_proto_msgTypes[15].OneofWrappers = []interface{}{} - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_determined_api_v1_search_proto_rawDesc, - NumEnums: 0, - NumMessages: 17, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_determined_api_v1_search_proto_goTypes, - DependencyIndexes: file_determined_api_v1_search_proto_depIdxs, - MessageInfos: file_determined_api_v1_search_proto_msgTypes, - }.Build() - File_determined_api_v1_search_proto = out.File - file_determined_api_v1_search_proto_rawDesc = nil - file_determined_api_v1_search_proto_goTypes = nil - file_determined_api_v1_search_proto_depIdxs = nil -} diff --git a/proto/pkg/apiv1/tensorboard.pb.go b/proto/pkg/apiv1/tensorboard.pb.go index 5b845d4e3f6..4989d1d5049 100644 --- a/proto/pkg/apiv1/tensorboard.pb.go +++ b/proto/pkg/apiv1/tensorboard.pb.go @@ -731,167 +731,6 @@ func (x *LaunchTensorboardResponse) GetWarnings() []LaunchWarning { return nil } -// Request to launch a tensorboard using searches matching a filter. -type LaunchTensorboardSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Targets all searches matching filter expression. Leave empty if using IDs. - Filter *string `protobuf:"bytes,1,opt,name=filter,proto3,oneof" json:"filter,omitempty"` - // Tensorboard config (JSON). - Config *_struct.Struct `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` - // Tensorboard template name. - TemplateName string `protobuf:"bytes,3,opt,name=template_name,json=templateName,proto3" json:"template_name,omitempty"` - // The files to run with the command. - Files []*utilv1.File `protobuf:"bytes,4,rep,name=files,proto3" json:"files,omitempty"` - // Workspace in which to launch tensorboard. Defaults to 'Uncategorized'. - WorkspaceId int32 `protobuf:"varint,5,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` - // Target search IDs. Leave empty if using filter. - SearchIds []int32 `protobuf:"varint,6,rep,packed,name=search_ids,json=searchIds,proto3" json:"search_ids,omitempty"` -} - -func (x *LaunchTensorboardSearchesRequest) Reset() { - *x = LaunchTensorboardSearchesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_tensorboard_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LaunchTensorboardSearchesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LaunchTensorboardSearchesRequest) ProtoMessage() {} - -func (x *LaunchTensorboardSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_tensorboard_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LaunchTensorboardSearchesRequest.ProtoReflect.Descriptor instead. -func (*LaunchTensorboardSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_tensorboard_proto_rawDescGZIP(), []int{10} -} - -func (x *LaunchTensorboardSearchesRequest) GetFilter() string { - if x != nil && x.Filter != nil { - return *x.Filter - } - return "" -} - -func (x *LaunchTensorboardSearchesRequest) GetConfig() *_struct.Struct { - if x != nil { - return x.Config - } - return nil -} - -func (x *LaunchTensorboardSearchesRequest) GetTemplateName() string { - if x != nil { - return x.TemplateName - } - return "" -} - -func (x *LaunchTensorboardSearchesRequest) GetFiles() []*utilv1.File { - if x != nil { - return x.Files - } - return nil -} - -func (x *LaunchTensorboardSearchesRequest) GetWorkspaceId() int32 { - if x != nil { - return x.WorkspaceId - } - return 0 -} - -func (x *LaunchTensorboardSearchesRequest) GetSearchIds() []int32 { - if x != nil { - return x.SearchIds - } - return nil -} - -// Response to LaunchTensorboardSearchesRequest. -type LaunchTensorboardSearchesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The requested tensorboard. - Tensorboard *tensorboardv1.Tensorboard `protobuf:"bytes,1,opt,name=tensorboard,proto3" json:"tensorboard,omitempty"` - // The config; - Config *_struct.Struct `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` - // List of any related warnings. - Warnings []LaunchWarning `protobuf:"varint,3,rep,packed,name=warnings,proto3,enum=determined.api.v1.LaunchWarning" json:"warnings,omitempty"` -} - -func (x *LaunchTensorboardSearchesResponse) Reset() { - *x = LaunchTensorboardSearchesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_tensorboard_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LaunchTensorboardSearchesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LaunchTensorboardSearchesResponse) ProtoMessage() {} - -func (x *LaunchTensorboardSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_tensorboard_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LaunchTensorboardSearchesResponse.ProtoReflect.Descriptor instead. -func (*LaunchTensorboardSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_tensorboard_proto_rawDescGZIP(), []int{11} -} - -func (x *LaunchTensorboardSearchesResponse) GetTensorboard() *tensorboardv1.Tensorboard { - if x != nil { - return x.Tensorboard - } - return nil -} - -func (x *LaunchTensorboardSearchesResponse) GetConfig() *_struct.Struct { - if x != nil { - return x.Config - } - return nil -} - -func (x *LaunchTensorboardSearchesResponse) GetWarnings() []LaunchWarning { - if x != nil { - return x.Warnings - } - return nil -} - var File_determined_api_v1_tensorboard_proto protoreflect.FileDescriptor var file_determined_api_v1_tensorboard_proto_rawDesc = []byte{ @@ -1027,44 +866,10 @@ var file_determined_api_v1_tensorboard_proto_rawDesc = []byte{ 0x68, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0xd2, 0x01, 0x0b, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0xd2, 0x01, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x22, 0x92, 0x02, 0x0a, 0x20, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x54, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, - 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, - 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xfa, 0x01, 0x0a, 0x21, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x74, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x74, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x0b, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, - 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x74, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x75, - 0x6e, 0x63, 0x68, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0xd2, 0x01, 0x0b, 0x74, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0xd2, 0x01, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2d, 0x61, 0x69, 0x2f, 0x64, - 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, + 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2d, 0x61, 0x69, 0x2f, 0x64, 0x65, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1080,54 +885,47 @@ func file_determined_api_v1_tensorboard_proto_rawDescGZIP() []byte { } var file_determined_api_v1_tensorboard_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_determined_api_v1_tensorboard_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_determined_api_v1_tensorboard_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_determined_api_v1_tensorboard_proto_goTypes = []interface{}{ - (GetTensorboardsRequest_SortBy)(0), // 0: determined.api.v1.GetTensorboardsRequest.SortBy - (*GetTensorboardsRequest)(nil), // 1: determined.api.v1.GetTensorboardsRequest - (*GetTensorboardsResponse)(nil), // 2: determined.api.v1.GetTensorboardsResponse - (*GetTensorboardRequest)(nil), // 3: determined.api.v1.GetTensorboardRequest - (*GetTensorboardResponse)(nil), // 4: determined.api.v1.GetTensorboardResponse - (*KillTensorboardRequest)(nil), // 5: determined.api.v1.KillTensorboardRequest - (*KillTensorboardResponse)(nil), // 6: determined.api.v1.KillTensorboardResponse - (*SetTensorboardPriorityRequest)(nil), // 7: determined.api.v1.SetTensorboardPriorityRequest - (*SetTensorboardPriorityResponse)(nil), // 8: determined.api.v1.SetTensorboardPriorityResponse - (*LaunchTensorboardRequest)(nil), // 9: determined.api.v1.LaunchTensorboardRequest - (*LaunchTensorboardResponse)(nil), // 10: determined.api.v1.LaunchTensorboardResponse - (*LaunchTensorboardSearchesRequest)(nil), // 11: determined.api.v1.LaunchTensorboardSearchesRequest - (*LaunchTensorboardSearchesResponse)(nil), // 12: determined.api.v1.LaunchTensorboardSearchesResponse - (OrderBy)(0), // 13: determined.api.v1.OrderBy - (*tensorboardv1.Tensorboard)(nil), // 14: determined.tensorboard.v1.Tensorboard - (*Pagination)(nil), // 15: determined.api.v1.Pagination - (*_struct.Struct)(nil), // 16: google.protobuf.Struct - (*utilv1.File)(nil), // 17: determined.util.v1.File - (*BulkExperimentFilters)(nil), // 18: determined.api.v1.BulkExperimentFilters - (LaunchWarning)(0), // 19: determined.api.v1.LaunchWarning + (GetTensorboardsRequest_SortBy)(0), // 0: determined.api.v1.GetTensorboardsRequest.SortBy + (*GetTensorboardsRequest)(nil), // 1: determined.api.v1.GetTensorboardsRequest + (*GetTensorboardsResponse)(nil), // 2: determined.api.v1.GetTensorboardsResponse + (*GetTensorboardRequest)(nil), // 3: determined.api.v1.GetTensorboardRequest + (*GetTensorboardResponse)(nil), // 4: determined.api.v1.GetTensorboardResponse + (*KillTensorboardRequest)(nil), // 5: determined.api.v1.KillTensorboardRequest + (*KillTensorboardResponse)(nil), // 6: determined.api.v1.KillTensorboardResponse + (*SetTensorboardPriorityRequest)(nil), // 7: determined.api.v1.SetTensorboardPriorityRequest + (*SetTensorboardPriorityResponse)(nil), // 8: determined.api.v1.SetTensorboardPriorityResponse + (*LaunchTensorboardRequest)(nil), // 9: determined.api.v1.LaunchTensorboardRequest + (*LaunchTensorboardResponse)(nil), // 10: determined.api.v1.LaunchTensorboardResponse + (OrderBy)(0), // 11: determined.api.v1.OrderBy + (*tensorboardv1.Tensorboard)(nil), // 12: determined.tensorboard.v1.Tensorboard + (*Pagination)(nil), // 13: determined.api.v1.Pagination + (*_struct.Struct)(nil), // 14: google.protobuf.Struct + (*utilv1.File)(nil), // 15: determined.util.v1.File + (*BulkExperimentFilters)(nil), // 16: determined.api.v1.BulkExperimentFilters + (LaunchWarning)(0), // 17: determined.api.v1.LaunchWarning } var file_determined_api_v1_tensorboard_proto_depIdxs = []int32{ 0, // 0: determined.api.v1.GetTensorboardsRequest.sort_by:type_name -> determined.api.v1.GetTensorboardsRequest.SortBy - 13, // 1: determined.api.v1.GetTensorboardsRequest.order_by:type_name -> determined.api.v1.OrderBy - 14, // 2: determined.api.v1.GetTensorboardsResponse.tensorboards:type_name -> determined.tensorboard.v1.Tensorboard - 15, // 3: determined.api.v1.GetTensorboardsResponse.pagination:type_name -> determined.api.v1.Pagination - 14, // 4: determined.api.v1.GetTensorboardResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard - 16, // 5: determined.api.v1.GetTensorboardResponse.config:type_name -> google.protobuf.Struct - 14, // 6: determined.api.v1.KillTensorboardResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard - 14, // 7: determined.api.v1.SetTensorboardPriorityResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard - 16, // 8: determined.api.v1.LaunchTensorboardRequest.config:type_name -> google.protobuf.Struct - 17, // 9: determined.api.v1.LaunchTensorboardRequest.files:type_name -> determined.util.v1.File - 18, // 10: determined.api.v1.LaunchTensorboardRequest.filters:type_name -> determined.api.v1.BulkExperimentFilters - 14, // 11: determined.api.v1.LaunchTensorboardResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard - 16, // 12: determined.api.v1.LaunchTensorboardResponse.config:type_name -> google.protobuf.Struct - 19, // 13: determined.api.v1.LaunchTensorboardResponse.warnings:type_name -> determined.api.v1.LaunchWarning - 16, // 14: determined.api.v1.LaunchTensorboardSearchesRequest.config:type_name -> google.protobuf.Struct - 17, // 15: determined.api.v1.LaunchTensorboardSearchesRequest.files:type_name -> determined.util.v1.File - 14, // 16: determined.api.v1.LaunchTensorboardSearchesResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard - 16, // 17: determined.api.v1.LaunchTensorboardSearchesResponse.config:type_name -> google.protobuf.Struct - 19, // 18: determined.api.v1.LaunchTensorboardSearchesResponse.warnings:type_name -> determined.api.v1.LaunchWarning - 19, // [19:19] is the sub-list for method output_type - 19, // [19:19] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 19, // [19:19] is the sub-list for extension extendee - 0, // [0:19] is the sub-list for field type_name + 11, // 1: determined.api.v1.GetTensorboardsRequest.order_by:type_name -> determined.api.v1.OrderBy + 12, // 2: determined.api.v1.GetTensorboardsResponse.tensorboards:type_name -> determined.tensorboard.v1.Tensorboard + 13, // 3: determined.api.v1.GetTensorboardsResponse.pagination:type_name -> determined.api.v1.Pagination + 12, // 4: determined.api.v1.GetTensorboardResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard + 14, // 5: determined.api.v1.GetTensorboardResponse.config:type_name -> google.protobuf.Struct + 12, // 6: determined.api.v1.KillTensorboardResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard + 12, // 7: determined.api.v1.SetTensorboardPriorityResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard + 14, // 8: determined.api.v1.LaunchTensorboardRequest.config:type_name -> google.protobuf.Struct + 15, // 9: determined.api.v1.LaunchTensorboardRequest.files:type_name -> determined.util.v1.File + 16, // 10: determined.api.v1.LaunchTensorboardRequest.filters:type_name -> determined.api.v1.BulkExperimentFilters + 12, // 11: determined.api.v1.LaunchTensorboardResponse.tensorboard:type_name -> determined.tensorboard.v1.Tensorboard + 14, // 12: determined.api.v1.LaunchTensorboardResponse.config:type_name -> google.protobuf.Struct + 17, // 13: determined.api.v1.LaunchTensorboardResponse.warnings:type_name -> determined.api.v1.LaunchWarning + 14, // [14:14] is the sub-list for method output_type + 14, // [14:14] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_determined_api_v1_tensorboard_proto_init() } @@ -1259,39 +1057,14 @@ func file_determined_api_v1_tensorboard_proto_init() { return nil } } - file_determined_api_v1_tensorboard_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchTensorboardSearchesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_determined_api_v1_tensorboard_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LaunchTensorboardSearchesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } } - file_determined_api_v1_tensorboard_proto_msgTypes[10].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_determined_api_v1_tensorboard_proto_rawDesc, NumEnums: 1, - NumMessages: 12, + NumMessages: 10, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/src/determined/api/v1/api.proto b/proto/src/determined/api/v1/api.proto index 69e5008ae9c..97cd4df4bd2 100644 --- a/proto/src/determined/api/v1/api.proto +++ b/proto/src/determined/api/v1/api.proto @@ -20,7 +20,6 @@ import "determined/api/v1/notebook.proto"; import "determined/api/v1/project.proto"; import "determined/api/v1/rbac.proto"; import "determined/api/v1/run.proto"; -import "determined/api/v1/search.proto"; import "determined/api/v1/task.proto"; import "determined/api/v1/template.proto"; import "determined/api/v1/tensorboard.proto"; @@ -1618,17 +1617,6 @@ service Determined { tags: "Tensorboards" }; } - // Launch a tensorboard for one or more searches using bulk search filters. - rpc LaunchTensorboardSearches(LaunchTensorboardSearchesRequest) - returns (LaunchTensorboardSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/tensorboards" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } // Delete tensorboard files. rpc DeleteTensorboardFiles(DeleteTensorboardFilesRequest) returns (DeleteTensorboardFilesResponse) { @@ -2698,7 +2686,7 @@ service Determined { }; } - // Delete runs. + // Delete a list of runs. rpc DeleteRuns(DeleteRunsRequest) returns (DeleteRunsResponse) { option (google.api.http) = { post: "/api/v1/runs/delete" @@ -2855,96 +2843,6 @@ service Determined { }; } - // Move searches. - rpc MoveSearches(MoveSearchesRequest) returns (MoveSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/move" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - - // Cancel searches. - rpc CancelSearches(CancelSearchesRequest) returns (CancelSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/cancel" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - - // Kill searches. - rpc KillSearches(KillSearchesRequest) returns (KillSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/kill" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - - // Delete searches. - rpc DeleteSearches(DeleteSearchesRequest) returns (DeleteSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/delete" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - - // Archive searches. - rpc ArchiveSearches(ArchiveSearchesRequest) - returns (ArchiveSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/archive" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - - // Unarchive searches. - rpc UnarchiveSearches(UnarchiveSearchesRequest) - returns (UnarchiveSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/unarchive" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - - // Pause experiment associated with provided searches. - rpc PauseSearches(PauseSearchesRequest) returns (PauseSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/pause" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - - // Unpause experiment associated with provided searches. - rpc ResumeSearches(ResumeSearchesRequest) returns (ResumeSearchesResponse) { - option (google.api.http) = { - post: "/api/v1/searches/resume" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Internal" - }; - } - // Create and get a user's access token rpc PostAccessToken(PostAccessTokenRequest) returns (PostAccessTokenResponse) { diff --git a/proto/src/determined/api/v1/run.proto b/proto/src/determined/api/v1/run.proto index 599ee7ea1c5..32b6896ea9b 100644 --- a/proto/src/determined/api/v1/run.proto +++ b/proto/src/determined/api/v1/run.proto @@ -66,10 +66,12 @@ message RunActionResult { // Request to move the run to a different project. message MoveRunsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "source_project_id", "destination_project_id" ] } + json_schema: { + required: [ "source_project_id", "destination_project_id", "run_ids" ] + } }; - // The ids of the runs being moved. Leave empty if using filter. + // The ids of the runs being moved. repeated int32 run_ids = 1; // The id of the current parent project. int32 source_project_id = 2; @@ -94,9 +96,9 @@ message MoveRunsResponse { // Kill runs. message KillRunsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "source_project_id" ] } + json_schema: { required: [ "run_ids", "source_project_id" ] } }; - // The ids of the runs being killed. Leave empty if using filter. + // The ids of the runs being killed. repeated int32 run_ids = 1; // Project id of the runs being killed. int32 project_id = 2; @@ -115,9 +117,9 @@ message KillRunsResponse { // Delete runs. message DeleteRunsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "run_ids" ] } }; - // The ids of the runs being deleted. Leave empty if using filter. + // The ids of the runs being deleted. repeated int32 run_ids = 1; // Project id of the runs being deleted. int32 project_id = 2; @@ -136,10 +138,10 @@ message DeleteRunsResponse { // Request to archive the run message ArchiveRunsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "run_ids" ] } }; - // The ids of the runs being archived. Leave empty if using filter. + // The ids of the runs being archived. repeated int32 run_ids = 1; // The id of the current parent project. int32 project_id = 2; @@ -160,10 +162,10 @@ message ArchiveRunsResponse { // Request to unarchive the run message UnarchiveRunsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "run_ids" ] } }; - // The ids of the runs being unarchived. Leave empty if using filter. + // The ids of the runs being unarchived. repeated int32 run_ids = 1; // The id of the current parent project. int32 project_id = 2; @@ -184,10 +186,10 @@ message UnarchiveRunsResponse { // Request to pause the experiment associated witha run. message PauseRunsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "run_ids", "skip_multitrial" ] } }; - // The ids of the runs being paused. Leave empty if using filter. + // The ids of the runs being moved. repeated int32 run_ids = 1; // The id of the project of the runs being paused. int32 project_id = 2; @@ -208,10 +210,10 @@ message PauseRunsResponse { // Request to unpause the experiment associated witha run. message ResumeRunsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "run_ids", "skip_multitrial" ] } }; - // The ids of the runs being moved. Leave empty if using filter. + // The ids of the runs being moved. repeated int32 run_ids = 1; // The id of the project of the runs being unpaused. int32 project_id = 2; diff --git a/proto/src/determined/api/v1/search.proto b/proto/src/determined/api/v1/search.proto deleted file mode 100644 index 5b4ee91249a..00000000000 --- a/proto/src/determined/api/v1/search.proto +++ /dev/null @@ -1,202 +0,0 @@ -syntax = "proto3"; - -package determined.api.v1; -option go_package = "github.com/determined-ai/determined/proto/pkg/apiv1"; - -import "protoc-gen-swagger/options/annotations.proto"; - -// Message for results of individual searches in a multi-search action. -message SearchActionResult { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "error", "id" ] } - }; - // Optional error message. - string error = 1; - // search ID. - int32 id = 2; -} - -// Request to move the search to a different project. -message MoveSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "source_project_id", "destination_project_id" ] } - }; - - // The ids of the searches being moved. Leave empty if using filter. - repeated int32 search_ids = 1; - // The id of the current parent project. - int32 source_project_id = 2; - // The id of the new parent project. - int32 destination_project_id = 3; - // Filter expression - optional string filter = 4; -} - -// Response to MoveSearchesRequest. -message MoveSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} - -// Cancel searches. -message CancelSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } - }; - // The ids of the searches being canceled. Leave empty if using filter. - repeated int32 search_ids = 1; - // Project id of the searches being canceled. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} -// Response to CancelSearchesRequest. -message CancelSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} - -// Kill searches. -message KillSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } - }; - // The ids of the searches being killed. Leave empty if using filter. - repeated int32 search_ids = 1; - // Project id of the searches being killed. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} -// Response to KillSearchesRequest. -message KillSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} - -// Delete searches. -message DeleteSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } - }; - // The ids of the searches being deleted. Leave empty if using filter. - repeated int32 search_ids = 1; - // Project id of the searches being deleted. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} -// Response to DeleteSearchesRequest. -message DeleteSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} - -// Request to archive the search -message ArchiveSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } - }; - - // The ids of the searches being archived. Leave empty if using filter. - repeated int32 search_ids = 1; - // The id of the current parent project. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} - -// Response to ArchiveSearchesRequest. -message ArchiveSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} - -// Request to unarchive the search -message UnarchiveSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } - }; - - // The ids of the searches being unarchived. Leave empty if using filter. - repeated int32 search_ids = 1; - // The id of the current parent project. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} - -// Response to UnarchiveSearchesRequest. -message UnarchiveSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} - -// Request to pause the experiment associated witha search. -message PauseSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } - }; - - // The ids of the searches being moved. Leave empty if using filter. - repeated int32 search_ids = 1; - // The id of the project of the searches being paused. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} - -// Response to PauseSearchesRequest. -message PauseSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} - -// Request to unpause the experiment associated witha search. -message ResumeSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } - }; - - // The ids of the searches being moved. Leave empty if using filter. - repeated int32 search_ids = 1; - // The id of the project of the searches being unpaused. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} - -// Response to ResumeSearchesRequest. -message ResumeSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "results" ] } - }; - - // Details on success or error for each search. - repeated SearchActionResult results = 1; -} diff --git a/proto/src/determined/api/v1/tensorboard.proto b/proto/src/determined/api/v1/tensorboard.proto index 9f255450867..85abedf3b2c 100644 --- a/proto/src/determined/api/v1/tensorboard.proto +++ b/proto/src/determined/api/v1/tensorboard.proto @@ -127,31 +127,3 @@ message LaunchTensorboardResponse { // List of any related warnings. repeated LaunchWarning warnings = 3; } - -// Request to launch a tensorboard using searches matching a filter. -message LaunchTensorboardSearchesRequest { - // Targets all searches matching filter expression. Leave empty if using IDs. - optional string filter = 1; - // Tensorboard config (JSON). - google.protobuf.Struct config = 2; - // Tensorboard template name. - string template_name = 3; - // The files to run with the command. - repeated determined.util.v1.File files = 4; - // Workspace in which to launch tensorboard. Defaults to 'Uncategorized'. - int32 workspace_id = 5; - // Target search IDs. Leave empty if using filter. - repeated int32 search_ids = 6; -} -// Response to LaunchTensorboardSearchesRequest. -message LaunchTensorboardSearchesResponse { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "tensorboard", "config" ] } - }; - // The requested tensorboard. - determined.tensorboard.v1.Tensorboard tensorboard = 1; - // The config; - google.protobuf.Struct config = 2; - // List of any related warnings. - repeated LaunchWarning warnings = 3; -} \ No newline at end of file diff --git a/webui/react/src/components/ComparisonView.test.mock.tsx b/webui/react/src/components/ComparisonView.test.mock.tsx index 800af38149d..a9eba821af9 100644 --- a/webui/react/src/components/ComparisonView.test.mock.tsx +++ b/webui/react/src/components/ComparisonView.test.mock.tsx @@ -1,14 +1,11 @@ -import { useObservable } from 'micro-observables'; import React from 'react'; import { useGlasbey } from 'hooks/useGlasbey'; import { RunMetricData } from 'hooks/useMetrics'; -import { V1LocationType } from 'services/api-ts-sdk'; import { ExperimentWithTrial, Scale } from 'types'; import { generateTestRunData } from 'utils/tests/generateTestData'; import ComparisonView from './ComparisonView'; -import { FilterFormStore } from './FilterForm/components/FilterFormStore'; export const METRIC_DATA: RunMetricData = { data: { @@ -247,7 +244,6 @@ export const ExperimentComparisonViewWithMocks: React.FC = ({ onWidthChange, open, }: Props): JSX.Element => { - const tableFilters = useObservable(new FilterFormStore(V1LocationType.EXPERIMENT).asJsonString); const colorMap = useGlasbey(SELECTED_EXPERIMENTS.map((exp) => exp.experiment.id)); return ( = ({ initialWidth={200} open={open} projectId={1} - tableFilters={tableFilters} onWidthChange={onWidthChange}> {children} @@ -274,7 +269,6 @@ export const RunComparisonViewWithMocks: React.FC = ({ onWidthChange, open, }: Props): JSX.Element => { - const tableFilters = useObservable(new FilterFormStore(V1LocationType.RUN).asJsonString); const colorMap = useGlasbey(SELECTED_RUNS.map((run) => run.id)); return ( = ({ ? { selections: [], type: 'ONLY_IN' } : { selections: SELECTED_RUNS.map((run) => run.id), type: 'ONLY_IN' } } - tableFilters={tableFilters} onWidthChange={onWidthChange}> {children} diff --git a/webui/react/src/components/ComparisonView.tsx b/webui/react/src/components/ComparisonView.tsx index 610227af98c..c5d5d018f06 100644 --- a/webui/react/src/components/ComparisonView.tsx +++ b/webui/react/src/components/ComparisonView.tsx @@ -15,16 +15,13 @@ import useMobile from 'hooks/useMobile'; import useScrollbarWidth from 'hooks/useScrollbarWidth'; import { TrialsComparisonTable } from 'pages/ExperimentDetails/TrialsComparisonModal'; import { searchExperiments, searchRuns } from 'services/api'; -import { V1ColumnType, V1LocationType } from 'services/api-ts-sdk'; import { ExperimentWithTrial, FlatRun, SelectionType, XOR } from 'types'; import handleError from 'utils/error'; import { getIdsFilter as getExperimentIdsFilter } from 'utils/experiment'; -import { combine } from 'utils/filterFormSet'; import { getIdsFilter as getRunIdsFilter } from 'utils/flatRun'; import CompareMetrics from './CompareMetrics'; import { INIT_FORMSET } from './FilterForm/components/FilterFormStore'; -import { FilterFormSet, Operator } from './FilterForm/components/type'; export const EMPTY_MESSAGE = 'No items selected.'; @@ -36,8 +33,6 @@ interface BaseProps { onWidthChange: (width: number) => void; fixedColumnsCount: number; projectId: number; - searchId?: number; - tableFilters: string; } type Props = XOR<{ experimentSelection: SelectionType }, { runSelection: SelectionType }> & @@ -137,8 +132,6 @@ const ComparisonView: React.FC = ({ projectId, experimentSelection, runSelection, - searchId, - tableFilters, }) => { const scrollbarWidth = useScrollbarWidth(); const hasPinnedColumns = fixedColumnsCount > 1; @@ -155,10 +148,7 @@ const ComparisonView: React.FC = ({ return NotLoaded; } try { - const filterFormSet = - experimentSelection.type === 'ALL_EXCEPT' - ? (JSON.parse(tableFilters) as FilterFormSet) - : INIT_FORMSET; + const filterFormSet = INIT_FORMSET; const filter = getExperimentIdsFilter(filterFormSet, experimentSelection); const response = await searchExperiments({ filter: JSON.stringify(filter), @@ -172,7 +162,7 @@ const ComparisonView: React.FC = ({ handleError(e, { publicSubject: 'Unable to fetch experiments for comparison' }); return NotLoaded; } - }, [experimentSelection, open, tableFilters]); + }, [experimentSelection, open]); const loadableSelectedRuns = useAsync(async () => { if ( @@ -182,28 +172,12 @@ const ComparisonView: React.FC = ({ ) { return NotLoaded; } - const filterFormSet = - runSelection.type === 'ALL_EXCEPT' - ? (JSON.parse(tableFilters) as FilterFormSet) - : INIT_FORMSET; + const filterFormSet = INIT_FORMSET; try { const filter = getRunIdsFilter(filterFormSet, runSelection); - if (searchId) { - // only display trials for search - const searchFilter = { - columnName: 'experimentId', - kind: 'field' as const, - location: V1LocationType.RUN, - operator: Operator.Eq, - type: V1ColumnType.NUMBER, - value: searchId, - }; - filter.filterGroup = combine(filter.filterGroup, 'and', searchFilter); - } const response = await searchRuns({ filter: JSON.stringify(filter), limit: SELECTION_LIMIT, - projectId, }); setIsSelectionLimitReached( !!response?.pagination?.total && response?.pagination?.total > SELECTION_LIMIT, @@ -213,7 +187,7 @@ const ComparisonView: React.FC = ({ handleError(e, { publicSubject: 'Unable to fetch runs for comparison' }); return NotLoaded; } - }, [open, projectId, runSelection, searchId, tableFilters]); + }, [open, runSelection]); const minWidths: [number, number] = useMemo(() => { return [fixedColumnsCount * MIN_COLUMN_WIDTH + scrollbarWidth, 100]; diff --git a/webui/react/src/components/ExperimentActionDropdown.tsx b/webui/react/src/components/ExperimentActionDropdown.tsx index 2af2ca397ac..2536e23bcc8 100644 --- a/webui/react/src/components/ExperimentActionDropdown.tsx +++ b/webui/react/src/components/ExperimentActionDropdown.tsx @@ -353,7 +353,6 @@ const ExperimentActionDropdown: React.FC = ({ /> { it('submits a valid create experiment request', async () => { await setup(); - await user.click( - screen.getByRole('button', { name: RunActionCopyMap[CreateExperimentType.Fork] }), - ); + await user.click(screen.getByRole('button', { name: CreateExperimentType.Fork })); expect(mockCreateExperiment).toHaveBeenCalled(); }); }); diff --git a/webui/react/src/components/ExperimentCreateModal.tsx b/webui/react/src/components/ExperimentCreateModal.tsx index 8f05d77e1f6..c5b9bab03a8 100644 --- a/webui/react/src/components/ExperimentCreateModal.tsx +++ b/webui/react/src/components/ExperimentCreateModal.tsx @@ -49,7 +49,7 @@ const ExperimentEntityCopyMap = { trial: 'trial', }; -export const RunActionCopyMap = { +const RunActionCopyMap = { [CreateExperimentType.ContinueTrial]: 'Continue Run', [CreateExperimentType.Fork]: 'Fork', }; @@ -328,7 +328,7 @@ const ExperimentCreateModalComponent = ({ form: idPrefix + FORM_ID, handleError, handler: handleSubmit, - text: ExperimentActionCopyMap[type], + text: type, }} title={titleLabel} onClose={handleModalClose}> diff --git a/webui/react/src/components/ExperimentMoveModal.tsx b/webui/react/src/components/ExperimentMoveModal.tsx index fac37ead413..f46f1b64357 100644 --- a/webui/react/src/components/ExperimentMoveModal.tsx +++ b/webui/react/src/components/ExperimentMoveModal.tsx @@ -14,18 +14,14 @@ import Link from 'components/Link'; import useFeature from 'hooks/useFeature'; import usePermissions from 'hooks/usePermissions'; import { paths } from 'routes/utils'; -import { moveSearches } from 'services/api'; -import { V1MoveSearchesRequest } from 'services/api-ts-sdk'; +import { moveExperiments } from 'services/api'; +import { V1BulkExperimentFilters } from 'services/api-ts-sdk'; import projectStore from 'stores/projects'; import workspaceStore from 'stores/workspaces'; -import { Project, SelectionType, XOR } from 'types'; +import { Project } from 'types'; import handleError from 'utils/error'; -import { getIdsFilter as getExperimentIdsFilter } from 'utils/experiment'; import { capitalize, pluralizer } from 'utils/string'; -import { INIT_FORMSET } from './FilterForm/components/FilterFormStore'; -import { FilterFormSet } from './FilterForm/components/type'; - const FORM_ID = 'move-experiment-form'; type FormInputs = { @@ -33,21 +29,19 @@ type FormInputs = { workspaceId?: number; }; -interface BaseProps { +interface Props { + excludedExperimentIds?: Map; + experimentIds: number[]; + filters?: V1BulkExperimentFilters; onSubmit?: (successfulIds?: number[]) => void; - selectionSize: number; sourceProjectId: number; sourceWorkspaceId?: number; } -type Props = BaseProps & - XOR<{ experimentIds: number[] }, { selection: SelectionType; tableFilters: string }>; - const ExperimentMoveModalComponent: React.FC = ({ + excludedExperimentIds, experimentIds, - selection, - selectionSize, - tableFilters, + filters, onSubmit, sourceProjectId, sourceWorkspaceId, @@ -60,6 +54,8 @@ const ExperimentMoveModalComponent: React.FC = ({ const projectId = Form.useWatch('projectId', form); const f_flat_runs = useFeature().isOn('flat_runs'); + const entityName = f_flat_runs ? 'searches' : 'experiments'; + useEffect(() => { setDisabled(workspaceId !== 1 && !projectId); }, [workspaceId, projectId, sourceProjectId, sourceWorkspaceId]); @@ -80,14 +76,6 @@ const ExperimentMoveModalComponent: React.FC = ({ } }, [workspaceId]); - // use plurals for indeterminate case - const pluralizerArgs = f_flat_runs - ? (['search', 'searches'] as const) - : (['experiment'] as const); - // we use apply instead of a direct call here because typescript errors when you spread a tuple into arguments - const plural = pluralizer.apply(null, [selectionSize, ...pluralizerArgs]); - const actionCopy = `Move ${capitalize(plural)}`; - const handleSubmit = async () => { if (workspaceId === sourceWorkspaceId && projectId === sourceProjectId) { openToast({ title: 'No changes to save.' }); @@ -96,23 +84,16 @@ const ExperimentMoveModalComponent: React.FC = ({ const values = await form.validateFields(); const projId = values.projectId ?? 1; - const moveSearchesArgs: V1MoveSearchesRequest = { - destinationProjectId: projId, - sourceProjectId, - }; - - if (tableFilters !== undefined) { - const filterFormSet = - selection.type === 'ALL_EXCEPT' - ? (JSON.parse(tableFilters) as FilterFormSet) - : INIT_FORMSET; - const filter = getExperimentIdsFilter(filterFormSet, selection); - moveSearchesArgs.filter = JSON.stringify(filter); - } else { - moveSearchesArgs.searchIds = experimentIds; + if (excludedExperimentIds?.size) { + filters = { ...filters, excludedExperimentIds: Array.from(excludedExperimentIds.keys()) }; } - const results = await moveSearches(moveSearchesArgs); + const results = await moveExperiments({ + destinationProjectId: projId, + experimentIds, + filters, + projectId: sourceProjectId, + }); onSubmit?.(results.successful); @@ -125,19 +106,19 @@ const ExperimentMoveModalComponent: React.FC = ({ if (numSuccesses === 0 && numFailures === 0) { openToast({ - description: `No selected ${plural} were eligible for moving`, - title: `No eligible ${plural}`, + description: `No selected ${entityName} were eligible for moving`, + title: `No eligible ${entityName}`, }); } else if (numFailures === 0) { openToast({ closeable: true, - description: `${results.successful.length} ${pluralizer.apply(null, [results.successful.length, ...pluralizerArgs])} moved to project ${destinationProjectName}`, + description: `${results.successful.length} ${entityName} moved to project ${destinationProjectName}`, link: View Project, title: 'Move Success', }); } else if (numSuccesses === 0) { openToast({ - description: `Unable to move ${numFailures} ${pluralizer.apply(null, [numFailures, ...pluralizerArgs])}`, + description: `Unable to move ${numFailures} ${entityName}`, severity: 'Warning', title: 'Move Failure', }); @@ -146,7 +127,7 @@ const ExperimentMoveModalComponent: React.FC = ({ closeable: true, description: `${numFailures} out of ${ numFailures + numSuccesses - } eligible ${plural} failed to move + } eligible ${entityName} failed to move to project ${destinationProjectName}`, link: View Project, severity: 'Warning', @@ -161,6 +142,15 @@ const ExperimentMoveModalComponent: React.FC = ({ form.setFieldValue('workspaceId', sourceWorkspaceId ?? 1); }, [form, sourceProjectId, sourceWorkspaceId]); + // use plurals for indeterminate case + const entityCount = filters !== undefined ? 2 : experimentIds.length; + const pluralizerArgs = f_flat_runs + ? (['search', 'searches'] as const) + : (['experiment'] as const); + // we use apply instead of a direct call here because typescript errors when you spread a tuple into arguments + const plural = pluralizer.apply(null, [entityCount, ...pluralizerArgs]); + const actionCopy = `Move ${capitalize(plural)}`; + return ( { +const ExperimentTensorBoardModal = ({ + workspaceId, + selectedExperiments, + filters, +}: Props): JSX.Element => { const handleSubmit = async () => { - const managedSearchIds = selectedSearches.filter((exp) => !exp.unmanaged).map((exp) => exp.id); + const managedExperimentIds = selectedExperiments + .filter((exp) => !exp.unmanaged) + .map((exp) => exp.id); openCommandResponse( - await openOrCreateTensorBoardSearches({ - searchIds: managedSearchIds, - workspaceId, - }), + await openOrCreateTensorBoard({ experimentIds: managedExperimentIds, filters, workspaceId }), ); }; @@ -37,4 +42,4 @@ const SearchTensorBoardModal = ({ workspaceId, selectedSearches }: Props): JSX.E ); }; -export default SearchTensorBoardModal; +export default ExperimentTensorBoardModal; diff --git a/webui/react/src/components/LoadableCount.test.tsx b/webui/react/src/components/LoadableCount.test.tsx index 91adf9122a6..13c28789045 100644 --- a/webui/react/src/components/LoadableCount.test.tsx +++ b/webui/react/src/components/LoadableCount.test.tsx @@ -1,6 +1,5 @@ import { render, screen } from '@testing-library/react'; import { Loaded, NotLoaded } from 'hew/utils/loadable'; -import { noop } from 'lodash'; import LoadableCount from './LoadableCount'; @@ -25,11 +24,9 @@ const setup = (totalCount: number, selectedCount?: number, loaded?: boolean) => const total = loaded ? Loaded(totalCount) : NotLoaded; render( , ); diff --git a/webui/react/src/components/LoadableCount.tsx b/webui/react/src/components/LoadableCount.tsx index c1041628266..0cc016a9a95 100644 --- a/webui/react/src/components/LoadableCount.tsx +++ b/webui/react/src/components/LoadableCount.tsx @@ -1,5 +1,3 @@ -import Button from 'hew/Button'; -import { HandleSelectionChangeType } from 'hew/DataGrid/DataGrid'; import { Loadable } from 'hew/utils/loadable'; import { useMemo } from 'react'; @@ -8,14 +6,11 @@ import { pluralizer } from 'utils/string'; import css from './LoadableCount.module.scss'; -export type SelectionAction = 'SELECT_ALL' | 'CLEAR_SELECTION' | 'NONE'; interface Props { total: Loadable; labelSingular: string; labelPlural: string; selectedCount: number; - selectionAction: SelectionAction; - handleSelectionChange: HandleSelectionChangeType; } const LoadableCount: React.FC = ({ @@ -23,8 +18,6 @@ const LoadableCount: React.FC = ({ labelPlural, labelSingular, selectedCount, - selectionAction, - handleSelectionChange, }: Props) => { const isMobile = useMobile(); @@ -48,43 +41,11 @@ const LoadableCount: React.FC = ({ }); }, [labelPlural, labelSingular, total, selectedCount]); - const actualSelectAll = useMemo(() => { - return Loadable.match(total, { - _: () => null, - Loaded: () => { - switch (selectionAction) { - case 'SELECT_ALL': { - const onClick = () => handleSelectionChange('add-all'); - return ( - - ); - } - case 'CLEAR_SELECTION': { - const onClick = () => handleSelectionChange('remove-all'); - return ( - - ); - } - case 'NONE': { - return null; - } - } - }, - }); - }, [labelPlural, handleSelectionChange, selectionAction, total]); - if (!isMobile) { return ( - <> - - {selectionLabel} - - {actualSelectAll} - + + {selectionLabel} + ); } else { return null; diff --git a/webui/react/src/components/RunActionDropdown.tsx b/webui/react/src/components/RunActionDropdown.tsx index e782b73c0a9..a553e9d0181 100644 --- a/webui/react/src/components/RunActionDropdown.tsx +++ b/webui/react/src/components/RunActionDropdown.tsx @@ -207,8 +207,7 @@ const RunActionDropdown: React.FC = ({ const shared = ( onComplete?.(FlatRunAction.Move, run.id)} diff --git a/webui/react/src/components/RunFilterInterstitialModalComponent.test.tsx b/webui/react/src/components/RunFilterInterstitialModalComponent.test.tsx index 9cefe4dae02..7a05a4fdae1 100644 --- a/webui/react/src/components/RunFilterInterstitialModalComponent.test.tsx +++ b/webui/react/src/components/RunFilterInterstitialModalComponent.test.tsx @@ -111,7 +111,7 @@ describe('RunFilterInterstitialModalComponent', () => { // TODO: is there a better way to test these expectations? expect(filterFormSet.showArchived).toBeTruthy(); - const [, idFilter] = filterFormSet.filterGroup.children; + const [, , idFilter] = filterFormSet.filterGroup.children; for (const child of expectedFilterGroup.children) { expect(filterFormSet.filterGroup.children).toContainEqual(child); } @@ -148,7 +148,7 @@ describe('RunFilterInterstitialModalComponent', () => { const filterFormSet = JSON.parse(filterFormSetString || ''); expect(filterFormSet.showArchived).toBe(false); - const idFilters = filterFormSet.filterGroup.children[0].children || []; + const idFilters = filterFormSet.filterGroup.children || []; expect(idFilters.every((f: FormField) => f.operator === '=')).toBe(true); expect(idFilters.map((f: FormField) => f.value)).toEqual(expectedSelection); }); diff --git a/webui/react/src/components/RunFilterInterstitialModalComponent.tsx b/webui/react/src/components/RunFilterInterstitialModalComponent.tsx index 94850975e40..287b3f4a320 100644 --- a/webui/react/src/components/RunFilterInterstitialModalComponent.tsx +++ b/webui/react/src/components/RunFilterInterstitialModalComponent.tsx @@ -1,5 +1,5 @@ import { useModal } from 'hew/Modal'; -import { Failed, Loadable, NotLoaded } from 'hew/utils/loadable'; +import { Failed, NotLoaded } from 'hew/utils/loadable'; import { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react'; import { FilterFormSetWithoutId } from 'components/FilterForm/components/type'; @@ -74,13 +74,11 @@ export const RunFilterInterstitialModalComponent = forwardRef ({ close, open })); - const selectionHasSearchRuns: Loadable = useAsync( + const selectionHasSearchRuns = useAsync( async (canceler) => { if (!isOpen) return NotLoaded; const mergedCanceler = mergeAbortControllers(canceler, closeController.current); - - const filter: FilterFormSetWithoutId = getIdsFilter(filterFormSet, selection); - filter.filterGroup = combine(filter.filterGroup, 'and', { + const filterWithSingleFilter = combine(filterFormSet.filterGroup, 'and', { columnName: 'searcherType', kind: 'field', location: 'LOCATION_TYPE_RUN', @@ -88,6 +86,13 @@ export const RunFilterInterstitialModalComponent = forwardRef @@ -172,15 +183,6 @@ const Searches: React.FC = ({ project }) => { const isMobile = useMobile(); const { openToast } = useToast(); - const { selectionSize, dataGridSelection, handleSelectionChange, isRangeSelected } = useSelection( - { - records: experiments.map((loadable) => loadable.map((exp) => exp.experiment)), - selection: settings.selection, - total, - updateSettings, - }, - ); - const handlePinnedColumnsCountChange = useCallback( (newCount: number) => updateSettings({ pinnedColumnsCount: newCount }), [updateSettings], @@ -246,22 +248,34 @@ const Searches: React.FC = ({ project }) => { return []; }, [settings.selection]); - const loadedExperimentIdMap = useMemo(() => { - const experimentMap = new Map(); - + const loadedSelectedExperimentIds = useMemo(() => { + const selectedMap = new Map(); if (isLoadingSettings) { - return experimentMap; + return selectedMap; } - + const selectedIdSet = new Set(allSelectedExperimentIds); experiments.forEach((e, index) => { - Loadable.forEach(e, (experiment) => { - experimentMap.set(experiment.experiment.id, { experiment, index }); + Loadable.forEach(e, ({ experiment }) => { + if (selectedIdSet.has(experiment.id)) { + selectedMap.set(experiment.id, { experiment, index }); + } }); }); - return experimentMap; - }, [experiments, isLoadingSettings]); + return selectedMap; + }, [isLoadingSettings, allSelectedExperimentIds, experiments]); + + const selection = useMemo(() => { + let rows = CompactSelection.empty(); + loadedSelectedExperimentIds.forEach((info) => { + rows = rows.add(info.index); + }); + return { + columns: CompactSelection.empty(), + rows, + }; + }, [loadedSelectedExperimentIds]); - const colorMap = useGlasbey([...loadedExperimentIdMap.keys()]); + const colorMap = useGlasbey([...loadedSelectedExperimentIds.keys()]); const experimentFilters = useMemo(() => { const filters: V1BulkExperimentFilters = { @@ -385,6 +399,71 @@ const Searches: React.FC = ({ project }) => { }; }, [canceler, stopPolling]); + const rowRangeToIds = useCallback( + (range: [number, number]) => { + const slice = experiments.slice(range[0], range[1]); + return Loadable.filterNotLoaded(slice).map(({ experiment }) => experiment.id); + }, + [experiments], + ); + + const handleSelectionChange: HandleSelectionChangeType = useCallback( + (selectionType: SelectionType | RangelessSelectionType, range?: [number, number]) => { + let newSettings: SelectionState = { ...settings.selection }; + + switch (selectionType) { + case 'add': + if (!range) return; + if (newSettings.type === 'ALL_EXCEPT') { + const excludedSet = new Set(newSettings.exclusions); + rowRangeToIds(range).forEach((id) => excludedSet.delete(id)); + newSettings.exclusions = Array.from(excludedSet); + } else { + const includedSet = new Set(newSettings.selections); + rowRangeToIds(range).forEach((id) => includedSet.add(id)); + newSettings.selections = Array.from(includedSet); + } + + break; + case 'add-all': + newSettings = { + exclusions: [], + type: 'ALL_EXCEPT' as const, + }; + + break; + case 'remove': + if (!range) return; + if (newSettings.type === 'ALL_EXCEPT') { + const excludedSet = new Set(newSettings.exclusions); + rowRangeToIds(range).forEach((id) => excludedSet.add(id)); + newSettings.exclusions = Array.from(excludedSet); + } else { + const includedSet = new Set(newSettings.selections); + rowRangeToIds(range).forEach((id) => includedSet.delete(id)); + newSettings.selections = Array.from(includedSet); + } + + break; + case 'remove-all': + newSettings = DEFAULT_SELECTION; + + break; + case 'set': + if (!range) return; + newSettings = { + ...DEFAULT_SELECTION, + selections: Array.from(rowRangeToIds(range)), + }; + + break; + } + + updateSettings({ selection: newSettings }); + }, + [rowRangeToIds, settings.selection, updateSettings], + ); + const handleActionComplete = useCallback(async () => { /** * Deselect selected rows since their states may have changed where they @@ -560,7 +639,7 @@ const Searches: React.FC = ({ project }) => { const gridColumns = [...STATIC_COLUMNS, ...columnsIfLoaded] .map((columnName) => { if (columnName === MULTISELECT) { - return (columnDefs[columnName] = defaultSelectionColumn(dataGridSelection.rows, false)); + return (columnDefs[columnName] = defaultSelectionColumn(selection.rows, false)); } if (!Loadable.isLoaded(projectColumnsMap)) { @@ -633,26 +712,39 @@ const Searches: React.FC = ({ project }) => { columnsIfLoaded, appTheme, isDarkMode, - dataGridSelection.rows, + selection.rows, users, ]); - const handleHeaderClick = useCallback( - (columnId: string): void => { - if (columnId === MULTISELECT) { - if (isRangeSelected([0, settings.pageLimit])) { - handleSelectionChange?.('remove', [0, settings.pageLimit]); - } else { - handleSelectionChange?.('add', [0, settings.pageLimit]); - } - } - }, - [handleSelectionChange, isRangeSelected, settings.pageLimit], - ); - const getHeaderMenuItems = (columnId: string, colIdx: number): MenuItem[] => { if (columnId === MULTISELECT) { - return []; + const items: MenuItem[] = [ + settings.selection.type === 'ALL_EXCEPT' || settings.selection.selections.length > 0 + ? { + key: 'select-none', + label: 'Clear selected', + onClick: () => { + handleSelectionChange?.('remove-all'); + }, + } + : null, + ...[5, 10, 25].map((n) => ({ + key: `select-${n}`, + label: `Select first ${n}`, + onClick: () => { + handleSelectionChange?.('set', [0, n]); + dataGridRef.current?.scrollToTop(); + }, + })), + { + key: 'select-all', + label: 'Select all', + onClick: () => { + handleSelectionChange?.('add', [0, settings.pageLimit]); + }, + }, + ]; + return items; } const column = Loadable.getOrElse([], projectColumns).find((c) => c.column === columnId); if (!column) { @@ -779,21 +871,15 @@ const Searches: React.FC = ({ project }) => { columnGroups={[V1LocationType.EXPERIMENT]} entityCopy="Show searches…" formStore={formStore} - handleSelectionChange={handleSelectionChange} initialVisibleColumns={columnsIfLoaded} isOpenFilter={isOpenFilter} - isRangeSelected={isRangeSelected} labelPlural="searches" labelSingular="search" - pageSize={settings.pageLimit} project={project} projectColumns={projectColumns} rowHeight={globalSettings.rowHeight} selectedExperimentIds={allSelectedExperimentIds} - selection={settings.selection} - selectionSize={selectionSize} sorts={sorts} - tableFilterString={filtersString} total={total} onActionComplete={handleActionComplete} onActionSuccess={handleActionSuccess} @@ -852,13 +938,12 @@ const Searches: React.FC = ({ project }) => { ); }} rowHeight={rowHeightMap[globalSettings.rowHeight as RowHeight]} - selection={dataGridSelection} + selection={selection} sorts={sorts} staticColumns={STATIC_COLUMNS} onColumnResize={handleColumnWidthChange} onColumnsOrderChange={handleColumnsOrderChange} onContextMenuComplete={handleContextMenuComplete} - onHeaderClicked={handleHeaderClick} onPinnedColumnsCountChange={handlePinnedColumnsCountChange} onSelectionChange={handleSelectionChange} /> diff --git a/webui/react/src/components/TableActionBar.tsx b/webui/react/src/components/TableActionBar.tsx index b49c5fc6ae0..1196ff9ca5c 100644 --- a/webui/react/src/components/TableActionBar.tsx +++ b/webui/react/src/components/TableActionBar.tsx @@ -1,6 +1,6 @@ import Button from 'hew/Button'; import Column from 'hew/Column'; -import { HandleSelectionChangeType, Sort } from 'hew/DataGrid/DataGrid'; +import { Sort } from 'hew/DataGrid/DataGrid'; import Dropdown, { MenuItem } from 'hew/Dropdown'; import Icon, { IconName } from 'hew/Icon'; import { useModal } from 'hew/Modal'; @@ -15,28 +15,27 @@ import BatchActionConfirmModalComponent from 'components/BatchActionConfirmModal import ColumnPickerMenu from 'components/ColumnPickerMenu'; import ExperimentMoveModalComponent from 'components/ExperimentMoveModal'; import ExperimentRetainLogsModalComponent from 'components/ExperimentRetainLogsModal'; +import ExperimentTensorBoardModal from 'components/ExperimentTensorBoardModal'; import { FilterFormStore } from 'components/FilterForm/components/FilterFormStore'; import TableFilter from 'components/FilterForm/TableFilter'; import MultiSortMenu from 'components/MultiSortMenu'; import { OptionsMenu, RowHeight } from 'components/OptionsMenu'; import { defaultProjectSettings } from 'components/Searches/Searches.settings'; -import SearchTensorBoardModal from 'components/SearchTensorBoardModal'; import useMobile from 'hooks/useMobile'; import usePermissions from 'hooks/usePermissions'; import { defaultExperimentColumns } from 'pages/F_ExpList/expListColumns'; import { - archiveSearches, - cancelSearches, - deleteSearches, + activateExperiments, + archiveExperiments, + cancelExperiments, + deleteExperiments, getExperiments, - killSearches, - openOrCreateTensorBoardSearches, - pauseSearches, - resumeSearches, - unarchiveSearches, + killExperiments, + openOrCreateTensorBoard, + pauseExperiments, + unarchiveExperiments, } from 'services/api'; import { V1LocationType } from 'services/api-ts-sdk'; -import { SearchBulkActionParams } from 'services/types'; import { BulkActionResult, BulkExperimentItem, @@ -44,20 +43,17 @@ import { Project, ProjectColumn, ProjectExperiment, - SelectionType, } from 'types'; import handleError, { ErrorLevel } from 'utils/error'; import { canActionExperiment, getActionsForExperimentsUnion, - getIdsFilter, getProjectExperimentForExperimentItem, } from 'utils/experiment'; import { capitalizeWord } from 'utils/string'; import { openCommandResponse } from 'utils/wait'; -import { FilterFormSet } from './FilterForm/components/type'; -import LoadableCount, { SelectionAction } from './LoadableCount'; +import LoadableCount from './LoadableCount'; import css from './TableActionBar.module.scss'; const batchActions = [ @@ -91,12 +87,10 @@ const actionIcons: Record = { interface Props { compareViewOn?: boolean; formStore: FilterFormStore; - handleSelectionChange: HandleSelectionChangeType; heatmapBtnVisible?: boolean; heatmapOn?: boolean; initialVisibleColumns: string[]; isOpenFilter: boolean; - isRangeSelected: (range: [number, number]) => boolean; onActionComplete?: () => Promise; onActionSuccess?: (action: BatchAction, successfulIds: number[]) => void; onComparisonViewToggle?: () => void; @@ -106,13 +100,10 @@ interface Props { onSortChange?: (sorts: Sort[]) => void; onVisibleColumnChange?: (newColumns: string[], pinnedCount?: number) => void; onHeatmapSelectionRemove?: (id: string) => void; - pageSize: number; project: Project; projectColumns: Loadable; rowHeight: RowHeight; selectedExperimentIds: number[]; - selection: SelectionType; - selectionSize: number; sorts: Sort[]; pinnedColumnsCount?: number; total: Loadable; @@ -122,19 +113,15 @@ interface Props { bannedFilterColumns?: Set; bannedSortColumns?: Set; entityCopy?: string; - tableFilterString: string; } const TableActionBar: React.FC = ({ compareViewOn, formStore, - tableFilterString, - handleSelectionChange, heatmapBtnVisible, heatmapOn, initialVisibleColumns, isOpenFilter, - isRangeSelected, onActionComplete, onActionSuccess, onComparisonViewToggle, @@ -144,7 +131,6 @@ const TableActionBar: React.FC = ({ onSortChange, onHeatmapSelectionRemove, onVisibleColumnChange, - pageSize, project, projectColumns, rowHeight, @@ -158,16 +144,14 @@ const TableActionBar: React.FC = ({ bannedFilterColumns, bannedSortColumns, entityCopy, - selectionSize, - selection, }) => { const permissions = usePermissions(); const [batchAction, setBatchAction] = useState(); const BatchActionConfirmModal = useModal(BatchActionConfirmModalComponent); const ExperimentMoveModal = useModal(ExperimentMoveModalComponent); const ExperimentRetainLogsModal = useModal(ExperimentRetainLogsModalComponent); - const { Component: SearchTensorBoardModalComponent, open: openSearchTensorBoardModal } = - useModal(SearchTensorBoardModal); + const { Component: ExperimentTensorBoardModalComponent, open: openExperimentTensorBoardModal } = + useModal(ExperimentTensorBoardModal); const isMobile = useMobile(); const { openToast } = useToast(); @@ -217,50 +201,32 @@ const TableActionBar: React.FC = ({ ); const availableBatchActions = useMemo(() => { - switch (selection.type) { - case 'ONLY_IN': { - const experiments = selection.selections.map((id) => experimentMap[id]) ?? []; - return getActionsForExperimentsUnion(experiments, [...batchActions], permissions); // Spreading batchActions is so TypeScript doesn't complain that it's readonly. - } - case 'ALL_EXCEPT': - return batchActions; - } - }, [selection, permissions, experimentMap]); + const experiments = selectedExperimentIds.map((id) => experimentMap[id]) ?? []; + return getActionsForExperimentsUnion(experiments, [...batchActions], permissions); + // Spreading batchActions is so TypeScript doesn't complain that it's readonly. + }, [selectedExperimentIds, experimentMap, permissions]); const sendBatchActions = useCallback( async (action: BatchAction): Promise => { - const params: SearchBulkActionParams = { projectId: project.id }; - switch (selection.type) { - case 'ONLY_IN': { - const validSearchIds = selectedExperiments - .filter((exp) => !exp.unmanaged && canActionExperiment(action, exp)) - .map((exp) => exp.id); - params.searchIds = validSearchIds; - break; - } - case 'ALL_EXCEPT': { - const filterFormSet = JSON.parse(tableFilterString) as FilterFormSet; - params.filter = JSON.stringify(getIdsFilter(filterFormSet, selection)); - break; - } - } - + const validExperimentIds = selectedExperiments + .filter((exp) => !exp.unmanaged && canActionExperiment(action, exp)) + .map((exp) => exp.id); + const params = { + experimentIds: validExperimentIds, + projectId: project.id, + }; switch (action) { case ExperimentAction.OpenTensorBoard: { - if ( - params.searchIds === undefined || - params.searchIds.length === selectedExperiments.length - ) { + if (validExperimentIds.length !== selectedExperiments.length) { + // if unmanaged experiments are selected, open experimentTensorBoardModal + openExperimentTensorBoardModal(); + } else { openCommandResponse( - await openOrCreateTensorBoardSearches({ - filter: params.filter, - searchIds: params.searchIds, + await openOrCreateTensorBoard({ + experimentIds: params.experimentIds, workspaceId: project?.workspaceId, }), ); - } else { - // if unmanaged experiments are selected, open searchTensorBoardModal - openSearchTensorBoardModal(); } return; } @@ -269,30 +235,27 @@ const TableActionBar: React.FC = ({ case ExperimentAction.RetainLogs: return ExperimentRetainLogsModal.open(); case ExperimentAction.Activate: - return await resumeSearches(params); + return await activateExperiments(params); case ExperimentAction.Archive: - return await archiveSearches(params); + return await archiveExperiments(params); case ExperimentAction.Cancel: - return await cancelSearches(params); + return await cancelExperiments(params); case ExperimentAction.Kill: - return await killSearches(params); + return await killExperiments(params); case ExperimentAction.Pause: - return await pauseSearches(params); + return await pauseExperiments(params); case ExperimentAction.Unarchive: - return await unarchiveSearches(params); + return await unarchiveExperiments(params); case ExperimentAction.Delete: - return await deleteSearches(params); + return await deleteExperiments(params); } }, [ - project.id, - project?.workspaceId, - selection, selectedExperiments, - tableFilterString, ExperimentMoveModal, ExperimentRetainLogsModal, - openSearchTensorBoardModal, + openExperimentTensorBoardModal, + project, ], ); @@ -349,7 +312,8 @@ const TableActionBar: React.FC = ({ closeable: true, description: `${action} succeeded for ${numSuccesses} out of ${ numFailures + numSuccesses - } ${labelPlural.toLowerCase()}`, + } eligible + ${labelPlural.toLowerCase()}`, severity: 'Warning', title: `Partial ${action} Failure`, }); @@ -412,19 +376,7 @@ const TableActionBar: React.FC = ({ }, [] as MenuItem[]); }, [availableBatchActions]); - const selectionAction: SelectionAction = useMemo(() => { - return total.match({ - _: () => 'NONE' as const, - Loaded: (loadedTotal) => { - if (isRangeSelected([0, pageSize]) && selectionSize < loadedTotal) { - return 'SELECT_ALL'; - } else if (selectionSize > pageSize) { - return 'CLEAR_SELECTION'; - } - return 'NONE'; - }, - }); - }, [isRangeSelected, selectionSize, pageSize, total]); + const handleAction = useCallback((key: string) => handleBatchAction(key), [handleBatchAction]); return (
@@ -461,19 +413,17 @@ const TableActionBar: React.FC = ({ onVisibleColumnChange={onVisibleColumnChange} /> - {selectionSize > 0 && ( - + {selectedExperimentIds.length > 0 && ( + )} @@ -510,11 +460,13 @@ const TableActionBar: React.FC = ({ /> )} + canActionExperiment(ExperimentAction.Move, experimentMap[id]) && + permissions.canMoveExperiment({ experiment: experimentMap[id] }), + )} sourceProjectId={project.id} sourceWorkspaceId={project.workspaceId} - tableFilters={tableFilterString} onSubmit={handleSubmitMove} /> = ({ projectId={project.id} onSubmit={handleSubmitRetainLogs} /> -
diff --git a/webui/react/src/e2e/models/common/hew/DataGrid.ts b/webui/react/src/e2e/models/common/hew/DataGrid.ts index 8b2484f352f..98722cc9be7 100644 --- a/webui/react/src/e2e/models/common/hew/DataGrid.ts +++ b/webui/react/src/e2e/models/common/hew/DataGrid.ts @@ -5,6 +5,7 @@ import { } from 'playwright-page-model-base/BaseComponent'; import { expect } from 'e2e/fixtures/global-fixtures'; +import { DropdownMenu } from 'e2e/models/common/hew/Dropdown'; import { printMap } from 'e2e/utils/debug'; class IndexNotFoundError extends Error {} @@ -395,6 +396,14 @@ export class HeadRow>> extends NamedCompone parent: this, selector: 'th', }); + readonly selectDropdown = new HeaderDropdown({ + clickThisComponentToOpen: new BaseComponent({ + parent: this, + selector: `[${DataGrid.columnIndexAttribute}="1"]`, + }), + openMethod: this.clickSelectDropdown.bind(this), + root: this.root, + }); #columnDefs = new Map(); @@ -464,8 +473,18 @@ export class HeadRow>> extends NamedCompone /** * Clicks the head row's select button */ - async clickSelectHeader(): Promise { + async clickSelectDropdown(): Promise { // magic numbers for the select button await this.parentTable.pwLocator.click({ position: { x: 5, y: 5 } }); } } + +/** + * Represents the HeaderDropdown from the DataGrid component + */ +class HeaderDropdown extends DropdownMenu { + readonly select5 = this.menuItem('select-5'); + readonly select10 = this.menuItem('select-10'); + readonly select25 = this.menuItem('select-25'); + readonly selectAll = this.menuItem('select-all'); +} diff --git a/webui/react/src/e2e/models/components/TableActionBar.ts b/webui/react/src/e2e/models/components/TableActionBar.ts index 433f339ea1f..432d6a3df22 100644 --- a/webui/react/src/e2e/models/components/TableActionBar.ts +++ b/webui/react/src/e2e/models/components/TableActionBar.ts @@ -25,8 +25,6 @@ export class TableActionBar extends NamedComponent { count = new BaseComponent({ parent: this, selector: '[data-test="count"]' }); heatmapToggle = new BaseComponent({ parent: this, selector: '[data-test="heatmapToggle"]' }); compare = new BaseComponent({ parent: this, selector: '[data-test="compare"]' }); - clearSelection = new BaseComponent({ parent: this, selector: '[data-test="clear-selection"]' }); - selectAll = new BaseComponent({ parent: this, selector: '[data-test="select-all"]' }); // TODO a bunch of modals } diff --git a/webui/react/src/e2e/models/pages/ProjectDetails.ts b/webui/react/src/e2e/models/pages/ProjectDetails.ts index 8aa2d812552..9c2aa63530d 100644 --- a/webui/react/src/e2e/models/pages/ProjectDetails.ts +++ b/webui/react/src/e2e/models/pages/ProjectDetails.ts @@ -5,7 +5,7 @@ import { F_ExperimentList } from 'e2e/models/components/F_ExperimentList'; import { PageComponent } from 'e2e/models/components/Page'; /** - * Represents the ProjectDetails page from src/pages/ProjectDetails.tsx + * Represents the SignIn page from src/pages/ProjectDetails.tsx */ export class ProjectDetails extends DeterminedPage { readonly title = /Uncategorized Experiments|Project Details/; @@ -35,8 +35,6 @@ export class ProjectDetails extends DeterminedPage { return Number(matches[1]); } - // async getRowsSelected(): Promise<{ selected: number; total?: number }> {} - readonly pageComponent = new PageComponent({ parent: this }); readonly dynamicTabs = new DynamicTabs({ parent: this.pageComponent }); readonly runsTab = this.dynamicTabs.pivot.tab('runs'); diff --git a/webui/react/src/e2e/tests/experimentList.spec.ts b/webui/react/src/e2e/tests/experimentList.spec.ts index 1d122c84663..f5b3f9f98ff 100644 --- a/webui/react/src/e2e/tests/experimentList.spec.ts +++ b/webui/react/src/e2e/tests/experimentList.spec.ts @@ -19,7 +19,7 @@ test.describe('Experiment List', () => { const getCount = async () => { const count = await projectDetailsPage.f_experimentList.tableActionBar.count.pwLocator.textContent(); - if (count === null) return 0; + if (count === null) throw new Error('Count is null'); return parseInt(count); }; @@ -62,19 +62,11 @@ test.describe('Experiment List', () => { timeout: 10_000, }); await test.step('Deselect', async () => { - const count = await getCount(); - if (count !== 0) { - await grid.headRow.clickSelectHeader(); - const selectAllButton = projectDetailsPage.f_experimentList.tableActionBar.selectAll; - const clearAllButton = projectDetailsPage.f_experimentList.tableActionBar.clearSelection; - if (await selectAllButton.pwLocator.isVisible()) { - await selectAllButton.pwLocator.click(); - await clearAllButton.pwLocator.click(); - } else if (await clearAllButton.pwLocator.isVisible()) { - await clearAllButton.pwLocator.click(); - } else { - await grid.headRow.clickSelectHeader(); - } + try { + await grid.headRow.selectDropdown.menuItem('select-none').select({ timeout: 1_000 }); + } catch (e) { + // close the dropdown by clicking elsewhere + await projectDetailsPage.f_experimentList.tableActionBar.count.pwLocator.click(); } }); await test.step('Reset Columns', async () => { @@ -310,6 +302,11 @@ test.describe('Experiment List', () => { await test.step('Read Cell Value', async () => { await expect.soft((await row.getCellByColumnName('ID')).pwLocator).toHaveText(/\d+/); }); + await test.step('Select 5', async () => { + await ( + await projectDetailsPage.f_experimentList.dataGrid.headRow.selectDropdown.open() + ).select5.pwLocator.click(); + }); await test.step('Experiment Overview Navigation', async () => { await projectDetailsPage.f_experimentList.dataGrid.scrollLeft(); const textContent = await (await row.getCellByColumnName('ID')).pwLocator.textContent(); diff --git a/webui/react/src/hooks/useSelection.ts b/webui/react/src/hooks/useSelection.ts deleted file mode 100644 index 5fb6f7e4c5a..00000000000 --- a/webui/react/src/hooks/useSelection.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { CompactSelection, GridSelection } from '@glideapps/glide-data-grid'; -import { - HandleSelectionChangeType, - RangelessSelectionType, - SelectionType, -} from 'hew/DataGrid/DataGrid'; -import { Loadable } from 'hew/utils/loadable'; -import * as t from 'io-ts'; -import { useCallback, useMemo } from 'react'; - -import { RegularSelectionType, SelectionType as SelectionState } from 'types'; - -export const DEFAULT_SELECTION: t.TypeOf = { - selections: [], - type: 'ONLY_IN', -}; - -interface HasId { - id: number; -} - -interface SelectionConfig { - records: Loadable[]; - selection: SelectionState; - total: Loadable; - updateSettings: (p: Record) => void; -} - -interface UseSelectionReturn { - selectionSize: number; - dataGridSelection: GridSelection; - handleSelectionChange: HandleSelectionChangeType; - rowRangeToIds: (range: [number, number]) => number[]; - loadedSelectedRecords: T[]; - loadedSelectedRecordIds: number[]; - isRangeSelected: (range: [number, number]) => boolean; -} - -const useSelection = (config: SelectionConfig): UseSelectionReturn => { - const loadedRecordIdMap = useMemo(() => { - const recordMap = new Map(); - - config.records.forEach((r, index) => { - Loadable.forEach(r, (record) => { - recordMap.set(record.id, { index, record }); - }); - }); - return recordMap; - }, [config.records]); - - const selectedRecordIdSet = useMemo(() => { - switch (config.selection.type) { - case 'ONLY_IN': - return new Set(config.selection.selections); - case 'ALL_EXCEPT': { - const excludedSet = new Set(config.selection.exclusions); - return new Set( - Loadable.filterNotLoaded(config.records, (record) => !excludedSet.has(record.id)).map( - (record) => record.id, - ), - ); - } - } - }, [config.records, config.selection]); - - const dataGridSelection = useMemo(() => { - let rows = CompactSelection.empty(); - switch (config.selection.type) { - case 'ONLY_IN': - config.selection.selections.forEach((id) => { - const incIndex = loadedRecordIdMap.get(id)?.index; - if (incIndex !== undefined) { - rows = rows.add(incIndex); - } - }); - break; - case 'ALL_EXCEPT': - rows = rows.add([0, config.total.getOrElse(1) - 1]); - config.selection.exclusions.forEach((exc) => { - const excIndex = loadedRecordIdMap.get(exc)?.index; - if (excIndex !== undefined) { - rows = rows.remove(excIndex); - } - }); - break; - } - return { - columns: CompactSelection.empty(), - rows, - }; - }, [loadedRecordIdMap, config.selection, config.total]); - - const loadedSelectedRecords: T[] = useMemo(() => { - return Loadable.filterNotLoaded(config.records, (record) => selectedRecordIdSet.has(record.id)); - }, [config.records, selectedRecordIdSet]); - - const loadedSelectedRecordIds: number[] = useMemo(() => { - return loadedSelectedRecords.map((record) => record.id); - }, [loadedSelectedRecords]); - - const selectionSize = useMemo(() => { - switch (config.selection.type) { - case 'ONLY_IN': - return config.selection.selections.length; - case 'ALL_EXCEPT': - return config.total.getOrElse(0) - config.selection.exclusions.length; - } - }, [config.selection, config.total]); - - const rowRangeToIds = useCallback( - (range: [number, number]) => { - const slice = config.records.slice(range[0], range[1]); - return Loadable.filterNotLoaded(slice).map((run) => run.id); - }, - [config.records], - ); - - const handleSelectionChange: HandleSelectionChangeType = useCallback( - (selectionType: SelectionType | RangelessSelectionType, range?: [number, number]) => { - let newSettings: SelectionState = { ...config.selection }; - - switch (selectionType) { - case 'add': - if (!range) return; - if (newSettings.type === 'ALL_EXCEPT') { - const excludedSet = new Set(newSettings.exclusions); - rowRangeToIds(range).forEach((id) => excludedSet.delete(id)); - newSettings.exclusions = Array.from(excludedSet); - } else { - const includedSet = new Set(newSettings.selections); - rowRangeToIds(range).forEach((id) => includedSet.add(id)); - newSettings.selections = Array.from(includedSet); - } - - break; - case 'add-all': - newSettings = { - exclusions: [], - type: 'ALL_EXCEPT', - }; - - break; - case 'remove': - if (!range) return; - if (newSettings.type === 'ALL_EXCEPT') { - const excludedSet = new Set(newSettings.exclusions); - rowRangeToIds(range).forEach((id) => excludedSet.add(id)); - newSettings.exclusions = Array.from(excludedSet); - } else { - const includedSet = new Set(newSettings.selections); - rowRangeToIds(range).forEach((id) => includedSet.delete(id)); - newSettings.selections = Array.from(includedSet); - } - - break; - case 'remove-all': - newSettings = DEFAULT_SELECTION; - - break; - case 'set': - if (!range) return; - newSettings = { - ...DEFAULT_SELECTION, - selections: Array.from(rowRangeToIds(range)), - }; - - break; - } - config.updateSettings({ selection: newSettings }); - }, - [config, rowRangeToIds], - ); - - const isRangeSelected = useCallback( - (range: [number, number]): boolean => { - switch (config.selection.type) { - case 'ONLY_IN': { - const includedSet = new Set(config.selection.selections); - return rowRangeToIds(range).every((id) => includedSet.has(id)); - } - case 'ALL_EXCEPT': { - const excludedSet = new Set(config.selection.exclusions); - return rowRangeToIds(range).every((id) => !excludedSet.has(id)); - } - } - }, - [rowRangeToIds, config.selection], - ); - - return { - dataGridSelection, - handleSelectionChange, - isRangeSelected, - loadedSelectedRecordIds, - loadedSelectedRecords, - rowRangeToIds, - selectionSize, - }; -}; - -export default useSelection; diff --git a/webui/react/src/pages/ExperimentDetails/ExperimentDetailsHeader.tsx b/webui/react/src/pages/ExperimentDetails/ExperimentDetailsHeader.tsx index 6ca0fd8550d..a3cc28ad39d 100644 --- a/webui/react/src/pages/ExperimentDetails/ExperimentDetailsHeader.tsx +++ b/webui/react/src/pages/ExperimentDetails/ExperimentDetailsHeader.tsx @@ -785,7 +785,6 @@ const ExperimentDetailsHeader: React.FC = ({ = ({ project }) => { /> = ({ project }) => { const isMobile = useMobile(); const { openToast } = useToast(); - const { - ui: { theme: appTheme }, - isDarkMode, - } = useUI(); - - const { - selectionSize, - dataGridSelection, - handleSelectionChange, - isRangeSelected, - loadedSelectedRecordIds: loadedSelectedExperimentIds, - } = useSelection({ - records: experiments.map((loadable) => loadable.map((exp) => exp.experiment)), - selection: settings.selection, - total, - updateSettings, - }); - const handlePinnedColumnsCountChange = useCallback( (newCount: number) => updateSettings({ pinnedColumnsCount: newCount }), [updateSettings], @@ -255,7 +248,38 @@ const F_ExperimentList: React.FC = ({ project }) => { const [error] = useState(false); const [canceler] = useState(new AbortController()); - const colorMap = useGlasbey(loadedSelectedExperimentIds); + const allSelectedExperimentIds = useMemo(() => { + return settings.selection.type === 'ONLY_IN' ? settings.selection.selections : []; + }, [settings.selection]); + + const loadedSelectedExperimentIds = useMemo(() => { + const selectedMap = new Map(); + if (isLoadingSettings) { + return selectedMap; + } + const selectedIdSet = new Set(allSelectedExperimentIds); + experiments.forEach((e, index) => { + Loadable.forEach(e, ({ experiment }) => { + if (selectedIdSet.has(experiment.id)) { + selectedMap.set(experiment.id, { experiment, index }); + } + }); + }); + return selectedMap; + }, [isLoadingSettings, allSelectedExperimentIds, experiments]); + + const selection = useMemo(() => { + let rows = CompactSelection.empty(); + loadedSelectedExperimentIds.forEach((info) => { + rows = rows.add(info.index); + }); + return { + columns: CompactSelection.empty(), + rows, + }; + }, [loadedSelectedExperimentIds]); + + const colorMap = useGlasbey([...loadedSelectedExperimentIds.keys()]); const { width: containerWidth } = useResize(contentRef); const experimentFilters = useMemo(() => { @@ -413,6 +437,71 @@ const F_ExperimentList: React.FC = ({ project }) => { }; }, [canceler, stopPolling]); + const rowRangeToIds = useCallback( + (range: [number, number]) => { + const slice = experiments.slice(range[0], range[1]); + return Loadable.filterNotLoaded(slice).map(({ experiment }) => experiment.id); + }, + [experiments], + ); + + const handleSelectionChange: HandleSelectionChangeType = useCallback( + (selectionType: SelectionType | RangelessSelectionType, range?: [number, number]) => { + let newSettings: SelectionState = { ...settings.selection }; + + switch (selectionType) { + case 'add': + if (!range) return; + if (newSettings.type === 'ALL_EXCEPT') { + const excludedSet = new Set(newSettings.exclusions); + rowRangeToIds(range).forEach((id) => excludedSet.delete(id)); + newSettings.exclusions = Array.from(excludedSet); + } else { + const includedSet = new Set(newSettings.selections); + rowRangeToIds(range).forEach((id) => includedSet.add(id)); + newSettings.selections = Array.from(includedSet); + } + + break; + case 'add-all': + newSettings = { + exclusions: [], + type: 'ALL_EXCEPT' as const, + }; + + break; + case 'remove': + if (!range) return; + if (newSettings.type === 'ALL_EXCEPT') { + const excludedSet = new Set(newSettings.exclusions); + rowRangeToIds(range).forEach((id) => excludedSet.add(id)); + newSettings.exclusions = Array.from(excludedSet); + } else { + const includedSet = new Set(newSettings.selections); + rowRangeToIds(range).forEach((id) => includedSet.delete(id)); + newSettings.selections = Array.from(includedSet); + } + + break; + case 'remove-all': + newSettings = DEFAULT_SELECTION; + + break; + case 'set': + if (!range) return; + newSettings = { + ...DEFAULT_SELECTION, + selections: Array.from(rowRangeToIds(range)), + }; + + break; + } + + updateSettings({ selection: newSettings }); + }, + [rowRangeToIds, settings.selection, updateSettings], + ); + const handleActionComplete = useCallback(async () => { /** * Deselect selected rows since their states may have changed where they @@ -645,6 +734,11 @@ const F_ExperimentList: React.FC = ({ project }) => { ); }, [isMobile, settings.compare, settings.pinnedColumnsCount]); + const { + ui: { theme: appTheme }, + isDarkMode, + } = useUI(); + const users = useObservable(usersStore.getUsers()); const columns: ColumnDef[] = useMemo(() => { @@ -667,7 +761,7 @@ const F_ExperimentList: React.FC = ({ project }) => { ) .map((columnName) => { if (columnName === MULTISELECT) { - return (columnDefs[columnName] = defaultSelectionColumn(dataGridSelection.rows, false)); + return (columnDefs[columnName] = defaultSelectionColumn(selection.rows, false)); } if (!Loadable.isLoaded(projectColumnsMap)) { @@ -798,36 +892,49 @@ const F_ExperimentList: React.FC = ({ project }) => { .flatMap((col) => (col ? [col] : [])); return gridColumns; }, [ - projectColumns, - appTheme, - settings.columnWidths, settings.compare, settings.pinnedColumnsCount, - settings.heatmapOn, + projectColumns, + settings.columnWidths, settings.heatmapSkipped, + projectHeatmap, + settings.heatmapOn, + columnsIfLoaded, + appTheme, isDarkMode, + selection.rows, users, - columnsIfLoaded, - dataGridSelection.rows, - projectHeatmap, ]); - const handleHeaderClick = useCallback( - (columnId: string): void => { - if (columnId === MULTISELECT) { - if (isRangeSelected([0, settings.pageLimit])) { - handleSelectionChange?.('remove', [0, settings.pageLimit]); - } else { - handleSelectionChange?.('add', [0, settings.pageLimit]); - } - } - }, - [handleSelectionChange, isRangeSelected, settings.pageLimit], - ); - const getHeaderMenuItems = (columnId: string, colIdx: number): MenuItem[] => { if (columnId === MULTISELECT) { - return []; + const items: MenuItem[] = [ + settings.selection.type === 'ALL_EXCEPT' || settings.selection.selections.length > 0 + ? { + key: 'select-none', + label: 'Clear selected', + onClick: () => { + handleSelectionChange?.('remove-all'); + }, + } + : null, + ...[5, 10, 25].map((n) => ({ + key: `select-${n}`, + label: `Select first ${n}`, + onClick: () => { + handleSelectionChange?.('set', [0, n]); + dataGridRef.current?.scrollToTop(); + }, + })), + { + key: 'select-all', + label: 'Select all', + onClick: () => { + handleSelectionChange?.('add', [0, settings.pageLimit]); + }, + }, + ]; + return items; } const column = Loadable.getOrElse([], projectColumns).find((c) => c.column === columnId); if (!column) { @@ -979,24 +1086,18 @@ const F_ExperimentList: React.FC = ({ project }) => { compareViewOn={settings.compare} entityCopy="Show experiments…" formStore={formStore} - handleSelectionChange={handleSelectionChange} heatmapBtnVisible={heatmapBtnVisible} heatmapOn={settings.heatmapOn} initialVisibleColumns={columnsIfLoaded} isOpenFilter={isOpenFilter} - isRangeSelected={isRangeSelected} labelPlural="experiments" labelSingular="experiment" - pageSize={settings.pageLimit} pinnedColumnsCount={settings.pinnedColumnsCount} project={project} projectColumns={projectColumns} rowHeight={globalSettings.rowHeight} - selectedExperimentIds={loadedSelectedExperimentIds} - selection={settings.selection} - selectionSize={selectionSize} + selectedExperimentIds={allSelectedExperimentIds} sorts={sorts} - tableFilterString={filtersString} total={total} onActionComplete={handleActionComplete} onActionSuccess={handleActionSuccess} @@ -1029,7 +1130,6 @@ const F_ExperimentList: React.FC = ({ project }) => { initialWidth={comparisonViewTableWidth} open={settings.compare} projectId={project.id} - tableFilters={filtersString} onWidthChange={handleCompareWidthChange}> columns={columns} @@ -1065,13 +1165,12 @@ const F_ExperimentList: React.FC = ({ project }) => { ); }} rowHeight={rowHeightMap[globalSettings.rowHeight]} - selection={dataGridSelection} + selection={selection} sorts={sorts} staticColumns={STATIC_COLUMNS} onColumnResize={handleColumnWidthChange} onColumnsOrderChange={handleColumnsOrderChange} onContextMenuComplete={handleContextMenuComplete} - onHeaderClicked={handleHeaderClick} onPinnedColumnsCountChange={handlePinnedColumnsCountChange} onSelectionChange={handleSelectionChange} /> diff --git a/webui/react/src/pages/FlatRuns/FlatRunActionButton.test.tsx b/webui/react/src/pages/FlatRuns/FlatRunActionButton.test.tsx index de659e91200..f6f9bd4dced 100644 --- a/webui/react/src/pages/FlatRuns/FlatRunActionButton.test.tsx +++ b/webui/react/src/pages/FlatRuns/FlatRunActionButton.test.tsx @@ -25,12 +25,9 @@ const setup = (selectedFlatRuns: ReadonlyArray>) => { render( run.id), type: 'ONLY_IN' }} - selectionSize={selectedFlatRuns.length} workspaceId={1} onActionComplete={onActionComplete} onActionSuccess={onActionSuccess} diff --git a/webui/react/src/pages/FlatRuns/FlatRunActionButton.tsx b/webui/react/src/pages/FlatRuns/FlatRunActionButton.tsx index 6b8b8820f6c..9dc726499a8 100644 --- a/webui/react/src/pages/FlatRuns/FlatRunActionButton.tsx +++ b/webui/react/src/pages/FlatRuns/FlatRunActionButton.tsx @@ -9,7 +9,6 @@ import { useObservable } from 'micro-observables'; import { useCallback, useMemo, useState } from 'react'; import BatchActionConfirmModalComponent from 'components/BatchActionConfirmModal'; -import { FilterFormSetWithoutId } from 'components/FilterForm/components/type'; import Link from 'components/Link'; import usePermissions from 'hooks/usePermissions'; import FlatRunMoveModalComponent from 'pages/FlatRuns/FlatRunMoveModal'; @@ -22,11 +21,10 @@ import { resumeRuns, unarchiveRuns, } from 'services/api'; -import { RunBulkActionParams } from 'services/types'; import projectStore from 'stores/projects'; -import { BulkActionResult, ExperimentAction, FlatRun, Project, SelectionType } from 'types'; +import { BulkActionResult, ExperimentAction, FlatRun, Project } from 'types'; import handleError from 'utils/error'; -import { canActionFlatRun, getActionsForFlatRunsUnion, getIdsFilter } from 'utils/flatRun'; +import { canActionFlatRun, getActionsForFlatRunsUnion } from 'utils/flatRun'; import { capitalizeWord, pluralizer } from 'utils/string'; const BATCH_ACTIONS = [ @@ -54,24 +52,18 @@ const ACTION_ICONS: Record = { const LABEL_PLURAL = 'runs'; interface Props { - filter: string; isMobile: boolean; selectedRuns: ReadonlyArray>; projectId: number; workspaceId: number; onActionSuccess?: (action: BatchAction, successfulIds: number[]) => void; onActionComplete?: () => void | Promise; - selection: SelectionType; - selectionSize: number; } const FlatRunActionButton = ({ - filter, isMobile, selectedRuns, projectId, - selection, - selectionSize, workspaceId, onActionSuccess, onActionComplete, @@ -88,21 +80,13 @@ const FlatRunActionButton = ({ const sendBatchActions = useCallback( async (action: BatchAction): Promise => { - const params: RunBulkActionParams = { projectId }; - switch (selection.type) { - case 'ONLY_IN': { - const validRunIds = selectedRuns - .filter((run) => canActionFlatRun(action, run)) - .map((run) => run.id); - params.runIds = validRunIds; - break; - } - case 'ALL_EXCEPT': { - const filterFormSet = JSON.parse(filter) as FilterFormSetWithoutId; - params.filter = JSON.stringify(getIdsFilter(filterFormSet, selection)); - break; - } - } + const validRunIds = selectedRuns + .filter((exp) => canActionFlatRun(action, exp)) + .map((run) => run.id); + const params = { + projectId, + runIds: validRunIds, + }; switch (action) { case ExperimentAction.Move: flatRunMoveModalOpen(); @@ -121,7 +105,7 @@ const FlatRunActionButton = ({ return await resumeRuns(params); } }, - [flatRunMoveModalOpen, projectId, selectedRuns, selection, filter], + [flatRunMoveModalOpen, projectId, selectedRuns], ); const submitBatchAction = useCallback( @@ -155,7 +139,8 @@ const FlatRunActionButton = ({ } else { openToast({ closeable: true, - description: `${action} succeeded for ${numSuccesses} out of ${numFailures + numSuccesses} ${pluralizer(numFailures + numSuccesses, 'run')}`, + description: `${action} succeeded for ${numSuccesses} out of ${numFailures + numSuccesses} eligible + ${pluralizer(numFailures + numSuccesses, 'run')}`, severity: 'Warning', title: `Partial ${action} Failure`, }); @@ -190,13 +175,8 @@ const FlatRunActionButton = ({ ); const availableBatchActions = useMemo(() => { - switch (selection.type) { - case 'ONLY_IN': - return getActionsForFlatRunsUnion(selectedRuns, [...BATCH_ACTIONS], permissions); - case 'ALL_EXCEPT': - return BATCH_ACTIONS; - } - }, [selection.type, selectedRuns, permissions]); + return getActionsForFlatRunsUnion(selectedRuns, [...BATCH_ACTIONS], permissions); + }, [selectedRuns, permissions]); const editMenuItems = useMemo(() => { const groupedBatchActions = [BATCH_ACTIONS]; @@ -217,7 +197,7 @@ const FlatRunActionButton = ({ }, []); }, [availableBatchActions]); - const onSubmitMove = useCallback( + const onSubmit = useCallback( async (results: BulkActionResult, destinationProjectId: number) => { const numSuccesses = results?.successful.length ?? 0; const numFailures = results?.failed.length ?? 0; @@ -261,7 +241,7 @@ const FlatRunActionButton = ({ return ( <> - {selectionSize > 0 && ( + {selectedRuns.length > 0 && ( diff --git a/webui/react/src/pages/FlatRuns/FlatRunMoveModal.tsx b/webui/react/src/pages/FlatRuns/FlatRunMoveModal.tsx index c60b305bed3..68f3544f87d 100644 --- a/webui/react/src/pages/FlatRuns/FlatRunMoveModal.tsx +++ b/webui/react/src/pages/FlatRuns/FlatRunMoveModal.tsx @@ -10,8 +10,6 @@ import { List } from 'immutable'; import { useObservable } from 'micro-observables'; import React, { Ref, useCallback, useEffect, useId, useRef } from 'react'; -import { INIT_FORMSET } from 'components/FilterForm/components/FilterFormStore'; -import { FilterFormSet } from 'components/FilterForm/components/type'; import RunFilterInterstitialModalComponent, { ControlledModalRef, } from 'components/RunFilterInterstitialModalComponent'; @@ -21,12 +19,10 @@ import RunMoveWarningModalComponent, { import usePermissions from 'hooks/usePermissions'; import { formStore } from 'pages/FlatRuns/FlatRuns'; import { moveRuns } from 'services/api'; -import { V1MoveRunsRequest } from 'services/api-ts-sdk'; import projectStore from 'stores/projects'; import workspaceStore from 'stores/workspaces'; -import { BulkActionResult, Project, SelectionType, XOR } from 'types'; +import { BulkActionResult, FlatRun, Project } from 'types'; import handleError from 'utils/error'; -import { getIdsFilter as getRunIdsFilter } from 'utils/flatRun'; import { pluralizer } from 'utils/string'; const FORM_ID = 'move-flat-run-form'; @@ -36,21 +32,15 @@ type FormInputs = { destinationWorkspaceId?: number; }; -interface BaseProps { - selectionSize: number; +interface Props { + flatRuns: Readonly[]; sourceProjectId: number; sourceWorkspaceId?: number; onSubmit?: (results: BulkActionResult, destinationProjectId: number) => void | Promise; } -type Props = BaseProps & - XOR<{ runIds: number[] }, { selection: SelectionType; tableFilters: string }>; - const FlatRunMoveModalComponent: React.FC = ({ - runIds, - tableFilters, - selection, - selectionSize, + flatRuns, sourceProjectId, sourceWorkspaceId, onSubmit, @@ -107,38 +97,24 @@ const FlatRunMoveModalComponent: React.FC = ({ return; } - const moveRunsArgs: V1MoveRunsRequest = { + const results = await moveRuns({ destinationProjectId: projId, + runIds: flatRuns.map((flatRun) => flatRun.id), sourceProjectId, - }; - - if (tableFilters !== undefined) { - const filterFormSet = - selection.type === 'ALL_EXCEPT' - ? (JSON.parse(tableFilters) as FilterFormSet) - : INIT_FORMSET; - const filter = getRunIdsFilter(filterFormSet, selection); - moveRunsArgs.filter = JSON.stringify(filter); - } else { - moveRunsArgs.runIds = runIds; - } - - const results = await moveRuns(moveRunsArgs); + }); await onSubmit?.(results, projId); form.resetFields(); } catch (e) { handleError(e, { publicSubject: 'Unable to move runs' }); } }, [ + flatRuns, form, - destinationWorkspaceId, - sourceWorkspaceId, - sourceProjectId, - openToast, - tableFilters, onSubmit, - selection, - runIds, + openToast, + sourceProjectId, + sourceWorkspaceId, + destinationWorkspaceId, ]); return ( @@ -151,9 +127,9 @@ const FlatRunMoveModalComponent: React.FC = ({ form: idPrefix + FORM_ID, handleError, handler: handleSubmit, - text: `Move ${pluralizer(selectionSize, 'Run')}`, + text: `Move ${pluralizer(flatRuns.length, 'Run')}`, }} - title={`Move ${pluralizer(selectionSize, 'Run')}`}> + title={`Move ${pluralizer(flatRuns.length, 'Run')}`}>
= ({ flatRun.id), type: 'ONLY_IN' }} /> ); diff --git a/webui/react/src/pages/FlatRuns/FlatRuns.tsx b/webui/react/src/pages/FlatRuns/FlatRuns.tsx index 389c01b08ea..361ee1c8cec 100644 --- a/webui/react/src/pages/FlatRuns/FlatRuns.tsx +++ b/webui/react/src/pages/FlatRuns/FlatRuns.tsx @@ -1,3 +1,4 @@ +import { CompactSelection, GridSelection } from '@glideapps/glide-data-grid'; import { isLeft } from 'fp-ts/lib/Either'; import Button from 'hew/Button'; import Column from 'hew/Column'; @@ -13,7 +14,15 @@ import { MULTISELECT, } from 'hew/DataGrid/columns'; import { ContextMenuCompleteHandlerProps } from 'hew/DataGrid/contextMenu'; -import DataGrid, { DataGridHandle, Sort, validSort, ValidSort } from 'hew/DataGrid/DataGrid'; +import DataGrid, { + DataGridHandle, + HandleSelectionChangeType, + RangelessSelectionType, + SelectionType, + Sort, + validSort, + ValidSort, +} from 'hew/DataGrid/DataGrid'; import { MenuItem } from 'hew/Dropdown'; import Icon from 'hew/Icon'; import Link from 'hew/Link'; @@ -29,15 +38,10 @@ import { v4 as uuidv4 } from 'uuid'; import ColumnPickerMenu from 'components/ColumnPickerMenu'; import ComparisonView from 'components/ComparisonView'; import { Error } from 'components/exceptions'; -import { - FilterFormStore, - INIT_FORMSET, - ROOT_ID, -} from 'components/FilterForm/components/FilterFormStore'; +import { FilterFormStore, ROOT_ID } from 'components/FilterForm/components/FilterFormStore'; import { AvailableOperators, FilterFormSet, - FilterFormSetWithoutId, FormField, FormGroup, FormKind, @@ -46,7 +50,7 @@ import { SpecialColumnNames, } from 'components/FilterForm/components/type'; import TableFilter from 'components/FilterForm/TableFilter'; -import LoadableCount, { SelectionAction } from 'components/LoadableCount'; +import LoadableCount from 'components/LoadableCount'; import MultiSortMenu, { EMPTY_SORT, sortMenuItemsForColumn } from 'components/MultiSortMenu'; import { OptionsMenu, RowHeight } from 'components/OptionsMenu'; import { @@ -63,7 +67,6 @@ import useMobile from 'hooks/useMobile'; import usePolling from 'hooks/usePolling'; import useResize from 'hooks/useResize'; import useScrollbarWidth from 'hooks/useScrollbarWidth'; -import useSelection from 'hooks/useSelection'; import { useSettings } from 'hooks/useSettings'; import useTypedParams from 'hooks/useTypedParams'; import FlatRunActionButton from 'pages/FlatRuns/FlatRunActionButton'; @@ -72,9 +75,15 @@ import { getProjectColumns, getProjectNumericMetricsRange, searchRuns } from 'se import { V1ColumnType, V1LocationType, V1TableType } from 'services/api-ts-sdk'; import userStore from 'stores/users'; import userSettings from 'stores/userSettings'; -import { DetailedUser, FlatRun, FlatRunAction, ProjectColumn, RunState } from 'types'; +import { + DetailedUser, + FlatRun, + FlatRunAction, + ProjectColumn, + RunState, + SelectionType as SelectionState, +} from 'types'; import handleError from 'utils/error'; -import { combine } from 'utils/filterFormSet'; import { eagerSubscribe } from 'utils/observable'; import { pluralizer } from 'utils/string'; @@ -183,7 +192,7 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { _: () => [], Loaded: (formset: FilterFormSet) => formset.filterGroup.children, }); - const filtersString = useObservable(formStore.asJsonString) || JSON.stringify(INIT_FORMSET); + const filtersString = useObservable(formStore.asJsonString); const [total, setTotal] = useState>(NotLoaded); const isMobile = useMobile(); const [isLoading, setIsLoading] = useState(true); @@ -194,19 +203,6 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { const { openToast } = useToast(); const { width: containerWidth } = useResize(contentRef); - const { - selectionSize, - dataGridSelection, - handleSelectionChange, - loadedSelectedRecords: loadedSelectedRuns, - isRangeSelected, - } = useSelection({ - records: runs, - selection: settings.selection, - total, - updateSettings, - }); - const { ui: { theme: appTheme }, isDarkMode, @@ -252,6 +248,10 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { return new Set([...BANNED_SORT_COLUMNS, ...arrayTypeColumns]); }, [arrayTypeColumns]); + const selectedRunIdSet = useMemo(() => { + return new Set(settings.selection.type === 'ONLY_IN' ? settings.selection.selections : []); + }, [settings.selection]); + const columnsIfLoaded = useMemo( () => (isLoadingSettings ? [] : settings.columns), [isLoadingSettings, settings.columns], @@ -263,18 +263,41 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { ); }, [isMobile, settings.compare, settings.pinnedColumnsCount]); - const loadedRunIdMap = useMemo(() => { - const runMap = new Map(); + const loadedSelectedRunIds = useMemo(() => { + const selectedMap = new Map(); + const selectedArray: FlatRun[] = []; + if (isLoadingSettings) { + return selectedMap; + } runs.forEach((r, index) => { Loadable.forEach(r, (run) => { - runMap.set(run.id, { index, run }); + if (selectedRunIdSet.has(run.id)) { + selectedMap.set(run.id, { index, run }); + selectedArray.push(run); + } }); }); - return runMap; - }, [runs]); + return selectedMap; + }, [isLoadingSettings, runs, selectedRunIdSet]); + + const selection = useMemo(() => { + let rows = CompactSelection.empty(); + loadedSelectedRunIds.forEach((info) => { + rows = rows.add(info.index); + }); + return { + columns: CompactSelection.empty(), + rows, + }; + }, [loadedSelectedRunIds]); - const colorMap = useGlasbey([...loadedRunIdMap.keys()]); + const selectedRuns: FlatRun[] = useMemo(() => { + const selected = runs.flatMap((run) => { + return run.isLoaded && selectedRunIdSet.has(run.data.id) ? [run.data] : []; + }); + return selected; + }, [runs, selectedRunIdSet]); const handleIsOpenFilterChange = useCallback((newOpen: boolean) => { setIsOpenFilter(newOpen); @@ -283,6 +306,8 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { } }, []); + const colorMap = useGlasbey([...loadedSelectedRunIds.keys()]); + const handleToggleComparisonView = useCallback(() => { updateSettings({ compare: !settings.compare }); }, [settings.compare, updateSettings]); @@ -311,7 +336,7 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { ) .map((columnName) => { if (columnName === MULTISELECT) { - return defaultSelectionColumn(dataGridSelection.rows, false); + return defaultSelectionColumn(selection.rows, false); } if (!Loadable.isLoaded(projectColumnsMap)) { @@ -454,7 +479,7 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { isDarkMode, projectColumns, projectHeatmap, - dataGridSelection.rows, + selection.rows, settings.columnWidths, settings.compare, settings.heatmapOn, @@ -513,30 +538,31 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { setRuns(INITIAL_LOADING_RUNS); }, [setPage]); - const filterFormSetString = useMemo(() => { - const filter = JSON.parse(filtersString) as FilterFormSetWithoutId; - if (searchId) { - // only display trials for search - const searchFilter = { - columnName: 'experimentId', - kind: 'field' as const, - location: V1LocationType.RUN, - operator: Operator.Eq, - type: V1ColumnType.NUMBER, - value: searchId, - }; - filter.filterGroup = combine(filter.filterGroup, 'and', searchFilter); - } - return JSON.stringify(filter); - }, [filtersString, searchId]); - const fetchRuns = useCallback(async (): Promise => { if (isLoadingSettings || Loadable.isNotLoaded(loadableFormset)) return; try { + const filters = JSON.parse(filtersString); + if (searchId) { + // only display trials for search + const existingFilterGroup = { ...filters.filterGroup }; + const searchFilter = { + columnName: 'experimentId', + kind: 'field', + location: 'LOCATION_TYPE_RUN', + operator: '=', + type: 'COLUMN_TYPE_NUMBER', + value: searchId, + }; + filters.filterGroup = { + children: [existingFilterGroup, searchFilter], + conjunction: 'and', + kind: 'group', + }; + } const offset = page * settings.pageLimit; const response = await searchRuns( { - filter: filterFormSetString, + filter: JSON.stringify(filters), limit: settings.pageLimit, offset, projectId: projectId, @@ -560,15 +586,16 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { setIsLoading(false); } }, [ + canceler.signal, + filtersString, isLoadingSettings, loadableFormset, page, - settings.pageLimit, - filterFormSetString, projectId, - sortString, - canceler.signal, resetPagination, + settings.pageLimit, + sortString, + searchId, ]); const { stopPolling } = usePolling(fetchRuns, { rerunOnNewFn: true }); @@ -676,6 +703,70 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { [settings.columnWidths, updateColumnWidths], ); + const rowRangeToIds = useCallback( + (range: [number, number]) => { + const slice = runs.slice(range[0], range[1]); + return Loadable.filterNotLoaded(slice).map((run) => run.id); + }, + [runs], + ); + + const handleSelectionChange: HandleSelectionChangeType = useCallback( + (selectionType: SelectionType | RangelessSelectionType, range?: [number, number]) => { + let newSettings: SelectionState = { ...settings.selection }; + + switch (selectionType) { + case 'add': + if (!range) return; + if (newSettings.type === 'ALL_EXCEPT') { + const excludedSet = new Set(newSettings.exclusions); + rowRangeToIds(range).forEach((id) => excludedSet.delete(id)); + newSettings.exclusions = Array.from(excludedSet); + } else { + const includedSet = new Set(newSettings.selections); + rowRangeToIds(range).forEach((id) => includedSet.add(id)); + newSettings.selections = Array.from(includedSet); + } + + break; + case 'add-all': + newSettings = { + exclusions: [], + type: 'ALL_EXCEPT' as const, + }; + + break; + case 'remove': + if (!range) return; + if (newSettings.type === 'ALL_EXCEPT') { + const excludedSet = new Set(newSettings.exclusions); + rowRangeToIds(range).forEach((id) => excludedSet.add(id)); + newSettings.exclusions = Array.from(excludedSet); + } else { + const includedSet = new Set(newSettings.selections); + rowRangeToIds(range).forEach((id) => includedSet.delete(id)); + newSettings.selections = Array.from(includedSet); + } + + break; + case 'remove-all': + newSettings = DEFAULT_SELECTION; + + break; + case 'set': + if (!range) return; + newSettings = { + ...DEFAULT_SELECTION, + selections: Array.from(rowRangeToIds(range)), + }; + + break; + } + updateSettings({ selection: newSettings }); + }, + [rowRangeToIds, settings.selection, updateSettings], + ); + const onActionComplete = useCallback(async () => { handleSelectionChange('remove-all'); await fetchRuns(); @@ -779,23 +870,36 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { [updateSettings], ); - const handleHeaderClick = useCallback( - (columnId: string): void => { - if (columnId === MULTISELECT) { - if (isRangeSelected([0, settings.pageLimit])) { - handleSelectionChange('remove', [0, settings.pageLimit]); - } else { - handleSelectionChange('add', [0, settings.pageLimit]); - } - } - }, - [handleSelectionChange, isRangeSelected, settings.pageLimit], - ); - const getHeaderMenuItems = useCallback( (columnId: string, colIdx: number): MenuItem[] => { if (columnId === MULTISELECT) { - return []; + const items: MenuItem[] = [ + settings.selection.type === 'ALL_EXCEPT' || settings.selection.selections.length > 0 + ? { + key: 'select-none', + label: 'Clear selected', + onClick: () => { + handleSelectionChange?.('remove-all'); + }, + } + : null, + ...[5, 10, 25].map((n) => ({ + key: `select-${n}`, + label: `Select first ${n}`, + onClick: () => { + handleSelectionChange?.('set', [0, n]); + dataGridRef.current?.scrollToTop(); + }, + })), + { + key: 'select-all', + label: 'Select all', + onClick: () => { + handleSelectionChange?.('add', [0, settings.pageLimit]); + }, + }, + ]; + return items; } const column = Loadable.getOrElse([], projectColumns).find((c) => c.column === columnId); @@ -947,9 +1051,12 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { bannedSortColumns, projectColumns, settings.pinnedColumnsCount, + settings.selection, + settings.pageLimit, settings.heatmapOn, settings.heatmapSkipped, isMobile, + handleSelectionChange, columnsIfLoaded, handleColumnsOrderChange, rootFilterChildren, @@ -967,20 +1074,6 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { }; }, [canceler, stopPolling]); - const selectionAction: SelectionAction = useMemo(() => { - return total.match({ - _: () => 'NONE' as const, - Loaded: (loadedTotal) => { - if (isRangeSelected([0, settings.pageLimit]) && selectionSize < loadedTotal) { - return 'SELECT_ALL'; - } else if (selectionSize > settings.pageLimit) { - return 'CLEAR_SELECTION'; - } - return 'NONE'; - }, - }); - }, [isRangeSelected, selectionSize, settings.pageLimit, total]); - return (
@@ -1025,21 +1118,16 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { onRowHeightChange={onRowHeightChange} /> @@ -1089,8 +1177,6 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { open={settings.compare} projectId={projectId} runSelection={settings.selection} - searchId={searchId} - tableFilters={filtersString} onWidthChange={handleCompareWidthChange}> columns={columns} @@ -1122,13 +1208,12 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { ); }} rowHeight={rowHeightMap[globalSettings.rowHeight as RowHeight]} - selection={dataGridSelection} + selection={selection} sorts={sorts} staticColumns={STATIC_COLUMNS} onColumnResize={handleColumnWidthChange} onColumnsOrderChange={handleColumnsOrderChange} onContextMenuComplete={handleContextMenuComplete} - onHeaderClicked={handleHeaderClick} onPinnedColumnsCountChange={handlePinnedColumnsCountChange} onSelectionChange={handleSelectionChange} /> diff --git a/webui/react/src/services/api-ts-sdk/api.ts b/webui/react/src/services/api-ts-sdk/api.ts index f6a2db5e811..b7c430d9da8 100644 --- a/webui/react/src/services/api-ts-sdk/api.ts +++ b/webui/react/src/services/api-ts-sdk/api.ts @@ -1549,11 +1549,11 @@ export interface V1ArchiveProjectResponse { */ export interface V1ArchiveRunsRequest { /** - * The ids of the runs being archived. Leave empty if using filter. + * The ids of the runs being archived. * @type {Array} * @memberof V1ArchiveRunsRequest */ - runIds?: Array; + runIds: Array; /** * The id of the current parent project. * @type {number} @@ -1580,44 +1580,6 @@ export interface V1ArchiveRunsResponse { */ results: Array; } -/** - * - * @export - * @interface V1ArchiveSearchesRequest - */ -export interface V1ArchiveSearchesRequest { - /** - * The ids of the searches being archived. Leave empty if using filter. - * @type {Array} - * @memberof V1ArchiveSearchesRequest - */ - searchIds?: Array; - /** - * The id of the current parent project. - * @type {number} - * @memberof V1ArchiveSearchesRequest - */ - projectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1ArchiveSearchesRequest - */ - filter?: string; -} -/** - * Response to ArchiveSearchesRequest. - * @export - * @interface V1ArchiveSearchesResponse - */ -export interface V1ArchiveSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1ArchiveSearchesResponse - */ - results: Array; -} /** * Response to ArchiveWorkspaceRequest. * @export @@ -1854,44 +1816,6 @@ export interface V1CancelExperimentsResponse { */ results: Array; } -/** - * Cancel searches. - * @export - * @interface V1CancelSearchesRequest - */ -export interface V1CancelSearchesRequest { - /** - * The ids of the searches being canceled. Leave empty if using filter. - * @type {Array} - * @memberof V1CancelSearchesRequest - */ - searchIds?: Array; - /** - * Project id of the searches being canceled. - * @type {number} - * @memberof V1CancelSearchesRequest - */ - projectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1CancelSearchesRequest - */ - filter?: string; -} -/** - * Response to CancelSearchesRequest. - * @export - * @interface V1CancelSearchesResponse - */ -export interface V1CancelSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1CancelSearchesResponse - */ - results: Array; -} /** * Checkpoint a collection of files saved by a task. * @export @@ -2747,17 +2671,17 @@ export interface V1DeleteProjectResponse { */ export interface V1DeleteRunsRequest { /** - * The ids of the runs being deleted. Leave empty if using filter. + * The ids of the runs being deleted. * @type {Array} * @memberof V1DeleteRunsRequest */ - runIds?: Array; + runIds: Array; /** * Project id of the runs being deleted. * @type {number} * @memberof V1DeleteRunsRequest */ - projectId: number; + projectId?: number; /** * Filter expression * @type {string} @@ -2778,44 +2702,6 @@ export interface V1DeleteRunsResponse { */ results: Array; } -/** - * Delete searches. - * @export - * @interface V1DeleteSearchesRequest - */ -export interface V1DeleteSearchesRequest { - /** - * The ids of the searches being deleted. Leave empty if using filter. - * @type {Array} - * @memberof V1DeleteSearchesRequest - */ - searchIds?: Array; - /** - * Project id of the searches being deleted. - * @type {number} - * @memberof V1DeleteSearchesRequest - */ - projectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1DeleteSearchesRequest - */ - filter?: string; -} -/** - * Response to DeleteSearchesRequest. - * @export - * @interface V1DeleteSearchesResponse - */ -export interface V1DeleteSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1DeleteSearchesResponse - */ - results: Array; -} /** * Response to DeleteTemplateRequest. * @export @@ -5834,11 +5720,11 @@ export interface V1KillNotebookResponse { */ export interface V1KillRunsRequest { /** - * The ids of the runs being killed. Leave empty if using filter. + * The ids of the runs being killed. * @type {Array} * @memberof V1KillRunsRequest */ - runIds?: Array; + runIds: Array; /** * Project id of the runs being killed. * @type {number} @@ -5865,44 +5751,6 @@ export interface V1KillRunsResponse { */ results: Array; } -/** - * Kill searches. - * @export - * @interface V1KillSearchesRequest - */ -export interface V1KillSearchesRequest { - /** - * The ids of the searches being killed. Leave empty if using filter. - * @type {Array} - * @memberof V1KillSearchesRequest - */ - searchIds?: Array; - /** - * Project id of the searches being killed. - * @type {number} - * @memberof V1KillSearchesRequest - */ - projectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1KillSearchesRequest - */ - filter?: string; -} -/** - * Response to KillSearchesRequest. - * @export - * @interface V1KillSearchesResponse - */ -export interface V1KillSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1KillSearchesResponse - */ - results: Array; -} /** * Response to KillShellRequest. * @export @@ -6196,74 +6044,6 @@ export interface V1LaunchTensorboardResponse { */ warnings?: Array; } -/** - * Request to launch a tensorboard using searches matching a filter. - * @export - * @interface V1LaunchTensorboardSearchesRequest - */ -export interface V1LaunchTensorboardSearchesRequest { - /** - * Targets all searches matching filter expression. Leave empty if using IDs. - * @type {string} - * @memberof V1LaunchTensorboardSearchesRequest - */ - filter?: string; - /** - * Tensorboard config (JSON). - * @type {any} - * @memberof V1LaunchTensorboardSearchesRequest - */ - config?: any; - /** - * Tensorboard template name. - * @type {string} - * @memberof V1LaunchTensorboardSearchesRequest - */ - templateName?: string; - /** - * The files to run with the command. - * @type {Array} - * @memberof V1LaunchTensorboardSearchesRequest - */ - files?: Array; - /** - * Workspace in which to launch tensorboard. Defaults to 'Uncategorized'. - * @type {number} - * @memberof V1LaunchTensorboardSearchesRequest - */ - workspaceId?: number; - /** - * Target search IDs. Leave empty if using filter. - * @type {Array} - * @memberof V1LaunchTensorboardSearchesRequest - */ - searchIds?: Array; -} -/** - * Response to LaunchTensorboardSearchesRequest. - * @export - * @interface V1LaunchTensorboardSearchesResponse - */ -export interface V1LaunchTensorboardSearchesResponse { - /** - * The requested tensorboard. - * @type {V1Tensorboard} - * @memberof V1LaunchTensorboardSearchesResponse - */ - tensorboard: V1Tensorboard; - /** - * The config; - * @type {any} - * @memberof V1LaunchTensorboardSearchesResponse - */ - config: any; - /** - * List of any related warnings. - * @type {Array} - * @memberof V1LaunchTensorboardSearchesResponse - */ - warnings?: Array; -} /** * Enum values for warnings when launching commands. - LAUNCH_WARNING_UNSPECIFIED: Default value - LAUNCH_WARNING_CURRENT_SLOTS_EXCEEDED: For a default webhook * @export @@ -7081,11 +6861,11 @@ export interface V1MoveProjectResponse { */ export interface V1MoveRunsRequest { /** - * The ids of the runs being moved. Leave empty if using filter. + * The ids of the runs being moved. * @type {Array} * @memberof V1MoveRunsRequest */ - runIds?: Array; + runIds: Array; /** * The id of the current parent project. * @type {number} @@ -7124,50 +6904,6 @@ export interface V1MoveRunsResponse { */ results: Array; } -/** - * Request to move the search to a different project. - * @export - * @interface V1MoveSearchesRequest - */ -export interface V1MoveSearchesRequest { - /** - * The ids of the searches being moved. Leave empty if using filter. - * @type {Array} - * @memberof V1MoveSearchesRequest - */ - searchIds?: Array; - /** - * The id of the current parent project. - * @type {number} - * @memberof V1MoveSearchesRequest - */ - sourceProjectId: number; - /** - * The id of the new parent project. - * @type {number} - * @memberof V1MoveSearchesRequest - */ - destinationProjectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1MoveSearchesRequest - */ - filter?: string; -} -/** - * Response to MoveSearchesRequest. - * @export - * @interface V1MoveSearchesResponse - */ -export interface V1MoveSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1MoveSearchesResponse - */ - results: Array; -} /** * Note is a user comment connected to a project. * @export @@ -8065,11 +7801,11 @@ export interface V1PauseGenericTaskResponse { */ export interface V1PauseRunsRequest { /** - * The ids of the runs being paused. Leave empty if using filter. + * The ids of the runs being moved. * @type {Array} * @memberof V1PauseRunsRequest */ - runIds?: Array; + runIds: Array; /** * The id of the project of the runs being paused. * @type {number} @@ -8096,44 +7832,6 @@ export interface V1PauseRunsResponse { */ results: Array; } -/** - * Request to pause the experiment associated witha search. - * @export - * @interface V1PauseSearchesRequest - */ -export interface V1PauseSearchesRequest { - /** - * The ids of the searches being moved. Leave empty if using filter. - * @type {Array} - * @memberof V1PauseSearchesRequest - */ - searchIds?: Array; - /** - * The id of the project of the searches being paused. - * @type {number} - * @memberof V1PauseSearchesRequest - */ - projectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1PauseSearchesRequest - */ - filter?: string; -} -/** - * Response to PauseSearchesRequest. - * @export - * @interface V1PauseSearchesResponse - */ -export interface V1PauseSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1PauseSearchesResponse - */ - results: Array; -} /** * * @export @@ -10350,11 +10048,11 @@ export interface V1ResourcesSummary { */ export interface V1ResumeRunsRequest { /** - * The ids of the runs being moved. Leave empty if using filter. + * The ids of the runs being moved. * @type {Array} * @memberof V1ResumeRunsRequest */ - runIds?: Array; + runIds: Array; /** * The id of the project of the runs being unpaused. * @type {number} @@ -10381,44 +10079,6 @@ export interface V1ResumeRunsResponse { */ results: Array; } -/** - * Request to unpause the experiment associated witha search. - * @export - * @interface V1ResumeSearchesRequest - */ -export interface V1ResumeSearchesRequest { - /** - * The ids of the searches being moved. Leave empty if using filter. - * @type {Array} - * @memberof V1ResumeSearchesRequest - */ - searchIds?: Array; - /** - * The id of the project of the searches being unpaused. - * @type {number} - * @memberof V1ResumeSearchesRequest - */ - projectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1ResumeSearchesRequest - */ - filter?: string; -} -/** - * Response to ResumeSearchesRequest. - * @export - * @interface V1ResumeSearchesResponse - */ -export interface V1ResumeSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1ResumeSearchesResponse - */ - results: Array; -} /** * * @export @@ -10635,25 +10295,6 @@ export interface V1ScopeTypeMask { */ workspace?: boolean; } -/** - * Message for results of individual searches in a multi-search action. - * @export - * @interface V1SearchActionResult - */ -export interface V1SearchActionResult { - /** - * Optional error message. - * @type {string} - * @memberof V1SearchActionResult - */ - error: string; - /** - * search ID. - * @type {number} - * @memberof V1SearchActionResult - */ - id: number; -} /** * * @export @@ -12382,11 +12023,11 @@ export interface V1UnarchiveProjectResponse { */ export interface V1UnarchiveRunsRequest { /** - * The ids of the runs being unarchived. Leave empty if using filter. + * The ids of the runs being unarchived. * @type {Array} * @memberof V1UnarchiveRunsRequest */ - runIds?: Array; + runIds: Array; /** * The id of the current parent project. * @type {number} @@ -12413,44 +12054,6 @@ export interface V1UnarchiveRunsResponse { */ results: Array; } -/** - * - * @export - * @interface V1UnarchiveSearchesRequest - */ -export interface V1UnarchiveSearchesRequest { - /** - * The ids of the searches being unarchived. Leave empty if using filter. - * @type {Array} - * @memberof V1UnarchiveSearchesRequest - */ - searchIds?: Array; - /** - * The id of the current parent project. - * @type {number} - * @memberof V1UnarchiveSearchesRequest - */ - projectId: number; - /** - * Filter expression - * @type {string} - * @memberof V1UnarchiveSearchesRequest - */ - filter?: string; -} -/** - * Response to UnarchiveSearchesRequest. - * @export - * @interface V1UnarchiveSearchesResponse - */ -export interface V1UnarchiveSearchesResponse { - /** - * Details on success or error for each search. - * @type {Array} - * @memberof V1UnarchiveSearchesResponse - */ - results: Array; -} /** * Response to UnarchiveWorkspaceRequest. * @export @@ -20287,55 +19890,17 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat }, /** * - * @summary Archive searches. - * @param {V1ArchiveSearchesRequest} body + * @summary Assign multiple users to multiple groups. + * @param {V1AssignMultipleGroupsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} */ - archiveSearches(body: V1ArchiveSearchesRequest, options: any = {}): FetchArgs { + assignMultipleGroups(body: V1AssignMultipleGroupsRequest, options: any = {}): FetchArgs { // verify required parameter 'body' is not null or undefined if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling archiveSearches.'); + throw new RequiredError('body','Required parameter body was null or undefined when calling assignMultipleGroups.'); } - const localVarPath = `/api/v1/searches/archive`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Assign multiple users to multiple groups. - * @param {V1AssignMultipleGroupsRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - assignMultipleGroups(body: V1AssignMultipleGroupsRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling assignMultipleGroups.'); - } - const localVarPath = `/api/v1/users/assignments`; + const localVarPath = `/api/v1/users/assignments`; const localVarUrlObj = new URL(localVarPath, BASE_PATH); const localVarRequestOptions = { method: 'PATCH', ...options }; const localVarHeaderParameter = {} as any; @@ -20405,44 +19970,6 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, - /** - * - * @summary Cancel searches. - * @param {V1CancelSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - cancelSearches(body: V1CancelSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling cancelSearches.'); - } - const localVarPath = `/api/v1/searches/cancel`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, /** * * @summary Cleanup task logs according to the retention policy. @@ -20701,7 +20228,7 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat }, /** * - * @summary Delete runs. + * @summary Delete a list of runs. * @param {V1DeleteRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -20737,44 +20264,6 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, - /** - * - * @summary Delete searches. - * @param {V1DeleteSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - deleteSearches(body: V1DeleteSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling deleteSearches.'); - } - const localVarPath = `/api/v1/searches/delete`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, /** * * @summary Get the set of metric names recorded for a list of experiments. @@ -21817,82 +21306,6 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, - /** - * - * @summary Kill searches. - * @param {V1KillSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - killSearches(body: V1KillSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling killSearches.'); - } - const localVarPath = `/api/v1/searches/kill`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Launch a tensorboard for one or more searches using bulk search filters. - * @param {V1LaunchTensorboardSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - launchTensorboardSearches(body: V1LaunchTensorboardSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling launchTensorboardSearches.'); - } - const localVarPath = `/api/v1/searches/tensorboards`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, /** * * @summary List all resource pools, bound and unbound, available to a specific workspace @@ -22133,44 +21546,6 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, - /** - * - * @summary Move searches. - * @param {V1MoveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - moveSearches(body: V1MoveSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling moveSearches.'); - } - const localVarPath = `/api/v1/searches/move`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, /** * * @summary NotifyContainterRunning is used to notify the master that the container is running. On HPC, the launcher will report a state of "Running" as soon as Slurm starts the job, but the container may be in the process of getting pulled down from the Internet, so the experiment is not really considered to be in a "Running" state until all the containers that are part of the experiment are running and not being pulled. @@ -22453,44 +21828,6 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, - /** - * - * @summary Pause experiment associated with provided searches. - * @param {V1PauseSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - pauseSearches(body: V1PauseSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling pauseSearches.'); - } - const localVarPath = `/api/v1/searches/pause`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, /** * * @summary PostAllocationAcceleratorData sets the accelerator for a given allocation. @@ -23159,44 +22496,6 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, - /** - * - * @summary Unpause experiment associated with provided searches. - * @param {V1ResumeSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - resumeSearches(body: V1ResumeSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling resumeSearches.'); - } - const localVarPath = `/api/v1/searches/resume`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, /** * * @summary Start syncing and prepare to be able to report to a run. This should be called once per task that will report to the run. @@ -23547,44 +22846,6 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, - /** - * - * @summary Unarchive searches. - * @param {V1UnarchiveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - unarchiveSearches(body: V1UnarchiveSearchesRequest, options: any = {}): FetchArgs { - // verify required parameter 'body' is not null or undefined - if (body === null || body === undefined) { - throw new RequiredError('body','Required parameter body was null or undefined when calling unarchiveSearches.'); - } - const localVarPath = `/api/v1/searches/unarchive`; - const localVarUrlObj = new URL(localVarPath, BASE_PATH); - const localVarRequestOptions = { method: 'POST', ...options }; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication BearerToken required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - objToSearchParams(localVarQueryParameter, localVarUrlObj.searchParams); - objToSearchParams(options.query || {}, localVarUrlObj.searchParams); - localVarRequestOptions.headers = { ...localVarHeaderParameter, ...options.headers }; - localVarRequestOptions.body = JSON.stringify(body) - - return { - url: `${localVarUrlObj.pathname}${localVarUrlObj.search}`, - options: localVarRequestOptions, - }; - }, /** * * @summary Unbind resource pool to workspace @@ -23879,32 +23140,13 @@ export const InternalApiFp = function (configuration?: Configuration) { /** * * @summary Set allocation to waiting state. - * @param {string} allocationId The id of the allocation. - * @param {V1AllocationWaitingRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - allocationWaiting(allocationId: string, body: V1AllocationWaitingRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).allocationWaiting(allocationId, body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, - /** - * - * @summary Archive runs. - * @param {V1ArchiveRunsRequest} body + * @param {string} allocationId The id of the allocation. + * @param {V1AllocationWaitingRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} */ - archiveRuns(body: V1ArchiveRunsRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).archiveRuns(body, options); + allocationWaiting(allocationId: string, body: V1AllocationWaitingRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { + const localVarFetchArgs = InternalApiFetchParamCreator(configuration).allocationWaiting(allocationId, body, options); return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { if (response.status >= 200 && response.status < 300) { @@ -23917,13 +23159,13 @@ export const InternalApiFp = function (configuration?: Configuration) { }, /** * - * @summary Archive searches. - * @param {V1ArchiveSearchesRequest} body + * @summary Archive runs. + * @param {V1ArchiveRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} */ - archiveSearches(body: V1ArchiveSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).archiveSearches(body, options); + archiveRuns(body: V1ArchiveRunsRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { + const localVarFetchArgs = InternalApiFetchParamCreator(configuration).archiveRuns(body, options); return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { if (response.status >= 200 && response.status < 300) { @@ -23973,25 +23215,6 @@ export const InternalApiFp = function (configuration?: Configuration) { }); }; }, - /** - * - * @summary Cancel searches. - * @param {V1CancelSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - cancelSearches(body: V1CancelSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).cancelSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, /** * * @summary Cleanup task logs according to the retention policy. @@ -24126,7 +23349,7 @@ export const InternalApiFp = function (configuration?: Configuration) { }, /** * - * @summary Delete runs. + * @summary Delete a list of runs. * @param {V1DeleteRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -24143,25 +23366,6 @@ export const InternalApiFp = function (configuration?: Configuration) { }); }; }, - /** - * - * @summary Delete searches. - * @param {V1DeleteSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - deleteSearches(body: V1DeleteSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).deleteSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, /** * * @summary Get the set of metric names recorded for a list of experiments. @@ -24665,44 +23869,6 @@ export const InternalApiFp = function (configuration?: Configuration) { }); }; }, - /** - * - * @summary Kill searches. - * @param {V1KillSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - killSearches(body: V1KillSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).killSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, - /** - * - * @summary Launch a tensorboard for one or more searches using bulk search filters. - * @param {V1LaunchTensorboardSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - launchTensorboardSearches(body: V1LaunchTensorboardSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).launchTensorboardSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, /** * * @summary List all resource pools, bound and unbound, available to a specific workspace @@ -24808,25 +23974,6 @@ export const InternalApiFp = function (configuration?: Configuration) { }); }; }, - /** - * - * @summary Move searches. - * @param {V1MoveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - moveSearches(body: V1MoveSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).moveSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, /** * * @summary NotifyContainterRunning is used to notify the master that the container is running. On HPC, the launcher will report a state of "Running" as soon as Slurm starts the job, but the container may be in the process of getting pulled down from the Internet, so the experiment is not really considered to be in a "Running" state until all the containers that are part of the experiment are running and not being pulled. @@ -24963,25 +24110,6 @@ export const InternalApiFp = function (configuration?: Configuration) { }); }; }, - /** - * - * @summary Pause experiment associated with provided searches. - * @param {V1PauseSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - pauseSearches(body: V1PauseSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).pauseSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, /** * * @summary PostAllocationAcceleratorData sets the accelerator for a given allocation. @@ -25296,25 +24424,6 @@ export const InternalApiFp = function (configuration?: Configuration) { }); }; }, - /** - * - * @summary Unpause experiment associated with provided searches. - * @param {V1ResumeSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - resumeSearches(body: V1ResumeSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).resumeSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, /** * * @summary Start syncing and prepare to be able to report to a run. This should be called once per task that will report to the run. @@ -25463,25 +24572,6 @@ export const InternalApiFp = function (configuration?: Configuration) { }); }; }, - /** - * - * @summary Unarchive searches. - * @param {V1UnarchiveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - unarchiveSearches(body: V1UnarchiveSearchesRequest, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { - const localVarFetchArgs = InternalApiFetchParamCreator(configuration).unarchiveSearches(body, options); - return (fetch: FetchAPI = window.fetch, basePath: string = BASE_PATH) => { - return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } else { - throw response; - } - }); - }; - }, /** * * @summary Unbind resource pool to workspace @@ -25656,16 +24746,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch archiveRuns(body: V1ArchiveRunsRequest, options?: any) { return InternalApiFp(configuration).archiveRuns(body, options)(fetch, basePath); }, - /** - * - * @summary Archive searches. - * @param {V1ArchiveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - archiveSearches(body: V1ArchiveSearchesRequest, options?: any) { - return InternalApiFp(configuration).archiveSearches(body, options)(fetch, basePath); - }, /** * * @summary Assign multiple users to multiple groups. @@ -25687,16 +24767,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch bindRPToWorkspace(resourcePoolName: string, body: V1BindRPToWorkspaceRequest, options?: any) { return InternalApiFp(configuration).bindRPToWorkspace(resourcePoolName, body, options)(fetch, basePath); }, - /** - * - * @summary Cancel searches. - * @param {V1CancelSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - cancelSearches(body: V1CancelSearchesRequest, options?: any) { - return InternalApiFp(configuration).cancelSearches(body, options)(fetch, basePath); - }, /** * * @summary Cleanup task logs according to the retention policy. @@ -25768,7 +24838,7 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch }, /** * - * @summary Delete runs. + * @summary Delete a list of runs. * @param {V1DeleteRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -25776,16 +24846,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch deleteRuns(body: V1DeleteRunsRequest, options?: any) { return InternalApiFp(configuration).deleteRuns(body, options)(fetch, basePath); }, - /** - * - * @summary Delete searches. - * @param {V1DeleteSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - deleteSearches(body: V1DeleteSearchesRequest, options?: any) { - return InternalApiFp(configuration).deleteSearches(body, options)(fetch, basePath); - }, /** * * @summary Get the set of metric names recorded for a list of experiments. @@ -26064,26 +25124,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch killRuns(body: V1KillRunsRequest, options?: any) { return InternalApiFp(configuration).killRuns(body, options)(fetch, basePath); }, - /** - * - * @summary Kill searches. - * @param {V1KillSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - killSearches(body: V1KillSearchesRequest, options?: any) { - return InternalApiFp(configuration).killSearches(body, options)(fetch, basePath); - }, - /** - * - * @summary Launch a tensorboard for one or more searches using bulk search filters. - * @param {V1LaunchTensorboardSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - launchTensorboardSearches(body: V1LaunchTensorboardSearchesRequest, options?: any) { - return InternalApiFp(configuration).launchTensorboardSearches(body, options)(fetch, basePath); - }, /** * * @summary List all resource pools, bound and unbound, available to a specific workspace @@ -26144,16 +25184,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch moveRuns(body: V1MoveRunsRequest, options?: any) { return InternalApiFp(configuration).moveRuns(body, options)(fetch, basePath); }, - /** - * - * @summary Move searches. - * @param {V1MoveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - moveSearches(body: V1MoveSearchesRequest, options?: any) { - return InternalApiFp(configuration).moveSearches(body, options)(fetch, basePath); - }, /** * * @summary NotifyContainterRunning is used to notify the master that the container is running. On HPC, the launcher will report a state of "Running" as soon as Slurm starts the job, but the container may be in the process of getting pulled down from the Internet, so the experiment is not really considered to be in a "Running" state until all the containers that are part of the experiment are running and not being pulled. @@ -26227,16 +25257,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch pauseRuns(body: V1PauseRunsRequest, options?: any) { return InternalApiFp(configuration).pauseRuns(body, options)(fetch, basePath); }, - /** - * - * @summary Pause experiment associated with provided searches. - * @param {V1PauseSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - pauseSearches(body: V1PauseSearchesRequest, options?: any) { - return InternalApiFp(configuration).pauseSearches(body, options)(fetch, basePath); - }, /** * * @summary PostAllocationAcceleratorData sets the accelerator for a given allocation. @@ -26407,16 +25427,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch resumeRuns(body: V1ResumeRunsRequest, options?: any) { return InternalApiFp(configuration).resumeRuns(body, options)(fetch, basePath); }, - /** - * - * @summary Unpause experiment associated with provided searches. - * @param {V1ResumeSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - resumeSearches(body: V1ResumeSearchesRequest, options?: any) { - return InternalApiFp(configuration).resumeSearches(body, options)(fetch, basePath); - }, /** * * @summary Start syncing and prepare to be able to report to a run. This should be called once per task that will report to the run. @@ -26502,16 +25512,6 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch unarchiveRuns(body: V1UnarchiveRunsRequest, options?: any) { return InternalApiFp(configuration).unarchiveRuns(body, options)(fetch, basePath); }, - /** - * - * @summary Unarchive searches. - * @param {V1UnarchiveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - unarchiveSearches(body: V1UnarchiveSearchesRequest, options?: any) { - return InternalApiFp(configuration).unarchiveSearches(body, options)(fetch, basePath); - }, /** * * @summary Unbind resource pool to workspace @@ -26667,18 +25667,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).archiveRuns(body, options)(this.fetch, this.basePath) } - /** - * - * @summary Archive searches. - * @param {V1ArchiveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public archiveSearches(body: V1ArchiveSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).archiveSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary Assign multiple users to multiple groups. @@ -26704,18 +25692,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).bindRPToWorkspace(resourcePoolName, body, options)(this.fetch, this.basePath) } - /** - * - * @summary Cancel searches. - * @param {V1CancelSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public cancelSearches(body: V1CancelSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).cancelSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary Cleanup task logs according to the retention policy. @@ -26801,7 +25777,7 @@ export class InternalApi extends BaseAPI { /** * - * @summary Delete runs. + * @summary Delete a list of runs. * @param {V1DeleteRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -26811,18 +25787,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).deleteRuns(body, options)(this.fetch, this.basePath) } - /** - * - * @summary Delete searches. - * @param {V1DeleteSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public deleteSearches(body: V1DeleteSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).deleteSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary Get the set of metric names recorded for a list of experiments. @@ -27151,30 +26115,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).killRuns(body, options)(this.fetch, this.basePath) } - /** - * - * @summary Kill searches. - * @param {V1KillSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public killSearches(body: V1KillSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).killSearches(body, options)(this.fetch, this.basePath) - } - - /** - * - * @summary Launch a tensorboard for one or more searches using bulk search filters. - * @param {V1LaunchTensorboardSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public launchTensorboardSearches(body: V1LaunchTensorboardSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).launchTensorboardSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary List all resource pools, bound and unbound, available to a specific workspace @@ -27245,18 +26185,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).moveRuns(body, options)(this.fetch, this.basePath) } - /** - * - * @summary Move searches. - * @param {V1MoveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public moveSearches(body: V1MoveSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).moveSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary NotifyContainterRunning is used to notify the master that the container is running. On HPC, the launcher will report a state of "Running" as soon as Slurm starts the job, but the container may be in the process of getting pulled down from the Internet, so the experiment is not really considered to be in a "Running" state until all the containers that are part of the experiment are running and not being pulled. @@ -27344,18 +26272,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).pauseRuns(body, options)(this.fetch, this.basePath) } - /** - * - * @summary Pause experiment associated with provided searches. - * @param {V1PauseSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public pauseSearches(body: V1PauseSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).pauseSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary PostAllocationAcceleratorData sets the accelerator for a given allocation. @@ -27558,18 +26474,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).resumeRuns(body, options)(this.fetch, this.basePath) } - /** - * - * @summary Unpause experiment associated with provided searches. - * @param {V1ResumeSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public resumeSearches(body: V1ResumeSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).resumeSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary Start syncing and prepare to be able to report to a run. This should be called once per task that will report to the run. @@ -27669,18 +26573,6 @@ export class InternalApi extends BaseAPI { return InternalApiFp(this.configuration).unarchiveRuns(body, options)(this.fetch, this.basePath) } - /** - * - * @summary Unarchive searches. - * @param {V1UnarchiveSearchesRequest} body - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof InternalApi - */ - public unarchiveSearches(body: V1UnarchiveSearchesRequest, options?: any) { - return InternalApiFp(this.configuration).unarchiveSearches(body, options)(this.fetch, this.basePath) - } - /** * * @summary Unbind resource pool to workspace diff --git a/webui/react/src/services/api.ts b/webui/react/src/services/api.ts index a4e57fc0aed..02a4134d631 100644 --- a/webui/react/src/services/api.ts +++ b/webui/react/src/services/api.ts @@ -7,7 +7,7 @@ import { DeterminedInfo, Telemetry } from 'stores/determinedInfo'; import { EmptyParams, RawJson, SingleEntityParams } from 'types'; import * as Type from 'types'; import { generateDetApi } from 'utils/service'; -import { tensorBoardMatchesSource, tensorBoardSearchesMatchesSource } from 'utils/task'; +import { tensorBoardMatchesSource } from 'utils/task'; /* Authentication */ @@ -493,75 +493,6 @@ export const changeExperimentLogRetention = generateDetApi< Type.BulkActionResult >(Config.changeExperimentLogRetention); -/* Searches */ - -export const archiveSearches = generateDetApi< - Api.V1ArchiveSearchesRequest, - Api.V1ArchiveSearchesResponse, - Type.BulkActionResult ->(Config.archiveSearches); - -export const deleteSearches = generateDetApi< - Api.V1DeleteSearchesRequest, - Api.V1DeleteSearchesResponse, - Type.BulkActionResult ->(Config.deleteSearches); - -export const killSearches = generateDetApi< - Api.V1KillSearchesRequest, - Api.V1KillSearchesResponse, - Type.BulkActionResult ->(Config.killSearches); - -export const moveSearches = generateDetApi< - Api.V1MoveSearchesRequest, - Api.V1MoveSearchesResponse, - Type.BulkActionResult ->(Config.moveSearches); - -export const unarchiveSearches = generateDetApi< - Api.V1UnarchiveSearchesRequest, - Api.V1UnarchiveSearchesResponse, - void ->(Config.unarchiveSearches); - -export const pauseSearches = generateDetApi< - Api.V1ResumeSearchesRequest, - Api.V1ResumeSearchesResponse, - Type.BulkActionResult ->(Config.pauseSearches); - -export const resumeSearches = generateDetApi< - Api.V1ResumeSearchesRequest, - Api.V1ResumeSearchesResponse, - Type.BulkActionResult ->(Config.resumeSearches); - -export const cancelSearches = generateDetApi< - Api.V1ResumeSearchesRequest, - Api.V1ResumeSearchesResponse, - Type.BulkActionResult ->(Config.resumeSearches); - -export const launchTensorBoardSearches = generateDetApi< - Service.LaunchTensorBoardSearchesParams, - Api.V1LaunchTensorboardSearchesResponse, - Type.CommandResponse ->(Config.launchTensorBoardSearches); - -export const openOrCreateTensorBoardSearches = async ( - params: Service.LaunchTensorBoardSearchesParams, -): Promise => { - const tensorboards = await getTensorBoards({}); - const match = tensorboards.find( - (tensorboard) => - !terminalCommandStates.has(tensorboard.state) && - tensorBoardSearchesMatchesSource(tensorboard, params), - ); - if (match) return { command: match, warnings: [V1LaunchWarning.CURRENTSLOTSEXCEEDED] }; - return launchTensorBoardSearches(params); -}; - /* Tasks */ export const getTask = generateDetApi< diff --git a/webui/react/src/services/apiConfig.ts b/webui/react/src/services/apiConfig.ts index 2472eb6e06b..b6c2b0ed1b8 100644 --- a/webui/react/src/services/apiConfig.ts +++ b/webui/react/src/services/apiConfig.ts @@ -1153,104 +1153,6 @@ export const getTrialWorkloads: DetApi< ), }; -/* Searches */ - -export const archiveSearches: DetApi< - Api.V1ArchiveSearchesRequest, - Api.V1ArchiveSearchesResponse, - Type.BulkActionResult -> = { - name: 'archiveSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.archiveSearches(params, options), -}; - -export const deleteSearches: DetApi< - Api.V1DeleteSearchesRequest, - Api.V1DeleteSearchesResponse, - Type.BulkActionResult -> = { - name: 'deleteSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.deleteSearches(params, options), -}; - -export const killSearches: DetApi< - Api.V1KillSearchesRequest, - Api.V1KillSearchesResponse, - Type.BulkActionResult -> = { - name: 'killSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.killSearches(params, options), -}; - -export const moveSearches: DetApi< - Api.V1MoveSearchesRequest, - Api.V1MoveSearchesResponse, - Type.BulkActionResult -> = { - name: 'moveSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.moveSearches(params, options), -}; - -export const unarchiveSearches: DetApi< - Api.V1UnarchiveSearchesRequest, - Api.V1UnarchiveSearchesResponse, - Type.BulkActionResult -> = { - name: 'unarchiveSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.unarchiveSearches(params, options), -}; - -export const pauseSearches: DetApi< - Api.V1PauseSearchesRequest, - Api.V1PauseSearchesResponse, - Type.BulkActionResult -> = { - name: 'pauseSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.pauseSearches(params, options), -}; - -export const resumeSearches: DetApi< - Api.V1ResumeSearchesRequest, - Api.V1ResumeSearchesResponse, - Type.BulkActionResult -> = { - name: 'resumeSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.resumeSearches(params, options), -}; - -export const cancelSearches: DetApi< - Api.V1CancelSearchesRequest, - Api.V1CancelSearchesResponse, - Type.BulkActionResult -> = { - name: 'cancelSearches', - postProcess: (response) => decoder.mapV1ActionResults(response.results), - request: (params, options) => detApi.Internal.cancelSearches(params, options), -}; - -export const launchTensorBoardSearches: DetApi< - Service.LaunchTensorBoardSearchesParams, - Api.V1LaunchTensorboardSearchesResponse, - Type.CommandResponse -> = { - name: 'launchTensorBoard', - postProcess: (response) => { - return { - command: decoder.mapV1TensorBoard(response.tensorboard), - warnings: response.warnings || [], - }; - }, - request: (params: Service.LaunchTensorBoardSearchesParams) => - detApi.Internal.launchTensorboardSearches(params), -}; - /* Runs */ export const searchRuns: DetApi< diff --git a/webui/react/src/services/types.ts b/webui/react/src/services/types.ts index 01960ebd252..3b41ec11778 100644 --- a/webui/react/src/services/types.ts +++ b/webui/react/src/services/types.ts @@ -164,18 +164,6 @@ export interface SearchRunsParams extends PaginationParams { sort?: string; } -export interface RunBulkActionParams { - projectId: number; - filter?: string; - runIds?: number[]; -} - -export interface SearchBulkActionParams { - projectId: number; - filter?: string; - searchIds?: number[]; -} - export interface GetTaskParams { taskId: string; } @@ -300,12 +288,6 @@ export interface LaunchTensorBoardParams { filters?: Api.V1BulkExperimentFilters; } -export interface LaunchTensorBoardSearchesParams { - searchIds?: Array; - workspaceId?: number; - filter?: string; -} - export interface LaunchJupyterLabParams { config?: { description?: string; diff --git a/webui/react/src/utils/experiment.ts b/webui/react/src/utils/experiment.ts index 97ca9d3941b..e0a99125f44 100644 --- a/webui/react/src/utils/experiment.ts +++ b/webui/react/src/utils/experiment.ts @@ -362,7 +362,7 @@ const idToFilter = (operator: Operator, id: number) => export const getIdsFilter = ( filterFormSet: FilterFormSetWithoutId, selection: SelectionType, -): FilterFormSetWithoutId => { +): FilterFormSetWithoutId | undefined => { const filterGroup: FilterFormSetWithoutId['filterGroup'] = selection.type === 'ALL_EXCEPT' ? { diff --git a/webui/react/src/utils/task.ts b/webui/react/src/utils/task.ts index f29c4ba6d61..0c220bf9e56 100644 --- a/webui/react/src/utils/task.ts +++ b/webui/react/src/utils/task.ts @@ -1,7 +1,7 @@ import _ from 'lodash'; import { killableCommandStates, killableRunStates, terminalCommandStates } from 'constants/states'; -import { LaunchTensorBoardParams, LaunchTensorBoardSearchesParams } from 'services/types'; +import { LaunchTensorBoardParams } from 'services/types'; import * as Type from 'types'; import { CommandState, RunState, State } from 'types'; @@ -221,23 +221,6 @@ export const tensorBoardMatchesSource = ( return false; }; -// Checks whether tensorboard source matches a given source list. -export const tensorBoardSearchesMatchesSource = ( - tensorBoard: Type.CommandTask, - source: LaunchTensorBoardSearchesParams, -): boolean => { - if (source.searchIds) { - source.searchIds?.sort(); - tensorBoard.misc?.experimentIds?.sort(); - - if (_.isEqual(tensorBoard.misc?.experimentIds, source.searchIds)) { - return true; - } - } - - return false; -}; - const commandStateSortOrder: CommandState[] = [ CommandState.Pulling, CommandState.Starting,