Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions agent/agentsocket/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package agentsocket

import (
"context"
"time"

"golang.org/x/xerrors"
"storj.io/drpc"
Expand Down Expand Up @@ -134,14 +135,48 @@ func (c *Client) SyncStatus(ctx context.Context, unitName unit.ID) (SyncStatusRe
})
}

var history []UnitEvent
for _, ev := range resp.History {
history = append(history, unitEventFromProto(ev))
}

return SyncStatusResponse{
UnitName: unitName,
Status: unit.Status(resp.Status),
IsReady: resp.IsReady,
Dependencies: dependencies,
History: history,
}, nil
}

// SyncTimeline returns the full event log of unit status transitions and
// dependency declarations across all units, ordered by sequence number.
func (c *Client) SyncTimeline(ctx context.Context) ([]UnitEvent, error) {
resp, err := c.client.SyncTimeline(ctx, &proto.SyncTimelineRequest{})
if err != nil {
return nil, err
}

events := make([]UnitEvent, 0, len(resp.Events))
for _, ev := range resp.Events {
events = append(events, unitEventFromProto(ev))
}
return events, nil
}

func unitEventFromProto(ev *proto.UnitEvent) UnitEvent {
return UnitEvent{
SequenceNumber: ev.GetSequenceNumber(),
Time: ev.GetTime().AsTime(),
Kind: unit.EventKind(ev.GetKind()),
UnitID: unit.ID(ev.GetUnitId()),
FromStatus: unit.Status(ev.GetFromStatus()),
ToStatus: unit.Status(ev.GetToStatus()),
DependsOnUnit: unit.ID(ev.GetDependsOnUnit()),
RequiredStatus: unit.Status(ev.GetRequiredStatus()),
}
}

// SyncList returns all registered units and their current statuses.
func (c *Client) SyncList(ctx context.Context) ([]SyncListItem, error) {
resp, err := c.client.SyncList(ctx, &proto.SyncListRequest{})
Expand Down Expand Up @@ -258,6 +293,7 @@ type SyncStatusResponse struct {
Status unit.Status `table:"status" json:"status"`
IsReady bool `table:"ready" json:"is_ready"`
Dependencies []DependencyInfo `table:"dependencies" json:"dependencies"`
History []UnitEvent `table:"history" json:"history"`
}

// SyncListItem contains summary information for a single unit.
Expand All @@ -275,6 +311,19 @@ type DependencyInfo struct {
IsSatisfied bool `table:"satisfied" json:"is_satisfied"`
}

// UnitEvent is an immutable record of a change to the dependency graph:
// either a unit status transition or a dependency declaration.
type UnitEvent struct {
SequenceNumber uint64 `table:"sequence_number,default_sort" json:"sequence_number"`
Time time.Time `table:"time" json:"time"`
Kind unit.EventKind `table:"kind" json:"kind"`
UnitID unit.ID `table:"unit" json:"unit_id"`
FromStatus unit.Status `table:"from" json:"from_status,omitempty"`
ToStatus unit.Status `table:"to" json:"to_status,omitempty"`
DependsOnUnit unit.ID `table:"depends on" json:"depends_on_unit,omitempty"`
RequiredStatus unit.Status `table:"required status" json:"required_status,omitempty"`
}

// ContextSource is a registered workspace-context scan root.
type ContextSource struct {
Path string `table:"path,default_sort" json:"path"`
Expand Down
Loading
Loading