Skip to content

Commit

Permalink
apply yaml model interface
Browse files Browse the repository at this point in the history
  • Loading branch information
gy2006 committed Feb 28, 2025
1 parent b083e4f commit f91af1e
Show file tree
Hide file tree
Showing 18 changed files with 128 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import com.flowci.flow.business.FetchFlow;
import com.flowci.flow.business.FetchFlowYamlContent;
import com.flowci.flow.model.Flow;
import com.flowci.yaml.business.ParseYamlV2;
import com.flowci.yaml.business.ParseYaml;
import jakarta.annotation.Nullable;
import jakarta.transaction.Transactional;
import lombok.AllArgsConstructor;
Expand All @@ -27,7 +27,7 @@ public class CreateBuildImpl implements CreateBuild {

private final FetchFlow fetchFlow;
private final FetchFlowYamlContent fetchFlowYamlContent;
private final ParseYamlV2 parseYamlV2;
private final ParseYaml parseYamlV2;
private final BuildRepo buildRepo;
private final BuildYamlRepo buildYamlRepo;
private final RequestContextHolder requestContextHolder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.flowci.common.exception.NotAvailableException;
import com.flowci.flow.business.UpdateFlowYamlContent;
import com.flowci.flow.repo.FlowYamlRepo;
import com.flowci.yaml.business.ParseYamlV2;
import com.flowci.yaml.business.ParseYaml;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
Expand All @@ -18,7 +18,7 @@
@AllArgsConstructor
public class UpdateFlowYamlContentImpl implements UpdateFlowYamlContent {

private final ParseYamlV2 parseYamlV2;
private final ParseYaml parseYamlV2;
private final FlowYamlRepo flowYamlRepo;
private final RequestContextHolder requestContextHolder;

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/com/flowci/yaml/business/ParseYaml.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.flowci.yaml.business;

import com.flowci.yaml.model.Flow;

public interface ParseYaml {
Flow invoke(String yaml);
}
7 changes: 0 additions & 7 deletions src/main/java/com/flowci/yaml/business/ParseYamlV2.java

This file was deleted.

28 changes: 10 additions & 18 deletions src/main/java/com/flowci/yaml/business/impl/ParseYamlV2Impl.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,24 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.flowci.common.validator.ValidName;
import com.flowci.yaml.business.ParseYamlV2;
import com.flowci.yaml.business.ParseYaml;
import com.flowci.yaml.exception.InvalidYamlException;
import com.flowci.yaml.model.FlowV2;
import com.flowci.yaml.model.StepV2;
import com.flowci.yaml.model.v2.FlowV2;
import com.flowci.yaml.model.v2.StepV2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

import static java.lang.String.format;
import static org.springframework.util.CollectionUtils.isEmpty;
import static org.springframework.util.StringUtils.hasText;

@Slf4j
@Component
public class ParseYamlV2Impl implements ParseYamlV2 {
public class ParseYamlV2Impl implements ParseYaml {

private static final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
private static final ValidName.NameValidator nameValidator = new ValidName.NameValidator();
Expand Down Expand Up @@ -48,7 +49,7 @@ public FlowV2 invoke(String yaml) {

private void validateSteps(FlowV2 flow) {
var steps = flow.getSteps();
if (CollectionUtils.isEmpty(steps)) {
if (isEmpty(steps)) {
throw new InvalidYamlException("at least one step is required");
}

Expand Down Expand Up @@ -78,7 +79,7 @@ private void validateSteps(FlowV2 flow) {

private void validateCommands(StepV2 step) {
var commands = step.getCommands();
if (CollectionUtils.isEmpty(commands)) {
if (isEmpty(commands)) {
throw new InvalidYamlException(format("at least one command under step '%s' is required", step.getName()));
}

Expand All @@ -101,7 +102,7 @@ private void buildGraph(FlowV2 flow) {
}

for (var step : steps) {
if (CollectionUtils.isEmpty(step.getDependsOn())) {
if (isEmpty(step.getDependsOn())) {
continue;
}

Expand Down Expand Up @@ -137,13 +138,4 @@ private void checkCircularDependencies(List<StepV2> steps, HashMap<StepV2, Integ
checkCircularDependencies(step.getNext(), traversed);
}
}

/**
* Ex:
* A <-- B <-- C
* A <-- C
*/
private void checkDuplicatedDependsOn(List<StepV2> steps) {

}
}
23 changes: 23 additions & 0 deletions src/main/java/com/flowci/yaml/model/Base.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.flowci.yaml.model;

import com.flowci.yaml.model.v2.DockerV2;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface Base {

Map<String, String> getVariables();

// condition script , todo: python or groovy?
String getCondition();

Integer getTimeout();

Set<String> getAgents();

Docker getDocker();

List<DockerV2> getDockers();
}
8 changes: 8 additions & 0 deletions src/main/java/com/flowci/yaml/model/Command.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.flowci.yaml.model;

public interface Command {

String getBash();

String getPwsh();
}
21 changes: 21 additions & 0 deletions src/main/java/com/flowci/yaml/model/Docker.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.flowci.yaml.model;

import java.util.List;
import java.util.Map;

public interface Docker {

String getImage();

String getNetwork();

List<String> getPorts();

List<String> getEntrypoint();

List<String> getCommand();

Map<String, String> getEnvironment();

Boolean getIsRuntime();
}
8 changes: 8 additions & 0 deletions src/main/java/com/flowci/yaml/model/Flow.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.flowci.yaml.model;

import java.util.List;

public interface Flow<S extends Step<?>> extends Base {

List<S> getSteps();
}
16 changes: 16 additions & 0 deletions src/main/java/com/flowci/yaml/model/Step.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.flowci.yaml.model;

import java.util.List;

public interface Step<C extends Command> extends Base {

String getName();

Boolean getAllowFailure();

Integer getRetry();

List<String> getDependsOn();

List<C> getCommands();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.flowci.yaml.model;
package com.flowci.yaml.model.v2;

import com.flowci.yaml.model.Base;
import lombok.Getter;
import lombok.Setter;

Expand All @@ -9,7 +10,7 @@

@Getter
@Setter
public abstract class BaseV2 {
public abstract class BaseV2 implements Base {

private static final Integer DEFAULT_TIMEOUT = 1800;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.flowci.yaml.model;
package com.flowci.yaml.model.v2;

import com.flowci.yaml.model.Command;
import lombok.Getter;
import lombok.Setter;

import static org.springframework.util.StringUtils.hasText;

@Getter
@Setter
public class CommandV2 {
public class CommandV2 implements Command {

private String name; // optional

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.flowci.yaml.model;
package com.flowci.yaml.model.v2;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.flowci.yaml.model.Docker;
import lombok.Getter;
import lombok.Setter;

Expand All @@ -9,7 +10,7 @@

@Getter
@Setter
public class DockerV2 {
public class DockerV2 implements Docker {

private String image;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.flowci.yaml.model;
package com.flowci.yaml.model.v2;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.flowci.yaml.model.Flow;
import com.flowci.yaml.model.Step;
import jakarta.annotation.Nullable;
import lombok.Getter;
import lombok.Setter;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.LinkedList;
Expand All @@ -16,7 +17,7 @@

@Setter
@Getter
public class FlowV2 extends BaseV2 {
public class FlowV2 extends BaseV2 implements Flow<StepV2> {

/**
* List of agent tags
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@
package com.flowci.yaml.model;
package com.flowci.yaml.model.v2;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.flowci.common.model.Variables;
import com.flowci.yaml.model.Step;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.util.LinkedList;
import java.util.List;
import java.util.Set;

@Getter
@Setter
@EqualsAndHashCode(of = "name", callSuper = false)
public class StepV2 extends BaseV2 {
public class StepV2 extends BaseV2 implements Step<CommandV2> {

private static final Boolean DEFAULT_ALLOW_FAILURE = false;

private String name;

private Set<String> agents;

// dependency steps name
@JsonProperty("depends_on")
private List<String> dependsOn;
Expand Down
9 changes: 4 additions & 5 deletions src/test/java/com/flowci/build/business/CreateBuildTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@
import com.flowci.common.model.Variables;
import com.flowci.flow.business.FetchFlow;
import com.flowci.flow.business.FetchFlowYamlContent;
import com.flowci.flow.model.Flow;
import com.flowci.flow.model.FlowYaml;
import com.flowci.yaml.business.ParseYamlV2;
import com.flowci.yaml.model.FlowV2;
import com.flowci.yaml.business.ParseYaml;
import com.flowci.yaml.model.v2.FlowV2;
import org.instancio.Instancio;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
Expand All @@ -30,7 +29,7 @@ class CreateBuildTest extends SpringTest {
private FetchFlowYamlContent fetchFlowYamlContent;

@MockBean
private ParseYamlV2 parseYamlV2;
private ParseYaml parseYamlV2;

@Autowired
private MockRepositoriesConfig mockRepositoriesConfig;
Expand All @@ -40,7 +39,7 @@ class CreateBuildTest extends SpringTest {

@Test
void givenFlow_whenCreating_thenBuildIsCreated() {
var mockFlow = newDummyInstance(Flow.class).create();
var mockFlow = newDummyInstance(com.flowci.flow.model.Flow.class).create();
when(fetchFlow.invoke(anyLong())).thenReturn(mockFlow);
var mockFlowYaml = newDummyInstance(FlowYaml.class).create();
when(fetchFlowYamlContent.invoke(anyLong(), eq(false))).thenReturn(mockFlowYaml.getYaml());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import com.flowci.SpringTest;
import com.flowci.common.RequestContextHolder;
import com.flowci.flow.model.FlowYaml;
import com.flowci.yaml.business.ParseYamlV2;
import com.flowci.yaml.model.FlowV2;
import com.flowci.yaml.business.ParseYaml;
import com.flowci.yaml.model.v2.FlowV2;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -31,7 +31,7 @@ class UpdateFlowYamlContentTest extends SpringTest {
private MockRepositoriesConfig mockRepositoriesConfig;

@MockBean
private ParseYamlV2 mockParseYamlV2;
private ParseYaml mockParseYamlV2;

@MockBean
private RequestContextHolder mockRequestContextHolder;
Expand Down
9 changes: 5 additions & 4 deletions src/test/java/com/flowci/yaml/ParseYamlV2Test.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.flowci.yaml;

import com.flowci.SpringTest;
import com.flowci.yaml.business.ParseYamlV2;
import com.flowci.yaml.business.ParseYaml;
import com.flowci.yaml.exception.InvalidYamlException;
import com.flowci.yaml.model.v2.FlowV2;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
Expand All @@ -13,12 +14,12 @@
class ParseYamlV2Test extends SpringTest {

@Autowired
private ParseYamlV2 parseYamlV2;
private ParseYaml parseYamlV2;

@Test
void givenYaml_whenParsing_thenReturnFlowObject() {
var content = getResourceAsString("yaml/v2_success.yaml");
var flowV2 = parseYamlV2.invoke(content);
var flowV2 = (FlowV2) parseYamlV2.invoke(content);
assertNotNull(flowV2);

// verify agents
Expand Down Expand Up @@ -89,7 +90,7 @@ void givenYaml_whenParsing_thenReturnFlowObject() {
@Test
void givenYamlWithParallelSteps_whenParsing_thenReturnFlowObject() {
var content = getResourceAsString("yaml/v2_success_parallel_steps.yaml");
var flowV2 = parseYamlV2.invoke(content);
var flowV2 = (FlowV2) parseYamlV2.invoke(content);
assertNotNull(flowV2);

// next steps of flow should be the steps without deps
Expand Down

0 comments on commit f91af1e

Please sign in to comment.