From 94c1fa9de619074cbda1c5b0d3d10f569eb2a588 Mon Sep 17 00:00:00 2001 From: hkang1 Date: Wed, 13 Nov 2024 11:03:03 -0700 Subject: [PATCH 1/9] Revert "fix: cover select all edge cases (#10187)" This reverts commit 11a2581bb03f4a1ed7e5e387923476e1e1cd0c6d. --- .../src/components/LoadableCount.test.tsx | 3 -- webui/react/src/components/LoadableCount.tsx | 50 ++++++++----------- .../src/components/Searches/Searches.tsx | 12 ++++- webui/react/src/components/TableActionBar.tsx | 33 ++++-------- .../e2e/models/components/TableActionBar.ts | 1 - .../src/e2e/tests/experimentList.spec.ts | 13 ++--- .../src/pages/F_ExpList/F_ExperimentList.tsx | 13 +++-- webui/react/src/pages/FlatRuns/FlatRuns.tsx | 33 ++++++------ 8 files changed, 70 insertions(+), 88 deletions(-) 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..357c17d3d9a 100644 --- a/webui/react/src/components/LoadableCount.tsx +++ b/webui/react/src/components/LoadableCount.tsx @@ -1,5 +1,4 @@ import Button from 'hew/Button'; -import { HandleSelectionChangeType } from 'hew/DataGrid/DataGrid'; import { Loadable } from 'hew/utils/loadable'; import { useMemo } from 'react'; @@ -8,23 +7,24 @@ 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; + onActualSelectAll?: () => void; + onClearSelect?: () => void; + pageSize?: number; selectedCount: number; - selectionAction: SelectionAction; - handleSelectionChange: HandleSelectionChangeType; } const LoadableCount: React.FC = ({ total, labelPlural, labelSingular, + onActualSelectAll, + onClearSelect, + pageSize = 20, selectedCount, - selectionAction, - handleSelectionChange, }: Props) => { const isMobile = useMobile(); @@ -51,31 +51,25 @@ const LoadableCount: React.FC = ({ 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; - } + Loaded: (loadedTotal) => { + if (onActualSelectAll && selectedCount >= pageSize && selectedCount < loadedTotal) { + return ( + + ); + } else if (onClearSelect && (selectedCount >= pageSize || selectedCount === loadedTotal)) { + return ( + + ); } + + return null; }, }); - }, [labelPlural, handleSelectionChange, selectionAction, total]); + }, [labelPlural, onActualSelectAll, onClearSelect, pageSize, selectedCount, total]); if (!isMobile) { return ( diff --git a/webui/react/src/components/Searches/Searches.tsx b/webui/react/src/components/Searches/Searches.tsx index f5dc484792c..95b3cfd2d96 100644 --- a/webui/react/src/components/Searches/Searches.tsx +++ b/webui/react/src/components/Searches/Searches.tsx @@ -637,6 +637,14 @@ const Searches: React.FC = ({ project }) => { users, ]); + const handleActualSelectAll = useCallback(() => { + handleSelectionChange?.('add-all'); + }, [handleSelectionChange]); + + const handleClearSelect = useCallback(() => { + handleSelectionChange?.('remove-all'); + }, [handleSelectionChange]); + const handleHeaderClick = useCallback( (columnId: string): void => { if (columnId === MULTISELECT) { @@ -779,10 +787,8 @@ 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} @@ -797,6 +803,8 @@ const Searches: React.FC = ({ project }) => { total={total} onActionComplete={handleActionComplete} onActionSuccess={handleActionSuccess} + onActualSelectAll={handleActualSelectAll} + onClearSelect={handleClearSelect} onIsOpenFilterChange={handleIsOpenFilterChange} onRowHeightChange={handleRowHeightChange} onSortChange={handleSortChange} diff --git a/webui/react/src/components/TableActionBar.tsx b/webui/react/src/components/TableActionBar.tsx index b49c5fc6ae0..dff835730fd 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'; @@ -57,7 +57,7 @@ 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,14 +91,14 @@ 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; + onActualSelectAll?: () => void; + onClearSelect?: () => void; onComparisonViewToggle?: () => void; onHeatmapToggle?: (heatmapOn: boolean) => void; onIsOpenFilterChange?: (value: boolean) => void; @@ -106,7 +106,7 @@ interface Props { onSortChange?: (sorts: Sort[]) => void; onVisibleColumnChange?: (newColumns: string[], pinnedCount?: number) => void; onHeatmapSelectionRemove?: (id: string) => void; - pageSize: number; + pageSize?: number; project: Project; projectColumns: Loadable; rowHeight: RowHeight; @@ -129,14 +129,14 @@ const TableActionBar: React.FC = ({ compareViewOn, formStore, tableFilterString, - handleSelectionChange, heatmapBtnVisible, heatmapOn, initialVisibleColumns, isOpenFilter, - isRangeSelected, onActionComplete, onActionSuccess, + onActualSelectAll, + onClearSelect, onComparisonViewToggle, onHeatmapToggle, onIsOpenFilterChange, @@ -412,20 +412,6 @@ 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]); - return (
@@ -469,12 +455,13 @@ const TableActionBar: React.FC = ({ )} diff --git a/webui/react/src/e2e/models/components/TableActionBar.ts b/webui/react/src/e2e/models/components/TableActionBar.ts index 433f339ea1f..17acec62672 100644 --- a/webui/react/src/e2e/models/components/TableActionBar.ts +++ b/webui/react/src/e2e/models/components/TableActionBar.ts @@ -26,7 +26,6 @@ export class TableActionBar extends NamedComponent { 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/tests/experimentList.spec.ts b/webui/react/src/e2e/tests/experimentList.spec.ts index 1d122c84663..8ae7f66d01a 100644 --- a/webui/react/src/e2e/tests/experimentList.spec.ts +++ b/webui/react/src/e2e/tests/experimentList.spec.ts @@ -65,15 +65,10 @@ test.describe('Experiment List', () => { 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(); + const isClearSelectionVisible = + await projectDetailsPage.f_experimentList.tableActionBar.clearSelection.pwLocator.isVisible(); + if (isClearSelectionVisible) { + await projectDetailsPage.f_experimentList.tableActionBar.clearSelection.pwLocator.click(); } } }); diff --git a/webui/react/src/pages/F_ExpList/F_ExperimentList.tsx b/webui/react/src/pages/F_ExpList/F_ExperimentList.tsx index 0314b426cbd..c816d04ec04 100644 --- a/webui/react/src/pages/F_ExpList/F_ExperimentList.tsx +++ b/webui/react/src/pages/F_ExpList/F_ExperimentList.tsx @@ -487,6 +487,14 @@ const F_ExperimentList: React.FC = ({ project }) => { [handleSelectionChange, openToast], ); + const handleActualSelectAll = useCallback(() => { + handleSelectionChange?.('add-all'); + }, [handleSelectionChange]); + + const handleClearSelect = useCallback(() => { + handleSelectionChange?.('remove-all'); + }, [handleSelectionChange]); + const handleContextMenuComplete = useCallback( (action: ExperimentAction, id: number, data?: Partial) => handleActionSuccess(action, [id], data), @@ -979,15 +987,12 @@ 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} @@ -1000,6 +1005,8 @@ const F_ExperimentList: React.FC = ({ project }) => { total={total} onActionComplete={handleActionComplete} onActionSuccess={handleActionSuccess} + onActualSelectAll={handleActualSelectAll} + onClearSelect={handleClearSelect} onComparisonViewToggle={handleToggleComparisonView} onHeatmapSelectionRemove={(id) => { const newSelection = settings.heatmapSkipped.filter((s) => s !== id); diff --git a/webui/react/src/pages/FlatRuns/FlatRuns.tsx b/webui/react/src/pages/FlatRuns/FlatRuns.tsx index 389c01b08ea..e9fbc37c353 100644 --- a/webui/react/src/pages/FlatRuns/FlatRuns.tsx +++ b/webui/react/src/pages/FlatRuns/FlatRuns.tsx @@ -46,7 +46,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 { @@ -779,13 +779,21 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { [updateSettings], ); + const handleActualSelectAll = useCallback(() => { + handleSelectionChange?.('add-all'); + }, [handleSelectionChange]); + + const handleClearSelect = useCallback(() => { + handleSelectionChange?.('remove-all'); + }, [handleSelectionChange]); + const handleHeaderClick = useCallback( (columnId: string): void => { if (columnId === MULTISELECT) { if (isRangeSelected([0, settings.pageLimit])) { - handleSelectionChange('remove', [0, settings.pageLimit]); + handleSelectionChange?.('remove', [0, settings.pageLimit]); } else { - handleSelectionChange('add', [0, settings.pageLimit]); + handleSelectionChange?.('add', [0, settings.pageLimit]); } } }, @@ -967,20 +975,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 (
@@ -1035,12 +1029,13 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { onActionComplete={onActionComplete} /> From 76a1a6ae1fedbe9747fd6074bc50a9c94ffcce09 Mon Sep 17 00:00:00 2001 From: hkang1 Date: Wed, 13 Nov 2024 11:07:00 -0700 Subject: [PATCH 2/9] Revert "feat: additional APIs to support "actual select all" functions [ET-238] (#10102)" This reverts commit deb3772c7e9fa8960b97fb44dcba4868005a8f43. --- master/internal/api_searches.go | 219 ++---- master/internal/api_searches_intg_test.go | 666 ------------------ proto/pkg/apiv1/search.pb.go | 308 ++------ proto/pkg/apiv1/tensorboard.pb.go | 311 ++------ proto/src/determined/api/v1/api.proto | 22 - proto/src/determined/api/v1/search.proto | 25 +- proto/src/determined/api/v1/tensorboard.proto | 28 - 7 files changed, 180 insertions(+), 1399 deletions(-) diff --git a/master/internal/api_searches.go b/master/internal/api_searches.go index 2a285c95842..732de70eb8f 100644 --- a/master/internal/api_searches.go +++ b/master/internal/api_searches.go @@ -95,7 +95,6 @@ func (a *apiServer) MoveSearches( 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) @@ -211,40 +210,80 @@ func (a *apiServer) MoveSearches( 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) +func (a *apiServer) KillSearches(ctx context.Context, req *apiv1.KillSearchesRequest, +) (*apiv1.KillSearchesResponse, error) { + curUser, _, err := grpcutil.GetUser(ctx) 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, - }) + type killSearchOKResult struct { + ID int32 + RequestID *string + IsTerminal bool + } + + var killCandidatees []killSearchOKResult + getQ := getSelectSearchesQueryTables(). + Model(&killCandidatees). + Column("e.id"). + ColumnExpr("t.request_id"). + 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_UPDATE_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 killCandidatees { + visibleIDs.Insert(cand.ID) + switch { + case cand.IsTerminal: results = append(results, &apiv1.SearchActionResult{ - Error: fmt.Sprintf("Failed to cancel search: %s", err), - Id: searchID, + Error: "", + Id: cand.ID, }) - } else { + // This should be impossible in the current system but we will leave this check here + // to cover a possible error in integration tests + case cand.RequestID == nil: results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: searchID, + Error: "Search has no associated request id.", + Id: cand.ID, }) + default: + validIDs = append(validIDs, cand.ID) } } - 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 + 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", originalID), + Id: originalID, + }) + } + } } + for _, searchID := range validIDs { _, err = a.KillExperiment(ctx, &apiv1.KillExperimentRequest{ Id: searchID, @@ -562,7 +601,6 @@ func pauseResumeSearchAction(ctx context.Context, isPause bool, projectID int32, 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) @@ -633,136 +671,3 @@ func pauseResumeSearchAction(ctx context.Context, isPause bool, projectID int32, } 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 index ff5ca16a5e7..183cdcf6586 100644 --- a/master/internal/api_searches_intg_test.go +++ b/master/internal/api_searches_intg_test.go @@ -11,37 +11,16 @@ import ( "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, @@ -388,616 +367,6 @@ func TestDeleteSearchesFilter(t *testing.T) { 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 @@ -1178,38 +547,3 @@ func TestUnarchiveSearchAlreadyUnarchived(t *testing.T) { 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/pkg/apiv1/search.pb.go b/proto/pkg/apiv1/search.pb.go index 21169abb3fa..51dced64516 100644 --- a/proto/pkg/apiv1/search.pb.go +++ b/proto/pkg/apiv1/search.pb.go @@ -202,122 +202,6 @@ func (x *MoveSearchesResponse) GetResults() []*SearchActionResult { 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 @@ -335,7 +219,7 @@ type KillSearchesRequest struct { func (x *KillSearchesRequest) Reset() { *x = KillSearchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[5] + mi := &file_determined_api_v1_search_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -348,7 +232,7 @@ func (x *KillSearchesRequest) String() string { func (*KillSearchesRequest) ProtoMessage() {} func (x *KillSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[5] + 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 { @@ -361,7 +245,7 @@ func (x *KillSearchesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KillSearchesRequest.ProtoReflect.Descriptor instead. func (*KillSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{5} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{3} } func (x *KillSearchesRequest) GetSearchIds() []int32 { @@ -385,7 +269,7 @@ func (x *KillSearchesRequest) GetFilter() string { return "" } -// Response to KillSearchesRequest. +// Response to KillSearchesResponse. type KillSearchesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -398,7 +282,7 @@ type KillSearchesResponse struct { func (x *KillSearchesResponse) Reset() { *x = KillSearchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[6] + mi := &file_determined_api_v1_search_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -411,7 +295,7 @@ func (x *KillSearchesResponse) String() string { func (*KillSearchesResponse) ProtoMessage() {} func (x *KillSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[6] + 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 { @@ -424,7 +308,7 @@ func (x *KillSearchesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KillSearchesResponse.ProtoReflect.Descriptor instead. func (*KillSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{6} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{4} } func (x *KillSearchesResponse) GetResults() []*SearchActionResult { @@ -451,7 +335,7 @@ type DeleteSearchesRequest struct { func (x *DeleteSearchesRequest) Reset() { *x = DeleteSearchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[7] + mi := &file_determined_api_v1_search_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -464,7 +348,7 @@ func (x *DeleteSearchesRequest) String() string { func (*DeleteSearchesRequest) ProtoMessage() {} func (x *DeleteSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[7] + 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 { @@ -477,7 +361,7 @@ func (x *DeleteSearchesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSearchesRequest.ProtoReflect.Descriptor instead. func (*DeleteSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{7} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{5} } func (x *DeleteSearchesRequest) GetSearchIds() []int32 { @@ -501,7 +385,7 @@ func (x *DeleteSearchesRequest) GetFilter() string { return "" } -// Response to DeleteSearchesRequest. +// Response to DeleteSearchesResponse. type DeleteSearchesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -514,7 +398,7 @@ type DeleteSearchesResponse struct { func (x *DeleteSearchesResponse) Reset() { *x = DeleteSearchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[8] + mi := &file_determined_api_v1_search_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -527,7 +411,7 @@ func (x *DeleteSearchesResponse) String() string { func (*DeleteSearchesResponse) ProtoMessage() {} func (x *DeleteSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[8] + 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 { @@ -540,7 +424,7 @@ func (x *DeleteSearchesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSearchesResponse.ProtoReflect.Descriptor instead. func (*DeleteSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{8} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{6} } func (x *DeleteSearchesResponse) GetResults() []*SearchActionResult { @@ -567,7 +451,7 @@ type ArchiveSearchesRequest struct { func (x *ArchiveSearchesRequest) Reset() { *x = ArchiveSearchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[9] + mi := &file_determined_api_v1_search_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -580,7 +464,7 @@ func (x *ArchiveSearchesRequest) String() string { func (*ArchiveSearchesRequest) ProtoMessage() {} func (x *ArchiveSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[9] + 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 { @@ -593,7 +477,7 @@ func (x *ArchiveSearchesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveSearchesRequest.ProtoReflect.Descriptor instead. func (*ArchiveSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{9} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{7} } func (x *ArchiveSearchesRequest) GetSearchIds() []int32 { @@ -630,7 +514,7 @@ type ArchiveSearchesResponse struct { func (x *ArchiveSearchesResponse) Reset() { *x = ArchiveSearchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[10] + mi := &file_determined_api_v1_search_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -643,7 +527,7 @@ func (x *ArchiveSearchesResponse) String() string { func (*ArchiveSearchesResponse) ProtoMessage() {} func (x *ArchiveSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[10] + 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 { @@ -656,7 +540,7 @@ func (x *ArchiveSearchesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ArchiveSearchesResponse.ProtoReflect.Descriptor instead. func (*ArchiveSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{10} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{8} } func (x *ArchiveSearchesResponse) GetResults() []*SearchActionResult { @@ -683,7 +567,7 @@ type UnarchiveSearchesRequest struct { func (x *UnarchiveSearchesRequest) Reset() { *x = UnarchiveSearchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[11] + mi := &file_determined_api_v1_search_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -696,7 +580,7 @@ func (x *UnarchiveSearchesRequest) String() string { func (*UnarchiveSearchesRequest) ProtoMessage() {} func (x *UnarchiveSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[11] + 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 { @@ -709,7 +593,7 @@ func (x *UnarchiveSearchesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnarchiveSearchesRequest.ProtoReflect.Descriptor instead. func (*UnarchiveSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{11} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{9} } func (x *UnarchiveSearchesRequest) GetSearchIds() []int32 { @@ -746,7 +630,7 @@ type UnarchiveSearchesResponse struct { func (x *UnarchiveSearchesResponse) Reset() { *x = UnarchiveSearchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[12] + mi := &file_determined_api_v1_search_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -759,7 +643,7 @@ func (x *UnarchiveSearchesResponse) String() string { func (*UnarchiveSearchesResponse) ProtoMessage() {} func (x *UnarchiveSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[12] + 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 { @@ -772,7 +656,7 @@ func (x *UnarchiveSearchesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnarchiveSearchesResponse.ProtoReflect.Descriptor instead. func (*UnarchiveSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{12} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{10} } func (x *UnarchiveSearchesResponse) GetResults() []*SearchActionResult { @@ -799,7 +683,7 @@ type PauseSearchesRequest struct { func (x *PauseSearchesRequest) Reset() { *x = PauseSearchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[13] + mi := &file_determined_api_v1_search_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -812,7 +696,7 @@ func (x *PauseSearchesRequest) String() string { func (*PauseSearchesRequest) ProtoMessage() {} func (x *PauseSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[13] + 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 { @@ -825,7 +709,7 @@ func (x *PauseSearchesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PauseSearchesRequest.ProtoReflect.Descriptor instead. func (*PauseSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{13} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{11} } func (x *PauseSearchesRequest) GetSearchIds() []int32 { @@ -862,7 +746,7 @@ type PauseSearchesResponse struct { func (x *PauseSearchesResponse) Reset() { *x = PauseSearchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[14] + mi := &file_determined_api_v1_search_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -875,7 +759,7 @@ func (x *PauseSearchesResponse) String() string { func (*PauseSearchesResponse) ProtoMessage() {} func (x *PauseSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[14] + 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 { @@ -888,7 +772,7 @@ func (x *PauseSearchesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PauseSearchesResponse.ProtoReflect.Descriptor instead. func (*PauseSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{14} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{12} } func (x *PauseSearchesResponse) GetResults() []*SearchActionResult { @@ -915,7 +799,7 @@ type ResumeSearchesRequest struct { func (x *ResumeSearchesRequest) Reset() { *x = ResumeSearchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[15] + mi := &file_determined_api_v1_search_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -928,7 +812,7 @@ func (x *ResumeSearchesRequest) String() string { func (*ResumeSearchesRequest) ProtoMessage() {} func (x *ResumeSearchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[15] + 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 { @@ -941,7 +825,7 @@ func (x *ResumeSearchesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResumeSearchesRequest.ProtoReflect.Descriptor instead. func (*ResumeSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{15} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{13} } func (x *ResumeSearchesRequest) GetSearchIds() []int32 { @@ -978,7 +862,7 @@ type ResumeSearchesResponse struct { func (x *ResumeSearchesResponse) Reset() { *x = ResumeSearchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_determined_api_v1_search_proto_msgTypes[16] + mi := &file_determined_api_v1_search_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -991,7 +875,7 @@ func (x *ResumeSearchesResponse) String() string { func (*ResumeSearchesResponse) ProtoMessage() {} func (x *ResumeSearchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_determined_api_v1_search_proto_msgTypes[16] + 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 { @@ -1004,7 +888,7 @@ func (x *ResumeSearchesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResumeSearchesResponse.ProtoReflect.Descriptor instead. func (*ResumeSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{16} + return file_determined_api_v1_search_proto_rawDescGZIP(), []int{14} } func (x *ResumeSearchesResponse) GetResults() []*SearchActionResult { @@ -1050,22 +934,6 @@ var file_determined_api_v1_search_proto_rawDesc = []byte{ 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, @@ -1181,40 +1049,37 @@ func file_determined_api_v1_search_proto_rawDescGZIP() []byte { 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_msgTypes = make([]protoimpl.MessageInfo, 15) 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 + (*KillSearchesRequest)(nil), // 3: determined.api.v1.KillSearchesRequest + (*KillSearchesResponse)(nil), // 4: determined.api.v1.KillSearchesResponse + (*DeleteSearchesRequest)(nil), // 5: determined.api.v1.DeleteSearchesRequest + (*DeleteSearchesResponse)(nil), // 6: determined.api.v1.DeleteSearchesResponse + (*ArchiveSearchesRequest)(nil), // 7: determined.api.v1.ArchiveSearchesRequest + (*ArchiveSearchesResponse)(nil), // 8: determined.api.v1.ArchiveSearchesResponse + (*UnarchiveSearchesRequest)(nil), // 9: determined.api.v1.UnarchiveSearchesRequest + (*UnarchiveSearchesResponse)(nil), // 10: determined.api.v1.UnarchiveSearchesResponse + (*PauseSearchesRequest)(nil), // 11: determined.api.v1.PauseSearchesRequest + (*PauseSearchesResponse)(nil), // 12: determined.api.v1.PauseSearchesResponse + (*ResumeSearchesRequest)(nil), // 13: determined.api.v1.ResumeSearchesRequest + (*ResumeSearchesResponse)(nil), // 14: 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 + 0, // 1: determined.api.v1.KillSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult + 0, // 2: determined.api.v1.DeleteSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult + 0, // 3: determined.api.v1.ArchiveSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult + 0, // 4: determined.api.v1.UnarchiveSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult + 0, // 5: determined.api.v1.PauseSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult + 0, // 6: determined.api.v1.ResumeSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_determined_api_v1_search_proto_init() } @@ -1260,30 +1125,6 @@ func file_determined_api_v1_search_proto_init() { } } 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 @@ -1295,7 +1136,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KillSearchesResponse); i { case 0: return &v.state @@ -1307,7 +1148,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteSearchesRequest); i { case 0: return &v.state @@ -1319,7 +1160,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteSearchesResponse); i { case 0: return &v.state @@ -1331,7 +1172,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ArchiveSearchesRequest); i { case 0: return &v.state @@ -1343,7 +1184,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ArchiveSearchesResponse); i { case 0: return &v.state @@ -1355,7 +1196,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UnarchiveSearchesRequest); i { case 0: return &v.state @@ -1367,7 +1208,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UnarchiveSearchesResponse); i { case 0: return &v.state @@ -1379,7 +1220,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PauseSearchesRequest); i { case 0: return &v.state @@ -1391,7 +1232,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PauseSearchesResponse); i { case 0: return &v.state @@ -1403,7 +1244,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResumeSearchesRequest); i { case 0: return &v.state @@ -1415,7 +1256,7 @@ func file_determined_api_v1_search_proto_init() { return nil } } - file_determined_api_v1_search_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_determined_api_v1_search_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResumeSearchesResponse); i { case 0: return &v.state @@ -1435,14 +1276,13 @@ func file_determined_api_v1_search_proto_init() { 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, + NumMessages: 15, NumExtensions: 0, NumServices: 0, }, 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..f28505e2a56 100644 --- a/proto/src/determined/api/v1/api.proto +++ b/proto/src/determined/api/v1/api.proto @@ -1618,17 +1618,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) { @@ -2866,17 +2855,6 @@ service Determined { }; } - // 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) = { diff --git a/proto/src/determined/api/v1/search.proto b/proto/src/determined/api/v1/search.proto index 5b4ee91249a..c6b782b975d 100644 --- a/proto/src/determined/api/v1/search.proto +++ b/proto/src/determined/api/v1/search.proto @@ -42,27 +42,6 @@ message MoveSearchesResponse { 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) = { @@ -75,7 +54,7 @@ message KillSearchesRequest { // Filter expression optional string filter = 3; } -// Response to KillSearchesRequest. +// Response to KillSearchesResponse. message KillSearchesResponse { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ "results" ] } @@ -96,7 +75,7 @@ message DeleteSearchesRequest { // Filter expression optional string filter = 3; } -// Response to DeleteSearchesRequest. +// Response to DeleteSearchesResponse. message DeleteSearchesResponse { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ "results" ] } 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 From 76829870ce4f9eddbd78aac3392ad2571fa56586 Mon Sep 17 00:00:00 2001 From: hkang1 Date: Wed, 13 Nov 2024 11:08:44 -0700 Subject: [PATCH 3/9] Revert "feat: add actual select all to glide tables [ET-238] (#10081)" This reverts commit 834eeda6ae25215761f4ec6e131cdc0194be8fd9. --- .../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 +- webui/react/src/components/LoadableCount.tsx | 39 +-- .../src/components/RunActionDropdown.tsx | 3 +- ...nFilterInterstitialModalComponent.test.tsx | 4 +- .../RunFilterInterstitialModalComponent.tsx | 15 +- .../src/components/Searches/Searches.tsx | 185 ++++++++---- webui/react/src/components/TableActionBar.tsx | 137 ++++----- .../src/e2e/models/common/hew/DataGrid.ts | 21 +- .../e2e/models/components/TableActionBar.ts | 1 - .../src/e2e/models/pages/ProjectDetails.ts | 4 +- .../src/e2e/tests/experimentList.spec.ts | 20 +- webui/react/src/hooks/useSelection.ts | 201 ------------- .../ExperimentDetailsHeader.tsx | 1 - webui/react/src/pages/ExperimentList.tsx | 1 - .../src/pages/F_ExpList/F_ExperimentList.tsx | 212 ++++++++++---- .../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 | 266 ++++++++++++------ 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 +- 31 files changed, 672 insertions(+), 937 deletions(-) rename webui/react/src/components/{SearchTensorBoardModal.tsx => ExperimentTensorBoardModal.tsx} (54%) delete mode 100644 webui/react/src/hooks/useSelection.ts 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.tsx b/webui/react/src/components/LoadableCount.tsx index 357c17d3d9a..0cc016a9a95 100644 --- a/webui/react/src/components/LoadableCount.tsx +++ b/webui/react/src/components/LoadableCount.tsx @@ -1,4 +1,3 @@ -import Button from 'hew/Button'; import { Loadable } from 'hew/utils/loadable'; import { useMemo } from 'react'; @@ -11,9 +10,6 @@ interface Props { total: Loadable; labelSingular: string; labelPlural: string; - onActualSelectAll?: () => void; - onClearSelect?: () => void; - pageSize?: number; selectedCount: number; } @@ -21,9 +17,6 @@ const LoadableCount: React.FC = ({ total, labelPlural, labelSingular, - onActualSelectAll, - onClearSelect, - pageSize = 20, selectedCount, }: Props) => { const isMobile = useMobile(); @@ -48,37 +41,11 @@ const LoadableCount: React.FC = ({ }); }, [labelPlural, labelSingular, total, selectedCount]); - const actualSelectAll = useMemo(() => { - return Loadable.match(total, { - _: () => null, - Loaded: (loadedTotal) => { - if (onActualSelectAll && selectedCount >= pageSize && selectedCount < loadedTotal) { - return ( - - ); - } else if (onClearSelect && (selectedCount >= pageSize || selectedCount === loadedTotal)) { - return ( - - ); - } - - return null; - }, - }); - }, [labelPlural, onActualSelectAll, onClearSelect, pageSize, selectedCount, 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 colorMap = useGlasbey([...loadedExperimentIdMap.keys()]); + 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 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,34 +712,39 @@ const Searches: React.FC = ({ project }) => { columnsIfLoaded, appTheme, isDarkMode, - dataGridSelection.rows, + selection.rows, users, ]); - const handleActualSelectAll = useCallback(() => { - handleSelectionChange?.('add-all'); - }, [handleSelectionChange]); - - const handleClearSelect = useCallback(() => { - handleSelectionChange?.('remove-all'); - }, [handleSelectionChange]); - - 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) { @@ -791,20 +875,14 @@ const Searches: React.FC = ({ project }) => { isOpenFilter={isOpenFilter} 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} - onActualSelectAll={handleActualSelectAll} - onClearSelect={handleClearSelect} onIsOpenFilterChange={handleIsOpenFilterChange} onRowHeightChange={handleRowHeightChange} onSortChange={handleSortChange} @@ -860,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 dff835730fd..1196ff9ca5c 100644 --- a/webui/react/src/components/TableActionBar.tsx +++ b/webui/react/src/components/TableActionBar.tsx @@ -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,19 +43,16 @@ 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 from './LoadableCount'; import css from './TableActionBar.module.scss'; @@ -97,8 +93,6 @@ interface Props { isOpenFilter: boolean; onActionComplete?: () => Promise; onActionSuccess?: (action: BatchAction, successfulIds: number[]) => void; - onActualSelectAll?: () => void; - onClearSelect?: () => void; onComparisonViewToggle?: () => void; onHeatmapToggle?: (heatmapOn: boolean) => void; onIsOpenFilterChange?: (value: boolean) => 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,21 +113,17 @@ interface Props { bannedFilterColumns?: Set; bannedSortColumns?: Set; entityCopy?: string; - tableFilterString: string; } const TableActionBar: React.FC = ({ compareViewOn, formStore, - tableFilterString, heatmapBtnVisible, heatmapOn, initialVisibleColumns, isOpenFilter, onActionComplete, onActionSuccess, - onActualSelectAll, - onClearSelect, onComparisonViewToggle, onHeatmapToggle, onIsOpenFilterChange, @@ -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,6 +376,8 @@ const TableActionBar: React.FC = ({ }, [] as MenuItem[]); }, [availableBatchActions]); + const handleAction = useCallback((key: string) => handleBatchAction(key), [handleBatchAction]); + return (
@@ -447,8 +413,8 @@ const TableActionBar: React.FC = ({ onVisibleColumnChange={onVisibleColumnChange} /> - {selectionSize > 0 && ( - + {selectedExperimentIds.length > 0 && ( + @@ -457,11 +423,8 @@ const TableActionBar: React.FC = ({ @@ -497,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 17acec62672..432d6a3df22 100644 --- a/webui/react/src/e2e/models/components/TableActionBar.ts +++ b/webui/react/src/e2e/models/components/TableActionBar.ts @@ -25,7 +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"]' }); // 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 8ae7f66d01a..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,14 +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 isClearSelectionVisible = - await projectDetailsPage.f_experimentList.tableActionBar.clearSelection.pwLocator.isVisible(); - if (isClearSelectionVisible) { - await projectDetailsPage.f_experimentList.tableActionBar.clearSelection.pwLocator.click(); - } + 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 () => { @@ -305,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 @@ -487,14 +576,6 @@ const F_ExperimentList: React.FC = ({ project }) => { [handleSelectionChange, openToast], ); - const handleActualSelectAll = useCallback(() => { - handleSelectionChange?.('add-all'); - }, [handleSelectionChange]); - - const handleClearSelect = useCallback(() => { - handleSelectionChange?.('remove-all'); - }, [handleSelectionChange]); - const handleContextMenuComplete = useCallback( (action: ExperimentAction, id: number, data?: Partial) => handleActionSuccess(action, [id], data), @@ -653,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(() => { @@ -675,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)) { @@ -806,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) { @@ -997,16 +1096,11 @@ const F_ExperimentList: React.FC = ({ project }) => { 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} - onActualSelectAll={handleActualSelectAll} - onClearSelect={handleClearSelect} onComparisonViewToggle={handleToggleComparisonView} onHeatmapSelectionRemove={(id) => { const newSelection = settings.heatmapSkipped.filter((s) => s !== id); @@ -1036,7 +1130,6 @@ const F_ExperimentList: React.FC = ({ project }) => { initialWidth={comparisonViewTableWidth} open={settings.compare} projectId={project.id} - tableFilters={filtersString} onWidthChange={handleCompareWidthChange}> columns={columns} @@ -1072,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 e9fbc37c353..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, @@ -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 colorMap = useGlasbey([...loadedRunIdMap.keys()]); + const selection = useMemo(() => { + let rows = CompactSelection.empty(); + loadedSelectedRunIds.forEach((info) => { + rows = rows.add(info.index); + }); + return { + columns: CompactSelection.empty(), + rows, + }; + }, [loadedSelectedRunIds]); + + 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,31 +870,36 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { [updateSettings], ); - const handleActualSelectAll = useCallback(() => { - handleSelectionChange?.('add-all'); - }, [handleSelectionChange]); - - const handleClearSelect = useCallback(() => { - handleSelectionChange?.('remove-all'); - }, [handleSelectionChange]); - - 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); @@ -955,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, @@ -1019,23 +1118,17 @@ const FlatRuns: React.FC = ({ projectId, workspaceId, searchId }) => { onRowHeightChange={onRowHeightChange} /> @@ -1084,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} @@ -1117,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 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, From 78ca1979fa950cb0f67dee3832cf767816c70c40 Mon Sep 17 00:00:00 2001 From: hkang1 Date: Wed, 13 Nov 2024 11:09:58 -0700 Subject: [PATCH 4/9] Revert "refactor: remove annotations requiring search ids in bulk action js (ET-241) (#10062)" This reverts commit 6c46a465a317d2b305a5c9ed3cdfd5cfc22a61d4. --- proto/pkg/apiv1/run.pb.go | 248 ++++++++++++----------- proto/pkg/apiv1/search.pb.go | 219 ++++++++++---------- proto/src/determined/api/v1/run.proto | 30 +-- proto/src/determined/api/v1/search.proto | 30 +-- 4 files changed, 271 insertions(+), 256 deletions(-) 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 index 51dced64516..5968f5824bc 100644 --- a/proto/pkg/apiv1/search.pb.go +++ b/proto/pkg/apiv1/search.pb.go @@ -83,7 +83,7 @@ type MoveSearchesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the searches being moved. Leave empty if using filter. + // The ids of the searches being moved. 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"` @@ -208,7 +208,7 @@ type KillSearchesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the searches being killed. Leave empty if using filter. + // The ids of the searches being killed. 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"` @@ -324,7 +324,7 @@ type DeleteSearchesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the searches being deleted. Leave empty if using filter. + // The ids of the searches being deleted. 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"` @@ -440,7 +440,7 @@ type ArchiveSearchesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the searches being archived. Leave empty if using filter. + // The ids of the searches being archived. 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"` @@ -556,7 +556,7 @@ type UnarchiveSearchesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the searches being unarchived. Leave empty if using filter. + // The ids of the searches being unarchived. 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"` @@ -672,7 +672,7 @@ type PauseSearchesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the searches being moved. Leave empty if using filter. + // The ids of the searches being moved. 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"` @@ -788,7 +788,7 @@ type ResumeSearchesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The ids of the searches being moved. Leave empty if using filter. + // The ids of the searches being moved. 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"` @@ -912,7 +912,7 @@ var file_determined_api_v1_search_proto_rawDesc = []byte{ 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, + 0x64, 0x22, 0xff, 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, @@ -923,118 +923,123 @@ var file_determined_api_v1_search_proto_rawDesc = []byte{ 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, + 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x3a, 0x3f, 0x92, 0x41, 0x3c, 0x0a, 0x3a, 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, 0x8f, 0x01, 0x0a, 0x13, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 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, 0xa3, 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, 0x26, 0x92, 0x41, 0x23, 0x0a, 0x21, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 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, 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, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 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, 0x9f, 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, 0x68, 0x0a, 0x14, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x88, 0x01, 0x01, 0x3a, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x69, 0x64, 0x73, 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, 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, + 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xa1, 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, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x5f, 0x69, 0x64, 0x73, 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, + 0x9d, 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, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x69, 0x64, 0x73, 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, 0x9e, 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, + 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, + 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 ( 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 index c6b782b975d..1154ac98934 100644 --- a/proto/src/determined/api/v1/search.proto +++ b/proto/src/determined/api/v1/search.proto @@ -19,10 +19,12 @@ message SearchActionResult { // 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" ] } + json_schema: { + required: [ "source_project_id", "destination_project_id", "search_ids" ] + } }; - // The ids of the searches being moved. Leave empty if using filter. + // The ids of the searches being moved. repeated int32 search_ids = 1; // The id of the current parent project. int32 source_project_id = 2; @@ -45,9 +47,9 @@ message MoveSearchesResponse { // Kill searches. message KillSearchesRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "search_ids", "source_project_id" ] } }; - // The ids of the searches being killed. Leave empty if using filter. + // The ids of the searches being killed. repeated int32 search_ids = 1; // Project id of the searches being killed. int32 project_id = 2; @@ -66,9 +68,9 @@ message KillSearchesResponse { // Delete searches. message DeleteSearchesRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "search_ids" ] } }; - // The ids of the searches being deleted. Leave empty if using filter. + // The ids of the searches being deleted. repeated int32 search_ids = 1; // Project id of the searches being deleted. int32 project_id = 2; @@ -87,10 +89,10 @@ message DeleteSearchesResponse { // Request to archive the search message ArchiveSearchesRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "search_ids" ] } }; - // The ids of the searches being archived. Leave empty if using filter. + // The ids of the searches being archived. repeated int32 search_ids = 1; // The id of the current parent project. int32 project_id = 2; @@ -111,10 +113,10 @@ message ArchiveSearchesResponse { // Request to unarchive the search message UnarchiveSearchesRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "search_ids" ] } }; - // The ids of the searches being unarchived. Leave empty if using filter. + // The ids of the searches being unarchived. repeated int32 search_ids = 1; // The id of the current parent project. int32 project_id = 2; @@ -135,10 +137,10 @@ message UnarchiveSearchesResponse { // Request to pause the experiment associated witha search. message PauseSearchesRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "search_ids" ] } }; - // The ids of the searches being moved. Leave empty if using filter. + // The ids of the searches being moved. repeated int32 search_ids = 1; // The id of the project of the searches being paused. int32 project_id = 2; @@ -159,10 +161,10 @@ message PauseSearchesResponse { // Request to unpause the experiment associated witha search. message ResumeSearchesRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "project_id" ] } + json_schema: { required: [ "project_id", "search_ids" ] } }; - // The ids of the searches being moved. Leave empty if using filter. + // The ids of the searches being moved. repeated int32 search_ids = 1; // The id of the project of the searches being unpaused. int32 project_id = 2; From 1c98a18edb59e17a13765d9274b8d59ae71a4170 Mon Sep 17 00:00:00 2001 From: hkang1 Date: Mon, 18 Nov 2024 11:37:05 -0700 Subject: [PATCH 5/9] Revert "feat: bulk actions matching filters (ET-241) (#9895)" --- master/internal/api_searches.go | 673 ----------- master/internal/api_searches_intg_test.go | 549 --------- proto/pkg/apiv1/search.pb.go | 1302 --------------------- proto/src/determined/api/v1/api.proto | 119 +- proto/src/determined/api/v1/search.proto | 183 --- 5 files changed, 2 insertions(+), 2824 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 diff --git a/master/internal/api_searches.go b/master/internal/api_searches.go deleted file mode 100644 index 732de70eb8f..00000000000 --- a/master/internal/api_searches.go +++ /dev/null @@ -1,673 +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"). - 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) KillSearches(ctx context.Context, req *apiv1.KillSearchesRequest, -) (*apiv1.KillSearchesResponse, error) { - curUser, _, err := grpcutil.GetUser(ctx) - if err != nil { - return nil, err - } - - type killSearchOKResult struct { - ID int32 - RequestID *string - IsTerminal bool - } - - var killCandidatees []killSearchOKResult - getQ := getSelectSearchesQueryTables(). - Model(&killCandidatees). - Column("e.id"). - ColumnExpr("t.request_id"). - 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_UPDATE_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 killCandidatees { - visibleIDs.Insert(cand.ID) - switch { - case cand.IsTerminal: - results = append(results, &apiv1.SearchActionResult{ - Error: "", - Id: cand.ID, - }) - // This should be impossible in the current system but we will leave this check here - // to cover a possible error in integration tests - case cand.RequestID == nil: - results = append(results, &apiv1.SearchActionResult{ - Error: "Search has no associated request id.", - Id: cand.ID, - }) - default: - 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", originalID), - Id: originalID, - }) - } - } - } - - 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"). - 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 -} diff --git a/master/internal/api_searches_intg_test.go b/master/internal/api_searches_intg_test.go deleted file mode 100644 index 183cdcf6586..00000000000 --- a/master/internal/api_searches_intg_test.go +++ /dev/null @@ -1,549 +0,0 @@ -//go:build integration -// +build integration - -package internal - -import ( - "encoding/json" - "fmt" - "slices" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/determined-ai/determined/master/internal/db" - "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" -) - -// 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 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) -} diff --git a/proto/pkg/apiv1/search.pb.go b/proto/pkg/apiv1/search.pb.go deleted file mode 100644 index 5968f5824bc..00000000000 --- a/proto/pkg/apiv1/search.pb.go +++ /dev/null @@ -1,1302 +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. - 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 -} - -// Kill searches. -type KillSearchesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The ids of the searches being killed. - 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[3] - 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[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 KillSearchesRequest.ProtoReflect.Descriptor instead. -func (*KillSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{3} -} - -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 KillSearchesResponse. -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[4] - 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[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 KillSearchesResponse.ProtoReflect.Descriptor instead. -func (*KillSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{4} -} - -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. - 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[5] - 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[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 DeleteSearchesRequest.ProtoReflect.Descriptor instead. -func (*DeleteSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{5} -} - -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 DeleteSearchesResponse. -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[6] - 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[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 DeleteSearchesResponse.ProtoReflect.Descriptor instead. -func (*DeleteSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{6} -} - -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. - 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[7] - 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[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 ArchiveSearchesRequest.ProtoReflect.Descriptor instead. -func (*ArchiveSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{7} -} - -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[8] - 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[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 ArchiveSearchesResponse.ProtoReflect.Descriptor instead. -func (*ArchiveSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{8} -} - -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. - 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[9] - 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[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 UnarchiveSearchesRequest.ProtoReflect.Descriptor instead. -func (*UnarchiveSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{9} -} - -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[10] - 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[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 UnarchiveSearchesResponse.ProtoReflect.Descriptor instead. -func (*UnarchiveSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{10} -} - -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. - 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[11] - 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[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 PauseSearchesRequest.ProtoReflect.Descriptor instead. -func (*PauseSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{11} -} - -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[12] - 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[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 PauseSearchesResponse.ProtoReflect.Descriptor instead. -func (*PauseSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{12} -} - -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. - 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[13] - 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[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 ResumeSearchesRequest.ProtoReflect.Descriptor instead. -func (*ResumeSearchesRequest) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{13} -} - -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[14] - 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[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 ResumeSearchesResponse.ProtoReflect.Descriptor instead. -func (*ResumeSearchesResponse) Descriptor() ([]byte, []int) { - return file_determined_api_v1_search_proto_rawDescGZIP(), []int{14} -} - -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, 0xff, 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, 0x3f, 0x92, 0x41, 0x3c, 0x0a, 0x3a, 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, 0xd2, 0x01, 0x0a, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 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, 0xa3, 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, 0x26, 0x92, 0x41, 0x23, 0x0a, 0x21, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 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, 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, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, 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, 0x9f, 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, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x5f, 0x69, 0x64, 0x73, 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, 0xa1, 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, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x69, 0x64, 0x73, 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, - 0x9d, 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, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x5f, 0x69, 0x64, 0x73, 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, 0x9e, 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, - 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x73, - 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, 15) -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 - (*KillSearchesRequest)(nil), // 3: determined.api.v1.KillSearchesRequest - (*KillSearchesResponse)(nil), // 4: determined.api.v1.KillSearchesResponse - (*DeleteSearchesRequest)(nil), // 5: determined.api.v1.DeleteSearchesRequest - (*DeleteSearchesResponse)(nil), // 6: determined.api.v1.DeleteSearchesResponse - (*ArchiveSearchesRequest)(nil), // 7: determined.api.v1.ArchiveSearchesRequest - (*ArchiveSearchesResponse)(nil), // 8: determined.api.v1.ArchiveSearchesResponse - (*UnarchiveSearchesRequest)(nil), // 9: determined.api.v1.UnarchiveSearchesRequest - (*UnarchiveSearchesResponse)(nil), // 10: determined.api.v1.UnarchiveSearchesResponse - (*PauseSearchesRequest)(nil), // 11: determined.api.v1.PauseSearchesRequest - (*PauseSearchesResponse)(nil), // 12: determined.api.v1.PauseSearchesResponse - (*ResumeSearchesRequest)(nil), // 13: determined.api.v1.ResumeSearchesRequest - (*ResumeSearchesResponse)(nil), // 14: 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.KillSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 2: determined.api.v1.DeleteSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 3: determined.api.v1.ArchiveSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 4: determined.api.v1.UnarchiveSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 5: determined.api.v1.PauseSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 0, // 6: determined.api.v1.ResumeSearchesResponse.results:type_name -> determined.api.v1.SearchActionResult - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] 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.(*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[4].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[5].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[6].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[7].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[8].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[9].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[10].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[11].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[12].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[13].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[14].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{}{} - 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: 15, - 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/src/determined/api/v1/api.proto b/proto/src/determined/api/v1/api.proto index f28505e2a56..e6d8993426e 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"; @@ -2676,7 +2675,7 @@ service Determined { }; } - // Kill runs. + // Get a list of runs. rpc KillRuns(KillRunsRequest) returns (KillRunsResponse) { option (google.api.http) = { post: "/api/v1/runs/kill" @@ -2687,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" @@ -2843,118 +2842,4 @@ service Determined { tags: "Alpha" }; } - - // 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" - }; - } - - // 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) { - option (google.api.http) = { - post: "/api/v1/tokens", - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Tokens" - }; - } - - // Get a list of all access token records. - rpc GetAccessTokens(GetAccessTokensRequest) - returns (GetAccessTokensResponse) { - option (google.api.http) = { - get: "/api/v1/tokens" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Tokens" - }; - } - - // Patch an access token's mutable fields. - rpc PatchAccessToken(PatchAccessTokenRequest) - returns (PatchAccessTokenResponse) { - option (google.api.http) = { - patch: "/api/v1/tokens/{token_id}" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "Tokens" - }; - } } diff --git a/proto/src/determined/api/v1/search.proto b/proto/src/determined/api/v1/search.proto deleted file mode 100644 index 1154ac98934..00000000000 --- a/proto/src/determined/api/v1/search.proto +++ /dev/null @@ -1,183 +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", "search_ids" ] - } - }; - - // The ids of the searches being moved. - 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; -} - -// Kill searches. -message KillSearchesRequest { - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { - json_schema: { required: [ "search_ids", "source_project_id" ] } - }; - // The ids of the searches being killed. - repeated int32 search_ids = 1; - // Project id of the searches being killed. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} -// Response to KillSearchesResponse. -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: [ "search_ids" ] } - }; - // The ids of the searches being deleted. - repeated int32 search_ids = 1; - // Project id of the searches being deleted. - int32 project_id = 2; - // Filter expression - optional string filter = 3; -} -// Response to DeleteSearchesResponse. -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", "search_ids" ] } - }; - - // The ids of the searches being archived. - 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", "search_ids" ] } - }; - - // The ids of the searches being unarchived. - 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", "search_ids" ] } - }; - - // The ids of the searches being moved. - 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", "search_ids" ] } - }; - - // The ids of the searches being moved. - 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; -} From 750299f48fe67a6ac1f900e1b374f92ab351016f Mon Sep 17 00:00:00 2001 From: hkang1 Date: Tue, 19 Nov 2024 11:55:23 -0700 Subject: [PATCH 6/9] fix: add back in token code that is needed --- proto/src/determined/api/v1/api.proto | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/proto/src/determined/api/v1/api.proto b/proto/src/determined/api/v1/api.proto index e6d8993426e..fc5a464674c 100644 --- a/proto/src/determined/api/v1/api.proto +++ b/proto/src/determined/api/v1/api.proto @@ -2842,4 +2842,39 @@ service Determined { tags: "Alpha" }; } + + // Create and get a user's access token + rpc PostAccessToken(PostAccessTokenRequest) + returns (PostAccessTokenResponse) { + option (google.api.http) = { + post: "/api/v1/tokens", + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "Tokens" + }; + } + + // Get a list of all access token records. + rpc GetAccessTokens(GetAccessTokensRequest) + returns (GetAccessTokensResponse) { + option (google.api.http) = { + get: "/api/v1/tokens" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "Tokens" + }; + } + + // Patch an access token's mutable fields. + rpc PatchAccessToken(PatchAccessTokenRequest) + returns (PatchAccessTokenResponse) { + option (google.api.http) = { + patch: "/api/v1/tokens/{token_id}" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "Tokens" + }; + } } From b470223792953fc42ae89aae7d9ed723277ccfb2 Mon Sep 17 00:00:00 2001 From: hkang1 Date: Tue, 19 Nov 2024 11:55:31 -0700 Subject: [PATCH 7/9] chore: update generated code --- harness/determined/common/api/bindings.py | 936 +-------- proto/buf.image.bin | Bin 665762 -> 652973 bytes proto/pkg/apiv1/api.pb.go | 2168 ++++++++------------ proto/pkg/apiv1/api.pb.gw.go | 708 +------ webui/react/src/services/api-ts-sdk/api.ts | 1178 +---------- 5 files changed, 935 insertions(+), 4055 deletions(-) diff --git a/harness/determined/common/api/bindings.py b/harness/determined/common/api/bindings.py index b6384d66a20..3f4231201cc 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.""" @@ -11032,71 +10605,9 @@ def __init__( 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]", - ): - 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", *, @@ -22406,7 +21692,7 @@ def post_KillRuns( *, body: "v1KillRunsRequest", ) -> "v1KillRunsResponse": - """Kill runs.""" + """Get a list of runs.""" _params = None _resp = session._do_request( method="POST", @@ -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/proto/buf.image.bin b/proto/buf.image.bin index 49c522ee0ec0209f8a4586f716f0267ebb04ac23..3a22b0a12c0b036ccaa66349629c8a90dcc5c4cb 100644 GIT binary patch delta 38607 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 delta 47903 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�ZtB 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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. @@ -4689,9 +4559,9 @@ type DeterminedClient interface { SearchRuns(ctx context.Context, in *SearchRunsRequest, opts ...grpc.CallOption) (*SearchRunsResponse, error) // Move runs. MoveRuns(ctx context.Context, in *MoveRunsRequest, opts ...grpc.CallOption) (*MoveRunsResponse, error) - // Kill runs. + // Get a list of 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. @@ -8034,9 +7805,9 @@ type DeterminedServer interface { SearchRuns(context.Context, *SearchRunsRequest) (*SearchRunsResponse, error) // Move runs. MoveRuns(context.Context, *MoveRunsRequest) (*MoveRunsResponse, error) - // Kill runs. + // Get a list of 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/webui/react/src/services/api-ts-sdk/api.ts b/webui/react/src/services/api-ts-sdk/api.ts index f6a2db5e811..c8d8a9a3075 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. @@ -21781,7 +21270,7 @@ export const InternalApiFetchParamCreator = function (configuration?: Configurat }, /** * - * @summary Kill runs. + * @summary Get a list of runs. * @param {V1KillRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -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 @@ -23883,28 +23144,9 @@ export const InternalApiFp = function (configuration?: Configuration) { * @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 {*} [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. @@ -24648,7 +23852,7 @@ export const InternalApiFp = function (configuration?: Configuration) { }, /** * - * @summary Kill runs. + * @summary Get a list of runs. * @param {V1KillRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -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. @@ -26056,7 +25116,7 @@ export const InternalApiFactory = function (configuration?: Configuration, fetch }, /** * - * @summary Kill runs. + * @summary Get a list of runs. * @param {V1KillRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -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. @@ -27141,7 +26105,7 @@ export class InternalApi extends BaseAPI { /** * - * @summary Kill runs. + * @summary Get a list of runs. * @param {V1KillRunsRequest} body * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -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 From 5828df2b6296b28d6c812169ffeaba5befff5be3 Mon Sep 17 00:00:00 2001 From: hkang1 Date: Tue, 19 Nov 2024 19:03:48 -0700 Subject: [PATCH 8/9] chore: update based on PR reviews --- proto/src/determined/api/v1/api.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/src/determined/api/v1/api.proto b/proto/src/determined/api/v1/api.proto index fc5a464674c..97cd4df4bd2 100644 --- a/proto/src/determined/api/v1/api.proto +++ b/proto/src/determined/api/v1/api.proto @@ -2675,7 +2675,7 @@ service Determined { }; } - // Get a list of runs. + // Kill runs. rpc KillRuns(KillRunsRequest) returns (KillRunsResponse) { option (google.api.http) = { post: "/api/v1/runs/kill" From 9b7d857a1328d55b993915f610cb11337a40b19e Mon Sep 17 00:00:00 2001 From: hkang1 Date: Tue, 19 Nov 2024 20:48:13 -0700 Subject: [PATCH 9/9] chore: update generated files --- harness/determined/common/api/bindings.py | 2 +- proto/buf.image.bin | Bin 652973 -> 652964 bytes proto/pkg/apiv1/api.pb.go | 4 ++-- webui/react/src/services/api-ts-sdk/api.ts | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/harness/determined/common/api/bindings.py b/harness/determined/common/api/bindings.py index 3f4231201cc..0602c47a0d9 100644 --- a/harness/determined/common/api/bindings.py +++ b/harness/determined/common/api/bindings.py @@ -21692,7 +21692,7 @@ def post_KillRuns( *, body: "v1KillRunsRequest", ) -> "v1KillRunsResponse": - """Get a list of runs.""" + """Kill runs.""" _params = None _resp = session._do_request( method="POST", diff --git a/proto/buf.image.bin b/proto/buf.image.bin index 3a22b0a12c0b036ccaa66349629c8a90dcc5c4cb..a89a152e202fafaae1b65345bae0cee1744184ed 100644 GIT binary patch delta 80 zcmV-W0I&b8?I)z|CxC