Support for multiple vagrant providers
Selects the provider to be used based on the selected image.
diff --git a/vagrant/README.md b/vagrant/README.md
index 141f5b6..4843c3b 100644
--- a/vagrant/README.md
+++ b/vagrant/README.md
@@ -109,6 +109,31 @@
vagrant box add boxcutter/eval-win2012r2-standard ./box/virtualbox/eval-win2012r2-standard-nocm-1.0.4.box
```
+Vagrant providers
+-----------
+
+jclouds supports the virtualbox an libvirt providers out of the box. To use additional providers users need to let
+jclouds know how to configure them. For example how to turn configuration like number of cpus or amount of memory to
+the provider specific configuration. Additional configuration might be needed as well. This is not required, but not
+providing it will lead to VMs which ignore configuration passed in from jclouds.
+
+To let jclouds configure additional providers create a Ruby file in ~/.jclouds/vagrant/providers. In the file
+register a block to do the configuration, by calling into `CustomProviders.register`. The block will be passed
+two arguments - `config` which is the Vagrant provided machine config and `machine_config` which is the configuration
+coming from jclouds. Here's an example file for `libvirt`.
+
+```
+CustomProviders.register do |config, machine_config|
+ config.vm.provider "libvirt" do |v|
+ v.memory = machine_config["memory"] if machine_config.key?("memory")
+ v.cpus = machine_config["cpus"] if machine_config.key?("cpus")
+ end
+end
+```
+
+jclouds selects the provider to use based on the selected box. Each box lists the provider it's been created for.
+The current implementation supports just a single provider per box name.
+
Cleaning up
-----------
diff --git a/vagrant/pom.xml b/vagrant/pom.xml
index 3c38a19..1303640 100644
--- a/vagrant/pom.xml
+++ b/vagrant/pom.xml
@@ -41,7 +41,7 @@
<dependency>
<groupId>name.neykov</groupId>
<artifactId>vagrant-java-bindings</artifactId>
- <version>0.1.1</version>
+ <version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.jclouds</groupId>
diff --git a/vagrant/src/main/java/org/jclouds/vagrant/api/VagrantApiFacade.java b/vagrant/src/main/java/org/jclouds/vagrant/api/VagrantApiFacade.java
index d87cedb..648d3ce 100644
--- a/vagrant/src/main/java/org/jclouds/vagrant/api/VagrantApiFacade.java
+++ b/vagrant/src/main/java/org/jclouds/vagrant/api/VagrantApiFacade.java
@@ -30,7 +30,7 @@
*
* @return the raw output of the configured provisioners
*/
- String up(String machineName);
+ String up(String machineName, String provider);
void halt(String machineName);
void destroy(String machineName);
LoginCredentials sshConfig(String machineName);
diff --git a/vagrant/src/main/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapter.java b/vagrant/src/main/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapter.java
index d707ee6..838338d 100644
--- a/vagrant/src/main/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapter.java
+++ b/vagrant/src/main/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapter.java
@@ -110,9 +110,10 @@
}
private NodeAndInitialCredentials<VagrantNode> startMachine(File path, String group, String name, Image image, Hardware hardware) {
+ String provider = image.getUserMetadata().get(VagrantConstants.USER_META_PROVIDER);
VagrantApiFacade vagrant = cliFactory.create(path);
- String rawOutput = vagrant.up(name);
+ String rawOutput = vagrant.up(name, provider);
String output = normalizeOutput(name, rawOutput);
OsFamily osFamily = image.getOperatingSystem().getFamily();
@@ -308,9 +309,10 @@
halt(id);
VagrantNode node = nodeRegistry.get(id);
+ String provider = node.image().getUserMetadata().get(VagrantConstants.USER_META_PROVIDER);
String name = node.name();
VagrantApiFacade vagrant = getMachine(node);
- vagrant.up(name);
+ vagrant.up(name, provider);
node.setMachineState(Status.RUNNING);
}
@@ -331,9 +333,10 @@
@Override
public void resumeNode(String id) {
VagrantNode node = nodeRegistry.get(id);
+ String provider = node.image().getUserMetadata().get(VagrantConstants.USER_META_PROVIDER);
String name = node.name();
VagrantApiFacade vagrant = getMachine(node);
- vagrant.up(name);
+ vagrant.up(name, provider);
node.setMachineState(Status.RUNNING);
}
diff --git a/vagrant/src/main/java/org/jclouds/vagrant/internal/VagrantCliFacade.java b/vagrant/src/main/java/org/jclouds/vagrant/internal/VagrantCliFacade.java
index 8c32e43..05fc799 100644
--- a/vagrant/src/main/java/org/jclouds/vagrant/internal/VagrantCliFacade.java
+++ b/vagrant/src/main/java/org/jclouds/vagrant/internal/VagrantCliFacade.java
@@ -54,9 +54,9 @@
}
@Override
- public String up(String machineName) {
+ public String up(String machineName, String provider) {
outputRecorder.record();
- vagrant.up(machineName);
+ vagrant.up(machineName, provider);
return outputRecorder.stopRecording();
}
diff --git a/vagrant/src/main/resources/Vagrantfile b/vagrant/src/main/resources/Vagrantfile
index 9912ff1..e3898d0 100644
--- a/vagrant/src/main/resources/Vagrantfile
+++ b/vagrant/src/main/resources/Vagrantfile
@@ -18,6 +18,26 @@
# Because of linked_clone. 1.9+ recommended for Ubuntu Xenial
Vagrant.require_version ">= 1.8"
+module CustomProviders
+ @@providers = []
+ def register(&fn)
+ @@providers << fn
+ end
+ def configure(config, machine_config)
+ @@providers.each do |provider|
+ provider.call(config, machine_config)
+ end
+ end
+
+ module_function :register
+ module_function :configure
+end
+
+
+Dir[Dir.home() + '/.jclouds/vagrant/providers/*.rb'].each do |file|
+ require File.dirname(file) + "/" + File.basename(file, '.rb')
+end
+
Vagrant.configure(2) do |config|
Dir.glob('machines/*.yaml') do |machine_file|
machine_config = YAML.load_file(machine_file)
@@ -69,12 +89,18 @@
v.memory = machine_config["memory"] if machine_config.key?("memory")
v.cpus = machine_config["cpus"] if machine_config.key?("cpus")
v.linked_clone = true
- # Windows needs additional drivers for virtio
+ # Windows needs additional drivers for virtio and the default one is dreadfully slow on linux
if !isWindows
v.customize ["modifyvm", :id, "--nictype1", "virtio"]
v.customize ["modifyvm", :id, "--nictype2", "virtio"]
end
end
+ config.vm.provider "libvirt" do |v|
+ v.memory = machine_config["memory"] if machine_config.key?("memory")
+ v.cpus = machine_config["cpus"] if machine_config.key?("cpus")
+ end
+
+ CustomProviders.configure(config, machine_config)
end
end
end
\ No newline at end of file
diff --git a/vagrant/src/test/resources/logback-test.xml b/vagrant/src/test/resources/logback-test.xml
index 72e46d0..e39bae3 100644
--- a/vagrant/src/test/resources/logback-test.xml
+++ b/vagrant/src/test/resources/logback-test.xml
@@ -23,9 +23,16 @@
<Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
</encoder>
</appender>
+ <appender name="file" class="ch.qos.logback.core.FileAppender">
+ <file>target/test-data/jclouds.log</file>
+ <encoder>
+ <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+ </encoder>
+ </appender>
<root level="INFO">
<appender-ref ref="console"/>
+ <appender-ref ref="file"/>
</root>
<logger name="org.jclouds" level="INFO" />