Skip to content

Commit

Permalink
feat(core): validate that an input of type FILE didn't have any defaults
Browse files Browse the repository at this point in the history
  • Loading branch information
loicmathieu committed Jun 17, 2024
1 parent dd3e64a commit b9620a5
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import io.kestra.core.validations.FileInputValidation;
import jakarta.validation.ConstraintViolationException;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -12,6 +13,7 @@
@SuperBuilder
@Getter
@NoArgsConstructor
@FileInputValidation
public class FileInput extends Input<URI> {
@Builder.Default
public String extension = ".upl";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.kestra.core.validations;

import io.kestra.core.validations.validator.FileInputValidator;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FileInputValidator.class)
public @interface FileInputValidation {
String message() default "invalid file input";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package io.kestra.core.validations.validator;

import io.kestra.core.models.flows.input.FileInput;
import io.kestra.core.validations.FileInputValidation;
import io.micronaut.core.annotation.AnnotationValue;
import io.micronaut.core.annotation.Introspected;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.validation.validator.constraints.ConstraintValidator;
import io.micronaut.validation.validator.constraints.ConstraintValidatorContext;
import jakarta.inject.Singleton;

@Singleton
@Introspected
public class FileInputValidator implements ConstraintValidator<FileInputValidation, FileInput> {
@Override
public boolean isValid(@Nullable FileInput value, @NonNull AnnotationValue<FileInputValidation> annotationMetadata, @NonNull ConstraintValidatorContext context) {
if (value == null) {
return true; // nulls are allowed according to spec
}

if (value.getDefaults() != null) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("no `defaults` can be set for inputs of type 'FILE'")
.addConstraintViolation();
return false;
}

return true;
}
}
12 changes: 12 additions & 0 deletions core/src/test/java/io/kestra/core/models/flows/FlowTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,18 @@ void allTasksWithChildsAndTriggerIds() {
assertThat(all.size(), is(3));
}

@Test
void inputValidation() {
Flow flow = this.parse("flows/invalids/inputs-validation.yaml");
Optional<ConstraintViolationException> validate = modelValidator.isValid(flow);

assertThat(validate.isPresent(), is(true));
assertThat(validate.get().getConstraintViolations().size(), is(2));

assertThat(validate.get().getMessage(), containsString("inputs[0]: no `defaults` can be set for inputs of type 'FILE'"));
assertThat(validate.get().getMessage(), containsString("inputs[1]: `itemType` cannot be `ARRAY"));
}

private Flow parse(String path) {
URL resource = TestsUtils.class.getClassLoader().getResource(path);
assert resource != null;
Expand Down
15 changes: 15 additions & 0 deletions core/src/test/resources/flows/invalids/inputs-validation.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
id: inputs-validations
namespace: io.kestra.tests

inputs:
- id: file
type: FILE
defaults: something
- id: array
type: ARRAY
itemType: ARRAY

tasks:
- id: hello
type: io.kestra.plugin.core.log.Log
message: Hello World! 🚀

0 comments on commit b9620a5

Please sign in to comment.