Skip to content

Commit a830b52

Browse files
committed
Implement 'cleanOnValidationError' for Flyway 11
1 parent 400daf0 commit a830b52

File tree

6 files changed

+33
-5
lines changed

6 files changed

+33
-5
lines changed

extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayContainer.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class FlywayContainer {
88

99
private final boolean baselineAtStart;
1010
private final boolean cleanAtStart;
11+
private final boolean cleanOnValidationError;
1112
private final boolean migrateAtStart;
1213
private final boolean repairAtStart;
1314

@@ -17,12 +18,13 @@ public class FlywayContainer {
1718
private final boolean createPossible;
1819
private final String id;
1920

20-
public FlywayContainer(Flyway flyway, boolean baselineAtStart, boolean cleanAtStart, boolean migrateAtStart,
21-
boolean repairAtStart, boolean validateAtStart,
21+
public FlywayContainer(Flyway flyway, boolean baselineAtStart, boolean cleanAtStart, boolean cleanOnValidationError,
22+
boolean migrateAtStart, boolean repairAtStart, boolean validateAtStart,
2223
String dataSourceName, boolean hasMigrations, boolean createPossible) {
2324
this.flyway = flyway;
2425
this.baselineAtStart = baselineAtStart;
2526
this.cleanAtStart = cleanAtStart;
27+
this.cleanOnValidationError = cleanOnValidationError;
2628
this.migrateAtStart = migrateAtStart;
2729
this.repairAtStart = repairAtStart;
2830
this.validateAtStart = validateAtStart;
@@ -44,6 +46,10 @@ public boolean isCleanAtStart() {
4446
return cleanAtStart;
4547
}
4648

49+
public boolean isCleanOnValidationError() {
50+
return cleanOnValidationError;
51+
}
52+
4753
public boolean isMigrateAtStart() {
4854
return migrateAtStart;
4955
}

extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayContainerProducer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public FlywayContainer createFlyway(DataSource dataSource, String dataSourceName
5252
configCustomizerInstances, dataSourceName)).withCallbacks(callbacks)
5353
.createFlyway(dataSource);
5454
return new FlywayContainer(flyway, matchingRuntimeConfig.baselineAtStart, matchingRuntimeConfig.cleanAtStart,
55-
matchingRuntimeConfig.migrateAtStart,
55+
matchingRuntimeConfig.cleanOnValidationError, matchingRuntimeConfig.migrateAtStart,
5656
matchingRuntimeConfig.repairAtStart, matchingRuntimeConfig.validateAtStart,
5757
dataSourceName, hasMigrations,
5858
createPossible);

extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayDataSourceRuntimeConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ public static FlywayDataSourceRuntimeConfig defaultConfig() {
152152
@ConfigItem
153153
public boolean validateAtStart;
154154

155+
/**
156+
* true to automatically execute a Flyway clean command when a validation error occurs at start, false otherwise.
157+
*/
158+
@ConfigItem(name = "validate-at-start.clean-on-validation-error")
159+
public boolean cleanOnValidationError;
160+
155161
/**
156162
* true to execute Flyway baseline before migrations This flag is ignored if the flyway_schema_history table exists in the
157163
* current schema or if the current schema is empty.

extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayRecorder.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,15 @@ public void doStartActions(String dataSourceName) {
129129
flywayContainer.getFlyway().clean();
130130
}
131131
if (flywayContainer.isValidateAtStart()) {
132-
flywayContainer.getFlyway().validate();
132+
if (flywayContainer.isCleanOnValidationError()) {
133+
var result = flywayContainer.getFlyway().validateWithResult();
134+
135+
if (!result.validationSuccessful) {
136+
flywayContainer.getFlyway().clean();
137+
}
138+
} else {
139+
flywayContainer.getFlyway().validate();
140+
}
133141
}
134142
if (flywayContainer.isBaselineAtStart()) {
135143
new FlywayExecutor(flywayContainer.getFlyway().getConfiguration())

extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/UnconfiguredDataSourceFlywayContainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class UnconfiguredDataSourceFlywayContainer extends FlywayContainer {
1212
private final Throwable cause;
1313

1414
public UnconfiguredDataSourceFlywayContainer(String dataSourceName, String message, Throwable cause) {
15-
super(null, false, false, false, false, false, dataSourceName, false, false);
15+
super(null, false, false, false, false, false, false, dataSourceName, false, false);
1616
this.message = message;
1717
this.cause = cause;
1818
}

extensions/flyway/runtime/src/test/java/io/quarkus/flyway/runtime/FlywayCreatorTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@ void testValidateOnMigrate() {
170170
assertTrue(runtimeConfig.validateOnMigrate);
171171
}
172172

173+
@Test
174+
@DisplayName("clean on validation error default matches to false")
175+
void testCleanOnValidationError() {
176+
creator = new FlywayCreator(runtimeConfig, buildConfig);
177+
assertEquals(runtimeConfig.cleanOnValidationError, createdFlywayConfig().isCleanOnValidationError());
178+
assertFalse(runtimeConfig.cleanOnValidationError);
179+
}
180+
173181
@Test
174182
@DisplayName("clean disabled default matches to false")
175183
void testCleanDisabled() {

0 commit comments

Comments
 (0)