mirror of
https://github.com/cirruslabs/tart.git
synced 2026-10-13 17:35:31 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f45551cbf0 | ||
|
|
f68297097e | ||
|
|
637a2387e7 |
@@ -91,7 +91,7 @@ struct Run: AsyncParsableCommand {
|
||||
""", discussion: """
|
||||
Specify "list" as an interface name (--net-bridged=list) to list the available bridged interfaces.
|
||||
""", valueName: "interface name"))
|
||||
var netBridged: [String]
|
||||
var netBridged: [String] = []
|
||||
|
||||
@Flag(help: ArgumentHelp("Use software networking instead of the default shared (NAT) networking",
|
||||
discussion: "Learn how to configure Softnet for use with Tart here: https://github.com/cirruslabs/softnet"))
|
||||
|
||||
@@ -15,6 +15,10 @@ class DockerConfigCredentialsProvider: CredentialsProvider {
|
||||
return try executeHelper(binaryName: "docker-credential-\(helperProgram)", host: host)
|
||||
}
|
||||
|
||||
if let defaultCredsStore = config.credsStore {
|
||||
return try executeHelper(binaryName: "docker-credential-\(defaultCredsStore)", host: host)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -59,6 +63,7 @@ class DockerConfigCredentialsProvider: CredentialsProvider {
|
||||
struct DockerConfig: Codable {
|
||||
var auths: Dictionary<String, DockerAuthConfig>? = Dictionary()
|
||||
var credHelpers: Dictionary<String, String>? = Dictionary()
|
||||
var credsStore: String? = nil
|
||||
}
|
||||
|
||||
struct DockerAuthConfig: Codable {
|
||||
|
||||
@@ -3,3 +3,4 @@ testcontainers
|
||||
requests
|
||||
bitmath
|
||||
pytest-dependency
|
||||
paramiko
|
||||
|
||||
@@ -7,10 +7,9 @@ class Tart:
|
||||
def __init__(self):
|
||||
self.tmp_dir = tempfile.TemporaryDirectory(dir=os.environ.get("CIRRUS_WORKING_DIR"))
|
||||
|
||||
# Link to the users IPSW cache to make things faster
|
||||
src = os.path.join(os.path.expanduser("~"), ".tart", "cache", "IPSWs")
|
||||
dst = os.path.join(self.tmp_dir.name, "cache", "IPSWs")
|
||||
os.makedirs(os.path.join(self.tmp_dir.name, "cache"))
|
||||
# Link to the users cache to make things faster
|
||||
src = os.path.join(os.path.expanduser("~"), ".tart", "cache")
|
||||
dst = os.path.join(self.tmp_dir.name, "cache")
|
||||
os.symlink(src, dst)
|
||||
|
||||
def __enter__(self):
|
||||
@@ -31,3 +30,9 @@ class Tart:
|
||||
completed_process.check_returncode()
|
||||
|
||||
return completed_process.stdout.decode("utf-8"), completed_process.stderr.decode("utf-8")
|
||||
|
||||
def run_async(self, args) -> subprocess.Popen:
|
||||
env = os.environ.copy()
|
||||
env.update({"TART_HOME": self.tmp_dir.name})
|
||||
|
||||
return subprocess.Popen(["tart"] + args, env=env)
|
||||
|
||||
@@ -6,5 +6,5 @@ def test_clone(tart):
|
||||
tart.run(["clone", "debian", "ubuntu"])
|
||||
|
||||
# Ensure that we have now 2 VMs
|
||||
stdout, _, = tart.run(["list", "--quiet"])
|
||||
stdout, _, = tart.run(["list", "--source", "local", "--quiet"])
|
||||
assert stdout == "debian\nubuntu\n"
|
||||
|
||||
@@ -3,7 +3,7 @@ def test_create_macos(tart):
|
||||
tart.run(["create", "--from-ipsw", "latest", "macos-vm"])
|
||||
|
||||
# Ensure that the VM was created
|
||||
stdout, _ = tart.run(["list", "--quiet"])
|
||||
stdout, _ = tart.run(["list", "--source", "local", "--quiet"])
|
||||
assert stdout == "macos-vm\n"
|
||||
|
||||
|
||||
@@ -12,5 +12,5 @@ def test_create_linux(tart):
|
||||
tart.run(["create", "--linux", "linux-vm"])
|
||||
|
||||
# Ensure that the VM was created
|
||||
stdout, _ = tart.run(["list", "--quiet"])
|
||||
stdout, _ = tart.run(["list", "--source", "local", "--quiet"])
|
||||
assert stdout == "linux-vm\n"
|
||||
|
||||
@@ -3,12 +3,12 @@ def test_delete(tart):
|
||||
tart.run(["create", "--linux", "debian"])
|
||||
|
||||
# Ensure that the VM exists
|
||||
stdout, _, = tart.run(["list", "--quiet"])
|
||||
stdout, _, = tart.run(["list", "--source", "local", "--quiet"])
|
||||
assert stdout == "debian\n"
|
||||
|
||||
# Delete the VM
|
||||
tart.run(["delete", "debian"])
|
||||
|
||||
# Ensure that the VM was removed
|
||||
stdout, _, = tart.run(["list", "--quiet"])
|
||||
stdout, _, = tart.run(["list", "--source", "local", "--quiet"])
|
||||
assert stdout == ""
|
||||
|
||||
@@ -6,5 +6,5 @@ def test_rename(tart):
|
||||
tart.run(["rename", "debian", "ubuntu"])
|
||||
|
||||
# Ensure that the VM is now named "ubuntu"
|
||||
stdout, _, = tart.run(["list", "--quiet"])
|
||||
stdout, _, = tart.run(["list", "--source", "local", "--quiet"])
|
||||
assert stdout == "ubuntu\n"
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
import uuid
|
||||
|
||||
from paramiko.client import SSHClient, AutoAddPolicy
|
||||
|
||||
|
||||
def test_run(tart):
|
||||
vm_name = f"integration-test-run-{uuid.uuid4()}"
|
||||
|
||||
# Instantiate a VM with admin:admin SSH access
|
||||
tart.run(["clone", "ghcr.io/cirruslabs/macos-ventura-base:latest", vm_name])
|
||||
|
||||
# Run the VM asynchronously
|
||||
tart_run_process = tart.run_async(["run", vm_name])
|
||||
|
||||
# Obtain the VM's IP
|
||||
stdout, _ = tart.run(["ip", vm_name, "--wait", "120"])
|
||||
ip = stdout.strip()
|
||||
|
||||
# Connect to the VM over SSH and shutdown it
|
||||
client = SSHClient()
|
||||
client.set_missing_host_key_policy(AutoAddPolicy)
|
||||
client.connect(ip, username="admin", password="admin")
|
||||
client.exec_command("sudo shutdown -h now")
|
||||
|
||||
# Wait for the "tart run" to finish successfully
|
||||
tart_run_process.wait()
|
||||
assert tart_run_process.returncode == 0
|
||||
|
||||
# Delete the VM
|
||||
_, _ = tart.run(["delete", vm_name])
|
||||
Reference in New Issue
Block a user