/**
* Copyright 2015-2016 The OpenZipkin 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
*
* http://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 zipkin.storage.mysql;
import org.mariadb.jdbc.MariaDbDataSource;
import org.rnorth.ducttape.unreliables.Unreliables;
import org.testcontainers.containers.ContainerLaunchException;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.jdbc.ext.ScriptUtils;
import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse;
import org.testcontainers.shaded.com.google.common.io.Resources;
import javax.script.ScriptException;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.concurrent.TimeUnit;
public class ZipkinMySQLContainer extends GenericContainer<ZipkinMySQLContainer> {
MariaDbDataSource dataSource;
public ZipkinMySQLContainer(String version) {
super("openzipkin/zipkin-mysql:" + version);
withExposedPorts(3306);
setWaitStrategy(new AbstractWaitStrategy() {
@Override
protected void waitUntilReady() {
Unreliables.retryUntilTrue(1, TimeUnit.MINUTES, () -> {
if (!container.isRunning()) {
throw new ContainerLaunchException("Container failed to start");
}
try (Connection connection = dataSource.getConnection()) {
return connection.createStatement().execute("SELECT 1");
}
});
}
});
}
public MariaDbDataSource getDataSource() {
return dataSource;
}
@Override protected void containerIsStarting(InspectContainerResponse containerInfo) {
try {
dataSource = new MariaDbDataSource(
getContainerIpAddress(),
getMappedPort(getExposedPorts().get(0)),
"zipkin"
);
dataSource.setUser("zipkin");
dataSource.setPassword("zipkin");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override protected void containerIsStarted(InspectContainerResponse containerInfo) {
String[] scripts = {
// Drop all previously created tables in zipkin.*
"drop_zipkin_tables.sql",
// Populate the schema
"mysql.sql"
};
try (Connection connection = dataSource.getConnection()) {
for (String script : scripts) {
URL scriptURL = Resources.getResource(script);
String statements = Resources.toString(scriptURL, Charset.defaultCharset());
ScriptUtils.executeSqlScript(connection, script, statements);
}
} catch (SQLException | IOException | ScriptException e) {
throw new RuntimeException(e);
}
}
}