Support for multiple vagrant providers Selects the provider to be used based on the selected image.
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/234f67ed Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/234f67ed Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/234f67ed Branch: refs/heads/master Commit: 234f67edffa7a8465d85d6a5afa79e9324f08f40 Parents: c9af1b2 Author: Svetoslav Neykov <[email protected]> Authored: Wed Jul 19 20:51:46 2017 +0300 Committer: Svetoslav Neykov <[email protected]> Committed: Tue Aug 1 14:48:26 2017 +0300 ---------------------------------------------------------------------- vagrant/README.md | 25 +++++++++++++++++ vagrant/pom.xml | 2 +- .../jclouds/vagrant/api/VagrantApiFacade.java | 2 +- .../compute/VagrantComputeServiceAdapter.java | 9 ++++--- .../vagrant/internal/VagrantCliFacade.java | 4 +-- vagrant/src/main/resources/Vagrantfile | 28 +++++++++++++++++++- vagrant/src/test/resources/logback-test.xml | 7 +++++ 7 files changed, 69 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/234f67ed/vagrant/README.md ---------------------------------------------------------------------- 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 @@ make virtualbox/eval-win2012r2-standard 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 ----------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/234f67ed/vagrant/pom.xml ---------------------------------------------------------------------- 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> http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/234f67ed/vagrant/src/main/java/org/jclouds/vagrant/api/VagrantApiFacade.java ---------------------------------------------------------------------- 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 @@ public interface VagrantApiFacade { * * @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); http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/234f67ed/vagrant/src/main/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapter.java ---------------------------------------------------------------------- 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 @@ public class VagrantComputeServiceAdapter implements ComputeServiceAdapter<Vagra } 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 @@ public class VagrantComputeServiceAdapter implements ComputeServiceAdapter<Vagra 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 @@ public class VagrantComputeServiceAdapter implements ComputeServiceAdapter<Vagra @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); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/234f67ed/vagrant/src/main/java/org/jclouds/vagrant/internal/VagrantCliFacade.java ---------------------------------------------------------------------- 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 @@ public class VagrantCliFacade implements VagrantApiFacade, VagrantBoxApiFacade<B } @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(); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/234f67ed/vagrant/src/main/resources/Vagrantfile ---------------------------------------------------------------------- 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 @@ require 'yaml' # 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 @@ Vagrant.configure(2) do |config| 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 http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/234f67ed/vagrant/src/test/resources/logback-test.xml ---------------------------------------------------------------------- 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" />
