diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8fae0bb15..019bd03fb 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -110,14 +110,16 @@ $ cargo version
cargo 1.69.0 (6e9a83356 2023-04-12)
```
-#### Install docker
+#### Install Docker or Podman
-Currently, iceberg-rust uses docker to set up environment for integration tests.
+Currently, iceberg-rust uses Docker to set up environment for integration tests. Podman is also supported.
-You can learn how to install docker from [here](https://docs.docker.com/get-docker/).
+You can learn how to install Docker from [here](https://docs.docker.com/get-docker/).
For macos users, you can install [OrbStack](https://orbstack.dev/) as a docker alternative.
+For podman users, refer to [Using Podman instead of Docker](docs/contributing/podman.md)
+
## Build
* To compile the project: `make build`
diff --git a/crates/catalog/glue/tests/glue_catalog_test.rs b/crates/catalog/glue/tests/glue_catalog_test.rs
index 3edd8cdaf..d9c5b4e0b 100644
--- a/crates/catalog/glue/tests/glue_catalog_test.rs
+++ b/crates/catalog/glue/tests/glue_catalog_test.rs
@@ -18,6 +18,7 @@
//! Integration tests for glue catalog.
use std::collections::HashMap;
+use std::net::SocketAddr;
use std::sync::RwLock;
use ctor::{ctor, dtor};
@@ -64,14 +65,11 @@ async fn get_catalog() -> GlueCatalog {
docker_compose.get_container_ip("minio"),
)
};
- let read_port = format!("{}:{}", glue_catalog_ip, GLUE_CATALOG_PORT);
- loop {
- if !scan_port_addr(&read_port) {
- log::info!("Waiting for 1s glue catalog to ready...");
- sleep(std::time::Duration::from_millis(1000)).await;
- } else {
- break;
- }
+ let glue_socket_addr = SocketAddr::new(glue_catalog_ip, GLUE_CATALOG_PORT);
+ let minio_socket_addr = SocketAddr::new(minio_ip, MINIO_PORT);
+ while !scan_port_addr(glue_socket_addr) {
+ log::info!("Waiting for 1s glue catalog to ready...");
+ sleep(std::time::Duration::from_millis(1000)).await;
}
let props = HashMap::from([
@@ -83,7 +81,7 @@ async fn get_catalog() -> GlueCatalog {
(AWS_REGION_NAME.to_string(), "us-east-1".to_string()),
(
S3_ENDPOINT.to_string(),
- format!("http://{}:{}", minio_ip, MINIO_PORT),
+ format!("http://{}", minio_socket_addr),
),
(S3_ACCESS_KEY_ID.to_string(), "admin".to_string()),
(S3_SECRET_ACCESS_KEY.to_string(), "password".to_string()),
@@ -91,7 +89,7 @@ async fn get_catalog() -> GlueCatalog {
]);
let config = GlueCatalogConfig::builder()
- .uri(format!("http://{}:{}", glue_catalog_ip, GLUE_CATALOG_PORT))
+ .uri(format!("http://{}", glue_socket_addr))
.warehouse("s3a://warehouse/hive".to_string())
.props(props.clone())
.build();
diff --git a/crates/catalog/hms/tests/hms_catalog_test.rs b/crates/catalog/hms/tests/hms_catalog_test.rs
index e4974171f..5b8004439 100644
--- a/crates/catalog/hms/tests/hms_catalog_test.rs
+++ b/crates/catalog/hms/tests/hms_catalog_test.rs
@@ -18,6 +18,7 @@
//! Integration tests for hms catalog.
use std::collections::HashMap;
+use std::net::SocketAddr;
use std::sync::RwLock;
use ctor::{ctor, dtor};
@@ -63,22 +64,18 @@ async fn get_catalog() -> HmsCatalog {
docker_compose.get_container_ip("minio"),
)
};
-
- let read_port = format!("{}:{}", hms_catalog_ip, HMS_CATALOG_PORT);
- loop {
- if !scan_port_addr(&read_port) {
- log::info!("scan read_port {} check", read_port);
- log::info!("Waiting for 1s hms catalog to ready...");
- sleep(std::time::Duration::from_millis(1000)).await;
- } else {
- break;
- }
+ let hms_socket_addr = SocketAddr::new(hms_catalog_ip, HMS_CATALOG_PORT);
+ let minio_socket_addr = SocketAddr::new(minio_ip, MINIO_PORT);
+ while !scan_port_addr(hms_socket_addr) {
+ log::info!("scan hms_socket_addr {} check", hms_socket_addr);
+ log::info!("Waiting for 1s hms catalog to ready...");
+ sleep(std::time::Duration::from_millis(1000)).await;
}
let props = HashMap::from([
(
S3_ENDPOINT.to_string(),
- format!("http://{}:{}", minio_ip, MINIO_PORT),
+ format!("http://{}", minio_socket_addr),
),
(S3_ACCESS_KEY_ID.to_string(), "admin".to_string()),
(S3_SECRET_ACCESS_KEY.to_string(), "password".to_string()),
@@ -86,7 +83,7 @@ async fn get_catalog() -> HmsCatalog {
]);
let config = HmsCatalogConfig::builder()
- .address(format!("{}:{}", hms_catalog_ip, HMS_CATALOG_PORT))
+ .address(hms_socket_addr.to_string())
.thrift_transport(HmsThriftTransport::Buffered)
.warehouse("s3a://warehouse/hive".to_string())
.props(props)
diff --git a/crates/catalog/rest/testdata/rest_catalog/docker-compose.yaml b/crates/catalog/rest/testdata/rest_catalog/docker-compose.yaml
index b49b6c6c1..34ba3c874 100644
--- a/crates/catalog/rest/testdata/rest_catalog/docker-compose.yaml
+++ b/crates/catalog/rest/testdata/rest_catalog/docker-compose.yaml
@@ -15,6 +15,9 @@
# specific language governing permissions and limitations
# under the License.
+networks:
+ rest_bridge:
+
services:
rest:
image: tabulario/iceberg-rest:0.10.0
@@ -29,8 +32,10 @@ services:
- CATALOG_S3_ENDPOINT=http://minio:9000
depends_on:
- minio
- links:
- - minio:icebergdata.minio
+ networks:
+ rest_bridge:
+ aliases:
+ - icebergdata.minio
expose:
- 8181
@@ -40,10 +45,13 @@ services:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=password
- MINIO_DOMAIN=minio
+ hostname: icebergdata.minio
+ networks:
+ rest_bridge:
expose:
- 9001
- 9000
- command: [ "server", "/data", "--console-address", ":9001" ]
+ command: ["server", "/data", "--console-address", ":9001"]
mc:
depends_on:
@@ -55,3 +63,5 @@ services:
- AWS_REGION=us-east-1
entrypoint: >
/bin/sh -c " until (/usr/bin/mc config host add minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done; /usr/bin/mc rm -r --force minio/icebergdata; /usr/bin/mc mb minio/icebergdata; /usr/bin/mc policy set public minio/icebergdata; tail -f /dev/null "
+ networks:
+ rest_bridge:
diff --git a/crates/catalog/rest/tests/rest_catalog_test.rs b/crates/catalog/rest/tests/rest_catalog_test.rs
index 3c9ec6937..e98890a86 100644
--- a/crates/catalog/rest/tests/rest_catalog_test.rs
+++ b/crates/catalog/rest/tests/rest_catalog_test.rs
@@ -18,6 +18,7 @@
//! Integration tests for rest catalog.
use std::collections::HashMap;
+use std::net::SocketAddr;
use std::sync::RwLock;
use ctor::{ctor, dtor};
@@ -59,18 +60,14 @@ async fn get_catalog() -> RestCatalog {
docker_compose.get_container_ip("rest")
};
- let read_port = format!("{}:{}", rest_catalog_ip, REST_CATALOG_PORT);
- loop {
- if !scan_port_addr(&read_port) {
- log::info!("Waiting for 1s rest catalog to ready...");
- sleep(std::time::Duration::from_millis(1000)).await;
- } else {
- break;
- }
+ let rest_socket_addr = SocketAddr::new(rest_catalog_ip, REST_CATALOG_PORT);
+ while !scan_port_addr(rest_socket_addr) {
+ log::info!("Waiting for 1s rest catalog to ready...");
+ sleep(std::time::Duration::from_millis(1000)).await;
}
let config = RestCatalogConfig::builder()
- .uri(format!("http://{}:{}", rest_catalog_ip, REST_CATALOG_PORT))
+ .uri(format!("http://{}", rest_socket_addr))
.build();
RestCatalog::new(config)
}
diff --git a/crates/iceberg/testdata/file_io_s3/docker-compose.yaml b/crates/iceberg/testdata/file_io_s3/docker-compose.yaml
index 0793d225b..cbce31864 100644
--- a/crates/iceberg/testdata/file_io_s3/docker-compose.yaml
+++ b/crates/iceberg/testdata/file_io_s3/docker-compose.yaml
@@ -18,7 +18,7 @@
services:
minio:
image: minio/minio:RELEASE.2024-02-26T09-33-48Z
- ports:
+ expose:
- 9000
- 9001
environment:
diff --git a/crates/iceberg/tests/file_io_s3_test.rs b/crates/iceberg/tests/file_io_s3_test.rs
index efa9128a3..326fdbb29 100644
--- a/crates/iceberg/tests/file_io_s3_test.rs
+++ b/crates/iceberg/tests/file_io_s3_test.rs
@@ -17,6 +17,7 @@
//! Integration tests for FileIO S3.
+use std::net::SocketAddr;
use std::sync::RwLock;
use ctor::{ctor, dtor};
@@ -26,6 +27,7 @@ use iceberg::io::{
use iceberg_test_utils::docker::DockerCompose;
use iceberg_test_utils::{normalize_test_name, set_up};
+const MINIO_PORT: u16 = 9000;
static DOCKER_COMPOSE_ENV: RwLock