@@ -2,7 +2,9 @@ package pipeline
22
33import (
44 "os"
5+ "strings"
56
7+ pipelineSteps "github.com/kunalvirwal/shogun-cd/internal/pipeline/steps"
68 "go.yaml.in/yaml/v3"
79)
810
@@ -20,11 +22,130 @@ func (p *Service) LoadPipeline(path string) {
2022 }
2123
2224 // [TODO]: Validate the pipeline structure here if needed
25+ if ! p .validatePipeline (& pipeline ) {
26+ return
27+ }
2328
2429 for i , sw := range pipeline .Spec .Steps {
25- p .logger .LogInfo ("Step %d: Type=%s, Details=%+v" , i + 1 , sw .Step .Type (), sw .Step )
30+ p .logger .Log ("Step %d: Type=%s, Details=%+v" , i + 1 , sw .Step .Type (), sw .Step )
2631 }
27- p .logger .Log ("Pipeline %v loaded successfully" , pipeline .Metadata .Name )
32+ p .logger .LogInfo ("Pipeline %v loaded successfully" , pipeline .Metadata .Name )
2833
2934 // [TODO]: Further processing of the loaded pipeline, store into DB and all
3035}
36+
37+ func (p * Service ) validatePipeline (pipeline * Pipeline ) bool {
38+ // [TODO]: Implement validation logic
39+ if pipeline .ApiVersion != "shogun.dev/v1" {
40+ p .logger .LogNewError ("invalid apiVersion: %s" , pipeline .ApiVersion )
41+ return false
42+ }
43+ if pipeline .Kind != PipelineKind {
44+ p .logger .LogNewError ("invalid kind: %s" , pipeline .Kind )
45+ return false
46+ }
47+ // [TODO]: Check is name is unique
48+ if pipeline .Metadata .Name == "" {
49+ p .logger .LogNewError ("metadata.name cannot be empty" )
50+ return false
51+ }
52+ if len (pipeline .Spec .Triggers ) == 0 {
53+ p .logger .LogNewError ("at least one trigger must be specified" )
54+ return false
55+ }
56+ for _ , trigger := range pipeline .Spec .Triggers {
57+ if trigger .Type == string (WebhookTriggerKind ) {
58+ continue
59+ }
60+ if trigger .Type == string (GitChangesTriggerKind ) {
61+ if len (trigger .Paths ) == 0 {
62+ p .logger .LogNewError ("git_changes trigger must specify atleast one path" )
63+ return false
64+ }
65+ continue
66+ }
67+ p .logger .LogNewError ("invalid trigger type" )
68+ return false
69+ }
70+
71+ for i , sw := range pipeline .Spec .Steps {
72+ if sw .Step == nil {
73+ p .logger .LogNewError ("step %d is nil" , i + 1 )
74+ return false
75+ }
76+
77+ switch sw .Step .Type () {
78+ case pipelineSteps .MutateType :
79+ step := sw .Step .(* pipelineSteps.MutateStep )
80+ if ! p .validTrigger (step .TriggerWhen , i ) {
81+ return false
82+ }
83+ if step .File == "" {
84+ p .logger .LogNewError ("step %d mutate file cannot be empty" , i + 1 )
85+ return false
86+ }
87+ if step .UpdateField == "" {
88+ p .logger .LogNewError ("step %d mutate update_field cannot be empty" , i + 1 )
89+ return false
90+ }
91+
92+ case pipelineSteps .SyncType :
93+ step := sw .Step .(* pipelineSteps.SyncStep )
94+ if ! p .validTrigger (step .TriggerWhen , i ) {
95+ return false
96+ }
97+ if step .Target == "" {
98+ p .logger .LogNewError ("step %d exec target cannot be empty" , i + 1 )
99+ return false
100+ }
101+
102+ case pipelineSteps .ExecType :
103+ step := sw .Step .(* pipelineSteps.ExecStep )
104+ if ! p .validTrigger (step .TriggerWhen , i ) {
105+ return false
106+ }
107+ if step .Target == "" {
108+ p .logger .LogNewError ("step %d exec target cannot be empty" , i + 1 )
109+ return false
110+ }
111+ if len (step .Commands ) == 0 {
112+ p .logger .LogNewError ("step %d exec commands cannot be empty" , i + 1 )
113+ return false
114+ }
115+
116+ case pipelineSteps .ApplyType :
117+ step := sw .Step .(* pipelineSteps.ApplyStep )
118+ if ! p .validTrigger (step .TriggerWhen , i ) {
119+ return false
120+ }
121+ if step .Target == "" {
122+ p .logger .LogNewError ("step %d exec target cannot be empty" , i + 1 )
123+ return false
124+ }
125+ if len (step .Files ) == 0 {
126+ p .logger .LogNewError ("step %d apply files cannot be empty" , i + 1 )
127+ return false
128+ }
129+ for j , file := range step .Files {
130+ if ! strings .HasSuffix (file , ".yaml" ) && ! strings .HasSuffix (file , ".yml" ) && ! strings .HasSuffix (file , ".json" ) {
131+ p .logger .LogNewError ("step %d apply has a file with invalid extension at index %d" , i + 1 , j )
132+ return false
133+ }
134+ }
135+
136+ default :
137+ p .logger .LogNewError ("step %d has unknown type: %s" , i + 1 , sw .Step .Type ())
138+ return false
139+ }
140+
141+ }
142+ return true
143+ }
144+
145+ func (p * Service ) validTrigger (trigger string , i int ) bool {
146+ if trigger == "" || trigger == string (WebhookTriggerKind ) || trigger == string (GitChangesTriggerKind ) {
147+ return true
148+ }
149+ p .logger .LogNewError ("step %d has invalid trigger_when: %s" , i + 1 , trigger )
150+ return false
151+ }
0 commit comments