Einweg-VM zur Runtime erstellen

Vorstellung des Vagrant-Bindings

Wie bereits erwähnt, gibt es mit dem Vagrant-Binding ein Java API, das auf Vagrant aufsetzt und das Managen von VMs zur Java Runtime ermöglicht. Da Vagrant in Ruby geschrieben ist, kann es dank JRuby auch in der JVM ausgeführt werden. Und genau auf diesem Ansatz setzt das Vagrant-Binding auf. Das API ist in unterster Schicht ein JRuby-Wrapper um Vagrant. Zur Nutzung muss Vagrant allerdings nicht auf dem System installiert sein, da es Bestandteil des API ist. Nur eine VirtualBox-Installation wird aktuell benötigt, um Vagrant-Binding nutzen zu können. Durch die zentrale Vagrant-Klasse kann durch das API auf Vagrant-Konfigurationen zugegriffen werden. Diese benötigt Vagrant-Konfigurationen, die durch einfache Builder-Klassen erstellt werden können. Ein einfaches Beispiel zur Nutzung des API sieht wie folgt aus:

VagrantVmConfig vmConfig = VagrantVmConfigBuilder.create().withLucid32Box().withName("demoVm").build();
VagrantEnvironmentConfig environmentConfig = VagrantEnvironmentConfigBuilder.create().withVagrantVmConfig(vmConfig).build();

VagrantEnvironment vagrantEnvironmet = new Vagrant().createEnvironment(new File("my/Vagrant/path"), environmentConfig);

vagrantEnvironmet.up();
vagrantEnvironmet.destroy();

In der ersten Zeile wird eine VM konfiguriert. Hierbei wird ein Builder genutzt, der eine VM auf Basis der „lucid32“ Box definiert. Da das API direkt so aufgebaut ist, dass man mehrere VMs parallel managen kann, benötigt man ein VagrantEnvironment. Dieses kapselt eine beliebige Anzahl an VMs. Mit Hilfe einer Builder-Klasse wird in der zweiten Zeile eine Konfiguration unseres Environments erstellt, die genau die vorher definierte VM beinhaltet. Mit Hilfe der Vagrant-Klasse wird nun das eigentliche Environment erzeugt. Dieses liegt innerhalb des angegeben Pfades im lokalen System. In diesem Pfad wird auch das Vagrantfile automatisch abgelegt, und die werden VMs persistiert, sollten sie z.B. angehalten werden.
Wie im vorhergegangen Vagrant-Beispiel kann man das gesamte Environment nun direkt von Java aus starten bzw. stoppen.

Durch die Builder ist es sehr einfach möglich, die VMs weiter zu konfigurieren. Durch das VagrantEnvironment können alle VMs einzeln angesprochen werden. Das folgende Beispiel setzt ein Environment mit zwei VMs auf, wobei die zweite VM über PortForwarding und eine statische IP verfügen soll. Zusätzlich soll eine andere Box als Basis der VM dienen. Durch das darauf erstellte Environment kann man über alle VMs iterieren und diese so gezielt starten oder stoppen bzw. deren Status abfragen:

VagrantVmConfig vmConfig1 = VagrantVmConfigBuilder.create().withName("32BitVm").withLucid32Box().build();
VagrantVmConfig vmConfig2 = VagrantVmConfigBuilder.create().withBoxName("lucid64").withName("64BitVm").withBoxUrl(VagrantUtils.getInstance().getLucid64Url()).withHostOnlyIp("192.168.50.4").withVagrantPortForwarding(VagrantPortForwardingBuilder.create().withGuestPort(7411).withHostPort(8080).build()).build();
VagrantEnvironmentConfig environmentConfig = VagrantEnvironmentConfigBuilder.create().withVagrantVmConfig(vmConfig1).withVagrantVmConfig(vmConfig2).build();
VagrantEnvironment vagrantEnvironmet = new Vagrant().createEnvironment(new File("my/Vagrant/path"), environmentConfig);
for(VagrantVm vm : vagrantEnvironmet.getAllVms()) {
	vm.start();
}
for(VagrantVm vm : vagrantEnvironmet.getAllVms()) {
	if(vm.isRunning()) {
		System.out.println("VM " + vm.getName() + " is running");
	} else {
		System.out.println("VM " + vm.getName() + " is not running");
	}
}
for(VagrantVm vm : vagrantEnvironmet.getAllVms()) {
	vm.destroy();
}
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.