http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/main/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentials.java ---------------------------------------------------------------------- diff --git a/vagrant/src/main/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentials.java b/vagrant/src/main/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentials.java new file mode 100644 index 0000000..97667cf --- /dev/null +++ b/vagrant/src/main/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentials.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.domain.LoginCredentials.Builder; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.logging.Logger; +import org.jclouds.vagrant.internal.BoxConfig; +import org.jclouds.vagrant.reference.VagrantConstants; + +import com.google.common.base.Charsets; +import com.google.common.base.Optional; +import com.google.common.io.Files; +import com.google.inject.Singleton; + +@Singleton +public class VagrantDefaultImageCredentials implements PopulateDefaultLoginCredentialsForImageStrategy { + + @Resource + protected Logger logger = Logger.NULL; + + protected final LoginCredentials creds; + protected final Map<String, Credentials> credentialStore; + protected final BoxConfig.Factory boxConfigFactory; + + @Inject + VagrantDefaultImageCredentials( + @Nullable @Named("image") LoginCredentials creds, + Map<String, Credentials> credentialStore, + BoxConfig.Factory boxConfigFactory) { + this.creds = creds; + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.boxConfigFactory = checkNotNull(boxConfigFactory, "boxConfigFactory"); + } + + @Override + public LoginCredentials apply(Object resourceToAuthenticate) { + checkState(resourceToAuthenticate instanceof Image, "this is only valid for images, not %s", + resourceToAuthenticate.getClass().getSimpleName()); + if (creds != null) + return creds; + Image image = Image.class.cast(resourceToAuthenticate); + if (credentialStore.containsKey("image#" + image.getId())) { + return LoginCredentials.fromCredentials(credentialStore.get("image#" + image.getId())); + // Skipping osFamilyToCredentials - not applicable to vagrant world + } else if (image.getOperatingSystem().getFamily() == OsFamily.WINDOWS) { + return parseWinRmBoxCredentials(image); + } else { + return parseSshBoxCredentials(image); + } + } + + private LoginCredentials parseWinRmBoxCredentials(Image image) { + BoxConfig parser = boxConfigFactory.newInstance(image); + String username = parser.getStringKey(VagrantConstants.KEY_WINRM_USERNAME).or(VagrantConstants.DEFAULT_USERNAME); + String password = parser.getStringKey(VagrantConstants.KEY_WINRM_PASSWORD).or(VagrantConstants.DEFAULT_PASSWORD); + return LoginCredentials.builder() + .user(username) + .password(password) + .noPrivateKey() + .build(); + } + + private LoginCredentials parseSshBoxCredentials(Image image) { + BoxConfig parser = boxConfigFactory.newInstance(image); + String username = parser.getStringKey(VagrantConstants.KEY_SSH_USERNAME).or(VagrantConstants.DEFAULT_USERNAME); + Builder credBuilder = LoginCredentials.builder().user(username); + Optional<String> password = parser.getStringKey(VagrantConstants.KEY_SSH_PASSWORD); + if (password.isPresent()) { + credBuilder.password(password.get()); + } + Optional<String> privateKeyPath = parser.getStringKey(VagrantConstants.KEY_SSH_PRIVATE_KEY_PATH); + if (privateKeyPath.isPresent()) { + File privateKey = new File(parser.getFolder(), privateKeyPath.get()); + if (privateKey.exists()) { + try { + credBuilder.privateKey(Files.toString(privateKey, Charsets.UTF_8)); + } catch (IOException e) { + throw new IllegalStateException("Failure reading private key file " + + privateKey.getAbsolutePath() + " for box " + parser.getFolder().getAbsolutePath()); + } + } else { + logger.warn("Private key " + privateKeyPath.get() + " for box " + + parser.getFolder().getAbsolutePath() + " not found at " + privateKey.getAbsolutePath() + ". Ignoring."); + } + } + return credBuilder.build(); + } + +}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/main/java/org/jclouds/vagrant/suppliers/VagrantHardwareSupplier.java ---------------------------------------------------------------------- diff --git a/vagrant/src/main/java/org/jclouds/vagrant/suppliers/VagrantHardwareSupplier.java b/vagrant/src/main/java/org/jclouds/vagrant/suppliers/VagrantHardwareSupplier.java new file mode 100644 index 0000000..f048b48 --- /dev/null +++ b/vagrant/src/main/java/org/jclouds/vagrant/suppliers/VagrantHardwareSupplier.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.suppliers; + +import java.util.Map; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; +import org.jclouds.compute.domain.Processor; +import org.jclouds.compute.domain.Volume.Type; +import org.jclouds.compute.domain.VolumeBuilder; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; + +public class VagrantHardwareSupplier implements Supplier<Map<String, Hardware>> { + private static final Map<String, Hardware> HARDWARE = ImmutableMap.of( + "micro", hardware("micro", 512, 1), + "small", hardware("small", 1024, 1), + "medium", hardware("medium", 2048, 2), + "large", hardware("large", 4096, 2), + "xlarge", hardware("xlarge", 8192, 4)); + + private static Hardware hardware(String name, int ram, int cores) { + return new HardwareBuilder() + .ids(name) + .hypervisor("VirtualBox") + .name(name) + .processor(new Processor(cores, 1)) + .ram(ram) + .volume(new VolumeBuilder().bootDevice(true).durable(true).type(Type.LOCAL).build()) + .build(); + } + + @Override + public Map<String, Hardware> get() { + return HARDWARE; + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/main/java/org/jclouds/vagrant/util/VagrantUtils.java ---------------------------------------------------------------------- diff --git a/vagrant/src/main/java/org/jclouds/vagrant/util/VagrantUtils.java b/vagrant/src/main/java/org/jclouds/vagrant/util/VagrantUtils.java new file mode 100644 index 0000000..68c6249 --- /dev/null +++ b/vagrant/src/main/java/org/jclouds/vagrant/util/VagrantUtils.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.util; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import org.jclouds.util.Closeables2; + +import com.google.common.base.Charsets; +import com.google.common.io.ByteStreams; + +public class VagrantUtils { + public static void deleteFolder(File path) { + if (path.isDirectory()) { + for (File sub : path.listFiles()) { + deleteFolder(sub); + } + } + if (!path.delete()) { + throw new IllegalStateException("Can't delete " + path.getAbsolutePath()); + } + } + + public static void write(File file, String value) throws IOException { + write(file, new ByteArrayInputStream(value.getBytes(Charsets.UTF_8))); + } + + public static void write(File file, InputStream in) throws IOException { + OutputStream out = new FileOutputStream(file); + try { + ByteStreams.copy(in, out); + } finally { + Closeables2.closeQuietly(out); + Closeables2.closeQuietly(in); + } + } + + public static void deleteFiles(File path, String filePattern) { + for (File f : path.listFiles()) { + if (f.getName().startsWith(filePattern)) { + if (!f.delete()) { + throw new IllegalStateException("Failed deleting machine file " + f.getAbsolutePath()); + } + } + } + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/main/resources/Vagrantfile ---------------------------------------------------------------------- diff --git a/vagrant/src/main/resources/Vagrantfile b/vagrant/src/main/resources/Vagrantfile new file mode 100644 index 0000000..9912ff1 --- /dev/null +++ b/vagrant/src/main/resources/Vagrantfile @@ -0,0 +1,80 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'yaml' + +# Because of linked_clone. 1.9+ recommended for Ubuntu Xenial +Vagrant.require_version ">= 1.8" + +Vagrant.configure(2) do |config| + Dir.glob('machines/*.yaml') do |machine_file| + machine_config = YAML.load_file(machine_file) + name = File.basename(machine_file, ".yaml") + config.vm.define name do |config| + config.vm.box = machine_config["box"] + config.vm.box_check_update = false + config.vm.network "private_network", type: "dhcp" + config.vm.synced_folder '.', '/vagrant', disabled: true + config.ssh.username = machine_config["username"] if machine_config.key?("username") + config.ssh.password = machine_config["password"] if machine_config.key?("password") + config.ssh.private_key_path = machine_config["private_key_path"] if machine_config.key?("private_key_path") + + isWindows = (machine_config["osFamily"] == "windows"); + if isWindows + # That's a Powershell script. + # Go through a temporary file, otherwise getting the following error: + + # out-lineoutput : The OS handle's position is not what FileStream expected. Do n + # ot use a handle simultaneously in one FileStream and in Win32 code or another F + # ileStream. This may cause data loss. + # + CategoryInfo : NotSpecified: (:) [out-lineoutput], IOException + # + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Comma + # nds.OutLineOutputCommand + + config.vm.provision "shell", inline: <<-EOF + $tmp = [System.IO.Path]::GetTempFileName() + echo "================= Networks start =================" > $tmp + ipconfig | find "IPv4 Address" >> $tmp 2>&1 + echo "================= Networks end ===================" >> $tmp + echo "================= Hostname start ==========================" >> $tmp + hostname >> $tmp 2>&1 + echo "================= Hostname end ============================" >> $tmp + type $tmp + EOF + else + config.vm.provision "shell", inline: <<-EOF + echo "================= Networks start =================" + ip address show | grep 'scope global' 2>&1 + echo "================= Networks end ===================" + echo "================= Hostname start ==========================" + hostname 2>&1 + echo "================= Hostname end ============================" + EOF + end + + config.vm.provider "virtualbox" do |v| + v.gui = false + 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 + if !isWindows + v.customize ["modifyvm", :id, "--nictype1", "virtio"] + v.customize ["modifyvm", :id, "--nictype2", "virtio"] + end + end + end + end +end \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/compute/BoxConfigLiveTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/compute/BoxConfigLiveTest.java b/vagrant/src/test/java/org/jclouds/vagrant/compute/BoxConfigLiveTest.java new file mode 100644 index 0000000..3475f43 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/compute/BoxConfigLiveTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.compute; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; +import org.jclouds.vagrant.internal.BoxConfig; +import org.jclouds.vagrant.reference.VagrantConstants; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; + +@Test(groups = "live", testName = "BoxConfigLiveTest") +public class BoxConfigLiveTest extends BaseComputeServiceContextLiveTest { + + public BoxConfigLiveTest() { + provider = "vagrant"; + } + + @Test + public void testDefaultCredentials() { + Image image = view.getComputeService().getImage("ubuntu/trusty64"); + + BoxConfig.Factory boxConfigFactory = new BoxConfig.Factory(); + BoxConfig boxConfig = boxConfigFactory.newInstance(image); + + assertFalse(boxConfig.getStringKey(VagrantConstants.CONFIG_USERNAME).isPresent()); + assertFalse(boxConfig.getStringKey(VagrantConstants.CONFIG_PASSWORD).isPresent()); + } + + @Test + public void testCustomUsernameAndPassword() { + Image image = view.getComputeService().getImage("ubuntu/xenial64"); + + BoxConfig.Factory boxConfigFactory = new BoxConfig.Factory(); + BoxConfig boxConfig = boxConfigFactory.newInstance(image); + + assertEquals(boxConfig.getStringKey(VagrantConstants.CONFIG_USERNAME), Optional.of("ubuntu")); + // Password changes on each box update + assertTrue(boxConfig.getStringKey(VagrantConstants.CONFIG_PASSWORD).isPresent()); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapterLiveTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapterLiveTest.java b/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapterLiveTest.java new file mode 100644 index 0000000..58580ca --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantComputeServiceAdapterLiveTest.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.compute; + +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.internal.BaseComputeServiceLiveTest; +import org.jclouds.sshj.config.SshjSshClientModule; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +public class VagrantComputeServiceAdapterLiveTest extends BaseComputeServiceLiveTest { + + public VagrantComputeServiceAdapterLiveTest() { + provider = "vagrant"; + } + + @Override + protected Module getSshModule() { + return new SshjSshClientModule(); + } + + @Override + @Test(enabled = true) + public void testCorrectAuthException() throws Exception { + // Vagrant doesn't use credential info + } + + @Override + protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) { + // Vagrant doesn't support tags + // TODO Could store it in the json + } + + @Override + protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) { + // Vagrant doesn't support user metadata + // TODO Could store it in the json + } + + @Override + @Test(enabled = true, dependsOnMethods = "testGet") + public void testOptionToNotBlock() throws Exception { + // LoginCredentials are available only after the machine starts, + // so can't return earlier. + } + + @Override + @Test(enabled = true, dependsOnMethods = { "testCompareSizes" }) + public void testAScriptExecutionAfterBootWithBasicTemplate() throws Exception { + // Fails on CentOS 7. Can't ssh back with user foo because SELinux not configured correctly. + // "foo" is created out of the /home folder, /over/ridden is not white listed with the correct context. + // Steps needed to configure SELinux before creating the user: + // + // semanage fcontext -a -e /home /over/ridden + // mkdir /over/ridden + // restorecon /over/ridden + // useradd -d /over/ridden/foo foo + // + // semanage is not available on a default install - needs "yum install policycoreutils-python" + + Template template = buildTemplate(templateBuilder()); + if (template.getImage().getOperatingSystem().getFamily() != OsFamily.CENTOS) { + super.testAScriptExecutionAfterBootWithBasicTemplate(); + } + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantTemplateBuilderLiveTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantTemplateBuilderLiveTest.java b/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantTemplateBuilderLiveTest.java new file mode 100644 index 0000000..dcb8040 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/compute/VagrantTemplateBuilderLiveTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.compute; + +import static org.jclouds.compute.domain.OsFamily.UBUNTU; +import static org.jclouds.compute.domain.OsFamily.CENTOS; +import static org.jclouds.compute.util.ComputeServiceUtils.getCores; +import static org.testng.Assert.assertEquals; + +import java.io.IOException; +import java.util.Set; + +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.internal.BaseTemplateBuilderLiveTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +@Test(groups = "live", testName = "VagrantTemplateBuilderLiveTest") +public class VagrantTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { + + public VagrantTemplateBuilderLiveTest() { + provider = "vagrant"; + } + + @Override + protected Set<String> getIso3166Codes() { + return ImmutableSet.of(); + } + + @Test + @Override + public void testDefaultTemplateBuilder() throws IOException { + Template defaultTemplate = view.getComputeService().templateBuilder().build(); + String imageId = defaultTemplate.getImage().getId(); + if (imageId.startsWith("ubuntu")) { + assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), UBUNTU); + } else if (imageId.startsWith("centos")) { + assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), CENTOS); + } + assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(defaultTemplate.getHardware().getName(), "micro"); + assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/compute/WindowsLiveTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/compute/WindowsLiveTest.java b/vagrant/src/test/java/org/jclouds/vagrant/compute/WindowsLiveTest.java new file mode 100644 index 0000000..a8887e7 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/compute/WindowsLiveTest.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.compute; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.util.Set; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.vagrant.internal.BoxConfig; +import org.jclouds.vagrant.reference.VagrantConstants; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; + +/** + * Building the image: + * $ git clone https://github.com/boxcutter/windows.git boxcutter-windows + * $ cd boxcutter-windows + * $ make virtualbox/eval-win7x86-enterprise + * $ vagrant box add boxcutter/eval-win7x86-enterprise box/virtualbox/eval-win7x86-enterprise-nocm-1.0.4.box + */ +@Test(groups = "live", singleThreaded = true, enabled = true, testName = "WindowsLiveTest") +public class WindowsLiveTest extends BaseComputeServiceContextLiveTest { + + protected ComputeService client; + + public WindowsLiveTest() { + provider = "vagrant"; + } + + @Override + protected void initializeContext() { + super.initializeContext(); + client = view.getComputeService(); + } + + protected TemplateBuilder templateBuilder() { + TemplateBuilder templateBuilder = client.templateBuilder(); + if (templateBuilderSpec != null) { + templateBuilder = templateBuilder.from(templateBuilderSpec); + } + templateBuilder.imageId(getImageId()); + return templateBuilder; + } + + private String getImageId() { + return "boxcutter/eval-win7x86-enterprise"; + } + + protected Template buildTemplate(TemplateBuilder templateBuilder) { + return templateBuilder.build(); + } + + @Test + public void testGet() throws Exception { + Set<? extends NodeMetadata> nodes = client.createNodesInGroup("vagrant-win", 1, buildTemplate(templateBuilder())); + NodeMetadata node = Iterables.getOnlyElement(nodes); + OperatingSystem os = node.getOperatingSystem(); + LoginCredentials creds = node.getCredentials(); + assertEquals(os.getFamily(), OsFamily.WINDOWS); + assertEquals(creds.getUser(), "vagrant"); + assertTrue(creds.getOptionalPassword().isPresent(), "password expected"); + assertEquals(creds.getOptionalPassword().get(), "vagrant"); + assertFalse(creds.getOptionalPrivateKey().isPresent(), "no private key expected for windows"); + assertEquals(node.getLoginPort(), 5985); + client.destroyNode(node.getId()); + } + + + @Test + public void testBoxConfig() { + Image image = view.getComputeService().getImage(getImageId()); + + BoxConfig.Factory boxConfigFactory = new BoxConfig.Factory(); + BoxConfig boxConfig = boxConfigFactory.newInstance(image); + + assertEquals(boxConfig.getStringKey(".vm.communicator"), Optional.of("winrm")); + assertEquals(boxConfig.getKey(VagrantConstants.KEY_VM_GUEST), Optional.of(VagrantConstants.VM_GUEST_WINDOWS)); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/functions/BoxToImageTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/functions/BoxToImageTest.java b/vagrant/src/test/java/org/jclouds/vagrant/functions/BoxToImageTest.java new file mode 100644 index 0000000..ac6307c --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/functions/BoxToImageTest.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.functions; + +import static org.testng.Assert.assertEquals; + +import org.easymock.EasyMock; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Image.Status; +import org.jclouds.vagrant.internal.BoxConfig; +import org.jclouds.vagrant.reference.VagrantConstants; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; + +import vagrant.api.domain.Box; + +public class BoxToImageTest { + + @DataProvider(name = "boxedProvider") + public Object[][] boxesProvider() { + return new Object[][] { + {new Box("centos/7", "20161226", "virtualbox"), null, OsFamily.CENTOS}, + {new Box("ubuntu/xenial64", "20161226", "virtualbox"), null, OsFamily.UBUNTU}, + {new Box("windows-eval", "20161226", "virtualbox"), null, OsFamily.WINDOWS}, + {new Box("some-random-name", "20161226", "virtualbox"), Optional.of(VagrantConstants.VM_GUEST_WINDOWS), OsFamily.WINDOWS}, + {new Box("some-random-name", "20161226", "virtualbox"), Optional.absent(), OsFamily.UNRECOGNIZED}, + }; + } + + @Test(dataProvider = "boxedProvider") + public void testBoxToImage(Box box, Optional<String> guestType, OsFamily osFamilyExpected) { + BoxConfig boxConfig = EasyMock.createMock(BoxConfig.class); + if (guestType != null) { + EasyMock.expect(boxConfig.getKey(VagrantConstants.KEY_VM_GUEST)).andReturn(guestType); + } + + BoxConfig.Factory boxConfigFactory = EasyMock.createMock(BoxConfig.Factory.class); + EasyMock.expect(boxConfigFactory.newInstance(EasyMock.<Box>anyObject())).andReturn(boxConfig); + + EasyMock.replay(boxConfigFactory, boxConfig); + + BoxToImage boxToImage = new BoxToImage(boxConfigFactory); + Image image = boxToImage.apply(box); + + assertEquals(image.getId(), box.getName()); + assertEquals(image.getProviderId(), box.getName()); + assertEquals(image.getName(), box.getName()); + assertEquals(image.getVersion(), box.getVersion()); + assertEquals(image.getOperatingSystem().getFamily(), osFamilyExpected); + assertEquals(image.getOperatingSystem().getName(), box.getName()); + assertEquals(image.getOperatingSystem().getVersion(), box.getVersion()); + assertEquals(image.getOperatingSystem().getDescription(), box.getName()); + assertEquals(image.getStatus(), Status.AVAILABLE); + assertEquals(image.getUserMetadata(), ImmutableMap.of(VagrantConstants.USER_META_PROVIDER, box.getProvider())); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/functions/MachineToNodeMetadataTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/functions/MachineToNodeMetadataTest.java b/vagrant/src/test/java/org/jclouds/vagrant/functions/MachineToNodeMetadataTest.java new file mode 100644 index 0000000..7f5f5f2 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/functions/MachineToNodeMetadataTest.java @@ -0,0 +1,295 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.functions; + +import static org.testng.Assert.assertEquals; + +import java.io.File; +import java.util.Map; +import java.util.Set; + +import org.easymock.EasyMock; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadata.Status; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Processor; +import org.jclouds.domain.Location; +import org.jclouds.vagrant.domain.VagrantNode; +import org.jclouds.vagrant.internal.BoxConfig; +import org.jclouds.vagrant.internal.MachineConfig; +import org.jclouds.vagrant.reference.VagrantConstants; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +import vagrant.api.domain.Box; + +public class MachineToNodeMetadataTest { + private abstract static class MachineToNodeMetadataFixture { + @Test + public void doTest() { + OperatingSystem os = new OperatingSystem(getOsFamily(), "Jclouds OS", "10", "x64", "Jclouds Test Image", true); + Image image = new ImageBuilder() + .ids("jclouds/box") + .operatingSystem(os) + .status(org.jclouds.compute.domain.Image.Status.AVAILABLE) + .build(); + + ImmutableList<String> networks = ImmutableList.of("172.28.128.3"); + VagrantNode node = VagrantNode.builder() + .setPath(new File("/path/to/machine")) + .setId("vagrant/node") + .setGroup("vagrant") + .setName("node") + .setImage(image) + .setNetworks(networks) + .setHostname("vagrant-node") + .build(); + + node.setMachineState(Status.RUNNING); + + Location location = EasyMock.createMock(Location.class); + + BoxConfig boxConfig = EasyMock.createMock(BoxConfig.class); + expectBoxConfig(boxConfig); + + BoxConfig.Factory boxConfigFactory = EasyMock.createMock(BoxConfig.Factory.class); + EasyMock.expect(boxConfigFactory.newInstance((Image)EasyMock.<Box>anyObject())).andReturn(boxConfig); + + MachineConfig machineConfig = EasyMock.createMock(MachineConfig.class); + EasyMock.expect(machineConfig.load()).andReturn(getMachineConfig()); + + MachineConfig.Factory machineConfigFactory = EasyMock.createMock(MachineConfig.Factory.class); + EasyMock.expect(machineConfigFactory.newInstance(node)).andReturn(machineConfig); + + Hardware hardware = new HardwareBuilder().ids(getHardwareId()).ram(100).processor(new Processor(1.0, 1)).build(); + Supplier<? extends Map<String, Hardware>> hardwareSupplier = Suppliers.ofInstance(ImmutableMap.of(getHardwareId(), hardware)); + + EasyMock.replay(location, boxConfig, boxConfigFactory, + machineConfig, machineConfigFactory); + + @SuppressWarnings({ "unchecked", "rawtypes" }) + Supplier<Set<? extends Location>> locations = (Supplier<Set<? extends Location>>)(Supplier)Suppliers.ofInstance(ImmutableSet.of(location)); + + MachineToNodeMetadata machineToNodeMetadata = new MachineToNodeMetadata( + locations, + boxConfigFactory, + machineConfigFactory, + hardwareSupplier); + + NodeMetadata nodeMetadataActual = machineToNodeMetadata.apply(node); + + NodeMetadataBuilder nodeMetadataBuilder = new NodeMetadataBuilder() + .ids("vagrant/node") + .name("node") + .location(location) + .group("vagrant") + .imageId("jclouds/box") + .operatingSystem(os) + .status(Status.RUNNING) + .hostname("vagrant-node") + .privateAddresses(networks) + .hardware(hardware); + customizeBuilder(nodeMetadataBuilder); + NodeMetadata nodeMetadataExpected = nodeMetadataBuilder + .build(); + + assertEquals(nodeMetadataActual.toString(), nodeMetadataExpected.toString()); + } + + protected Map<String, Object> getMachineConfig() { + return ImmutableMap.<String, Object>of(VagrantConstants.CONFIG_HARDWARE_ID, getHardwareId()); + } + + protected abstract void customizeBuilder(NodeMetadataBuilder nodeMetadataBuilder); + protected abstract String getHardwareId(); + protected abstract OsFamily getOsFamily(); + protected abstract void expectBoxConfig(BoxConfig boxConfig); + } + + @Test + public void testMiniLinux() { + class MachineToNodeMetadataLinuxMini extends MachineToNodeMetadataFixture { + protected void customizeBuilder(NodeMetadataBuilder nodeMetadataBuilder) { + nodeMetadataBuilder.loginPort(2222); + } + + protected String getHardwareId() { + return "mini"; + } + + protected OsFamily getOsFamily() { + return OsFamily.LINUX; + } + + protected void expectBoxConfig(BoxConfig boxConfig) { + EasyMock.expect(boxConfig.getKey(VagrantConstants.KEY_SSH_PORT)).andReturn(Optional.of("2222")); + } + } + new MachineToNodeMetadataLinuxMini().doTest(); + } + + @Test + public void testDefaultSshPort() { + class MachineToNodeMetadataLinuxMini extends MachineToNodeMetadataFixture { + + protected OsFamily getOsFamily() { + return OsFamily.LINUX; + } + + protected void expectBoxConfig(BoxConfig boxConfig) { + EasyMock.expect(boxConfig.getKey(VagrantConstants.KEY_SSH_PORT)).andReturn(Optional.<String>absent()); + } + + protected void customizeBuilder(NodeMetadataBuilder nodeMetadataBuilder) { + nodeMetadataBuilder.loginPort(22); + } + + protected String getHardwareId() { + return "mini"; + } + } + new MachineToNodeMetadataLinuxMini().doTest(); + } + + @Test + public void testAutoLinux() { + class MachineToNodeMetadataLinuxMini extends MachineToNodeMetadataFixture { + protected OsFamily getOsFamily() { + return OsFamily.LINUX; + } + + protected void expectBoxConfig(BoxConfig boxConfig) { + EasyMock.expect(boxConfig.getKey(VagrantConstants.KEY_SSH_PORT)).andReturn(Optional.of("2222")); + } + + protected void customizeBuilder(NodeMetadataBuilder nodeMetadataBuilder) { + nodeMetadataBuilder.loginPort(2222) + .hardware(new HardwareBuilder() + .ids("automatic:cores=2.0;ram=1000") + .processor(new Processor(2.0, 1)) + .ram(1000) + .build()); + } + + @Override + protected Map<String, Object> getMachineConfig() { + return ImmutableMap.<String, Object>of( + VagrantConstants.CONFIG_HARDWARE_ID, getHardwareId(), + VagrantConstants.CONFIG_CPUS, "2.0", + VagrantConstants.CONFIG_MEMORY, "1000"); + } + + protected String getHardwareId() { + return "automatic"; + } + } + new MachineToNodeMetadataLinuxMini().doTest(); + } + + @Test + public void testMiniWin() { + class MachineToNodeMetadataLinuxMini extends MachineToNodeMetadataFixture { + protected void customizeBuilder(NodeMetadataBuilder nodeMetadataBuilder) { + nodeMetadataBuilder.loginPort(8899); + } + + protected String getHardwareId() { + return "mini"; + } + + protected OsFamily getOsFamily() { + return OsFamily.WINDOWS; + } + + protected void expectBoxConfig(BoxConfig boxConfig) { + EasyMock.expect(boxConfig.getKey(VagrantConstants.KEY_WINRM_PORT)).andReturn(Optional.of("8899")); + } + } + new MachineToNodeMetadataLinuxMini().doTest(); + } + + @Test + public void testDefaultWinrmPort() { + class MachineToNodeMetadataLinuxMini extends MachineToNodeMetadataFixture { + + protected OsFamily getOsFamily() { + return OsFamily.WINDOWS; + } + + protected void expectBoxConfig(BoxConfig boxConfig) { + EasyMock.expect(boxConfig.getKey(VagrantConstants.KEY_WINRM_PORT)).andReturn(Optional.<String>absent()); + } + + protected void customizeBuilder(NodeMetadataBuilder nodeMetadataBuilder) { + nodeMetadataBuilder.loginPort(5985); + } + + protected String getHardwareId() { + return "mini"; + } + } + new MachineToNodeMetadataLinuxMini().doTest(); + } + + @Test + public void testAutoWin() { + class MachineToNodeMetadataLinuxMini extends MachineToNodeMetadataFixture { + protected OsFamily getOsFamily() { + return OsFamily.WINDOWS; + } + + protected void expectBoxConfig(BoxConfig boxConfig) { + EasyMock.expect(boxConfig.getKey(VagrantConstants.KEY_WINRM_PORT)).andReturn(Optional.of("8899")); + } + + protected void customizeBuilder(NodeMetadataBuilder nodeMetadataBuilder) { + nodeMetadataBuilder.loginPort(8899) + .hardware(new HardwareBuilder() + .ids("automatic:cores=2.0;ram=1000") + .processor(new Processor(2.0, 1)) + .ram(1000) + .build()); + } + + @Override + protected Map<String, Object> getMachineConfig() { + return ImmutableMap.<String, Object>of( + VagrantConstants.CONFIG_HARDWARE_ID, getHardwareId(), + VagrantConstants.CONFIG_CPUS, "2.0", + VagrantConstants.CONFIG_MEMORY, "1000"); + } + + protected String getHardwareId() { + return "automatic"; + } + } + new MachineToNodeMetadataLinuxMini().doTest(); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/functions/OutdatedBoxesFilterTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/functions/OutdatedBoxesFilterTest.java b/vagrant/src/test/java/org/jclouds/vagrant/functions/OutdatedBoxesFilterTest.java new file mode 100644 index 0000000..7cf3f06 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/functions/OutdatedBoxesFilterTest.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.functions; + +import static org.testng.Assert.assertEquals; + +import java.util.Collection; +import java.util.Set; + +import org.testng.annotations.Test; +import org.testng.collections.Sets; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; + +import vagrant.api.domain.Box; + +public class OutdatedBoxesFilterTest { + Collection<Box> UNFILTERED = ImmutableList.<Box>builder() + .add(new Box("CiscoCloud/microservices-infrastructure", "0.5", "virtualbox")) + .add(new Box("boxcutter/eval-win7x86-enterprise", "0", "virtualbox")) + .add(new Box("centos/7", "1603.01", "virtualbox")) + .add(new Box("centos/7", "1607.01", "virtualbox")) + .add(new Box("chef/centos-6.5", "1.0.0", "virtualbox")) + .add(new Box("chef/centos-7.0", "1.0.0", "virtualbox")) + .add(new Box("debian/jessie64", "8.4.0", "virtualbox")) + .add(new Box("debian/jessie64", "8.6.1", "virtualbox")) + .add(new Box("debian/wheezy64", "7.10.0", "virtualbox")) + .add(new Box("mitchellh/boot2docker", "1.2.0", "virtualbox")) + .add(new Box("nrel/CentOS-6.5-x86_64", "1.2.0", "virtualbox")) + .add(new Box("orlandohohmeier/toolchain", "0.5.1", "virtualbox")) + .add(new Box("playa_mesos_ubuntu_14.04", "0", "virtualbox")) + .add(new Box("snappy", "0", "virtualbox")) + .add(new Box("ubuntu/precise32", "20161208.0.0", "virtualbox")) + .add(new Box("ubuntu/precise64", "12.04.4", "virtualbox")) + .add(new Box("ubuntu/trusty64", "14.04", "virtualbox")) + .add(new Box("ubuntu/trusty64", "20160822.0.2", "virtualbox")) + .add(new Box("ubuntu/ubuntu-15.04-snappy-core-edge-amd64", "15.04.20150424", "virtualbox")) + .add(new Box("ubuntu/vivid64", "20150427.0.0", "virtualbox")) + .add(new Box("ubuntu/vivid64", "20150611.0.1", "virtualbox")) + .add(new Box("ubuntu/wily64", "20151106.0.0", "virtualbox")) + .add(new Box("ubuntu/wily64", "20160715.0.0", "virtualbox")) + .add(new Box("ubuntu/xenial64", "20160922.0.0", "virtualbox")) + .add(new Box("ubuntu/xenial64", "20161119.0.0", "virtualbox")) + .add(new Box("ubuntu/xenial64", "20161221.0.0", "virtualbox")) + .build(); + + Set<Box> FILTERED = ImmutableSet.<Box>builder() + .add(new Box("CiscoCloud/microservices-infrastructure", "0.5", "virtualbox")) + .add(new Box("boxcutter/eval-win7x86-enterprise", "0", "virtualbox")) + .add(new Box("centos/7", "1607.01", "virtualbox")) + .add(new Box("chef/centos-6.5", "1.0.0", "virtualbox")) + .add(new Box("chef/centos-7.0", "1.0.0", "virtualbox")) + .add(new Box("debian/jessie64", "8.6.1", "virtualbox")) + .add(new Box("debian/wheezy64", "7.10.0", "virtualbox")) + .add(new Box("mitchellh/boot2docker", "1.2.0", "virtualbox")) + .add(new Box("nrel/CentOS-6.5-x86_64", "1.2.0", "virtualbox")) + .add(new Box("orlandohohmeier/toolchain", "0.5.1", "virtualbox")) + .add(new Box("playa_mesos_ubuntu_14.04", "0", "virtualbox")) + .add(new Box("snappy", "0", "virtualbox")) + .add(new Box("ubuntu/precise32", "20161208.0.0", "virtualbox")) + .add(new Box("ubuntu/precise64", "12.04.4", "virtualbox")) + .add(new Box("ubuntu/trusty64", "20160822.0.2", "virtualbox")) + .add(new Box("ubuntu/ubuntu-15.04-snappy-core-edge-amd64", "15.04.20150424", "virtualbox")) + .add(new Box("ubuntu/vivid64", "20150611.0.1", "virtualbox")) + .add(new Box("ubuntu/wily64", "20160715.0.0", "virtualbox")) + .add(new Box("ubuntu/xenial64", "20161221.0.0", "virtualbox")) + .build(); + + @Test + public void testFilter() { + OutdatedBoxesFilter filter = new OutdatedBoxesFilter(); + Collection<Box> actual = filter.apply(UNFILTERED); + assertEquals(Sets.newHashSet(actual), FILTERED, "Actual list: " + actual); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/internal/BoxConfigTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/internal/BoxConfigTest.java b/vagrant/src/test/java/org/jclouds/vagrant/internal/BoxConfigTest.java new file mode 100644 index 0000000..631d813 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/internal/BoxConfigTest.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.internal; + +import static org.testng.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; + +import org.jclouds.vagrant.reference.VagrantConstants; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.io.Files; +import com.google.common.io.Resources; + +import vagrant.api.domain.Box; + +public class BoxConfigTest { + + private File vagrantHome; + + @BeforeMethod + public void setUp() { + vagrantHome = new File(System.getProperty("java.io.tmpdir"), "jclouds/vagrant"); + } + + @Test + public void testKeys() throws IOException { + File boxFolder = new File(vagrantHome, "boxes/jclouds-VAGRANTSLASH-vagrant/0/virtualbox"); + boxFolder.mkdirs(); + File boxPath = new File(boxFolder, VagrantConstants.VAGRANTFILE); + Resources.asByteSource(getClass().getResource("/Vagrantfile.boxconfig")).copyTo(Files.asByteSink(boxPath)); + + BoxConfig boxConfig = new BoxConfig.Factory().newInstance(vagrantHome, new Box("jclouds/vagrant", "0", "virtualbox")); + assertEquals(boxConfig.getKey(".non.existent"), Optional.absent()); + assertEquals(boxConfig.getStringKey(".non.existent"), Optional.absent()); + assertEquals(boxConfig.getKey(VagrantConstants.KEY_VM_GUEST), Optional.of(VagrantConstants.VM_GUEST_WINDOWS)); + assertEquals(boxConfig.getKey(VagrantConstants.KEY_WINRM_USERNAME), Optional.of("\"jclouds-winrm\"")); + assertEquals(boxConfig.getStringKey(VagrantConstants.KEY_WINRM_USERNAME), Optional.of("jclouds-winrm")); + assertEquals(boxConfig.getStringKey(VagrantConstants.KEY_WINRM_PASSWORD), Optional.of("password-winrm")); + assertEquals(boxConfig.getStringKey(VagrantConstants.KEY_WINRM_PORT), Optional.of("8899")); + assertEquals(boxConfig.getStringKey(VagrantConstants.KEY_SSH_USERNAME), Optional.of("jclouds-ssh")); + assertEquals(boxConfig.getStringKey(VagrantConstants.KEY_SSH_PASSWORD), Optional.of("password-ssh")); + assertEquals(boxConfig.getStringKey(VagrantConstants.KEY_SSH_PRIVATE_KEY_PATH), Optional.of("/path/to/private.key")); + assertEquals(boxConfig.getStringKey(VagrantConstants.KEY_SSH_PORT), Optional.of("2222")); + + boxPath.delete(); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/internal/MachineConfigTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/internal/MachineConfigTest.java b/vagrant/src/test/java/org/jclouds/vagrant/internal/MachineConfigTest.java new file mode 100644 index 0000000..eb968a6 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/internal/MachineConfigTest.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.internal; + +import static org.testng.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Map; + +import org.jclouds.JcloudsVersion; +import org.jclouds.vagrant.reference.VagrantConstants; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.common.base.Charsets; +import com.google.common.collect.ImmutableMap; +import com.google.common.io.Files; +import com.google.common.io.Resources; + +public class MachineConfigTest { + private static final Map<String, Object> CONFIG = ImmutableMap.<String, Object>builder() + .put("jcloudsVersion", "0.0.1") + .put("box", "jclouds/vagrant") + .put("osFamily", "ubuntu") + .put("hardwareId", "micro") + .put("memory", "512") + .put("cpus", "1") + .build(); + + private File machineFolder; + private MachineConfig machineConfig; + private File configPath; + + @BeforeMethod + public void setUp() throws IOException { + File vagrantHome = new File(System.getProperty("java.io.tmpdir"), "jclouds/vagrant"); + machineFolder = new File(vagrantHome, "jclouds"); + File configFolder = new File(machineFolder, VagrantConstants.MACHINES_CONFIG_SUBFOLDER); + configFolder.mkdirs(); + configPath = new File(configFolder, "vagrant" + VagrantConstants.MACHINES_CONFIG_EXTENSION); + machineConfig = new MachineConfig.Factory().newInstance(machineFolder, "vagrant"); + } + + @AfterMethod + public void tearDown() { + configPath.delete(); + } + + @Test + public void testRead() throws IOException { + Resources.asByteSource(getClass().getResource("/machine-config.yaml")).copyTo(Files.asByteSink(configPath)); + assertEquals(machineConfig.load(), CONFIG); + } + + @Test + public void testWrite() throws IOException { + machineConfig.save(CONFIG); + ByteArrayOutputStream actualBytes = new ByteArrayOutputStream(); + Files.asByteSource(configPath).copyTo(actualBytes); + + ByteArrayOutputStream expectedBytes = new ByteArrayOutputStream(); + Resources.asByteSource(getClass().getResource("/machine-config.yaml")).copyTo(expectedBytes); + + String actual = new String(actualBytes.toByteArray(), Charsets.UTF_8); + String expected = new String(expectedBytes.toByteArray(), Charsets.UTF_8); + assertEquals(actual, expected + .replace("jcloudsVersion: 0.0.1", "jcloudsVersion: " + JcloudsVersion.get().toString()) + // Strip license headers + .replaceAll("(?m)^#.*", "") + .trim()); + } + + @Test + public void testUpdatesVersion() throws IOException { + machineConfig.save(CONFIG); + Map<String, Object> newConfig = machineConfig.load(); + assertEquals(newConfig.get(VagrantConstants.CONFIG_JCLOUDS_VERSION), JcloudsVersion.get().toString()); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantNodeRegistryTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantNodeRegistryTest.java b/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantNodeRegistryTest.java new file mode 100644 index 0000000..fb4950c --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantNodeRegistryTest.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.internal; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; + +import java.io.File; +import java.util.concurrent.TimeUnit; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.vagrant.domain.VagrantNode; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableList; + +public class VagrantNodeRegistryTest { + private static class TestTimeSupplier implements Supplier<Long> { + long time = System.currentTimeMillis(); + + @Override + public Long get() { + return time; + } + + public void advanceTime(long add) { + time += add; + } + + } + + @Test + public void testNodeRegistry() { + TestTimeSupplier timeSupplier = new TestTimeSupplier(); + VagrantNodeRegistry registry = new VagrantNodeRegistry(timeSupplier); + OperatingSystem os = new OperatingSystem(OsFamily.UNRECOGNIZED, "Jclouds OS", "10", "x64", "Jclouds Test Image", true); + Image image = new ImageBuilder() + .ids("jclouds/box") + .operatingSystem(os) + .status(Image.Status.AVAILABLE) + .build(); + + ImmutableList<String> networks = ImmutableList.of("172.28.128.3"); + VagrantNode node = VagrantNode.builder() + .setPath(new File("/path/to/machine")) + .setId("vagrant/node") + .setGroup("vagrant") + .setName("node") + .setImage(image) + .setNetworks(networks) + .setHostname("vagrant-node") + .build(); + + assertNull(registry.get(node.id())); + registry.add(node); + assertEquals(registry.get(node.id()), node); + registry.onTerminated(node); + assertEquals(registry.get(node.id()), node); + timeSupplier.advanceTime(TimeUnit.MINUTES.toMillis(10)); + assertNull(registry.get(node.id())); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantOutputRecorderTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantOutputRecorderTest.java b/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantOutputRecorderTest.java new file mode 100644 index 0000000..c74bb54 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantOutputRecorderTest.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.internal; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +import vagrant.api.CommandIOListener; + +public class VagrantOutputRecorderTest { + protected static final String INPUT = "vagrant up"; + protected static final String OUT1 = "1482768916,f99,metadata,provider,virtualbox\n"; + protected static final String OUT2 = "1482768916,,ui,info,Bringing machine "; + protected static final String OUT3 = "'f99' up with 'virtualbox' provider...\n"; + protected static final String OUT4 = "1482768916,f99,action,up,sta"; + + private static CommandIOListener nopIOListener = new CommandIOListener() { + @Override + public void onInput(String input) { + } + + @Override + public void onOutput(String output) { + } + }; + + @Test + public void testOutputRecorder() { + VagrantOutputRecorder outputRecorder = new VagrantOutputRecorder(nopIOListener); + outputRecorder.record(); + assertEquals(outputRecorder.stopRecording(), ""); + outputRecorder.record(); + outputRecorder.onInput("vagrant up"); + assertEquals(outputRecorder.stopRecording(), ""); + outputRecorder.record(); + outputRecorder.onOutput(OUT1); + outputRecorder.onOutput(OUT2); + outputRecorder.onOutput(OUT3 + OUT4); + assertEquals(outputRecorder.stopRecording(), OUT1 + OUT2 + OUT3 + OUT4); + outputRecorder.onOutput(OUT1); + assertEquals(outputRecorder.stopRecording(), ""); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantWireLoggerTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantWireLoggerTest.java b/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantWireLoggerTest.java new file mode 100644 index 0000000..66b89a5 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/internal/VagrantWireLoggerTest.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.internal; + +import java.io.InputStream; + +import org.easymock.Capture; +import org.easymock.EasyMock; +import org.jclouds.http.internal.HttpWire; +import org.testng.annotations.Test; + +public class VagrantWireLoggerTest { + private static final String INPUT = VagrantOutputRecorderTest.INPUT; + private static final String OUT1 = VagrantOutputRecorderTest.OUT1; + private static final String OUT2 = VagrantOutputRecorderTest.OUT2; + private static final String OUT3 = VagrantOutputRecorderTest.OUT3; + private static final String OUT4 = VagrantOutputRecorderTest.OUT4; + + @Test + public void testWireLogger() { + HttpWire httpWire = EasyMock.createMock(HttpWire.class); + Capture<InputStream> wireInCapture = new Capture<InputStream>(); + EasyMock.expect(httpWire.input(EasyMock.capture(wireInCapture))).andReturn(null); + EasyMock.expect(httpWire.output(OUT1)).andReturn(OUT1); + EasyMock.expect(httpWire.output(OUT2 + OUT3)).andReturn(OUT2 + OUT3); + EasyMock.expect(httpWire.output(OUT4)).andReturn(OUT4); + + EasyMock.replay(httpWire); + + VagrantWireLogger wireLogger = new VagrantWireLogger(httpWire); + wireLogger.onInput(INPUT); + wireLogger.onInput(null); + wireLogger.onOutput(OUT1); + wireLogger.onOutput(OUT2); + wireLogger.onOutput(OUT3 + OUT4); + wireLogger.onOutput(null); + + EasyMock.verify(httpWire); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentialsTest.java ---------------------------------------------------------------------- diff --git a/vagrant/src/test/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentialsTest.java b/vagrant/src/test/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentialsTest.java new file mode 100644 index 0000000..ea29835 --- /dev/null +++ b/vagrant/src/test/java/org/jclouds/vagrant/strategy/VagrantDefaultImageCredentialsTest.java @@ -0,0 +1,179 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.vagrant.strategy; + +import static org.testng.Assert.assertEquals; + +import java.util.Map; + +import org.easymock.EasyMock; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.vagrant.internal.BoxConfig; +import org.jclouds.vagrant.reference.VagrantConstants; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; + +public class VagrantDefaultImageCredentialsTest { + + @Test + public void testCredentials() { + LoginCredentials creds = LoginCredentials.builder() + .user("vagrant") + .password("vagrant") + .noPrivateKey() + .build(); + + @SuppressWarnings("unchecked") + Map<String, Credentials> credentialStore = EasyMock.createMock(Map.class); + BoxConfig.Factory boxConfigFactory = EasyMock.createMock(BoxConfig.Factory.class); + + EasyMock.replay(credentialStore, boxConfigFactory); + + VagrantDefaultImageCredentials defaultImageCredentials = + new VagrantDefaultImageCredentials(creds, credentialStore, boxConfigFactory); + + OperatingSystem os = new OperatingSystem(OsFamily.LINUX, "Jclouds OS", "10", "x64", "Jclouds Test Image", true); + Image image = new ImageBuilder() + .ids("jclouds/box") + .operatingSystem(os) + .status(org.jclouds.compute.domain.Image.Status.AVAILABLE) + .build(); + + LoginCredentials actualCreds = defaultImageCredentials.apply(image); + + EasyMock.verify(credentialStore, boxConfigFactory); + + assertEquals(actualCreds, creds); + } + + @Test + public void testCredentialStore() { + LoginCredentials creds = LoginCredentials.builder() + .user("vagrant") + .password("vagrant") + .noPrivateKey() + .build(); + + OperatingSystem os = new OperatingSystem(OsFamily.LINUX, "Jclouds OS", "10", "x64", "Jclouds Test Image", true); + Image image = new ImageBuilder() + .ids("jclouds/box") + .operatingSystem(os) + .status(org.jclouds.compute.domain.Image.Status.AVAILABLE) + .build(); + + @SuppressWarnings("unchecked") + Map<String, Credentials> credentialStore = EasyMock.createMock(Map.class); + EasyMock.expect(credentialStore.containsKey("image#" + image.getId())).andReturn(Boolean.TRUE); + EasyMock.expect(credentialStore.get("image#" + image.getId())).andReturn(creds); + + BoxConfig.Factory boxConfigFactory = EasyMock.createMock(BoxConfig.Factory.class); + + EasyMock.replay(credentialStore, boxConfigFactory); + + VagrantDefaultImageCredentials defaultImageCredentials = + new VagrantDefaultImageCredentials(null, credentialStore, boxConfigFactory); + + LoginCredentials actualCreds = defaultImageCredentials.apply(image); + + EasyMock.verify(credentialStore, boxConfigFactory); + + assertEquals(actualCreds, creds); + } + + @Test + public void testWinrmCredentials() { + LoginCredentials creds = LoginCredentials.builder() + .user("jclouds-user") + .password("jclouds-pass") + .noPrivateKey() + .build(); + + OperatingSystem os = new OperatingSystem(OsFamily.WINDOWS, "Jclouds OS", "10", "x64", "Jclouds Test Image", true); + Image image = new ImageBuilder() + .ids("jclouds/box") + .operatingSystem(os) + .status(org.jclouds.compute.domain.Image.Status.AVAILABLE) + .build(); + + @SuppressWarnings("unchecked") + Map<String, Credentials> credentialStore = EasyMock.createMock(Map.class); + EasyMock.expect(credentialStore.containsKey("image#" + image.getId())).andReturn(Boolean.FALSE); + + BoxConfig boxConfig = EasyMock.createMock(BoxConfig.class); + EasyMock.expect(boxConfig.getStringKey(VagrantConstants.KEY_WINRM_USERNAME)).andReturn(Optional.of(creds.getUser())); + EasyMock.expect(boxConfig.getStringKey(VagrantConstants.KEY_WINRM_PASSWORD)).andReturn(Optional.of(creds.getOptionalPassword().get())); + + BoxConfig.Factory boxConfigFactory = EasyMock.createMock(BoxConfig.Factory.class); + EasyMock.expect(boxConfigFactory.newInstance(image)).andReturn(boxConfig); + + EasyMock.replay(credentialStore, boxConfig, boxConfigFactory); + + VagrantDefaultImageCredentials defaultImageCredentials = + new VagrantDefaultImageCredentials(null, credentialStore, boxConfigFactory); + + LoginCredentials actualCreds = defaultImageCredentials.apply(image); + + EasyMock.verify(credentialStore, boxConfigFactory); + + assertEquals(actualCreds, creds); + } + + @Test + public void testSshCredentials() { + LoginCredentials creds = LoginCredentials.builder() + .user("jclouds-user") + .password("jclouds-pass") + .noPrivateKey() + .build(); + + OperatingSystem os = new OperatingSystem(OsFamily.LINUX, "Jclouds OS", "10", "x64", "Jclouds Test Image", true); + Image image = new ImageBuilder() + .ids("jclouds/box") + .operatingSystem(os) + .status(org.jclouds.compute.domain.Image.Status.AVAILABLE) + .build(); + + @SuppressWarnings("unchecked") + Map<String, Credentials> credentialStore = EasyMock.createMock(Map.class); + EasyMock.expect(credentialStore.containsKey("image#" + image.getId())).andReturn(Boolean.FALSE); + + BoxConfig boxConfig = EasyMock.createMock(BoxConfig.class); + EasyMock.expect(boxConfig.getStringKey(VagrantConstants.KEY_SSH_USERNAME)).andReturn(Optional.of(creds.getUser())); + EasyMock.expect(boxConfig.getStringKey(VagrantConstants.KEY_SSH_PASSWORD)).andReturn(Optional.of(creds.getOptionalPassword().get())); + EasyMock.expect(boxConfig.getStringKey(VagrantConstants.KEY_SSH_PRIVATE_KEY_PATH)).andReturn(Optional.<String>absent()); + + BoxConfig.Factory boxConfigFactory = EasyMock.createMock(BoxConfig.Factory.class); + EasyMock.expect(boxConfigFactory.newInstance(image)).andReturn(boxConfig); + + EasyMock.replay(credentialStore, boxConfig, boxConfigFactory); + + VagrantDefaultImageCredentials defaultImageCredentials = + new VagrantDefaultImageCredentials(null, credentialStore, boxConfigFactory); + + LoginCredentials actualCreds = defaultImageCredentials.apply(image); + + EasyMock.verify(credentialStore, boxConfigFactory); + + assertEquals(actualCreds, creds); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/resources/Vagrantfile.boxconfig ---------------------------------------------------------------------- diff --git a/vagrant/src/test/resources/Vagrantfile.boxconfig b/vagrant/src/test/resources/Vagrantfile.boxconfig new file mode 100644 index 0000000..9f09642 --- /dev/null +++ b/vagrant/src/test/resources/Vagrantfile.boxconfig @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Vagrant.configure(2) do |config| + config.vm.guest = :windows + config.winrm.username = "jclouds-winrm" + config.winrm.password = "password-winrm" + config.winrm.port = "8899" + config.ssh.username = "jclouds-ssh" + config.ssh.password = "password-ssh" + config.ssh.private_key_path = "/path/to/private.key" + config.ssh.port = "2222" +end \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/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 new file mode 100644 index 0000000..72e46d0 --- /dev/null +++ b/vagrant/src/test/resources/logback-test.xml @@ -0,0 +1,37 @@ +<?xml version="1.0"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> +<configuration scan="false"> + <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern> + </encoder> + </appender> + + <root level="INFO"> + <appender-ref ref="console"/> + </root> + + <logger name="org.jclouds" level="INFO" /> + <logger name="org.jclouds.vagrant" level="DEBUG" /> + <logger name="jclouds.wire" level="DEBUG" /> + <logger name="jclouds.headers" level="DEBUG" /> + <logger name="ch.qos.logback" level="WARN" /> + +</configuration> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fadcd5d9/vagrant/src/test/resources/machine-config.yaml ---------------------------------------------------------------------- diff --git a/vagrant/src/test/resources/machine-config.yaml b/vagrant/src/test/resources/machine-config.yaml new file mode 100644 index 0000000..f95642f --- /dev/null +++ b/vagrant/src/test/resources/machine-config.yaml @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +jcloudsVersion: 0.0.1 +box: jclouds/vagrant +osFamily: ubuntu +hardwareId: micro +memory: 512 +cpus: 1 \ No newline at end of file
