final String subsetting = parts[3]; final boolean encrypted = encryptionSetting( name ).apply( params::get ) == Encryption.TLS; BaseSetting setting; break; case "encryption": setting = encryptionSetting( name ); setting.setDescription( "Enable TLS for this connector." ); break; case "address": setting = listenAddress( settingName, defaultPort( name, params ) ); setting.setDeprecated( true ); setting.setReplacement( "dbms.connector." + name + ".listen_address" ); break; case "listen_address": setting = listenAddress( settingName, defaultPort( name, params ) ); setting.setDescription( "Address the connector should bind to." ); break; case "advertised_address": setting = advertisedAddress( settingName, listenAddress( settingName, defaultPort( name, params ) ) ); setting.setDescription( "Advertised address for this connector." ); break; if ( isDeprecatedConnectorName( name ) && !setting.deprecated() )
@Test public void sdfa() { Setting setting = cv.getSettingFor( "dbms.connector.http.type", Collections.emptyMap() ) .orElseThrow( () -> new RuntimeException( "missing setting!" ) ); assertTrue( setting.deprecated() ); assertEquals( Optional.empty(), setting.replacement() ); }
@Test public void warnsWhenNameIsNotHttpOrHttps() { String randomEnabled = "dbms.connector.bla.enabled"; String randomType = "dbms.connector.bla.type"; cv.validate( stringMap( randomEnabled, "true", randomType, "HTTP" ), warningConsumer ); verify( warningConsumer ).accept( format( DEPRECATED_CONNECTOR_MSG, format( "> %s%n> %s%n", randomEnabled, randomType ) ) ); }
@Nonnull public static BaseSetting<HttpConnector.Encryption> encryptionSetting( @Nonnull String name ) { return encryptionSetting( name, Encryption.NONE ); }
@Test public void setsDeprecationFlagOnCustomNamedHttpsConnectors() { List<Setting<Object>> settings = cv.settings( stringMap( "dbms.connector.0.type", "HTTP", "dbms.connector.0.enabled", "false", "dbms.connector.0.listen_address", "1.2.3.4:123", "dbms.connector.0.advertised_address", "localhost:123", "dbms.connector.0.encryption", Encryption.TLS.toString() ) ); assertEquals( 5, settings.size() ); for ( Setting s : settings ) { assertTrue( "every setting should be deprecated: " + s.name(), s.deprecated() ); String[] parts = s.name().split( "\\." ); if ( !"encryption".equals( parts[3] ) && !"type".equals( parts[3] ) ) { assertEquals( Optional.of( format( "%s.%s.%s.%s", parts[0], parts[1], "https", parts[3] ) ), s.replacement() ); } } } }
/** * @param name of connector, like 'bob' in 'dbms.connector.bob.type = HTTP' * @param rawConfig to parse * @return the default for the encryption level designated for the HTTP connector */ private int defaultPort( @Nonnull String name, @Nonnull Map<String,String> rawConfig ) { switch ( name ) { case "http": return Encryption.NONE.defaultPort; case "https": return TLS.defaultPort; default: Setting<Encryption> es = encryptionSetting( name ); return es.apply( rawConfig::get ).defaultPort; } }
@Test public void setsDeprecationFlagOnCustomNamedHttpConnectors() { List<Setting<Object>> settings = cv.settings( stringMap( "dbms.connector.0.type", "HTTP", "dbms.connector.0.enabled", "false", "dbms.connector.0.listen_address", "1.2.3.4:123", "dbms.connector.0.advertised_address", "localhost:123", "dbms.connector.0.encryption", Encryption.NONE.toString() ) ); assertEquals( 5, settings.size() ); for ( Setting s : settings ) { assertTrue( "every setting should be deprecated: " + s.name(), s.deprecated() ); String[] parts = s.name().split( "\\." ); if ( !"encryption".equals( parts[3] ) && !"type".equals( parts[3] ) ) { assertEquals( Optional.of( format( "%s.%s.%s.%s", parts[0], parts[1], "http", parts[3] ) ), s.replacement() ); } } }
final String subsetting = parts[3]; final boolean encrypted = encryptionSetting( name ).apply( params::get ) == Encryption.TLS; BaseSetting setting; break; case "encryption": setting = encryptionSetting( name ); setting.setDescription( "Enable TLS for this connector." ); break; case "address": setting = listenAddress( settingName, defaultPort( name, params ) ); setting.setDeprecated( true ); setting.setReplacement( "dbms.connector." + name + ".listen_address" ); break; case "listen_address": setting = listenAddress( settingName, defaultPort( name, params ) ); setting.setDescription( "Address the connector should bind to." ); break; case "advertised_address": setting = advertisedAddress( settingName, listenAddress( settingName, defaultPort( name, params ) ) ); setting.setDescription( "Advertised address for this connector." ); break; if ( isDeprecatedConnectorName( name ) && !setting.deprecated() )
@Test public void doesNotValidateUnrelatedStuff() { assertEquals( 0, cv.validate( stringMap( "dbms.connector.bolt.enabled", "true", "dbms.blabla.boo", "123" ), warningConsumer ).size() ); }
/** * @return stream of all configured http connectors */ @Nonnull private Stream<HttpConnector> httpConnectors( @Nonnull Map<String,String> params ) { return allConnectorIdentifiers( params ).stream() .map( Connector::new ) .filter( c -> c.group.groupKey.equalsIgnoreCase( "http" ) || c.group.groupKey.equalsIgnoreCase( "https" ) || HTTP == c.type.apply( params::get ) ) .map( c -> { final String name = c.group.groupKey; final Encryption defaultEncryption; switch ( name ) { case "https": defaultEncryption = TLS; break; case "http": default: defaultEncryption = NONE; break; } return new HttpConnector( name, HttpConnectorValidator.encryptionSetting( name, defaultEncryption ).apply( params::get ) ); } ); }
@Test public void setsDeprecationFlagOnType() { Setting setting = cv.getSettingFor( "dbms.connector.http.type", Collections.emptyMap() ) .orElseThrow( () -> new RuntimeException( "missing setting!" ) ); assertTrue( setting.deprecated() ); assertEquals( Optional.empty(), setting.replacement() ); }
@Test public void onlyEnabledRequiredWhenNameIsHttpOrHttps() { String httpEnabled = "dbms.connector.http.enabled"; String httpsEnabled = "dbms.connector.https.enabled"; assertEquals( stringMap( httpEnabled, "true" ), cv.validate( stringMap( httpEnabled, "true" ), warningConsumer ) ); assertEquals( stringMap( httpsEnabled, "true" ), cv.validate( stringMap( httpsEnabled, "true" ), warningConsumer ) ); }
@Nonnull public static BaseSetting<HttpConnector.Encryption> encryptionSetting( @Nonnull String name ) { return encryptionSetting( name, Encryption.NONE ); }
@Test public void setsDeprecationFlagOnAddress() { Setting setting = cv.getSettingFor( "dbms.connector.http.address", Collections.emptyMap() ) .orElseThrow( () -> new RuntimeException( "missing setting!" ) ); assertTrue( setting.deprecated() ); assertEquals( Optional.of( "dbms.connector.http.listen_address" ), setting.replacement() ); }
@Test public void errorsOnInvalidConnectorSetting1() { String invalidSetting = "dbms.connector.bla.0.enabled"; expected.expect( InvalidSettingException.class ); expected.expectMessage( "Invalid connector setting: dbms.connector.bla.0.enabled" ); cv.validate( stringMap( invalidSetting, "true" ), warningConsumer ); }
/** * @param name of connector, like 'bob' in 'dbms.connector.bob.type = HTTP' * @param rawConfig to parse * @return the default for the encryption level designated for the HTTP connector */ private int defaultPort( @Nonnull String name, @Nonnull Map<String,String> rawConfig ) { switch ( name ) { case "http": return Encryption.NONE.defaultPort; case "https": return TLS.defaultPort; default: Setting<Encryption> es = encryptionSetting( name ); return es.apply( rawConfig::get ).defaultPort; } }
@Test public void setsDeprecationFlagOnEncryption() { Setting setting = cv.getSettingFor( "dbms.connector.http.encryption", Collections.emptyMap() ) .orElseThrow( () -> new RuntimeException( "missing setting!" ) ); assertTrue( setting.deprecated() ); assertEquals( Optional.empty(), setting.replacement() ); }
@Test public void errorsOnInvalidConnectorSetting2() { String invalidSetting = "dbms.connector.http.foobar"; expected.expect( InvalidSettingException.class ); expected.expectMessage( "Invalid connector setting: dbms.connector.http.foobar" ); cv.validate( stringMap( invalidSetting, "true" ), warningConsumer ); }
/** * @return stream of all configured http connectors */ @Nonnull private Stream<HttpConnector> httpConnectors( @Nonnull Map<String,String> params ) { return allConnectorIdentifiers( params ).stream() .map( Connector::new ) .filter( c -> c.group.groupKey.equalsIgnoreCase( "http" ) || c.group.groupKey.equalsIgnoreCase( "https" ) || HTTP == c.type.apply( params::get ) ) .map( c -> { final String name = c.group.groupKey; final Encryption defaultEncryption; switch ( name ) { case "https": defaultEncryption = TLS; break; case "http": default: defaultEncryption = NONE; break; } return new HttpConnector( name, HttpConnectorValidator.encryptionSetting( name, defaultEncryption ).apply( params::get ) ); } ); }
@Test public void validatesType() { String type = "dbms.connector.bla.type"; expected.expect( InvalidSettingException.class ); expected.expectMessage( "'dbms.connector.bla.type' must be one of BOLT, HTTP; not 'BOBO'" ); cv.validate( stringMap( type, "BOBO" ), warningConsumer ); }