diff --git a/internal/grpc/pb/vantage.pb.go b/internal/grpc/pb/vantage.pb.go index bfd3548..a914114 100644 --- a/internal/grpc/pb/vantage.pb.go +++ b/internal/grpc/pb/vantage.pb.go @@ -206,6 +206,10 @@ type ServerCommand struct { CleanupWorkspace *CleanupWorkspaceCmd `json:"cleanup_workspace,omitempty"` OpenProxy *OpenProxyCmd `json:"open_proxy,omitempty"` Ping *PingCmd `json:"ping,omitempty"` + + RefreshWorkloads *RefreshWorkloadsCmd `json:"refresh_workloads,omitempty"` + ControlWorkload *ControlWorkloadCmd `json:"control_workload,omitempty"` + WorkloadLogs *WorkloadLogsCmd `json:"workload_logs,omitempty"` } // PingCmd is a server-originated liveness beat. It carries nothing and expects @@ -243,6 +247,8 @@ type AgentMessage struct { Result *CommandResult `json:"result,omitempty"` StepResult *StepResult `json:"step_result,omitempty"` StepOutput *StepOutputChunk `json:"step_output,omitempty"` + + WorkloadLogsResult *WorkloadLogsResult `json:"workload_logs_result,omitempty"` } type AgentReady struct{} @@ -377,6 +383,7 @@ type VantageClient interface { UploadGeneratedKey(ctx context.Context, in *UploadKeyRequest, opts ...grpc.CallOption) (*UploadKeyResponse, error) ReportUpdates(ctx context.Context, in *ReportUpdatesRequest, opts ...grpc.CallOption) (*ReportUpdatesResponse, error) ReportPackages(ctx context.Context, in *ReportPackagesRequest, opts ...grpc.CallOption) (*ReportPackagesResponse, error) + ReportWorkloads(ctx context.Context, in *ReportWorkloadsRequest, opts ...grpc.CallOption) (*ReportWorkloadsResponse, error) ReportInventory(ctx context.Context, in *InventoryReport, opts ...grpc.CallOption) (*InventoryReportResponse, error) SyncMonitors(ctx context.Context, in *SyncMonitorsRequest, opts ...grpc.CallOption) (*SyncMonitorsResponse, error) ReportChecks(ctx context.Context, in *ReportChecksRequest, opts ...grpc.CallOption) (*ReportChecksResponse, error) diff --git a/internal/grpc/pb/workloads.pb.go b/internal/grpc/pb/workloads.pb.go new file mode 100644 index 0000000..3222e41 --- /dev/null +++ b/internal/grpc/pb/workloads.pb.go @@ -0,0 +1,77 @@ +package pb + +import ( + "context" + + "google.golang.org/grpc" +) + +// Workload registry messages. Hand-written like the rest of this package: the +// .proto is the contract, this file is the Go side of it, and the two must be +// changed together. + +// Workload is one container or one systemd unit. +type Workload struct { + Kind string `json:"kind"` + Id string `json:"id"` + Name string `json:"name"` + State string `json:"state"` + Health string `json:"health,omitempty"` + Image string `json:"image,omitempty"` + Stack string `json:"stack,omitempty"` + Ports []string `json:"ports,omitempty"` + Restarts int32 `json:"restarts,omitempty"` + StartedAt string `json:"started_at,omitempty"` // RFC3339, empty when not running + Protected bool `json:"protected,omitempty"` +} + +// ReportWorkloadsRequest carries what a server is running. +// +// Offer-then-send, the same handshake as ReportPackages: the agent calls once +// with Workloads empty, and resends with the body only if NeedFull is set. +type ReportWorkloadsRequest struct { + ServerId string `json:"server_id"` + AgentToken string `json:"agent_token"` + Hash string `json:"hash"` + DockerOk bool `json:"docker_ok"` + DockerError string `json:"docker_error,omitempty"` + SystemdOk bool `json:"systemd_ok"` + SystemdError string `json:"systemd_error,omitempty"` + Workloads []Workload `json:"workloads,omitempty"` // empty on the offer call +} + +type ReportWorkloadsResponse struct { + NeedFull bool `json:"need_full"` +} + +// RefreshWorkloadsCmd carries no payload back. It makes the agent report +// immediately through ReportWorkloads, so there is exactly one writer for the +// server_workloads collection rather than two arriving by different routes. +type RefreshWorkloadsCmd struct{} + +type ControlWorkloadCmd struct { + Kind string `json:"kind"` + Id string `json:"id"` + Action string `json:"action"` // start | stop | restart +} + +type WorkloadLogsCmd struct { + Kind string `json:"kind"` + Id string `json:"id"` + Tail int32 `json:"tail,omitempty"` +} + +type WorkloadLogsResult struct { + CommandId string `json:"command_id"` + Text string `json:"text,omitempty"` + Truncated bool `json:"truncated,omitempty"` + Error string `json:"error,omitempty"` +} + +func (c *keyManagerClient) ReportWorkloads(ctx context.Context, in *ReportWorkloadsRequest, opts ...grpc.CallOption) (*ReportWorkloadsResponse, error) { + out := new(ReportWorkloadsResponse) + if err := c.cc.Invoke(ctx, "/vantage.v1.Vantage/ReportWorkloads", in, out, opts...); err != nil { + return nil, err + } + return out, nil +}