Skip to content

Commit ddcc168

Browse files
committed
test: add more integration tests and fix plan output counts
1 parent 6f10869 commit ddcc168

25 files changed

+734
-30
lines changed

src/main/java/com/devshawn/kafka/gitops/StateManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public void validate() {
6363

6464
public DesiredPlan plan() {
6565
DesiredPlan desiredPlan = generatePlan();
66-
planManager.validatePlanHasChanges(desiredPlan);
66+
planManager.validatePlanHasChanges(desiredPlan, managerConfig.isDeleteDisabled());
6767
planManager.writePlanToFile(desiredPlan);
6868
return desiredPlan;
6969
}
@@ -82,7 +82,7 @@ public DesiredPlan apply() {
8282
desiredPlan = generatePlan();
8383
}
8484

85-
planManager.validatePlanHasChanges(desiredPlan);
85+
planManager.validatePlanHasChanges(desiredPlan, managerConfig.isDeleteDisabled());
8686

8787
applyManager.applyTopics(desiredPlan);
8888
applyManager.applyAcls(desiredPlan);

src/main/java/com/devshawn/kafka/gitops/cli/ApplyCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public Integer call() {
3333
ParserService parserService = new ParserService(parent.getFile());
3434
StateManager stateManager = new StateManager(generateStateManagerConfig(), parserService);
3535
DesiredPlan desiredPlan = stateManager.apply();
36-
LogUtil.printApplyOverview(PlanUtil.getOverview(desiredPlan));
36+
LogUtil.printApplyOverview(PlanUtil.getOverview(desiredPlan, parent.isDeleteDisabled()));
3737
return 0;
3838
} catch (MissingConfigurationException | ReadPlanInputException ex) {
3939
LogUtil.printGenericError(ex, true);

src/main/java/com/devshawn/kafka/gitops/cli/PlanCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public Integer call() {
3232
ParserService parserService = new ParserService(parent.getFile());
3333
StateManager stateManager = new StateManager(generateStateManagerConfig(), parserService);
3434
DesiredPlan desiredPlan = stateManager.plan();
35-
LogUtil.printPlan(desiredPlan);
35+
LogUtil.printPlan(desiredPlan, parent.isDeleteDisabled());
3636
return 0;
3737
} catch (MissingConfigurationException ex) {
3838
LogUtil.printGenericError(ex);

src/main/java/com/devshawn/kafka/gitops/manager/PlanManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ public void planAcls(DesiredState desiredState, DesiredPlan.Builder desiredPlan)
167167
});
168168
}
169169

170-
public void validatePlanHasChanges(DesiredPlan desiredPlan) {
171-
PlanOverview planOverview = PlanUtil.getOverview(desiredPlan);
170+
public void validatePlanHasChanges(DesiredPlan desiredPlan, boolean deleteDisabled) {
171+
PlanOverview planOverview = PlanUtil.getOverview(desiredPlan, deleteDisabled);
172172
if (planOverview.getAdd() == 0 && planOverview.getUpdate() == 0 && planOverview.getRemove() == 0) {
173173
LogUtil.printNoChangesMessage();
174174
System.exit(0);

src/main/java/com/devshawn/kafka/gitops/service/ConfluentCloudService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.devshawn.kafka.gitops.service;
22

3-
import com.devshawn.kafka.gitops.config.KafkaGitopsConfigLoader;
43
import com.devshawn.kafka.gitops.domain.confluent.ServiceAccount;
54
import com.devshawn.kafka.gitops.exception.ConfluentCloudException;
65
import com.fasterxml.jackson.core.type.TypeReference;
@@ -12,7 +11,7 @@
1211

1312
public class ConfluentCloudService {
1413

15-
private static org.slf4j.Logger log = LoggerFactory.getLogger(KafkaGitopsConfigLoader.class);
14+
private static org.slf4j.Logger log = LoggerFactory.getLogger(ConfluentCloudService.class);
1615

1716
private final ObjectMapper objectMapper;
1817

@@ -21,7 +20,7 @@ public ConfluentCloudService(ObjectMapper objectMapper) {
2120
}
2221

2322
public List<ServiceAccount> getServiceAccounts() {
24-
log.info("Test");
23+
log.info("Fetching service account list from Confluent Cloud via ccloud tool.");
2524
try {
2625
String result = execCmd(new String[]{"ccloud", "service-account", "list", "-o", "json"});
2726
return objectMapper.readValue(result, new TypeReference<List<ServiceAccount>>() {
@@ -32,6 +31,7 @@ public List<ServiceAccount> getServiceAccounts() {
3231
}
3332

3433
public ServiceAccount createServiceAccount(String name) {
34+
log.info("Creating service account {} in Confluent Cloud via ccloud tool.", name);
3535
try {
3636
String description = String.format("Service account: %s", name);
3737
String result = execCmd(new String[]{"ccloud", "service-account", "create", name, "--description", description, "-o", "json"});

src/main/java/com/devshawn/kafka/gitops/util/LogUtil.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@
1010

1111
public class LogUtil {
1212

13-
public static void printPlan(DesiredPlan desiredPlan) {
14-
PlanOverview planOverview = PlanUtil.getOverview(desiredPlan);
13+
public static void printPlan(DesiredPlan desiredPlan, boolean deleteDisabled) {
14+
PlanOverview planOverview = PlanUtil.getOverview(desiredPlan, deleteDisabled);
1515

1616
printLegend(planOverview);
1717

18-
printTopicOverview(desiredPlan);
18+
printTopicOverview(desiredPlan, deleteDisabled);
1919
desiredPlan.getTopicPlans().forEach(LogUtil::printTopicPlan);
2020

21-
printAclOverview(desiredPlan);
21+
printAclOverview(desiredPlan, deleteDisabled);
2222
desiredPlan.getAclPlans().forEach(LogUtil::printAclPlan);
2323

24-
printOverview(desiredPlan);
24+
printOverview(desiredPlan, deleteDisabled);
2525
}
2626

2727
public static void printValidationResult(String message, boolean success) {
@@ -121,20 +121,20 @@ public static void printPostApply() {
121121
* Helpers
122122
*/
123123

124-
private static void printOverview(DesiredPlan desiredPlan) {
125-
PlanOverview planOverview = PlanUtil.getOverview(desiredPlan);
124+
private static void printOverview(DesiredPlan desiredPlan, boolean deleteDisabled) {
125+
PlanOverview planOverview = PlanUtil.getOverview(desiredPlan, deleteDisabled);
126126
System.out.println(String.format("%s: %s, %s, %s.", bold("Plan"), toCreate(planOverview.getAdd()),
127127
toUpdate(planOverview.getUpdate()), toDelete(planOverview.getRemove())));
128128
}
129129

130-
private static void printTopicOverview(DesiredPlan desiredPlan) {
131-
PlanOverview topicPlanOverview = PlanUtil.getTopicPlanOverview(desiredPlan);
130+
private static void printTopicOverview(DesiredPlan desiredPlan, boolean deleteDisabled) {
131+
PlanOverview topicPlanOverview = PlanUtil.getTopicPlanOverview(desiredPlan, deleteDisabled);
132132
System.out.println(String.format("Topics: %s, %s, %s.\n", toCreate(topicPlanOverview.getAdd()),
133133
toUpdate(topicPlanOverview.getUpdate()), toDelete(topicPlanOverview.getRemove())));
134134
}
135135

136-
private static void printAclOverview(DesiredPlan desiredPlan) {
137-
PlanOverview aclPlanOverview = PlanUtil.getAclPlanOverview(desiredPlan);
136+
private static void printAclOverview(DesiredPlan desiredPlan, boolean deleteDisabled) {
137+
PlanOverview aclPlanOverview = PlanUtil.getAclPlanOverview(desiredPlan, deleteDisabled);
138138
System.out.println(String.format("ACLs: %s, %s, %s.\n", toCreate(aclPlanOverview.getAdd()),
139139
toUpdate(aclPlanOverview.getUpdate()), toDelete(aclPlanOverview.getRemove())));
140140
}

src/main/java/com/devshawn/kafka/gitops/util/PlanUtil.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,31 @@
99

1010
public class PlanUtil {
1111

12-
public static PlanOverview getOverview(DesiredPlan desiredPlan) {
12+
public static PlanOverview getOverview(DesiredPlan desiredPlan, boolean deleteDisabled) {
1313
EnumMap<PlanAction, Long> map = getPlanActionMap();
14-
desiredPlan.getTopicPlans().forEach(it -> map.put(it.getAction(), map.get(it.getAction()) + 1));
15-
desiredPlan.getAclPlans().forEach(it -> map.put(it.getAction(), map.get(it.getAction()) + 1));
14+
desiredPlan.getTopicPlans().forEach(it -> addToMap(map, it.getAction(), deleteDisabled));
15+
desiredPlan.getAclPlans().forEach(it -> addToMap(map, it.getAction(), deleteDisabled));
1616
return buildPlanOverview(map);
1717
}
1818

19-
public static PlanOverview getTopicPlanOverview(DesiredPlan desiredPlan) {
19+
public static PlanOverview getTopicPlanOverview(DesiredPlan desiredPlan, boolean deleteDisabled) {
2020
EnumMap<PlanAction, Long> map = getPlanActionMap();
21-
desiredPlan.getTopicPlans().forEach(it -> map.put(it.getAction(), map.get(it.getAction()) + 1));
21+
desiredPlan.getTopicPlans().forEach(it -> addToMap(map, it.getAction(), deleteDisabled));
2222
return buildPlanOverview(map);
2323
}
2424

25-
public static PlanOverview getAclPlanOverview(DesiredPlan desiredPlan) {
25+
public static PlanOverview getAclPlanOverview(DesiredPlan desiredPlan, boolean deleteDisabled) {
2626
EnumMap<PlanAction, Long> map = getPlanActionMap();
27-
desiredPlan.getAclPlans().forEach(it -> map.put(it.getAction(), map.get(it.getAction()) + 1));
27+
desiredPlan.getAclPlans().forEach(it -> addToMap(map, it.getAction(), deleteDisabled));
2828
return buildPlanOverview(map);
2929
}
3030

31+
private static void addToMap(EnumMap<PlanAction, Long> map, PlanAction planAction, boolean deleteDisabled) {
32+
if (!(deleteDisabled && planAction == PlanAction.REMOVE)) {
33+
map.put(planAction, map.get(planAction) + 1);
34+
}
35+
}
36+
3137
private static EnumMap<PlanAction, Long> getPlanActionMap() {
3238
EnumMap<PlanAction, Long> map = new EnumMap<>(PlanAction.class);
3339
EnumSet.allOf(PlanAction.class).forEach(it -> map.putIfAbsent(it, 0L));

src/test/groovy/com/devshawn/kafka/gitops/ApplyCommandIntegrationSpec.groovy

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ class ApplyCommandIntegrationSpec extends Specification {
2222
}
2323

2424
void cleanupSpec() {
25-
TestUtils.cleanUpCluster()
25+
// TestUtils.cleanUpCluster()
2626
}
2727

2828
void 'test various successful applies - #planFile'() {
2929
setup:
30+
ByteArrayOutputStream out = new ByteArrayOutputStream()
31+
PrintStream oldOut = System.out
32+
System.setOut(new PrintStream(out))
3033
String file = TestUtils.getResourceFilePath("plans/${planFile}-plan.json")
3134
MainCommand mainCommand = new MainCommand()
3235
CommandLine cmd = new CommandLine(mainCommand)
@@ -36,14 +39,57 @@ class ApplyCommandIntegrationSpec extends Specification {
3639

3740
then:
3841
exitCode == 0
42+
out.toString() == TestUtils.getResourceFileContent("plans/${planFile}-apply-output.txt")
43+
44+
cleanup:
45+
System.setOut(oldOut)
3946

4047
where:
4148
planFile << [
4249
"simple",
43-
"application-service"
50+
"application-service",
51+
"multi-file"
4452
]
4553
}
4654

55+
void 'test various valid applies with seed - #planFile #deleteDisabled'() {
56+
setup:
57+
TestUtils.seedCluster()
58+
ByteArrayOutputStream out = new ByteArrayOutputStream()
59+
PrintStream oldOut = System.out
60+
System.setOut(new PrintStream(out))
61+
String file = TestUtils.getResourceFilePath("plans/${planFile}-plan.json")
62+
MainCommand mainCommand = new MainCommand()
63+
CommandLine cmd = new CommandLine(mainCommand)
64+
65+
when:
66+
int exitCode = -1
67+
if (deleteDisabled) {
68+
exitCode = cmd.execute("-f", file, "--no-delete", "apply", "-p", file)
69+
} else {
70+
exitCode = cmd.execute("-f", file, "apply", "-p", file)
71+
}
72+
73+
then:
74+
exitCode == 0
75+
if (deleteDisabled) {
76+
assert out.toString() == TestUtils.getResourceFileContent("plans/${planFile}-no-delete-apply-output.txt")
77+
} else {
78+
assert out.toString() == TestUtils.getResourceFileContent("plans/${planFile}-apply-output.txt")
79+
}
80+
81+
cleanup:
82+
System.setOut(oldOut)
83+
84+
where:
85+
planFile | deleteDisabled
86+
"seed-topic-modification" | true
87+
"seed-topic-modification" | false
88+
"seed-topic-modification-3" | true
89+
"seed-topic-modification-3" | false
90+
"seed-acl-exists" | false
91+
}
92+
4793
void 'test reading missing file throws ReadPlanInputException'() {
4894
setup:
4995
ByteArrayOutputStream out = new ByteArrayOutputStream()

src/test/groovy/com/devshawn/kafka/gitops/PlanCommandIntegrationSpec.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@ class PlanCommandIntegrationSpec extends Specification {
8989
where:
9090
planName | deleteDisabled
9191
"seed-topic-modification" | false
92+
"seed-topic-modification-2" | false
93+
"seed-topic-modification-3" | false
9294
"seed-topic-modification-no-delete" | true
95+
"seed-acl-exists" | true
9396
}
9497

9598
void 'test invalid plans - #planName'() {

src/test/groovy/com/devshawn/kafka/gitops/TestUtils.groovy

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class TestUtils {
5353
println "Finished cleaning up cluster"
5454
} catch (Exception ex) {
5555
println "Error cleaning up kafka cluster"
56+
println ex
5657
}
5758

5859
}
@@ -64,11 +65,13 @@ class TestUtils {
6465
AdminClient adminClient = AdminClient.create(getKafkaConfig())
6566
createTopic("delete-topic", 1, adminClient)
6667
createTopic("test-topic", 1, adminClient)
68+
createTopic("topic-with-configs-1", 3, adminClient, ["cleanup.policy": "compact", "segment.bytes": "100000"])
69+
createTopic("topic-with-configs-2", 6, adminClient, ["retention.ms": "60000"])
6770
createAcl(adminClient)
6871

6972
conditions.eventually {
7073
Set<String> newTopics = adminClient.listTopics().names().get()
71-
assert newTopics.size() == 2
74+
assert newTopics.size() == 4
7275

7376
List<AclBinding> newAcls = new ArrayList<>(adminClient.describeAcls(getWildcardFilter()).values().get())
7477
assert newAcls.size() == 1
@@ -80,7 +83,14 @@ class TestUtils {
8083
}
8184

8285
static void createTopic(String name, int partitions, AdminClient adminClient) {
86+
createTopic(name, partitions, adminClient, null)
87+
}
88+
89+
static void createTopic(String name, int partitions, AdminClient adminClient, Map<String, String> configs) {
8390
NewTopic newTopic = new NewTopic(name, partitions, (short) 1)
91+
if (configs != null) {
92+
newTopic.configs(configs)
93+
}
8494
adminClient.createTopics(Collections.singletonList(newTopic)).all().get()
8595
}
8696

0 commit comments

Comments
 (0)