8 changed files with 269 additions and 1 deletions
@ -0,0 +1,54 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2023 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.docker.compose.service.connection.sqlserver; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.util.Assert; |
||||||
|
import org.springframework.util.StringUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* MS SQL Server environment details. |
||||||
|
* |
||||||
|
* @author Andy Wilkinson |
||||||
|
*/ |
||||||
|
class MsSqlServerEnvironment { |
||||||
|
|
||||||
|
private final String username = "SA"; |
||||||
|
|
||||||
|
private final String password; |
||||||
|
|
||||||
|
MsSqlServerEnvironment(Map<String, String> env) { |
||||||
|
this.password = extractPassword(env); |
||||||
|
} |
||||||
|
|
||||||
|
private String extractPassword(Map<String, String> env) { |
||||||
|
String password = env.get("MSSQL_SA_PASSWORD"); |
||||||
|
password = (password != null) ? password : env.get("SA_PASSWORD"); |
||||||
|
Assert.state(StringUtils.hasLength(password), "No MSSQL password found"); |
||||||
|
return password; |
||||||
|
} |
||||||
|
|
||||||
|
String getUsername() { |
||||||
|
return this.username; |
||||||
|
} |
||||||
|
|
||||||
|
String getPassword() { |
||||||
|
return this.password; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,72 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2023 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.docker.compose.service.connection.sqlserver; |
||||||
|
|
||||||
|
import io.r2dbc.spi.ConnectionFactoryOptions; |
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; |
||||||
|
import org.springframework.boot.docker.compose.core.RunningService; |
||||||
|
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; |
||||||
|
import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; |
||||||
|
import org.springframework.boot.docker.compose.service.connection.r2dbc.ConnectionFactoryOptionsBuilder; |
||||||
|
|
||||||
|
/** |
||||||
|
* {@link DockerComposeConnectionDetailsFactory} to create {@link R2dbcConnectionDetails} |
||||||
|
* for a {@code mssql} service. |
||||||
|
* |
||||||
|
* @author Moritz Halbritter |
||||||
|
* @author Andy Wilkinson |
||||||
|
* @author Phillip Webb |
||||||
|
*/ |
||||||
|
class MsSqlServerR2dbcDockerComposeConnectionDetailsFactory |
||||||
|
extends DockerComposeConnectionDetailsFactory<R2dbcConnectionDetails> { |
||||||
|
|
||||||
|
MsSqlServerR2dbcDockerComposeConnectionDetailsFactory() { |
||||||
|
super("mssql/server", "io.r2dbc.spi.ConnectionFactoryOptions"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected R2dbcConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { |
||||||
|
return new MsSqlR2dbcDockerComposeConnectionDetails(source.getRunningService()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@link R2dbcConnectionDetails} backed by a {@code mssql} {@link RunningService}. |
||||||
|
*/ |
||||||
|
static class MsSqlR2dbcDockerComposeConnectionDetails extends DockerComposeConnectionDetails |
||||||
|
implements R2dbcConnectionDetails { |
||||||
|
|
||||||
|
private static final ConnectionFactoryOptionsBuilder connectionFactoryOptionsBuilder = new ConnectionFactoryOptionsBuilder( |
||||||
|
"mssql", 1433); |
||||||
|
|
||||||
|
private final ConnectionFactoryOptions connectionFactoryOptions; |
||||||
|
|
||||||
|
MsSqlR2dbcDockerComposeConnectionDetails(RunningService service) { |
||||||
|
super(service); |
||||||
|
MsSqlServerEnvironment environment = new MsSqlServerEnvironment(service.env()); |
||||||
|
this.connectionFactoryOptions = connectionFactoryOptionsBuilder.build(service, "", |
||||||
|
environment.getUsername(), environment.getPassword()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ConnectionFactoryOptions getConnectionFactoryOptions() { |
||||||
|
return this.connectionFactoryOptions; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2023 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Auto-configuration for docker compose MS SQL Server service connections. |
||||||
|
*/ |
||||||
|
package org.springframework.boot.docker.compose.service.connection.sqlserver; |
||||||
@ -0,0 +1,65 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2023 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.docker.compose.service.connection.sqlserver; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
import static org.assertj.core.api.Assertions.assertThatIllegalStateException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link MsSqlServerEnvironment}. |
||||||
|
* |
||||||
|
* @author Andy Wilkinson |
||||||
|
*/ |
||||||
|
class MsSqlServerEnvironmentTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
void createWhenHasNoPasswordThrowsException() { |
||||||
|
assertThatIllegalStateException().isThrownBy(() -> new MsSqlServerEnvironment(Collections.emptyMap())) |
||||||
|
.withMessage("No MSSQL password found"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getUsernameWhenHasNoMsSqlUser() { |
||||||
|
MsSqlServerEnvironment environment = new MsSqlServerEnvironment(Map.of("MSSQL_SA_PASSWORD", "secret")); |
||||||
|
assertThat(environment.getUsername()).isEqualTo("SA"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getPasswordWhenHasMsSqlSaPassword() { |
||||||
|
MsSqlServerEnvironment environment = new MsSqlServerEnvironment(Map.of("MSSQL_SA_PASSWORD", "secret")); |
||||||
|
assertThat(environment.getPassword()).isEqualTo("secret"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getPasswordWhenHasSaPassword() { |
||||||
|
MsSqlServerEnvironment environment = new MsSqlServerEnvironment(Map.of("SA_PASSWORD", "secret")); |
||||||
|
assertThat(environment.getPassword()).isEqualTo("secret"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getPasswordWhenHasMsSqlSaPasswordAndSaPasswordPrefersMsSqlSaPassword() { |
||||||
|
MsSqlServerEnvironment environment = new MsSqlServerEnvironment( |
||||||
|
Map.of("MSSQL_SA_PASSWORD", "secret", "SA_PASSWORD", "not used")); |
||||||
|
assertThat(environment.getPassword()).isEqualTo("secret"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,48 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2023 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.docker.compose.service.connection.sqlserver; |
||||||
|
|
||||||
|
import io.r2dbc.spi.ConnectionFactoryOptions; |
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; |
||||||
|
import org.springframework.boot.docker.compose.service.connection.test.AbstractDockerComposeIntegrationTests; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Integration tests for {@link MsSqlServerR2dbcDockerComposeConnectionDetailsFactory} |
||||||
|
* |
||||||
|
* @author Andy Wilkinson |
||||||
|
*/ |
||||||
|
class MsSqlServerR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests |
||||||
|
extends AbstractDockerComposeIntegrationTests { |
||||||
|
|
||||||
|
MsSqlServerR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests() { |
||||||
|
super("mssqlserver-compose.yaml"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void runCreatesConnectionDetails() { |
||||||
|
R2dbcConnectionDetails connectionDetails = run(R2dbcConnectionDetails.class); |
||||||
|
ConnectionFactoryOptions connectionFactoryOptions = connectionDetails.getConnectionFactoryOptions(); |
||||||
|
assertThat(connectionFactoryOptions.toString()).contains("driver=mssql", "password=REDACTED", "user=SA"); |
||||||
|
assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.PASSWORD)) |
||||||
|
.isEqualTo("verYs3cret"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
services: |
||||||
|
database: |
||||||
|
image: 'mcr.microsoft.com/mssql/server' |
||||||
|
ports: |
||||||
|
- '1433' |
||||||
|
environment: |
||||||
|
- 'MSSQL_SA_PASSWORD=verYs3cret' |
||||||
|
- 'ACCEPT_EULA=yes' |
||||||
Loading…
Reference in new issue