Documentation
¶
Overview ¶
Package readmodel is the operator read model: the pure reads over persisted state that the console's screens and the command line issue. Every function here is a read of what the registry, the rendered policy store, and the flow store already hold, shaped for the screen that asks; nothing here computes what a query could return, and nothing here writes. The operator surface's handlers and the command line call these functions and nothing else, which is what keeps the two transports from drifting (ADR-0007 as amended, ADR-0021).
The flow reads go through the FlowStore interface (ADR-0009): a rollup is one of a closed set of named groupings, aggregated in the store and bounded (ADR-0007 as amended); peers come back as ingestion resolved them, never re-resolved at read time (ADR-0019); flow lists paginate by cursor keyed on window start and row id. Workload reads pair the registry's record with the latest rendered version so sync drift is one read, and derive nothing but the credential state, which is a function of the stored expiry, the stored renewal error, the clock, and the renewal grace the control plane serves with.
Index ¶
- Constants
- Variables
- func GapKindName(k innerwallv1.EvidenceGapKind) string
- func GapSourceName(s innerwallv1.EvidenceSource) string
- func IsUnknown(err error) bool
- func OwnedTableStateName(s innerwallv1.OwnedTableState) string
- func ParseSyncState(s string) (innerwallv1.SyncState, error)
- func ParseVerdict(s string) (innerwallv1.PolicyDecision, error)
- func SyncStateName(s innerwallv1.SyncState) string
- func TerminalVerdict(mode innerwallv1.EnforcementMode) innerwallv1.PolicyDecision
- func VerdictName(d innerwallv1.PolicyDecision) string
- type Counters
- type CredentialLifecycle
- type CredentialState
- type CredentialStatus
- type Flow
- type FlowsPage
- type FlowsRequest
- type Gap
- type Gaps
- type GapsRequest
- type GroupKeys
- type Health
- type Lifecycle
- type PeerRef
- type Range
- type Reader
- func (s *Reader) CountWorkloads(ctx context.Context) (*WorkloadCounts, error)
- func (s *Reader) Gaps(ctx context.Context, req GapsRequest) (*Gaps, error)
- func (s *Reader) GetWorkload(ctx context.Context, id identity.WorkloadID) (*Workload, error)
- func (s *Reader) ListFlows(ctx context.Context, req FlowsRequest) (*FlowsPage, error)
- func (s *Reader) ListWorkloads(ctx context.Context, req WorkloadsRequest) (*WorkloadsPage, error)
- func (s *Reader) RenderedPolicy(ctx context.Context, id identity.WorkloadID) (*RenderedPolicy, error)
- func (s *Reader) Rollup(ctx context.Context, req RollupRequest) (*Rollup, error)
- type RenderedPolicy
- type RenderedRule
- type Rollup
- type RollupGroup
- type RollupRequest
- type RuleRef
- type RulesetRef
- type Service
- type StatusCount
- type Store
- type SyncStatus
- type Workload
- type WorkloadCounts
- type WorkloadCursor
- type WorkloadPageQuery
- type WorkloadRecord
- type WorkloadRef
- type WorkloadsPage
- type WorkloadsRequest
Constants ¶
const ( DefaultGapLimit = 500 MaxGapLimit = 5000 )
DefaultGapLimit and MaxGapLimit bound the evidence gaps one read returns.
const ( DefaultWorkloadPageLimit = 100 MaxWorkloadPageLimit = 500 )
Page limits for the fleet list.
const DefaultRange = 24 * time.Hour
DefaultRange is the range a read covers when none is given: the last day up to now.
const RetiredRank int32 = 5
RetiredRank is the fleet order's rank of a retired workload: below every rank of the attention ordering, which a retired workload is outside. The retired list sorts by retirement instant within it.
const TelemetryLiveWindows = 2
TelemetryLiveWindows is how many flow windows may pass since the last report while a workload's telemetry is still live. The reporter ships one window per window length; two allow one late report.
Variables ¶
var ( // ErrInvalidRange is returned when a range's end is not after its // start. ErrInvalidRange = errors.New("readmodel: the end of the range must be after its start") // ErrInvalidCursor is returned for a cursor this read model did not // issue. ErrInvalidCursor = errors.New("readmodel: the cursor is not one this read issued") // ErrWorkloadRequired is returned by a read that has no unbounded // form when it is asked for one. ErrWorkloadRequired = errors.New("readmodel: a workload is required") // ErrInvalidService is returned for a service that is not // <protocol>/<port> or icmp. ErrInvalidService = errors.New("readmodel: a service is <protocol>/<port>, or icmp") )
Errors a caller branches on. A transport maps each to its own problem; the command line prints them.
var ErrUnknownLifecycle = errors.New("readmodel: lifecycle must be active or retired")
ErrUnknownLifecycle is a fleet read asking for a lifecycle state that does not exist.
Functions ¶
func GapKindName ¶
func GapKindName(k innerwallv1.EvidenceGapKind) string
GapKindName is a gap kind as the surface and the command line name it.
func GapSourceName ¶
func GapSourceName(s innerwallv1.EvidenceSource) string
GapSourceName is a gap's source as the surface and the command line name it; empty for a loss that is not one source's.
func OwnedTableStateName ¶ added in v0.2.0
func OwnedTableStateName(s innerwallv1.OwnedTableState) string
OwnedTableStateName is the owned table's state as the surface and the command line name it: present, absent, or unknown.
func ParseSyncState ¶
func ParseSyncState(s string) (innerwallv1.SyncState, error)
ParseSyncState parses a sync state name: synced, pending, degraded, or offline. Empty means every state.
func ParseVerdict ¶
func ParseVerdict(s string) (innerwallv1.PolicyDecision, error)
ParseVerdict parses a decision name: observed, allowed, would_block, or blocked. Empty means every decision.
func SyncStateName ¶
func SyncStateName(s innerwallv1.SyncState) string
SyncStateName is the inverse of ParseSyncState.
func TerminalVerdict ¶
func TerminalVerdict(mode innerwallv1.EnforcementMode) innerwallv1.PolicyDecision
TerminalVerdict is what traffic no rendered rule admits receives under a mode: observed in visibility, would_block in simulation, blocked when enforced (ADR-0020).
func VerdictName ¶
func VerdictName(d innerwallv1.PolicyDecision) string
VerdictName is the inverse of ParseVerdict.
Types ¶
type Counters ¶
type Counters struct {
// FlowCount is the number of stored records.
FlowCount int64
ConnectionCount uint64
ByteCount uint64
}
Counters are the summed counts of a group or of a whole rollup.
type CredentialLifecycle ¶ added in v0.5.0
type CredentialLifecycle string
CredentialLifecycle is what the control plane will still accept from a workload's credential, judged on its stored expiry by the rule that admits a presented one (enroll.StandingAt) and the renewal grace this control plane is configured with, which no client can know.
const ( // CredentialValid: not yet expired. CredentialValid CredentialLifecycle = "valid" // CredentialInGrace: expired within the renewal grace. The agent // keeps retrying renewal, and the workload recovers by itself, with // the same identity, once one succeeds. CredentialInGrace CredentialLifecycle = "in-grace" // CredentialPastGrace: expired beyond the renewal grace. Nothing // accepts it; the workload returns only by enrolling again with a new // provisioning token, as a new identity. CredentialPastGrace CredentialLifecycle = "past-grace" )
Credential lifecycle states.
type CredentialState ¶
type CredentialState string
CredentialState is the state of a workload's credential as the stored expiry, the stored renewal error, and the clock give it (ADR-0016).
const ( // CredentialRenews: the credential is valid and the last automatic // renewal, if any was due, succeeded. CredentialRenews CredentialState = "renews" // CredentialRenewalFailed: the credential is still valid but the // agent's last renewal attempt failed; it is heading for expiry. CredentialRenewalFailed CredentialState = "renewal-failed" // CredentialExpired: the credential has lapsed. The agent keeps // retrying renewal, which the control plane accepts within its // renewal grace; beyond it the workload must re-enroll (ADR-0016 as // amended). CredentialExpired CredentialState = "expired" )
Credential states.
type CredentialStatus ¶
type CredentialStatus struct {
State CredentialState
// Lifecycle is what the control plane will still accept from the
// credential, and RenewableUntil the instant the renewal grace after
// its expiry ends.
Lifecycle CredentialLifecycle
RenewableUntil time.Time
// Serial and ExpiresAt are the credential last issued, which State
// and Lifecycle judge.
Serial string
ExpiresAt time.Time
LastRenewedAt *time.Time
LastError string
// LastLateRenewal is the workload's latest late renewal; nil when it
// has never renewed late. A later on-time renewal leaves it.
LastLateRenewal *registry.LateRenewal
// LastPresented is the credential the workload's most recent sync
// stream opened on; nil when none has been recorded. It is the one in
// use only while the sync state says a stream is open, and differs
// from the issued one while a stream outlives a renewal.
LastPresented *registry.PresentedCredential
}
CredentialStatus is a workload's credential as the console shows it.
type Flow ¶
type Flow struct {
ID int64
WindowStart time.Time
WindowEnd time.Time
Peer PeerRef
SrcAddress netip.Addr
DstAddress netip.Addr
Service Service
Direction innerwallv1.Direction
Verdict innerwallv1.PolicyDecision
Rule *RuleRef
ConnectionCount uint64
ByteCount uint64
FirstSeen time.Time
LastSeen time.Time
ProcessName string
}
Flow is one stored window row as the operator sees it.
type FlowsPage ¶
type FlowsPage struct {
Workload WorkloadRef
Range Range
Flows []Flow
NextCursor string
}
FlowsPage is one page of flows, newest window first. NextCursor is empty on the last page.
type FlowsRequest ¶
type FlowsRequest struct {
Workload identity.WorkloadID
From time.Time
To time.Time
Verdict innerwallv1.PolicyDecision
Direction innerwallv1.Direction
Peer string
Service *Service
Cursor string
// Limit bounds the page; the store's default and maximum apply.
Limit int
}
FlowsRequest asks for one page of a workload's stored windows. Workload is required: there is no unbounded scan. A zero From or To takes the default range; a zero Verdict or Direction means any; an empty Peer means every peer, otherwise the stored peer key (a workload id, an address group id, or an address); a nil Service means every service. Cursor continues a previous page; empty is the first page.
type Gap ¶
type Gap struct {
Workload WorkloadRef
Kind innerwallv1.EvidenceGapKind
Source innerwallv1.EvidenceSource
From time.Time
To time.Time
Count *uint64
}
Gap is one interval [From, To) in which a workload's flow evidence is known to be incomplete (ADR-0019 as amended). Count is the records or table entries lost, nil when unknown.
type Gaps ¶
Gaps is the result of a gaps read: the range asked, the gaps intersecting it newest first, and whether more exist beyond the limit.
type GapsRequest ¶
type GapsRequest struct {
From time.Time
To time.Time
Workload *identity.WorkloadID
Selector policy.Selector
Limit int
}
GapsRequest asks for the evidence gaps of a workload set that intersect a range. The range, Workload, and Selector follow RollupRequest: a nil Workload and empty Selector cover every workload, and a Selector is resolved to the workloads it currently matches. Limit bounds the gaps; DefaultGapLimit when zero, MaxGapLimit at most.
type GroupKeys ¶
type GroupKeys struct {
Rule *RuleRef
Peer *PeerRef
Src *PeerRef
Dst *WorkloadRef
Service *Service
}
GroupKeys are the dimensions of one group. Which are set follows the grouping: Rule for rule and rule,peer (nil for the group of records no rule admitted); Peer for rule,peer and peer,service; Src for src,dst; Dst for src,dst and dst,service; Service for dst,service and peer,service.
type Health ¶
type Health struct {
LastSeenAt *time.Time
Credential CredentialStatus
DroppedFlowRecords uint64
// SourceOverruns counts the moments the kernel dropped events because
// one of the agent's flow sources fell behind, since the agent
// started; each is also an evidence gap with its interval.
SourceOverruns uint64
// ClockSkew is the latest flow report whose agent clock was beyond
// the tolerance, and whether it is still the latest reading; nil when
// none has been received.
ClockSkew *registry.ClockSkew
// OwnedTable is whether the agent's owned firewall table is in the
// kernel, as its heartbeats last said; unspecified until one that
// knows has arrived. OwnedTableAbsentSince is when the control plane
// first heard it was absent, nil unless it is. An absent table means
// the host enforces and observes nothing, whatever the sync state
// says of the version the agent acknowledged (issue #64).
OwnedTable innerwallv1.OwnedTableState
OwnedTableAbsentSince *time.Time
// LastFlowReportAt is when the control plane last received a flow
// report from the agent; nil when none has been. TelemetryLive says
// one arrived within TelemetryLiveWindows flow windows of the read: the
// agent is running and reaching the control plane, whatever its sync
// stream's state, which travels on another connection (issue #61).
LastFlowReportAt *time.Time
TelemetryLive bool
}
Health is what the agent's heartbeats and renewals have recorded.
type Lifecycle ¶ added in v0.5.0
type Lifecycle string
Lifecycle is where a workload stands in its life (ADR-0023): active, or retired by the operator. It is a state of its own, distinct from every sync state: offline is something to fix, and retired is something the operator decided.
type PeerRef ¶
PeerRef is a resolved peer as ingestion stored it (ADR-0019): its kind and key, the label snapshot captured at the time for a workload peer, and the name the registry currently gives the identity (a workload's hostname, an address group's name), which is looked up by the stored identity for display and is empty when the identity is no longer registered. An unresolved peer's key is its address.
type Reader ¶
type Reader struct {
Store Store
Flows flowstore.FlowStore
// FlowWindow is the flow aggregation window the control plane hands
// agents; a workload's telemetry is live while a report has arrived
// within TelemetryLiveWindows of it. Zero judges no telemetry live.
FlowWindow time.Duration
// RenewalGrace is the renewal grace the control plane admits expired
// credentials under, which a workload's credential lifecycle is
// judged by; enroll.DefaultRenewalGrace if zero. The control plane
// passes the grace it serves with.
RenewalGrace time.Duration
// Now is the clock; time.Now if nil.
Now func() time.Time
}
Reader is the read model. The command line and the operator surface hold one each over the same store.
func (*Reader) CountWorkloads ¶ added in v0.2.0
func (s *Reader) CountWorkloads(ctx context.Context) (*WorkloadCounts, error)
CountWorkloads returns how many workloads the fleet holds, in total, in each sync state, and removed, from one read of the store, so the counts agree with each other. A count is exact or the read fails: an active workload stored in a state outside the four is an error, removed or not, never left out of a total. A retired workload counts in Retired whatever its last sync state.
func (*Reader) Gaps ¶
Gaps reads the evidence gaps of a workload set intersecting a range, through the store's one named statement.
func (*Reader) GetWorkload ¶
GetWorkload returns one workload, or registry.ErrWorkloadUnknown.
func (*Reader) ListWorkloads ¶
func (s *Reader) ListWorkloads(ctx context.Context, req WorkloadsRequest) (*WorkloadsPage, error)
ListWorkloads returns one page of the fleet.
func (*Reader) RenderedPolicy ¶
func (s *Reader) RenderedPolicy(ctx context.Context, id identity.WorkloadID) (*RenderedPolicy, error)
RenderedPolicy returns a workload's persisted rendered policy, or registry.ErrWorkloadUnknown. A workload with no persisted policy yet is reported at version zero with no rules and no render instant.
type RenderedPolicy ¶
type RenderedPolicy struct {
Workload WorkloadRef
Version uint64
Mode innerwallv1.EnforcementMode
RenderedAt *time.Time
TerminalVerdict innerwallv1.PolicyDecision
Rules []RenderedRule
}
RenderedPolicy is a workload's persisted rendered policy: the version the agent is served, the mode, when it was rendered (nil when no render has happened yet), the verdict traffic no rule admits receives under that mode, and the rules. A pure configuration read: no counts and no flow joins; the console pairs it with a rollup.
type RenderedRule ¶
type RenderedRule struct {
ID string
AuthoredRuleID string
Ruleset *RulesetRef
Description string
// CreatedAt and UpdatedAt are the authored rule's own instants; nil
// when the authored rule no longer exists.
CreatedAt *time.Time
UpdatedAt *time.Time
Protocol innerwallv1.Protocol
// Ports is empty when the rule permits every port of the protocol.
Ports []policy.PortRange
PeerCIDRs []string
Verdict innerwallv1.PolicyDecision
}
RenderedRule is one resolved inbound permission as the agent holds it (ADR-0018): its match criteria (peers, protocol, ports), the verdict a match receives, and the authored rule it was rendered from. Every rendered rule admits; the mode decides what the rest of the traffic receives.
type Rollup ¶
type Rollup struct {
Range Range
EffectiveFrom *time.Time
EffectiveTo *time.Time
GroupBy flowstore.GroupBy
Groups []RollupGroup
GroupCount int64
Truncated bool
Totals Counters
}
Rollup is a grouped rollup. Range is what was asked; EffectiveFrom and EffectiveTo are the bounds of the windows actually covered, since a range quantizes to window boundaries, and are nil when nothing matched. Groups are in the requested order; Truncated says groups beyond them exist, and GroupCount and Totals cover all of them.
type RollupGroup ¶
type RollupGroup struct {
Keys GroupKeys
Counters
WorkloadCount *int64
FirstSeen time.Time
LastSeen time.Time
}
RollupGroup is one group with its counters and the span it was seen over. WorkloadCount is the number of distinct workloads that saw the group; it is set by rule and peer,service and nil otherwise: src,dst and dst,service name their one workload in their keys, and rule,peer, whose key names none, is not counted.
type RollupRequest ¶
type RollupRequest struct {
From time.Time
To time.Time
GroupBy flowstore.GroupBy
Verdict innerwallv1.PolicyDecision
Direction innerwallv1.Direction
Workload *identity.WorkloadID
Selector policy.Selector
Endpoint flowstore.Endpoint
Service *Service
Order flowstore.GroupOrder
// Limit bounds the groups; the store's default and maximum apply.
Limit int
}
RollupRequest asks for one grouped rollup. A zero From or To takes the default range; a zero Verdict or Direction means any; a nil Workload and empty Selector cover every workload, a Workload restricts to that one, a Selector to the workloads it currently matches (ADR-0019 resolves a scope at read time, deliberately), and both to their intersection; Endpoint says which end of a record the scope selects, the reporting destination when zero, or either end, so a workload that only sends traffic is seen by its outbound records; a nil Service means every service.
type RuleRef ¶
type RuleRef struct {
ID string
AuthoredRuleID string
Protocol innerwallv1.Protocol
}
RuleRef names a resolved rule as flow records attribute traffic to it: the resolved id, and the authored rule and protocol it was rendered from (ADR-0018).
type RulesetRef ¶
RulesetRef names the authored ruleset a rendered rule came from. It is nil on a rendered rule whose authored rule no longer exists, which can happen between a delete and the render it triggers. It carries no timestamps: the ruleset's instants are not the rule's, which the rendered rule carries itself.
type Service ¶
type Service struct {
Protocol innerwallv1.Protocol
Port uint16
}
Service is a destination port and protocol, the unit a flow record and a rendered rule share. A protocol without ports (ICMP) has Port 0.
func ParseService ¶
ParseService parses "<protocol>/<port>" or "icmp".
type StatusCount ¶ added in v0.2.0
type StatusCount struct {
SyncState innerwallv1.SyncState
Removed bool
Retired bool
Workloads int64
}
StatusCount is how many workloads hold one sync state with their owned table recorded absent (Removed), or not, and retired, or not.
type Store ¶
type Store interface {
// ListWorkloads returns every workload with its labels and addresses,
// the registry's view for naming peers and resolving scopes.
ListWorkloads(ctx context.Context) ([]registry.Workload, error)
ListAddressGroups(ctx context.Context) ([]policy.AddressGroup, error)
ListRulesets(ctx context.Context) ([]policy.Ruleset, error)
// GetWorkloadPolicy returns the persisted rendered policy of a
// workload with its version, or nil when none has been rendered.
GetWorkloadPolicy(ctx context.Context, id identity.WorkloadID) (*innerwallv1.WorkloadPolicy, error)
// ListWorkloadPage returns one page of the fleet in fleet order.
ListWorkloadPage(ctx context.Context, q WorkloadPageQuery) ([]WorkloadRecord, error)
// CountWorkloadsByStatus returns how many workloads hold each sync
// state, split by whether their owned table is recorded absent, read
// at one instant; a pair no workload holds is absent.
CountWorkloadsByStatus(ctx context.Context) ([]StatusCount, error)
// GetWorkloadRecord returns one workload with its latest rendered
// version and listening services, or registry.ErrWorkloadUnknown.
GetWorkloadRecord(ctx context.Context, id identity.WorkloadID) (*WorkloadRecord, error)
// ListWorkloadLabelIndex returns every workload's current labels, for
// resolving a selector to the workloads in its scope.
ListWorkloadLabelIndex(ctx context.Context) (map[identity.WorkloadID]map[string]string, error)
}
Store is the persisted state the read model reads. The Postgres store implements it with hand-written SQL (ADR-0006); flow data is read through the FlowStore beside it (ADR-0009).
type SyncStatus ¶
type SyncStatus struct {
State innerwallv1.SyncState
AppliedVersion uint64
LatestVersion uint64
LatestRenderedAt *time.Time
Error string
// LastSnapshotSentAt is nil when no snapshot has been recorded. A
// directed reconnect is observed as this instant advancing.
LastSnapshotSentAt *time.Time
// LastAckedAt is when the agent last acknowledged an applied
// version, and LastApplyFailedAt when it last reported a failed
// apply; each nil when none has been recorded. A failure instant
// outlives the failure: State says whether it still stands.
LastAckedAt *time.Time
LastApplyFailedAt *time.Time
}
SyncStatus is a workload's convergence with its rendered policy: the state the stream reports, the version the agent acknowledged against the latest rendered one, when that latest render happened, and when the sync path last sent the workload a snapshot.
type Workload ¶
type Workload struct {
ID identity.WorkloadID
Hostname string
Labels []registry.Label
Mode innerwallv1.EnforcementMode
EnrolledAt time.Time
Addresses []netip.Addr
Facts *innerwallv1.HostFacts
Agent registry.AgentInfo
ListeningServices []registry.ListeningService
Sync SyncStatus
Health Health
// Lifecycle is active or retired, and RetiredAt when it was retired,
// nil while it is active.
Lifecycle Lifecycle
RetiredAt *time.Time
}
Workload is the one object shape the fleet list and the workload detail share. The degraded-state screen reads entirely from it.
type WorkloadCounts ¶ added in v0.2.0
type WorkloadCounts struct {
Total int64
BySync map[innerwallv1.SyncState]int64
Removed int64
Retired int64
}
WorkloadCounts is the active fleet's size, in total, by sync state, and removed, beside the retired workloads. A workload whose owned table is recorded absent counts in Removed and in no sync state: its stored state is the agent's honest record of the version it acknowledged, but the host enforces none of it (issue #96). Every other active workload is in exactly one sync state, so Total is the sum of BySync and Removed. A retired workload is outside the attention ordering and counts in Retired alone, in no bucket and not in Total (ADR-0023).
type WorkloadCursor ¶
type WorkloadCursor struct {
SyncRank int32
SeenKey time.Time
ID identity.WorkloadID
}
WorkloadCursor is the position after which a fleet page continues.
type WorkloadPageQuery ¶
type WorkloadPageQuery struct {
IDs []identity.WorkloadID
Mode innerwallv1.EnforcementMode
SyncState innerwallv1.SyncState
Retired bool
After *WorkloadCursor
Limit int
}
WorkloadPageQuery selects one page of the fleet. An empty IDs means every workload; a zero Mode or SyncState means any; Retired selects the retired workloads instead of the active ones, never both; a nil After is the first page.
type WorkloadRecord ¶
type WorkloadRecord struct {
registry.Workload
// LastRenewedAt is when the credential was last reissued; nil when
// the enrollment credential is still the current one.
LastRenewedAt *time.Time
LatestVersion uint64
LatestRenderedAt *time.Time
ListeningServices []registry.ListeningService
// SyncRank and SeenKey are the store's sort keys for the fleet order:
// the attention rank and the last-seen instant with never-seen as the
// epoch. A cursor carries them.
SyncRank int32
SeenKey time.Time
}
WorkloadRecord is a workload as the store returns it for the read model: the registry's record, the latest rendered version and when it was rendered (zero and nil when none has been rendered), the listening services the agent reported, and the position keys the fleet order sorts by.
type WorkloadRef ¶
type WorkloadRef struct {
ID identity.WorkloadID
Hostname string
Labels map[string]string
}
WorkloadRef names a workload as the reporting end of a flow, with the registry's current hostname and labels.
type WorkloadsPage ¶
WorkloadsPage is one page of the fleet in fleet order: for the active fleet, attention rank (degraded or enforcement removed, offline, pending, synced), then most recently seen first; for the retired workloads, most recently retired first.
type WorkloadsRequest ¶
type WorkloadsRequest struct {
Selector policy.Selector
Mode innerwallv1.EnforcementMode
SyncState innerwallv1.SyncState
Lifecycle Lifecycle
Cursor string
Limit int
}
WorkloadsRequest asks for one page of the fleet. An empty Selector means every workload, otherwise the workloads it currently matches; a zero Mode or SyncState means any; Lifecycle selects the active fleet (the default when empty) or the retired workloads; Cursor continues a previous page.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package readmodeltest holds in-memory doubles of the read model's store and flow store for tests of the transports above it.
|
Package readmodeltest holds in-memory doubles of the read model's store and flow store for tests of the transports above it. |