Skip to content

Commit b38aee1

Browse files
committed
apply yaml model interface
1 parent b083e4f commit b38aee1

File tree

24 files changed

+270
-83
lines changed

24 files changed

+270
-83
lines changed

src/main/java/com/flowci/build/business/impl/CreateBuildImpl.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,23 @@
55
import com.flowci.build.model.BuildYaml;
66
import com.flowci.build.repo.BuildRepo;
77
import com.flowci.build.repo.BuildYamlRepo;
8+
import com.flowci.build.repo.JobRepo;
89
import com.flowci.common.RequestContextHolder;
910
import com.flowci.common.model.Variables;
1011
import com.flowci.flow.business.FetchFlow;
1112
import com.flowci.flow.business.FetchFlowYamlContent;
1213
import com.flowci.flow.model.Flow;
13-
import com.flowci.yaml.business.ParseYamlV2;
14+
import com.flowci.yaml.business.ParseYaml;
15+
import com.flowci.yaml.model.Command;
16+
import com.flowci.yaml.model.Step;
1417
import jakarta.annotation.Nullable;
1518
import jakarta.transaction.Transactional;
1619
import lombok.AllArgsConstructor;
1720
import lombok.extern.slf4j.Slf4j;
1821
import org.springframework.stereotype.Component;
1922

2023
import java.util.HashSet;
24+
import java.util.List;
2125
import java.util.Set;
2226

2327
@Slf4j
@@ -27,9 +31,10 @@ public class CreateBuildImpl implements CreateBuild {
2731

2832
private final FetchFlow fetchFlow;
2933
private final FetchFlowYamlContent fetchFlowYamlContent;
30-
private final ParseYamlV2 parseYamlV2;
34+
private final ParseYaml parseYamlV2;
3135
private final BuildRepo buildRepo;
3236
private final BuildYamlRepo buildYamlRepo;
37+
private final JobRepo jobRepo;
3338
private final RequestContextHolder requestContextHolder;
3439

3540
@Override
@@ -45,21 +50,22 @@ public Build invoke(Long flowId, Build.Trigger trigger, @Nullable Variables inpu
4550

4651
var build = new Build();
4752
build.setFlowId(flow.getId());
53+
build.setContext(toBuildVariables(flow, inputs));
4854
build.setTrigger(trigger);
4955
build.setStatus(Build.Status.CREATED);
50-
build.setAgentTags(agentTags.toArray(new String[0]));
56+
5157
build.setCreatedBy(requestContextHolder.getUserId());
5258
build.setUpdatedBy(requestContextHolder.getUserId());
5359
buildRepo.save(build);
5460

5561
var buildYaml = new BuildYaml();
5662
buildYaml.setId(build.getId());
57-
buildYaml.setVariables(toBuildVariables(flow, inputs));
5863
buildYaml.setYaml(yaml);
5964
buildYaml.setCreatedBy(build.getCreatedBy());
6065
buildYaml.setUpdatedBy(build.getUpdatedBy());
6166
buildYamlRepo.save(buildYaml);
6267

68+
6369
log.info("build {} is created for flow {} with trigger {}", build.getBuildAlias(), flowId, trigger);
6470
return build;
6571
}

src/main/java/com/flowci/build/model/Build.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.flowci.build.model;
22

33
import com.flowci.common.model.EntityBase;
4+
import com.flowci.common.model.Variables;
45
import io.hypersistence.utils.hibernate.type.array.StringArrayType;
56
import io.hypersistence.utils.hibernate.type.json.JsonType;
67
import jakarta.annotation.Nullable;
@@ -77,15 +78,9 @@ public enum Status {
7778
@Enumerated(EnumType.STRING)
7879
private Status status;
7980

80-
@org.hibernate.annotations.Type(StringArrayType.class)
81-
private String[] agentTags;
82-
8381
@Type(JsonType.class)
8482
private GitRef gitRef;
8583

86-
/**
87-
* Assigned agent id
88-
*/
89-
@Nullable
90-
private Long agentId;
84+
@Type(JsonType.class)
85+
private Variables context;
9186
}
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package com.flowci.build.model;
22

33
import com.flowci.common.model.EntityBase;
4-
import com.flowci.common.model.Variables;
5-
import io.hypersistence.utils.hibernate.type.json.JsonType;
64
import jakarta.persistence.Entity;
75
import jakarta.persistence.Id;
86
import jakarta.persistence.Table;
97
import lombok.Data;
108
import lombok.EqualsAndHashCode;
11-
import org.hibernate.annotations.Type;
129

1310
@Data
1411
@Entity
@@ -19,9 +16,5 @@ public class BuildYaml extends EntityBase {
1916
@Id
2017
private Long id;
2118

22-
// ref to flow variables and extra inputs
23-
@Type(JsonType.class)
24-
private Variables variables;
25-
2619
private String yaml;
2720
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.flowci.build.model;
2+
3+
import com.flowci.common.model.EntityBase;
4+
import com.flowci.common.model.Variables;
5+
import io.hypersistence.utils.hibernate.type.array.LongArrayType;
6+
import io.hypersistence.utils.hibernate.type.array.StringArrayType;
7+
import io.hypersistence.utils.hibernate.type.json.JsonType;
8+
import jakarta.annotation.Nullable;
9+
import jakarta.persistence.*;
10+
import lombok.Data;
11+
import lombok.EqualsAndHashCode;
12+
import org.hibernate.annotations.Type;
13+
14+
import java.util.Map;
15+
16+
/**
17+
* Job refer to Step from YAML
18+
*/
19+
@Data
20+
@Entity
21+
@Table(name = "jobs")
22+
@EqualsAndHashCode(of = "id", callSuper = false)
23+
public class Job extends EntityBase {
24+
25+
public enum Status {
26+
CREATED, // init status
27+
QUEUED, // been put to job queue and waiting for agent
28+
ASSIGNED, // assigned to an agent
29+
RUNNING, // agent start to execute the flow
30+
CANCELLING, // will be cancelled, but waiting for response from agent
31+
SUCCESS,
32+
FAILURE,
33+
CANCELLED,
34+
TIMEOUT
35+
}
36+
37+
@Id
38+
private Long id;
39+
40+
private Long buildId;
41+
42+
private String name;
43+
44+
/**
45+
* Dependency job id list
46+
*/
47+
@org.hibernate.annotations.Type(LongArrayType.class)
48+
private Long[] dependencies;
49+
50+
@Enumerated(EnumType.STRING)
51+
private Status status;
52+
53+
@Nullable
54+
@org.hibernate.annotations.Type(StringArrayType.class)
55+
private String[] agentTags;
56+
57+
/**
58+
* Assigned agent id
59+
*/
60+
@Nullable
61+
private Long agentId;
62+
63+
/**
64+
* All input variables
65+
* value assigned when agent assigned, need to take build context
66+
*/
67+
@Nullable
68+
@Type(JsonType.class)
69+
private Variables variables;
70+
71+
/**
72+
* Environment variables with value
73+
*/
74+
@Nullable
75+
@Type(JsonType.class)
76+
private Map<String, String> output;
77+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.flowci.build.repo;
2+
3+
import com.flowci.build.model.Job;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
@Repository
8+
public interface JobRepo extends JpaRepository<Job, Long> {
9+
}

src/main/java/com/flowci/flow/business/impl/UpdateFlowYamlContentImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import com.flowci.common.exception.NotAvailableException;
55
import com.flowci.flow.business.UpdateFlowYamlContent;
66
import com.flowci.flow.repo.FlowYamlRepo;
7-
import com.flowci.yaml.business.ParseYamlV2;
7+
import com.flowci.yaml.business.ParseYaml;
88
import lombok.AllArgsConstructor;
99
import lombok.extern.slf4j.Slf4j;
1010
import org.springframework.stereotype.Component;
@@ -18,7 +18,7 @@
1818
@AllArgsConstructor
1919
public class UpdateFlowYamlContentImpl implements UpdateFlowYamlContent {
2020

21-
private final ParseYamlV2 parseYamlV2;
21+
private final ParseYaml parseYamlV2;
2222
private final FlowYamlRepo flowYamlRepo;
2323
private final RequestContextHolder requestContextHolder;
2424

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.flowci.yaml.business;
2+
3+
import com.flowci.yaml.model.Flow;
4+
5+
public interface ParseYaml {
6+
Flow invoke(String yaml);
7+
}

src/main/java/com/flowci/yaml/business/ParseYamlV2.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/main/java/com/flowci/yaml/business/impl/ParseYamlV2Impl.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,25 @@
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
66
import com.flowci.common.validator.ValidName;
7-
import com.flowci.yaml.business.ParseYamlV2;
7+
import com.flowci.yaml.business.ParseYaml;
88
import com.flowci.yaml.exception.InvalidYamlException;
9-
import com.flowci.yaml.model.FlowV2;
10-
import com.flowci.yaml.model.StepV2;
9+
import com.flowci.yaml.model.Step;
10+
import com.flowci.yaml.model.v2.FlowV2;
11+
import com.flowci.yaml.model.v2.StepV2;
1112
import lombok.extern.slf4j.Slf4j;
1213
import org.springframework.stereotype.Component;
13-
import org.springframework.util.CollectionUtils;
1414

15-
import java.util.*;
15+
import java.util.HashMap;
16+
import java.util.HashSet;
17+
import java.util.List;
1618

1719
import static java.lang.String.format;
1820
import static org.springframework.util.CollectionUtils.isEmpty;
1921
import static org.springframework.util.StringUtils.hasText;
2022

2123
@Slf4j
2224
@Component
23-
public class ParseYamlV2Impl implements ParseYamlV2 {
25+
public class ParseYamlV2Impl implements ParseYaml {
2426

2527
private static final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
2628
private static final ValidName.NameValidator nameValidator = new ValidName.NameValidator();
@@ -34,7 +36,9 @@ public FlowV2 invoke(String yaml) {
3436
try {
3537
var flowV2 = objectMapper.readValue(yaml, FlowV2.class);
3638
for (var step : flowV2.getSteps()) {
37-
step.setParent(flowV2);
39+
if (step instanceof StepV2 v2) {
40+
v2.setParent(flowV2);
41+
}
3842
}
3943

4044
validateSteps(flowV2);
@@ -48,7 +52,7 @@ public FlowV2 invoke(String yaml) {
4852

4953
private void validateSteps(FlowV2 flow) {
5054
var steps = flow.getSteps();
51-
if (CollectionUtils.isEmpty(steps)) {
55+
if (isEmpty(steps)) {
5256
throw new InvalidYamlException("at least one step is required");
5357
}
5458

@@ -78,7 +82,7 @@ private void validateSteps(FlowV2 flow) {
7882

7983
private void validateCommands(StepV2 step) {
8084
var commands = step.getCommands();
81-
if (CollectionUtils.isEmpty(commands)) {
85+
if (isEmpty(commands)) {
8286
throw new InvalidYamlException(format("at least one command under step '%s' is required", step.getName()));
8387
}
8488

@@ -101,7 +105,7 @@ private void buildGraph(FlowV2 flow) {
101105
}
102106

103107
for (var step : steps) {
104-
if (CollectionUtils.isEmpty(step.getDependsOn())) {
108+
if (isEmpty(step.getDependsOn())) {
105109
continue;
106110
}
107111

@@ -118,7 +122,7 @@ private void buildGraph(FlowV2 flow) {
118122
}
119123
}
120124

121-
private void checkCircularDependencies(List<StepV2> steps, HashMap<StepV2, Integer> traversed) {
125+
private void checkCircularDependencies(List<Step> steps, HashMap<Step, Integer> traversed) {
122126
for (var step : steps) {
123127
Integer numEncountered = traversed.get(step);
124128

@@ -137,13 +141,4 @@ private void checkCircularDependencies(List<StepV2> steps, HashMap<StepV2, Integ
137141
checkCircularDependencies(step.getNext(), traversed);
138142
}
139143
}
140-
141-
/**
142-
* Ex:
143-
* A <-- B <-- C
144-
* A <-- C
145-
*/
146-
private void checkDuplicatedDependsOn(List<StepV2> steps) {
147-
148-
}
149144
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.flowci.yaml.model;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.Set;
6+
7+
public interface Base<D extends Docker> {
8+
9+
Map<String, String> getVariables();
10+
11+
// condition script , todo: python or groovy?
12+
String getCondition();
13+
14+
Integer getTimeout();
15+
16+
Set<String> getAgents();
17+
18+
D getDocker();
19+
20+
List<D> getDockers();
21+
}

0 commit comments

Comments
 (0)