Skip to content

Commit

Permalink
feat: Get/Put/Delete tags on searches (#9934)
Browse files Browse the repository at this point in the history
Co-authored-by: Jesse Amano <jesse.amano@hpe.com>
  • Loading branch information
AmanuelAaron and jesse-amano-hpe authored Sep 20, 2024
1 parent 904fb1f commit 2774476
Show file tree
Hide file tree
Showing 8 changed files with 1,551 additions and 856 deletions.
3 changes: 1 addition & 2 deletions master/internal/api_experiment.go
Original file line number Diff line number Diff line change
Expand Up @@ -3025,8 +3025,7 @@ func (a *apiServer) DeleteExperimentLabel(ctx context.Context,
ModelTableExpr("experiments as e").
Model(exp).
Apply(getExperimentColumns).
Where("e.id = ?", req.ExperimentId).
For("UPDATE")
Where("e.id = ?", req.ExperimentId)
if err = query.Scan(ctx); err != nil {
return nil, err
}
Expand Down
51 changes: 51 additions & 0 deletions master/internal/api_search.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/determined-ai/determined/master/internal/rm"
"github.com/determined-ai/determined/master/internal/sproto"
"github.com/determined-ai/determined/master/pkg/model"
"github.com/determined-ai/determined/proto/pkg/apiv1"
"github.com/determined-ai/determined/proto/pkg/apiv2"
"github.com/determined-ai/determined/proto/pkg/experimentv1"
"github.com/determined-ai/determined/proto/pkg/jobv1"
Expand Down Expand Up @@ -118,3 +119,53 @@ func (a *apiServer) GetSearch(

return &resp, nil
}

func (a *apiServer) GetSearchTags(
ctx context.Context, req *apiv2.GetSearchTagsRequest,
) (*apiv2.GetSearchTagsResponse, error) {
expReq := apiv1.GetExperimentLabelsRequest{
ProjectId: req.ProjectId,
}
expRes, err := a.GetExperimentLabels(ctx, &expReq)
if err != nil {
return nil, err
}
res := apiv2.GetSearchTagsResponse{
Tags: expRes.Labels,
}
return &res, nil
}

func (a *apiServer) PutSearchTag(
ctx context.Context, req *apiv2.PutSearchTagRequest,
) (*apiv2.PutSearchTagResponse, error) {
expReq := apiv1.PutExperimentLabelRequest{
ExperimentId: req.SearchId,
Label: req.Tag,
}
expRes, err := a.PutExperimentLabel(ctx, &expReq)
if err != nil {
return nil, err
}
res := apiv2.PutSearchTagResponse{
Tags: expRes.Labels,
}
return &res, nil
}

func (a *apiServer) DeleteSearchTag(
ctx context.Context, req *apiv2.DeleteSearchTagRequest,
) (*apiv2.DeleteSearchTagResponse, error) {
expReq := apiv1.DeleteExperimentLabelRequest{
ExperimentId: req.SearchId,
Label: req.Tag,
}
expRes, err := a.DeleteExperimentLabel(ctx, &expReq)
if err != nil {
return nil, err
}
res := apiv2.DeleteSearchTagResponse{
Tags: expRes.Labels,
}
return &res, nil
}
69 changes: 69 additions & 0 deletions master/internal/api_search_intg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,15 @@ package internal
import (
"encoding/json"
"testing"
"time"

"github.com/google/uuid"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/structpb"

"github.com/determined-ai/determined/master/internal/db"
"github.com/determined-ai/determined/master/pkg/model"
"github.com/determined-ai/determined/master/pkg/schemas"
"github.com/determined-ai/determined/proto/pkg/apiv2"
)

Expand Down Expand Up @@ -41,3 +45,68 @@ func TestGetSearchConfig(t *testing.T) {
})
}
}

func TestGetPutDeleteSearchTags(t *testing.T) {
api, curUser, ctx := setupAPITest(t, nil)
_, projectIDInt := createProjectAndWorkspace(ctx, t, api)
projectID := int32(projectIDInt)

activeConfig := schemas.WithDefaults(minExpConfig)
exp := &model.Experiment{
JobID: model.JobID(uuid.New().String()),
State: model.CompletedState,
OwnerID: &curUser.ID,
ProjectID: projectIDInt,
StartTime: time.Now(),
Config: activeConfig.AsLegacy(),
}
require.NoError(t, api.m.db.AddExperiment(exp, []byte{10, 11, 12}, activeConfig))

// Runs are required for delete tags to work
task := &model.Task{TaskType: model.TaskTypeTrial, TaskID: model.NewTaskID()}
require.NoError(t, db.AddTask(ctx, task))
require.NoError(t, db.AddTrial(ctx, &model.Trial{
State: model.PausedState,
ExperimentID: exp.ID,
StartTime: time.Now(),
}, task.TaskID))

// No tags initially
getResp, err := api.GetSearchTags(ctx, &apiv2.GetSearchTagsRequest{
ProjectId: projectID,
})
require.NoError(t, err)
require.Empty(t, getResp.Tags)

// Put new tag
testTag := "testTag"
putResp, err := api.PutSearchTag(ctx, &apiv2.PutSearchTagRequest{
SearchId: int32(exp.ID),
Tag: testTag,
})
require.NoError(t, err)
require.Len(t, putResp.Tags, 1)
require.Equal(t, putResp.Tags[0], testTag)

// Tags should be present
getResp, err = api.GetSearchTags(ctx, &apiv2.GetSearchTagsRequest{
ProjectId: projectID,
})
require.NoError(t, err)
require.Len(t, getResp.Tags, 1)

// Delete tag
deleteResp, err := api.DeleteSearchTag(ctx, &apiv2.DeleteSearchTagRequest{
SearchId: int32(exp.ID),
Tag: testTag,
})
require.NoError(t, err)
require.Empty(t, deleteResp.Tags)

// No more tags in project
getResp, err = api.GetSearchTags(ctx, &apiv2.GetSearchTagsRequest{
ProjectId: projectID,
})
require.NoError(t, err)
require.Empty(t, getResp.Tags)
}
294 changes: 225 additions & 69 deletions proto/pkg/apiv2/api.pb.go

Large diffs are not rendered by default.

Loading

0 comments on commit 2774476

Please sign in to comment.