From 67f1f536ad087ca9976f093e1f3477cec57f4985 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Mon, 17 Oct 2022 14:26:16 -0400 Subject: [PATCH] 18863: Add Log methods to golang API interface. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- lib/controller/federation/conn.go | 20 +++++++++++++ lib/controller/federation/generate.go | 2 +- lib/controller/federation/generated.go | 41 ++++++++++++++++++++++++++ lib/controller/router/router.go | 35 ++++++++++++++++++++++ lib/controller/rpc/conn.go | 35 ++++++++++++++++++++++ sdk/go/arvados/api.go | 10 +++++++ sdk/go/arvados/log.go | 7 +++-- sdk/go/arvadostest/api.go | 20 +++++++++++++ 8 files changed, 167 insertions(+), 3 deletions(-) diff --git a/lib/controller/federation/conn.go b/lib/controller/federation/conn.go index 89f68a5ef1..03690af026 100644 --- a/lib/controller/federation/conn.go +++ b/lib/controller/federation/conn.go @@ -515,6 +515,26 @@ func (conn *Conn) LinkDelete(ctx context.Context, options arvados.DeleteOptions) return conn.chooseBackend(options.UUID).LinkDelete(ctx, options) } +func (conn *Conn) LogCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Log, error) { + return conn.chooseBackend(options.ClusterID).LogCreate(ctx, options) +} + +func (conn *Conn) LogUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.Log, error) { + return conn.chooseBackend(options.UUID).LogUpdate(ctx, options) +} + +func (conn *Conn) LogGet(ctx context.Context, options arvados.GetOptions) (arvados.Log, error) { + return conn.chooseBackend(options.UUID).LogGet(ctx, options) +} + +func (conn *Conn) LogList(ctx context.Context, options arvados.ListOptions) (arvados.LogList, error) { + return conn.generated_LogList(ctx, options) +} + +func (conn *Conn) LogDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Log, error) { + return conn.chooseBackend(options.UUID).LogDelete(ctx, options) +} + func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions) (arvados.SpecimenList, error) { return conn.generated_SpecimenList(ctx, options) } diff --git a/lib/controller/federation/generate.go b/lib/controller/federation/generate.go index 8af6131564..86bbf9d9e3 100644 --- a/lib/controller/federation/generate.go +++ b/lib/controller/federation/generate.go @@ -53,7 +53,7 @@ func main() { defer out.Close() out.Write(regexp.MustCompile(`(?ms)^.*package .*?import.*?\n\)\n`).Find(buf)) io.WriteString(out, "//\n// -- this file is auto-generated -- do not edit -- edit list.go and run \"go generate\" instead --\n//\n\n") - for _, t := range []string{"Container", "ContainerRequest", "Group", "Specimen", "User", "Link", "APIClientAuthorization"} { + for _, t := range []string{"Container", "ContainerRequest", "Group", "Specimen", "User", "Link", "Log", "APIClientAuthorization"} { _, err := out.Write(bytes.ReplaceAll(orig, []byte("Collection"), []byte(t))) if err != nil { panic(err) diff --git a/lib/controller/federation/generated.go b/lib/controller/federation/generated.go index 66f36161d5..637a1ce919 100755 --- a/lib/controller/federation/generated.go +++ b/lib/controller/federation/generated.go @@ -263,6 +263,47 @@ func (conn *Conn) generated_LinkList(ctx context.Context, options arvados.ListOp return merged, err } +func (conn *Conn) generated_LogList(ctx context.Context, options arvados.ListOptions) (arvados.LogList, error) { + var mtx sync.Mutex + var merged arvados.LogList + var needSort atomic.Value + needSort.Store(false) + err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) { + options.ForwardedFor = conn.cluster.ClusterID + "-" + options.ForwardedFor + cl, err := backend.LogList(ctx, options) + if err != nil { + return nil, err + } + mtx.Lock() + defer mtx.Unlock() + if len(merged.Items) == 0 { + merged = cl + } else if len(cl.Items) > 0 { + merged.Items = append(merged.Items, cl.Items...) + needSort.Store(true) + } + uuids := make([]string, 0, len(cl.Items)) + for _, item := range cl.Items { + uuids = append(uuids, item.UUID) + } + return uuids, nil + }) + if needSort.Load().(bool) { + // Apply the default/implied order, "modified_at desc" + sort.Slice(merged.Items, func(i, j int) bool { + mi, mj := merged.Items[i].ModifiedAt, merged.Items[j].ModifiedAt + return mj.Before(mi) + }) + } + if merged.Items == nil { + // Return empty results as [], not null + // (https://github.com/golang/go/issues/27589 might be + // a better solution in the future) + merged.Items = []arvados.Log{} + } + return merged, err +} + func (conn *Conn) generated_APIClientAuthorizationList(ctx context.Context, options arvados.ListOptions) (arvados.APIClientAuthorizationList, error) { var mtx sync.Mutex var merged arvados.APIClientAuthorizationList diff --git a/lib/controller/router/router.go b/lib/controller/router/router.go index 80d5e92985..d4712558ea 100644 --- a/lib/controller/router/router.go +++ b/lib/controller/router/router.go @@ -367,6 +367,41 @@ func (rtr *router) addRoutes() { return rtr.backend.LinkDelete(ctx, *opts.(*arvados.DeleteOptions)) }, }, + { + arvados.EndpointLogCreate, + func() interface{} { return &arvados.CreateOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.backend.LogCreate(ctx, *opts.(*arvados.CreateOptions)) + }, + }, + { + arvados.EndpointLogUpdate, + func() interface{} { return &arvados.UpdateOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.backend.LogUpdate(ctx, *opts.(*arvados.UpdateOptions)) + }, + }, + { + arvados.EndpointLogList, + func() interface{} { return &arvados.ListOptions{Limit: -1} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.backend.LogList(ctx, *opts.(*arvados.ListOptions)) + }, + }, + { + arvados.EndpointLogGet, + func() interface{} { return &arvados.GetOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.backend.LogGet(ctx, *opts.(*arvados.GetOptions)) + }, + }, + { + arvados.EndpointLogDelete, + func() interface{} { return &arvados.DeleteOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.backend.LogDelete(ctx, *opts.(*arvados.DeleteOptions)) + }, + }, { arvados.EndpointSpecimenCreate, func() interface{} { return &arvados.CreateOptions{} }, diff --git a/lib/controller/rpc/conn.go b/lib/controller/rpc/conn.go index 0e532f23c0..4d8a82ce43 100644 --- a/lib/controller/rpc/conn.go +++ b/lib/controller/rpc/conn.go @@ -559,6 +559,41 @@ func (conn *Conn) LinkDelete(ctx context.Context, options arvados.DeleteOptions) return resp, err } +func (conn *Conn) LogCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Log, error) { + ep := arvados.EndpointLogCreate + var resp arvados.Log + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} + +func (conn *Conn) LogUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.Log, error) { + ep := arvados.EndpointLogUpdate + var resp arvados.Log + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} + +func (conn *Conn) LogGet(ctx context.Context, options arvados.GetOptions) (arvados.Log, error) { + ep := arvados.EndpointLogGet + var resp arvados.Log + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} + +func (conn *Conn) LogList(ctx context.Context, options arvados.ListOptions) (arvados.LogList, error) { + ep := arvados.EndpointLogList + var resp arvados.LogList + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} + +func (conn *Conn) LogDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Log, error) { + ep := arvados.EndpointLogDelete + var resp arvados.Log + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} + func (conn *Conn) SpecimenCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Specimen, error) { ep := arvados.EndpointSpecimenCreate var resp arvados.Specimen diff --git a/sdk/go/arvados/api.go b/sdk/go/arvados/api.go index 3797a17f50..bec387e857 100644 --- a/sdk/go/arvados/api.go +++ b/sdk/go/arvados/api.go @@ -70,6 +70,11 @@ var ( EndpointLinkGet = APIEndpoint{"GET", "arvados/v1/links/{uuid}", ""} EndpointLinkList = APIEndpoint{"GET", "arvados/v1/links", ""} EndpointLinkDelete = APIEndpoint{"DELETE", "arvados/v1/links/{uuid}", ""} + EndpointLogCreate = APIEndpoint{"POST", "arvados/v1/logs", "log"} + EndpointLogUpdate = APIEndpoint{"PATCH", "arvados/v1/logs/{uuid}", "log"} + EndpointLogGet = APIEndpoint{"GET", "arvados/v1/logs/{uuid}", ""} + EndpointLogList = APIEndpoint{"GET", "arvados/v1/logs", ""} + EndpointLogDelete = APIEndpoint{"DELETE", "arvados/v1/logs/{uuid}", ""} EndpointSysTrashSweep = APIEndpoint{"POST", "sys/trash_sweep", ""} EndpointUserActivate = APIEndpoint{"POST", "arvados/v1/users/{uuid}/activate", ""} EndpointUserCreate = APIEndpoint{"POST", "arvados/v1/users", "user"} @@ -284,6 +289,11 @@ type API interface { LinkGet(ctx context.Context, options GetOptions) (Link, error) LinkList(ctx context.Context, options ListOptions) (LinkList, error) LinkDelete(ctx context.Context, options DeleteOptions) (Link, error) + LogCreate(ctx context.Context, options CreateOptions) (Log, error) + LogUpdate(ctx context.Context, options UpdateOptions) (Log, error) + LogGet(ctx context.Context, options GetOptions) (Log, error) + LogList(ctx context.Context, options ListOptions) (LogList, error) + LogDelete(ctx context.Context, options DeleteOptions) (Log, error) SpecimenCreate(ctx context.Context, options CreateOptions) (Specimen, error) SpecimenUpdate(ctx context.Context, options UpdateOptions) (Specimen, error) SpecimenGet(ctx context.Context, options GetOptions) (Specimen, error) diff --git a/sdk/go/arvados/log.go b/sdk/go/arvados/log.go index 6f72634e54..06d7987e32 100644 --- a/sdk/go/arvados/log.go +++ b/sdk/go/arvados/log.go @@ -12,12 +12,15 @@ import ( type Log struct { ID uint64 `json:"id"` UUID string `json:"uuid"` + OwnerUUID string `json:"owner_uuid"` ObjectUUID string `json:"object_uuid"` ObjectOwnerUUID string `json:"object_owner_uuid"` EventType string `json:"event_type"` - EventAt *time.Time `json:"event"` + EventAt time.Time `json:"event"` + Summary string `json:"summary"` Properties map[string]interface{} `json:"properties"` - CreatedAt *time.Time `json:"created_at"` + CreatedAt time.Time `json:"created_at"` + ModifiedAt time.Time `json:"modified_at"` } // LogList is an arvados#logList resource. diff --git a/sdk/go/arvadostest/api.go b/sdk/go/arvadostest/api.go index d6da579d6b..83efd88928 100644 --- a/sdk/go/arvadostest/api.go +++ b/sdk/go/arvadostest/api.go @@ -193,6 +193,26 @@ func (as *APIStub) LinkDelete(ctx context.Context, options arvados.DeleteOptions as.appendCall(ctx, as.LinkDelete, options) return arvados.Link{}, as.Error } +func (as *APIStub) LogCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Log, error) { + as.appendCall(ctx, as.LogCreate, options) + return arvados.Log{}, as.Error +} +func (as *APIStub) LogUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.Log, error) { + as.appendCall(ctx, as.LogUpdate, options) + return arvados.Log{}, as.Error +} +func (as *APIStub) LogGet(ctx context.Context, options arvados.GetOptions) (arvados.Log, error) { + as.appendCall(ctx, as.LogGet, options) + return arvados.Log{}, as.Error +} +func (as *APIStub) LogList(ctx context.Context, options arvados.ListOptions) (arvados.LogList, error) { + as.appendCall(ctx, as.LogList, options) + return arvados.LogList{}, as.Error +} +func (as *APIStub) LogDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Log, error) { + as.appendCall(ctx, as.LogDelete, options) + return arvados.Log{}, as.Error +} func (as *APIStub) SpecimenCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Specimen, error) { as.appendCall(ctx, as.SpecimenCreate, options) return arvados.Specimen{}, as.Error -- 2.39.5