Skip to content

Commit

Permalink
tests: fix the integration tests for lunatic
Browse files Browse the repository at this point in the history
this commits fix the integration tests for lunatic shim by
adding hello to the end of the url for curling.

It also removes unused code in mod.rs

Signed-off-by: jiaxiao zhou <jiazho@microsoft.com>
  • Loading branch information
Mossaka committed Aug 18, 2023
1 parent 70b606c commit 102b49b
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 226 deletions.
248 changes: 24 additions & 224 deletions tests/common/mod.rs
Original file line number Diff line number Diff line change
@@ -1,204 +1,10 @@
use std::{io::Read, net::TcpListener, time::Duration};
use std::{io::Read, time::Duration};

use anyhow::Result;
use curl::easy::Easy;
use k8s_openapi::api::core::v1::Pod;
use kube::{api::ListParams, config::KubeConfigOptions, Api, Client, Config, ResourceExt};
use rand::{distributions::Alphanumeric, Rng};
use tokio::process::Command;

async fn which_binary(bianry_name: &str) -> Result<()> {
println!(" >>> which {}", bianry_name);
let mut cmd = Command::new("which");
cmd.arg(bianry_name);
let output = cmd.output().await;
if output.is_err() {
anyhow::bail!(format!("{} not found in PATH", bianry_name));
}
let output = output.unwrap();
if !output.status.success() {
anyhow::bail!(format!("{} not found in PATH", bianry_name));
}
Ok(())
}

pub async fn setup_test(test_ns: &str) -> Result<u16> {
let res = setup_test_helper(test_ns).await;
if res.is_err() {
println!(" >>> setup test failed");
teardown_test(test_ns).await?;
return res;
}
res
}

async fn setup_test_helper(test_ns: &str) -> Result<u16> {
which_binary("k3d").await?;
which_binary("cross").await?;
which_binary("docker").await?;
which_binary("kubectl").await?;

let dockerfile_path = "deployments/k3d";
let bin_path = "deployments/k3d/.tmp/";
let slight_shim_path = "deployments/k3d/.tmp/containerd-shim-slight-v1";
let spin_shim_path = "deployments/k3d/.tmp/containerd-shim-spin-v1";
let wws_shim_path = "deployments/k3d/.tmp/containerd-shim-wws-v1";

if which_binary(slight_shim_path).await.is_err() {
println!(" >>> install containerd-shim-slight-v1");
let mut cmd = Command::new("cross");
cmd.arg("build")
.arg("--target")
.arg("x86_64-unknown-linux-musl")
.arg("--release")
.arg("--manifest-path")
.arg("containerd-shim-slight-v1/Cargo.toml");
let output = cmd.output().await?;
if !output.status.success() {
anyhow::bail!("failed to build containerd-shim-slight-v1");
}
let mut cmd = Command::new("sudo");
cmd.arg("install")
.arg("containerd-shim-slight-v1/target/x86_64-unknown-linux-musl/release/containerd-shim-slight-v1")
.arg(bin_path);
let output = cmd.output().await?;
if !output.status.success() {
anyhow::bail!("failed to install containerd-shim-slight-v1");
}
}

if which_binary(spin_shim_path).await.is_err() {
println!(" >>> install containerd-shim-spin-v1");
let mut cmd = Command::new("cross");
cmd.arg("build")
.arg("--target")
.arg("x86_64-unknown-linux-musl")
.arg("--release")
.arg("--manifest-path")
.arg("containerd-shim-spin-v1/Cargo.toml");
let output = cmd.output().await?;
if !output.status.success() {
anyhow::bail!("failed to build containerd-shim-spin-v1");
}
let mut cmd = Command::new("sudo");
cmd.arg("install")
.arg("containerd-shim-spin-v1/target/x86_64-unknown-linux-musl/release/containerd-shim-spin-v1")
.arg(bin_path);
let output = cmd.output().await?;
if !output.status.success() {
anyhow::bail!("failed to install containerd-shim-spin-v1");
}
}

if which_binary(wws_shim_path).await.is_err() {
println!(" >>> install containerd-shim-wws-v1");
let mut cmd = Command::new("cross");
cmd.arg("build")
.arg("--target")
.arg("x86_64-unknown-linux-musl")
.arg("--release")
.arg("--manifest-path")
.arg("containerd-shim-wws-v1/Cargo.toml");
let output = cmd.output().await?;
if !output.status.success() {
anyhow::bail!("failed to build containerd-shim-wws-v1");
}
let mut cmd = Command::new("sudo");
cmd.arg("install")
.arg("containerd-shim-wws-v1/target/x86_64-unknown-linux-musl/release/containerd-shim-wws-v1")
.arg(bin_path);
let output = cmd.output().await?;
if !output.status.success() {
anyhow::bail!("failed to install containerd-shim-wws-v1");
}
}

// build docker image
let mut cmd = Command::new("docker");
cmd.arg("build").arg("-t").arg(test_ns).arg(dockerfile_path);
let output = cmd.output().await?;
if !output.status.success() {
// print out the error message to stderr
eprintln!("{}", String::from_utf8_lossy(&output.stderr));
// print out the stdout
println!("{}", String::from_utf8_lossy(&output.stdout));
anyhow::bail!(format!("failed to build docker image {}", test_ns));
}

// create k3d cluster
let cluster_name = format!("{}-cluster", test_ns);
let image_name = test_ns;
let _context_name = format!("k3d-{}", cluster_name);

let host_port = get_available_port().expect("failed to get available port");
// k3d cluster create $(CLUSTER_NAME) --image $(IMAGE_NAME) --api-port 6550 -p "8081:80@loadbalancer" --agents 1
let mut cmd = Command::new("k3d");
cmd.arg("cluster")
.arg("create")
.arg(&cluster_name)
.arg("--image")
.arg(&image_name)
.arg("-p")
.arg(format!("{}:80@loadbalancer", host_port))
.arg("--agents")
.arg("1");
let output = cmd.output().await?;
if !output.status.success() {
// print out the error message to stderr
eprintln!("{}", String::from_utf8_lossy(&output.stderr));
anyhow::bail!(format!("failed to create k3d cluster {}", cluster_name));
}

Ok(host_port)
}

pub async fn teardown_test(test_ns: &str) -> Result<()> {
let cluster_name = format!("{}-cluster", test_ns);

// delete k3d cluster
let mut cmd = Command::new("k3d");
cmd.arg("cluster").arg("delete").arg(cluster_name);
let output = cmd.output().await?;
if !output.status.success() {
anyhow::bail!(format!("failed to delete k3d cluster {}", test_ns));
}

// delete docker image
let mut cmd = Command::new("docker");
cmd.arg("rmi").arg(test_ns);
let output = cmd.output().await?;
if !output.status.success() {
// print out the error message to stderr
eprintln!("{}", String::from_utf8_lossy(&output.stderr));
// print out the stdout
println!("{}", String::from_utf8_lossy(&output.stdout));
anyhow::bail!(format!("failed to delete docker image {}", test_ns));
}

// check docker image is deleted
let mut cmd = Command::new("docker");
cmd.arg("image").arg("inspect").arg(test_ns);
let output = cmd.output().await?;
if output.status.success() {
anyhow::bail!(format!("failed to delete docker image {}", test_ns));
}

Ok(())
}

fn port_is_available(port: u16) -> bool {
TcpListener::bind(("127.0.0.1", port)).is_ok()
}

fn get_available_port() -> Option<u16> {
let mut rng = rand::thread_rng();
loop {
let port: u16 = rng.gen_range(1025..65535);
if port_is_available(port) {
return Some(port);
}
}
}

pub async fn retry_get(
url: &str,
Expand All @@ -209,15 +15,18 @@ pub async fn retry_get(
let mut i = 0;
let mut handle = Easy::new();
handle.url(url)?;
let mut transfer = handle.transfer();
transfer.write_function(|data| {
buf.extend_from_slice(data);
Ok(data.len())
})?;

loop {
let res = transfer.perform();
if res.is_ok() {
let res = {
let mut transfer = handle.transfer();
transfer.write_function(|data| {
buf.extend_from_slice(data);
Ok(data.len())
})?;
transfer.perform()
};
let response_code = handle.response_code()?;
// verify res is ok and not 404
if res.is_ok() && response_code != 404 {
break;
}
i += 1;
Expand All @@ -240,16 +49,19 @@ pub async fn retry_put(
handle.url(url)?;
handle.put(true)?;
handle.post_field_size(data.len() as u64)?;
let mut transfer = handle.transfer();
transfer.read_function(|into| Ok(data.as_bytes().read(into).unwrap_or(0)))?;
transfer.write_function(|data| {
println!("{}", String::from_utf8_lossy(data));
Ok(data.len())
})?;

loop {
let res = transfer.perform();
if res.is_ok() {
let res = {
let mut transfer = handle.transfer();
transfer.read_function(|into| Ok(data.as_bytes().read(into).unwrap_or(0)))?;
transfer.write_function(|data| {
println!("{}", String::from_utf8_lossy(data));
Ok(data.len())
})?;
transfer.perform()
};

let response_code = handle.response_code()?;
if res.is_ok() && response_code != 404 {
break;
}
i += 1;
Expand Down Expand Up @@ -277,18 +89,6 @@ pub async fn list_pods(cluster_name: &str) -> Result<()> {
Ok(())
}

pub async fn k_apply(path: &str) -> Result<()> {
let mut cmd = Command::new("kubectl");
cmd.arg("apply").arg("-f").arg(path);
let output = cmd.output().await?;
if !output.status.success() {
// print out the error message to stderr
eprintln!("{}", String::from_utf8_lossy(&output.stderr));
anyhow::bail!(format!("failed to apply {}", path));
}
Ok(())
}

pub async fn random_payload() -> String {
let rng = rand::thread_rng();
let payload: String = rng
Expand Down
4 changes: 2 additions & 2 deletions tests/integration_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,10 @@ async fn lunatic_test() -> Result<()> {
list_pods(&cluster_name).await?;

// curl for hello
println!(" >>> curl http://localhost:{}/lunatic", host_port);
println!(" >>> curl http://localhost:{}/lunatic/hello", host_port);
let mut res = Vec::new();
retry_get(
&format!("http://localhost:{}/lunatic", host_port),
&format!("http://localhost:{}/lunatic/hello", host_port),
&mut res,
RETRY_TIMES,
INTERVAL_IN_SECS,
Expand Down

0 comments on commit 102b49b

Please sign in to comment.