Skip to content

Commit 5a30e69

Browse files
authored
[b/438671977] Add check to prevent conflicting flags. (#928)
* Add check to prevent conflicting flags. Prevent the usage of "--database" together with "--assessment" for the "snowflake" connector.
1 parent c779591 commit 5a30e69

File tree

2 files changed

+90
-50
lines changed

2 files changed

+90
-50
lines changed

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/snowflake/AbstractSnowflakeConnector.java

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.util.List;
4343
import java.util.Properties;
4444
import javax.annotation.Nonnull;
45+
import javax.annotation.Nullable;
4546
import javax.sql.DataSource;
4647
import org.apache.commons.lang3.StringUtils;
4748
import org.springframework.jdbc.core.JdbcTemplate;
@@ -83,7 +84,7 @@ public AbstractSnowflakeConnector(@Nonnull String name) {
8384
@Override
8485
public Handle open(@Nonnull ConnectorArguments arguments)
8586
throws MetadataDumperUsageException, SQLException {
86-
validateConnectionArguments(arguments);
87+
validateArguments(arguments);
8788
String url = arguments.getUri() != null ? arguments.getUri() : getUrlFromArguments(arguments);
8889
String databaseName =
8990
arguments.getDatabases().isEmpty()
@@ -100,14 +101,45 @@ public Handle open(@Nonnull ConnectorArguments arguments)
100101
return jdbcHandle;
101102
}
102103

103-
private void validateConnectionArguments(@Nonnull ConnectorArguments arguments)
104+
private void validateArguments(@Nonnull ConnectorArguments arguments)
104105
throws MetadataDumperUsageException {
106+
ArrayList<String> messages = new ArrayList<>();
107+
MetadataDumperUsageException exception = null;
108+
105109
if (arguments.isPasswordFlagProvided() && arguments.isPrivateKeyFileProvided()) {
106-
throw new MetadataDumperUsageException(
110+
String inconsistentAuth =
107111
"Private key authentication method can't be used together with user password. "
108112
+ "If the private key file is encrypted, please use --"
109113
+ ConnectorArguments.OPT_PRIVATE_KEY_PASSWORD
110-
+ " to specify the key password.");
114+
+ " to specify the key password.";
115+
messages.add(inconsistentAuth);
116+
exception = new MetadataDumperUsageException(inconsistentAuth, messages);
117+
}
118+
119+
boolean hasDatabases = !arguments.getDatabases().isEmpty();
120+
if (arguments.isAssessment()
121+
&& hasDatabases
122+
&& arguments.getConnectorName().toLowerCase().equals("snowflake")) {
123+
String unsupportedFilter =
124+
"Trying to filter by database with the --"
125+
+ ConnectorArguments.OPT_ASSESSMENT
126+
+ " flag. This is unsupported in Assessment. Remove either the --"
127+
+ ConnectorArguments.OPT_ASSESSMENT
128+
+ " or the --"
129+
+ ConnectorArguments.OPT_DATABASE
130+
+ " flag.";
131+
messages.add(unsupportedFilter);
132+
exception = new MetadataDumperUsageException(unsupportedFilter, messages);
133+
}
134+
removeDuplicateMessageAndThrow(exception);
135+
}
136+
137+
private static void removeDuplicateMessageAndThrow(
138+
@Nullable MetadataDumperUsageException exception) {
139+
if (exception != null) {
140+
List<String> messages = exception.getMessages();
141+
messages.remove(messages.size() - 1);
142+
throw exception;
111143
}
112144
}
113145

dumper/app/src/test/java/com/google/edwmigration/dumper/application/dumper/connector/snowflake/AbstractSnowflakeConnectorTest.java

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector.snowflake;
1818

19+
import static java.util.Arrays.copyOf;
20+
import static org.junit.Assert.assertThrows;
21+
import static org.junit.Assert.assertTrue;
22+
1923
import com.google.common.collect.ImmutableList;
2024
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
2125
import com.google.edwmigration.dumper.application.dumper.MetadataDumperUsageException;
2226
import com.google.edwmigration.dumper.application.dumper.connector.AbstractConnectorTest;
2327
import java.io.IOException;
24-
import java.util.ArrayList;
25-
import java.util.List;
26-
import org.apache.commons.lang.ArrayUtils;
28+
import java.util.stream.IntStream;
2729
import org.junit.Assert;
2830
import org.junit.Test;
2931
import org.junit.runner.RunWith;
@@ -43,69 +45,64 @@ public class AbstractSnowflakeConnectorTest extends AbstractConnectorTest {
4345

4446
@Test
4547
public void openConnection_failsForVeryLongInput() throws IOException {
46-
List<String> args = new ArrayList<>(ARGS);
47-
args.add("--connector");
48-
args.add(metadataConnector.getName());
49-
50-
args.add("--database");
51-
args.add(
52-
"db12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
53-
48+
// 262 characters
49+
String longInput =
50+
"db12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
5451
ConnectorArguments arguments =
55-
new ConnectorArguments(args.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
52+
makeArguments("--connector", metadataConnector.getName(), "--database", longInput);
53+
5654
MetadataDumperUsageException e =
57-
Assert.assertThrows(
58-
MetadataDumperUsageException.class,
59-
() -> {
60-
metadataConnector.open(arguments);
61-
});
62-
Assert.assertTrue(e.getMessage().contains("longer than the maximum allowed number"));
55+
assertThrows(MetadataDumperUsageException.class, () -> metadataConnector.open(arguments));
56+
57+
assertTrue(e.getMessage(), e.getMessage().contains("longer than the maximum allowed number"));
6358
}
6459

6560
@Test
6661
public void openConnection_failsForMalformedInput() throws IOException {
67-
List<String> args = new ArrayList<>(ARGS);
68-
args.add("--connector");
69-
args.add(metadataConnector.getName());
70-
71-
args.add("--database");
72-
args.add("testdb\";DROP DATABASE testdb");
73-
7462
ConnectorArguments arguments =
75-
new ConnectorArguments(args.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
63+
makeArguments(
64+
"--connector",
65+
metadataConnector.getName(),
66+
"--database",
67+
"testdb\";DROP DATABASE testdb");
68+
7669
MetadataDumperUsageException e =
77-
Assert.assertThrows(
78-
MetadataDumperUsageException.class,
79-
() -> {
80-
metadataConnector.open(arguments);
81-
});
82-
Assert.assertTrue(
70+
assertThrows(MetadataDumperUsageException.class, () -> metadataConnector.open(arguments));
71+
72+
assertTrue(
73+
e.getMessage(),
8374
e.getMessage().contains("Database name has incorrectly placed double quote(s)."));
8475
}
8576

8677
@Test
8778
public void openConnection_failsForMixedPrivateKeyAndPassword() throws IOException {
88-
List<String> args = new ArrayList<>(ARGS);
89-
args.add("--connector");
90-
args.add(metadataConnector.getName());
91-
92-
args.add("--private-key-file");
93-
args.add("/path/to/file.r8");
94-
9579
ConnectorArguments arguments =
96-
new ConnectorArguments(args.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
80+
makeArguments(
81+
"--connector", metadataConnector.getName(), "--private-key-file", "/path/to/file.r8");
82+
9783
MetadataDumperUsageException e =
98-
Assert.assertThrows(
99-
MetadataDumperUsageException.class,
100-
() -> {
101-
metadataConnector.open(arguments);
102-
});
103-
Assert.assertTrue(
84+
assertThrows(MetadataDumperUsageException.class, () -> metadataConnector.open(arguments));
85+
86+
assertTrue(
87+
e.getMessage(),
10488
e.getMessage()
10589
.contains(
10690
"Private key authentication method can't be used together with user password"));
10791
}
10892

93+
@Test
94+
public void open_assessmentEnabledWithDatabaseFilter_throwsUsageException() throws IOException {
95+
ConnectorArguments arguments =
96+
makeArguments("--connector", "snowflake", "--database", "SNOWFLAKE", "--assessment");
97+
98+
MetadataDumperUsageException e =
99+
assertThrows(MetadataDumperUsageException.class, () -> metadataConnector.open(arguments));
100+
101+
assertTrue(
102+
e.getMessage(),
103+
e.getMessage().contains("Trying to filter by database with the --assessment flag."));
104+
}
105+
109106
@Test
110107
public void checkJnaInClasspath_success() {
111108
try {
@@ -116,4 +113,15 @@ public void checkJnaInClasspath_success() {
116113
"net.java.dev.jna was not found in the classpath it is required for the Snowflake MFA caching.");
117114
}
118115
}
116+
117+
private static ConnectorArguments makeArguments(String... extraArguments) {
118+
try {
119+
String[] arguments = copyOf(extraArguments, extraArguments.length + ARGS.size());
120+
IntStream.range(0, ARGS.size())
121+
.forEach(el -> arguments[el + extraArguments.length] = ARGS.get(el));
122+
return new ConnectorArguments(arguments);
123+
} catch (IOException e) {
124+
throw new RuntimeException(e);
125+
}
126+
}
119127
}

0 commit comments

Comments
 (0)