···2525// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
26262727// SpindleSetSpec defines the desired state of SpindleSet.
2828+// SpindleSet is an internal resource created by the Loom engine to manage pipeline executions.
2929+// Users do not create SpindleSet resources directly.
2830type SpindleSetSpec struct {
2929- // KnotUrl is the URL of the tangled.org knot to connect to (e.g., https://tangled.org/@org/repo).
3131+ // PipelineRun contains pipeline-specific information for this pipeline execution.
3232+ // This SpindleSet is ephemeral and represents a single pipeline run.
3033 // +kubebuilder:validation:Required
3131- // +kubebuilder:validation:Pattern=`^https?://.*`
3232- KnotUrl string `json:"knotUrl"`
3434+ PipelineRun *PipelineRunSpec `json:"pipelineRun"`
3535+3636+ // Template is the pod template configuration for jobs in this SpindleSet.
3737+ // Set internally by the engine from ConfigMap configuration.
3838+ // +optional
3939+ Template SpindleTemplate `json:"template,omitempty"`
4040+}
33413434- // KnotAuthSecret is the name of the Secret containing authentication credentials for the knot.
3535- // The secret should contain a key "token" with the auth token.
4242+// PipelineRunSpec defines the specification for a single pipeline execution.
4343+type PipelineRunSpec struct {
4444+ // PipelineID is the unique identifier for this pipeline run from the knot.
3645 // +kubebuilder:validation:Required
3737- KnotAuthSecret string `json:"knotAuthSecret"`
4646+ PipelineID string `json:"pipelineID"`
4747+4848+ // Knot is the domain of the knot that triggered this pipeline.
4949+ // +kubebuilder:validation:Required
5050+ Knot string `json:"knot"`
5151+5252+ // RepoURL is the Git repository URL to clone.
5353+ // +kubebuilder:validation:Required
5454+ RepoURL string `json:"repoURL"`
5555+5656+ // CommitSHA is the Git commit to checkout.
5757+ // +kubebuilder:validation:Required
5858+ CommitSHA string `json:"commitSHA"`
38593939- // MaxConcurrentJobs is the maximum number of concurrent spindle jobs that can run.
4040- // Defaults to 10 if not specified.
4141- // +kubebuilder:default=10
4242- // +kubebuilder:validation:Minimum=1
4343- // +kubebuilder:validation:Maximum=100
6060+ // Workflows is the list of workflows to execute in this pipeline.
6161+ // +kubebuilder:validation:MinItems=1
6262+ Workflows []WorkflowSpec `json:"workflows"`
6363+}
6464+6565+// WorkflowSpec defines a workflow to execute as part of a pipeline.
6666+// This is the canonical workflow definition that matches the .tangled/workflows/*.yaml format.
6767+type WorkflowSpec struct {
6868+ // Name is the workflow filename (e.g., "workflow-amd64.yaml").
6969+ // +kubebuilder:validation:Required
7070+ Name string `json:"name"`
7171+7272+ // Image is the container image to use for executing the workflow steps.
7373+ // +kubebuilder:validation:Required
7474+ Image string `json:"image"`
7575+7676+ // Architecture is the target architecture for this workflow (e.g., "amd64", "arm64").
7777+ // +kubebuilder:validation:Required
7878+ // +kubebuilder:validation:Enum=amd64;arm64
7979+ Architecture string `json:"architecture"`
8080+8181+ // Steps is the ordered list of steps to execute in this workflow.
4482 // +optional
4545- MaxConcurrentJobs int32 `json:"maxConcurrentJobs,omitempty"`
8383+ Steps []WorkflowStep `json:"steps,omitempty"`
8484+8585+ // When defines conditional execution rules for this workflow.
8686+ // +optional
8787+ When []WorkflowWhen `json:"when,omitempty"`
8888+8989+ // Environment contains workflow-level environment variables.
9090+ // +optional
9191+ Environment map[string]string `json:"environment,omitempty"`
46924747- // Template is the default pod template configuration for spindle jobs.
4848- // Individual workflows can override these settings.
9393+ // Dependencies specifies external dependencies for the workflow.
4994 // +optional
5050- Template SpindleTemplate `json:"template,omitempty"`
9595+ Dependencies *WorkflowDependencies `json:"dependencies,omitempty"`
9696+}
9797+9898+// WorkflowStep defines a single step in a workflow.
9999+type WorkflowStep struct {
100100+ // Name is the human-readable name of the step.
101101+ // +kubebuilder:validation:Required
102102+ Name string `json:"name"`
103103+104104+ // Command is the shell command to execute.
105105+ // +kubebuilder:validation:Required
106106+ Command string `json:"command"`
107107+108108+ // Environment contains step-specific environment variables.
109109+ // +optional
110110+ Environment map[string]string `json:"environment,omitempty"`
111111+}
112112+113113+// WorkflowWhen defines conditional execution rules.
114114+type WorkflowWhen struct {
115115+ // Event specifies which events trigger this workflow (e.g., "push", "pull_request").
116116+ // +optional
117117+ Event []string `json:"event,omitempty"`
118118+119119+ // Branch specifies which branches trigger this workflow.
120120+ // +optional
121121+ Branch []string `json:"branch,omitempty"`
122122+}
123123+124124+// WorkflowDependencies specifies external dependencies.
125125+type WorkflowDependencies struct {
126126+ // Nixpkgs is a list of Nix packages to make available.
127127+ // +optional
128128+ Nixpkgs []string `json:"nixpkgs,omitempty"`
51129}
5213053131// SpindleTemplate defines the pod template configuration for spindle jobs.
132132+// This is configured via ConfigMap and used internally by the engine.
54133type SpindleTemplate struct {
55134 // Resources defines the compute resource requirements for spindle jobs.
5656- // +optional
57135 Resources corev1.ResourceRequirements `json:"resources,omitempty"`
5813659137 // NodeSelector is a selector which must be true for the pod to fit on a node.
6060- // +optional
138138+ // For MVP, this is not exposed via ConfigMap.
61139 NodeSelector map[string]string `json:"nodeSelector,omitempty"`
6214063141 // Tolerations allows pods to schedule onto nodes with matching taints.
6464- // +optional
142142+ // For MVP, this is not exposed via ConfigMap.
65143 Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
6614467145 // Affinity defines scheduling constraints for spindle job pods.
6868- // +optional
146146+ // For MVP, this is not exposed via ConfigMap.
69147 Affinity *corev1.Affinity `json:"affinity,omitempty"`
70148}
71149···95173 // +optional
96174 FailedJobs int32 `json:"failedJobs,omitempty"`
971759898- // WebSocketConnected indicates whether the WebSocket connection to the knot is active.
176176+ // WorkflowStatuses tracks the status of individual workflows in a pipeline run.
99177 // +optional
100100- WebSocketConnected bool `json:"webSocketConnected,omitempty"`
178178+ WorkflowStatuses []WorkflowStatus `json:"workflowStatuses,omitempty"`
101179102102- // LastEventTime is the timestamp of the last pipeline event received from the knot.
180180+ // Phase represents the current phase of the pipeline execution.
103181 // +optional
104104- LastEventTime *metav1.Time `json:"lastEventTime,omitempty"`
182182+ Phase string `json:"phase,omitempty"`
183183+}
184184+185185+// WorkflowStatus tracks the status of a single workflow execution.
186186+type WorkflowStatus struct {
187187+ // Name is the workflow name.
188188+ Name string `json:"name"`
189189+190190+ // JobName is the name of the Kubernetes Job created for this workflow.
191191+ // +optional
192192+ JobName string `json:"jobName,omitempty"`
193193+194194+ // Phase is the current phase of the workflow (Pending, Running, Succeeded, Failed).
195195+ // +optional
196196+ Phase string `json:"phase,omitempty"`
197197+198198+ // StartTime is when the workflow started executing.
199199+ // +optional
200200+ StartTime *metav1.Time `json:"startTime,omitempty"`
201201+202202+ // CompletionTime is when the workflow finished.
203203+ // +optional
204204+ CompletionTime *metav1.Time `json:"completionTime,omitempty"`
105205}
106206107207// +kubebuilder:object:root=true
108208// +kubebuilder:subresource:status
109109-// +kubebuilder:printcolumn:name="Knot URL",type=string,JSONPath=`.spec.knotUrl`
110110-// +kubebuilder:printcolumn:name="Connected",type=boolean,JSONPath=`.status.webSocketConnected`
209209+// +kubebuilder:printcolumn:name="Pipeline ID",type=string,JSONPath=`.spec.pipelineRun.pipelineID`
210210+// +kubebuilder:printcolumn:name="Phase",type=string,JSONPath=`.status.phase`
111211// +kubebuilder:printcolumn:name="Running",type=integer,JSONPath=`.status.runningJobs`
112212// +kubebuilder:printcolumn:name="Completed",type=integer,JSONPath=`.status.completedJobs`
113213// +kubebuilder:printcolumn:name="Failed",type=integer,JSONPath=`.status.failedJobs`
114214// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"
115215116216// SpindleSet is the Schema for the spindlesets API.
217217+// SpindleSet is an internal resource that represents a single pipeline execution.
218218+// It groups Jobs for a pipeline run and provides automatic cleanup via owner references.
117219type SpindleSet struct {
118220 metav1.TypeMeta `json:",inline"`
119221 metav1.ObjectMeta `json:"metadata,omitempty"`
+164-3
api/v1alpha1/zz_generated.deepcopy.go
···2727)
28282929// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
3030+func (in *PipelineRunSpec) DeepCopyInto(out *PipelineRunSpec) {
3131+ *out = *in
3232+ if in.Workflows != nil {
3333+ in, out := &in.Workflows, &out.Workflows
3434+ *out = make([]WorkflowSpec, len(*in))
3535+ for i := range *in {
3636+ (*in)[i].DeepCopyInto(&(*out)[i])
3737+ }
3838+ }
3939+}
4040+4141+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineRunSpec.
4242+func (in *PipelineRunSpec) DeepCopy() *PipelineRunSpec {
4343+ if in == nil {
4444+ return nil
4545+ }
4646+ out := new(PipelineRunSpec)
4747+ in.DeepCopyInto(out)
4848+ return out
4949+}
5050+5151+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
3052func (in *SpindleSet) DeepCopyInto(out *SpindleSet) {
3153 *out = *in
3254 out.TypeMeta = in.TypeMeta
···88110// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
89111func (in *SpindleSetSpec) DeepCopyInto(out *SpindleSetSpec) {
90112 *out = *in
113113+ if in.PipelineRun != nil {
114114+ in, out := &in.PipelineRun, &out.PipelineRun
115115+ *out = new(PipelineRunSpec)
116116+ (*in).DeepCopyInto(*out)
117117+ }
91118 in.Template.DeepCopyInto(&out.Template)
92119}
93120···111138 (*in)[i].DeepCopyInto(&(*out)[i])
112139 }
113140 }
114114- if in.LastEventTime != nil {
115115- in, out := &in.LastEventTime, &out.LastEventTime
116116- *out = (*in).DeepCopy()
141141+ if in.WorkflowStatuses != nil {
142142+ in, out := &in.WorkflowStatuses, &out.WorkflowStatuses
143143+ *out = make([]WorkflowStatus, len(*in))
144144+ for i := range *in {
145145+ (*in)[i].DeepCopyInto(&(*out)[i])
146146+ }
117147 }
118148}
119149···161191 in.DeepCopyInto(out)
162192 return out
163193}
194194+195195+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
196196+func (in *WorkflowDependencies) DeepCopyInto(out *WorkflowDependencies) {
197197+ *out = *in
198198+ if in.Nixpkgs != nil {
199199+ in, out := &in.Nixpkgs, &out.Nixpkgs
200200+ *out = make([]string, len(*in))
201201+ copy(*out, *in)
202202+ }
203203+}
204204+205205+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowDependencies.
206206+func (in *WorkflowDependencies) DeepCopy() *WorkflowDependencies {
207207+ if in == nil {
208208+ return nil
209209+ }
210210+ out := new(WorkflowDependencies)
211211+ in.DeepCopyInto(out)
212212+ return out
213213+}
214214+215215+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
216216+func (in *WorkflowSpec) DeepCopyInto(out *WorkflowSpec) {
217217+ *out = *in
218218+ if in.Steps != nil {
219219+ in, out := &in.Steps, &out.Steps
220220+ *out = make([]WorkflowStep, len(*in))
221221+ for i := range *in {
222222+ (*in)[i].DeepCopyInto(&(*out)[i])
223223+ }
224224+ }
225225+ if in.When != nil {
226226+ in, out := &in.When, &out.When
227227+ *out = make([]WorkflowWhen, len(*in))
228228+ for i := range *in {
229229+ (*in)[i].DeepCopyInto(&(*out)[i])
230230+ }
231231+ }
232232+ if in.Environment != nil {
233233+ in, out := &in.Environment, &out.Environment
234234+ *out = make(map[string]string, len(*in))
235235+ for key, val := range *in {
236236+ (*out)[key] = val
237237+ }
238238+ }
239239+ if in.Dependencies != nil {
240240+ in, out := &in.Dependencies, &out.Dependencies
241241+ *out = new(WorkflowDependencies)
242242+ (*in).DeepCopyInto(*out)
243243+ }
244244+}
245245+246246+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowSpec.
247247+func (in *WorkflowSpec) DeepCopy() *WorkflowSpec {
248248+ if in == nil {
249249+ return nil
250250+ }
251251+ out := new(WorkflowSpec)
252252+ in.DeepCopyInto(out)
253253+ return out
254254+}
255255+256256+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
257257+func (in *WorkflowStatus) DeepCopyInto(out *WorkflowStatus) {
258258+ *out = *in
259259+ if in.StartTime != nil {
260260+ in, out := &in.StartTime, &out.StartTime
261261+ *out = (*in).DeepCopy()
262262+ }
263263+ if in.CompletionTime != nil {
264264+ in, out := &in.CompletionTime, &out.CompletionTime
265265+ *out = (*in).DeepCopy()
266266+ }
267267+}
268268+269269+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowStatus.
270270+func (in *WorkflowStatus) DeepCopy() *WorkflowStatus {
271271+ if in == nil {
272272+ return nil
273273+ }
274274+ out := new(WorkflowStatus)
275275+ in.DeepCopyInto(out)
276276+ return out
277277+}
278278+279279+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
280280+func (in *WorkflowStep) DeepCopyInto(out *WorkflowStep) {
281281+ *out = *in
282282+ if in.Environment != nil {
283283+ in, out := &in.Environment, &out.Environment
284284+ *out = make(map[string]string, len(*in))
285285+ for key, val := range *in {
286286+ (*out)[key] = val
287287+ }
288288+ }
289289+}
290290+291291+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowStep.
292292+func (in *WorkflowStep) DeepCopy() *WorkflowStep {
293293+ if in == nil {
294294+ return nil
295295+ }
296296+ out := new(WorkflowStep)
297297+ in.DeepCopyInto(out)
298298+ return out
299299+}
300300+301301+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
302302+func (in *WorkflowWhen) DeepCopyInto(out *WorkflowWhen) {
303303+ *out = *in
304304+ if in.Event != nil {
305305+ in, out := &in.Event, &out.Event
306306+ *out = make([]string, len(*in))
307307+ copy(*out, *in)
308308+ }
309309+ if in.Branch != nil {
310310+ in, out := &in.Branch, &out.Branch
311311+ *out = make([]string, len(*in))
312312+ copy(*out, *in)
313313+ }
314314+}
315315+316316+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowWhen.
317317+func (in *WorkflowWhen) DeepCopy() *WorkflowWhen {
318318+ if in == nil {
319319+ return nil
320320+ }
321321+ out := new(WorkflowWhen)
322322+ in.DeepCopyInto(out)
323323+ return out
324324+}
···1515 scope: Namespaced
1616 versions:
1717 - additionalPrinterColumns:
1818- - jsonPath: .spec.knotUrl
1919- name: Knot URL
1818+ - jsonPath: .spec.pipelineRun.pipelineID
1919+ name: Pipeline ID
2020 type: string
2121- - jsonPath: .status.webSocketConnected
2222- name: Connected
2323- type: boolean
2121+ - jsonPath: .status.phase
2222+ name: Phase
2323+ type: string
2424 - jsonPath: .status.runningJobs
2525 name: Running
2626 type: integer
···3636 name: v1alpha1
3737 schema:
3838 openAPIV3Schema:
3939- description: SpindleSet is the Schema for the spindlesets API.
3939+ description: |-
4040+ SpindleSet is the Schema for the spindlesets API.
4141+ SpindleSet is an internal resource that represents a single pipeline execution.
4242+ It groups Jobs for a pipeline run and provides automatic cleanup via owner references.
4043 properties:
4144 apiVersion:
4245 description: |-
···5659 metadata:
5760 type: object
5861 spec:
5959- description: SpindleSetSpec defines the desired state of SpindleSet.
6262+ description: |-
6363+ SpindleSetSpec defines the desired state of SpindleSet.
6464+ SpindleSet is an internal resource created by the Loom engine to manage pipeline executions.
6565+ Users do not create SpindleSet resources directly.
6066 properties:
6161- knotAuthSecret:
6767+ pipelineRun:
6268 description: |-
6363- KnotAuthSecret is the name of the Secret containing authentication credentials for the knot.
6464- The secret should contain a key "token" with the auth token.
6565- type: string
6666- knotUrl:
6767- description: KnotUrl is the URL of the tangled.org knot to connect
6868- to (e.g., https://tangled.org/@org/repo).
6969- pattern: ^https?://.*
7070- type: string
7171- maxConcurrentJobs:
7272- default: 10
7373- description: |-
7474- MaxConcurrentJobs is the maximum number of concurrent spindle jobs that can run.
7575- Defaults to 10 if not specified.
7676- format: int32
7777- maximum: 100
7878- minimum: 1
7979- type: integer
6969+ PipelineRun contains pipeline-specific information for this pipeline execution.
7070+ This SpindleSet is ephemeral and represents a single pipeline run.
7171+ properties:
7272+ commitSHA:
7373+ description: CommitSHA is the Git commit to checkout.
7474+ type: string
7575+ knot:
7676+ description: Knot is the domain of the knot that triggered this
7777+ pipeline.
7878+ type: string
7979+ pipelineID:
8080+ description: PipelineID is the unique identifier for this pipeline
8181+ run from the knot.
8282+ type: string
8383+ repoURL:
8484+ description: RepoURL is the Git repository URL to clone.
8585+ type: string
8686+ workflows:
8787+ description: Workflows is the list of workflows to execute in
8888+ this pipeline.
8989+ items:
9090+ description: |-
9191+ WorkflowSpec defines a workflow to execute as part of a pipeline.
9292+ This is the canonical workflow definition that matches the .tangled/workflows/*.yaml format.
9393+ properties:
9494+ architecture:
9595+ description: Architecture is the target architecture for
9696+ this workflow (e.g., "amd64", "arm64").
9797+ enum:
9898+ - amd64
9999+ - arm64
100100+ type: string
101101+ dependencies:
102102+ description: Dependencies specifies external dependencies
103103+ for the workflow.
104104+ properties:
105105+ nixpkgs:
106106+ description: Nixpkgs is a list of Nix packages to make
107107+ available.
108108+ items:
109109+ type: string
110110+ type: array
111111+ type: object
112112+ environment:
113113+ additionalProperties:
114114+ type: string
115115+ description: Environment contains workflow-level environment
116116+ variables.
117117+ type: object
118118+ image:
119119+ description: Image is the container image to use for executing
120120+ the workflow steps.
121121+ type: string
122122+ name:
123123+ description: Name is the workflow filename (e.g., "workflow-amd64.yaml").
124124+ type: string
125125+ steps:
126126+ description: Steps is the ordered list of steps to execute
127127+ in this workflow.
128128+ items:
129129+ description: WorkflowStep defines a single step in a workflow.
130130+ properties:
131131+ command:
132132+ description: Command is the shell command to execute.
133133+ type: string
134134+ environment:
135135+ additionalProperties:
136136+ type: string
137137+ description: Environment contains step-specific environment
138138+ variables.
139139+ type: object
140140+ name:
141141+ description: Name is the human-readable name of the
142142+ step.
143143+ type: string
144144+ required:
145145+ - command
146146+ - name
147147+ type: object
148148+ type: array
149149+ when:
150150+ description: When defines conditional execution rules for
151151+ this workflow.
152152+ items:
153153+ description: WorkflowWhen defines conditional execution
154154+ rules.
155155+ properties:
156156+ branch:
157157+ description: Branch specifies which branches trigger
158158+ this workflow.
159159+ items:
160160+ type: string
161161+ type: array
162162+ event:
163163+ description: Event specifies which events trigger
164164+ this workflow (e.g., "push", "pull_request").
165165+ items:
166166+ type: string
167167+ type: array
168168+ type: object
169169+ type: array
170170+ required:
171171+ - architecture
172172+ - image
173173+ - name
174174+ type: object
175175+ minItems: 1
176176+ type: array
177177+ required:
178178+ - commitSHA
179179+ - knot
180180+ - pipelineID
181181+ - repoURL
182182+ - workflows
183183+ type: object
80184 template:
81185 description: |-
8282- Template is the default pod template configuration for spindle jobs.
8383- Individual workflows can override these settings.
186186+ Template is the pod template configuration for jobs in this SpindleSet.
187187+ Set internally by the engine from ConfigMap configuration.
84188 properties:
85189 affinity:
8686- description: Affinity defines scheduling constraints for spindle
8787- job pods.
190190+ description: |-
191191+ Affinity defines scheduling constraints for spindle job pods.
192192+ For MVP, this is not exposed via ConfigMap.
88193 properties:
89194 nodeAffinity:
90195 description: Describes node affinity scheduling rules for
···10051110 nodeSelector:
10061111 additionalProperties:
10071112 type: string
10081008- description: NodeSelector is a selector which must be true for
10091009- the pod to fit on a node.
11131113+ description: |-
11141114+ NodeSelector is a selector which must be true for the pod to fit on a node.
11151115+ For MVP, this is not exposed via ConfigMap.
10101116 type: object
10111117 resources:
10121118 description: Resources defines the compute resource requirements
···10691175 type: object
10701176 type: object
10711177 tolerations:
10721072- description: Tolerations allows pods to schedule onto nodes with
10731073- matching taints.
11781178+ description: |-
11791179+ Tolerations allows pods to schedule onto nodes with matching taints.
11801180+ For MVP, this is not exposed via ConfigMap.
10741181 items:
10751182 description: |-
10761183 The pod this Toleration is attached to tolerates any taint that matches
···11101217 type: array
11111218 type: object
11121219 required:
11131113- - knotAuthSecret
11141114- - knotUrl
12201220+ - pipelineRun
11151221 type: object
11161222 status:
11171223 description: SpindleSetStatus defines the observed state of SpindleSet.
···11871293 failed.
11881294 format: int32
11891295 type: integer
11901190- lastEventTime:
11911191- description: LastEventTime is the timestamp of the last pipeline event
11921192- received from the knot.
11931193- format: date-time
11941194- type: string
11951296 pendingJobs:
11961297 description: PendingJobs is the number of spindle jobs currently pending.
11971298 format: int32
11981299 type: integer
13001300+ phase:
13011301+ description: Phase represents the current phase of the pipeline execution.
13021302+ type: string
11991303 runningJobs:
12001304 description: RunningJobs is the number of spindle jobs currently running.
12011305 format: int32
12021306 type: integer
12031203- webSocketConnected:
12041204- description: WebSocketConnected indicates whether the WebSocket connection
12051205- to the knot is active.
12061206- type: boolean
13071307+ workflowStatuses:
13081308+ description: WorkflowStatuses tracks the status of individual workflows
13091309+ in a pipeline run.
13101310+ items:
13111311+ description: WorkflowStatus tracks the status of a single workflow
13121312+ execution.
13131313+ properties:
13141314+ completionTime:
13151315+ description: CompletionTime is when the workflow finished.
13161316+ format: date-time
13171317+ type: string
13181318+ jobName:
13191319+ description: JobName is the name of the Kubernetes Job created
13201320+ for this workflow.
13211321+ type: string
13221322+ name:
13231323+ description: Name is the workflow name.
13241324+ type: string
13251325+ phase:
13261326+ description: Phase is the current phase of the workflow (Pending,
13271327+ Running, Succeeded, Failed).
13281328+ type: string
13291329+ startTime:
13301330+ description: StartTime is when the workflow started executing.
13311331+ format: date-time
13321332+ type: string
13331333+ required:
13341334+ - name
13351335+ type: object
13361336+ type: array
12071337 type: object
12081338 type: object
12091339 served: true