From 5c7fbb50e83d8edab54a6cd1cd651078537cd4c7 Mon Sep 17 00:00:00 2001 From: sophia Date: Mon, 30 Mar 2020 15:29:22 -0400 Subject: [PATCH] Test container provisioner plugin --- .../provisioners/container/config_test.rb | 141 ++++++++++++++++++ .../provisioners/docker/config_test.rb | 133 ----------------- .../provisioners/podman/config_test.rb | 30 ++++ .../provisioners/podman/provisioner_test.rb | 70 +++++++++ 4 files changed, 241 insertions(+), 133 deletions(-) create mode 100644 test/unit/plugins/provisioners/container/config_test.rb create mode 100644 test/unit/plugins/provisioners/podman/config_test.rb create mode 100644 test/unit/plugins/provisioners/podman/provisioner_test.rb diff --git a/test/unit/plugins/provisioners/container/config_test.rb b/test/unit/plugins/provisioners/container/config_test.rb new file mode 100644 index 000000000..ce205104a --- /dev/null +++ b/test/unit/plugins/provisioners/container/config_test.rb @@ -0,0 +1,141 @@ +require File.expand_path("../../../../base", __FILE__) + +require Vagrant.source_root.join("plugins/provisioners/container/config") +require Vagrant.source_root.join("plugins/kernel_v2/config/vm") + +describe VagrantPlugins::ContainerProvisioner::Config do + subject { described_class.new } + + describe "#build_image" do + it "stores them" do + subject.build_image("foo") + subject.build_image("bar", foo: :bar) + subject.finalize! + expect(subject.build_images.length).to eql(2) + expect(subject.build_images[0]).to eql(["foo", {}]) + expect(subject.build_images[1]).to eql(["bar", { foo: :bar }]) + end + end + + describe "#images" do + it "stores them in a set" do + subject.images = ["1", "1", "2"] + subject.finalize! + expect(subject.images.to_a.sort).to eql(["1", "2"]) + end + + it "overrides previously set images" do + subject.images = ["3"] + subject.images = ["1", "1", "2"] + subject.finalize! + expect(subject.images.to_a.sort).to eql(["1", "2"]) + end + end + + describe "#merge" do + it "has all images to pull" do + subject.pull_images("1") + + other = described_class.new + other.pull_images("2", "3") + + result = subject.merge(other) + expect(result.images.to_a.sort).to eq( + ["1", "2", "3"]) + end + + it "has all the containers to run" do + subject.run("foo", image: "bar", daemonize: false) + subject.run("bar") + + other = described_class.new + other.run("foo", image: "foo") + + result = subject.merge(other) + result.finalize! + + cs = result.containers + expect(cs.length).to eq(2) + expect(cs["foo"]).to eq({ + auto_assign_name: true, + image: "foo", + daemonize: false, + restart: "always", + }) + expect(cs["bar"]).to eq({ + auto_assign_name: true, + image: "bar", + daemonize: true, + restart: "always", + }) + end + + it "has all the containers to build" do + subject.build_image("foo") + + other = described_class.new + other.build_image("bar") + + result = subject.merge(other) + result.finalize! + + images = result.build_images + expect(images.length).to eq(2) + expect(images[0]).to eq(["foo", {}]) + expect(images[1]).to eq(["bar", {}]) + end + end + + describe "#pull_images" do + it "adds images to the list of images to build" do + subject.pull_images("1") + subject.pull_images("2", "3") + subject.finalize! + expect(subject.images.to_a.sort).to eql(["1", "2", "3"]) + end + end + + describe "#run" do + it "runs the given image" do + subject.run("foo") + + subject.finalize! + expect(subject.containers).to eql({ + "foo" => { + auto_assign_name: true, + daemonize: true, + image: "foo", + restart: "always", + } + }) + end + + it "can not auto assign name" do + subject.run("foo", auto_assign_name: false) + + subject.finalize! + expect(subject.containers).to eql({ + "foo" => { + auto_assign_name: false, + daemonize: true, + image: "foo", + restart: "always", + } + }) + end + + it "can not daemonize" do + subject.run("foo", daemonize: false) + + subject.finalize! + expect(subject.containers).to eql({ + "foo" => { + auto_assign_name: true, + daemonize: false, + image: "foo", + restart: "always", + } + }) + end + end +end diff --git a/test/unit/plugins/provisioners/docker/config_test.rb b/test/unit/plugins/provisioners/docker/config_test.rb index 2145be87e..79b2f5128 100644 --- a/test/unit/plugins/provisioners/docker/config_test.rb +++ b/test/unit/plugins/provisioners/docker/config_test.rb @@ -7,139 +7,6 @@ require Vagrant.source_root.join("plugins/kernel_v2/config/vm") describe VagrantPlugins::DockerProvisioner::Config do subject { described_class.new } - describe "#build_image" do - it "stores them" do - subject.build_image("foo") - subject.build_image("bar", foo: :bar) - subject.finalize! - expect(subject.build_images.length).to eql(2) - expect(subject.build_images[0]).to eql(["foo", {}]) - expect(subject.build_images[1]).to eql(["bar", { foo: :bar }]) - end - end - - describe "#images" do - it "stores them in a set" do - subject.images = ["1", "1", "2"] - subject.finalize! - expect(subject.images.to_a.sort).to eql(["1", "2"]) - end - - it "overrides previously set images" do - subject.images = ["3"] - subject.images = ["1", "1", "2"] - subject.finalize! - expect(subject.images.to_a.sort).to eql(["1", "2"]) - end - end - - describe "#merge" do - it "has all images to pull" do - subject.pull_images("1") - - other = described_class.new - other.pull_images("2", "3") - - result = subject.merge(other) - expect(result.images.to_a.sort).to eq( - ["1", "2", "3"]) - end - - it "has all the containers to run" do - subject.run("foo", image: "bar", daemonize: false) - subject.run("bar") - - other = described_class.new - other.run("foo", image: "foo") - - result = subject.merge(other) - result.finalize! - - cs = result.containers - expect(cs.length).to eq(2) - expect(cs["foo"]).to eq({ - auto_assign_name: true, - image: "foo", - daemonize: false, - restart: "always", - }) - expect(cs["bar"]).to eq({ - auto_assign_name: true, - image: "bar", - daemonize: true, - restart: "always", - }) - end - - it "has all the containers to build" do - subject.build_image("foo") - - other = described_class.new - other.build_image("bar") - - result = subject.merge(other) - result.finalize! - - images = result.build_images - expect(images.length).to eq(2) - expect(images[0]).to eq(["foo", {}]) - expect(images[1]).to eq(["bar", {}]) - end - end - - describe "#pull_images" do - it "adds images to the list of images to build" do - subject.pull_images("1") - subject.pull_images("2", "3") - subject.finalize! - expect(subject.images.to_a.sort).to eql(["1", "2", "3"]) - end - end - - describe "#run" do - it "runs the given image" do - subject.run("foo") - - subject.finalize! - expect(subject.containers).to eql({ - "foo" => { - auto_assign_name: true, - daemonize: true, - image: "foo", - restart: "always", - } - }) - end - - it "can not auto assign name" do - subject.run("foo", auto_assign_name: false) - - subject.finalize! - expect(subject.containers).to eql({ - "foo" => { - auto_assign_name: false, - daemonize: true, - image: "foo", - restart: "always", - } - }) - end - - it "can not daemonize" do - subject.run("foo", daemonize: false) - - subject.finalize! - expect(subject.containers).to eql({ - "foo" => { - auto_assign_name: true, - daemonize: false, - image: "foo", - restart: "always", - } - }) - end - end - describe "#post_install_provision" do it "raises an error if 'docker' provisioner was provided" do expect {subject.post_install_provision("myprov", :type=>"docker", :inline=>"echo 'hello'")} diff --git a/test/unit/plugins/provisioners/podman/config_test.rb b/test/unit/plugins/provisioners/podman/config_test.rb new file mode 100644 index 000000000..3894a9c53 --- /dev/null +++ b/test/unit/plugins/provisioners/podman/config_test.rb @@ -0,0 +1,30 @@ +require File.expand_path("../../../../base", __FILE__) + +require Vagrant.source_root.join("plugins/provisioners/podman/config") +require Vagrant.source_root.join("plugins/provisioners/podman/provisioner") +require Vagrant.source_root.join("plugins/kernel_v2/config/vm") + +describe VagrantPlugins::PodmanProvisioner::Config do + subject { described_class.new } + + describe "#post_install_provision" do + it "raises an error if 'podman' provisioner was provided" do + expect {subject.post_install_provision("myprov", :type=>"podman", :inline=>"echo 'hello'")} + .to raise_error(VagrantPlugins::PodmanProvisioner::PodmanError) + end + + it "setups a basic provisioner" do + prov = double() + mock_provisioner = "mock" + mock_provisioners = [mock_provisioner] + + allow(VagrantPlugins::Kernel_V2::VMConfig).to receive(:new). + and_return(prov) + allow(prov).to receive(:provision).and_return(mock_provisioners) + allow(prov).to receive(:provisioners).and_return(mock_provisioners) + + subject.post_install_provision("myprov", :inline=>"echo 'hello'") + expect(subject.post_install_provisioner).to eq(mock_provisioner) + end + end +end diff --git a/test/unit/plugins/provisioners/podman/provisioner_test.rb b/test/unit/plugins/provisioners/podman/provisioner_test.rb new file mode 100644 index 000000000..4527aec42 --- /dev/null +++ b/test/unit/plugins/provisioners/podman/provisioner_test.rb @@ -0,0 +1,70 @@ +require File.expand_path("../../../../base", __FILE__) + +require Vagrant.source_root.join("plugins/provisioners/podman/provisioner") + +describe VagrantPlugins::PodmanProvisioner::Provisioner do + include_context "unit" + subject { described_class.new(machine, config, installer, client) } + + let(:iso_env) do + # We have to create a Vagrantfile so there is a root path + env = isolated_environment + env.vagrantfile("") + env.create_vagrant_env + end + + let(:machine) { iso_env.machine(iso_env.machine_names[0], :dummy) } + let(:config) { double("config") } + let(:communicator) { double("comm") } + let(:guest) { double("guest") } + let(:client) { double("client") } + let(:installer) { double("installer") } + let(:hook) { double("hook") } + + before do + allow(machine).to receive(:communicate).and_return(communicator) + allow(machine).to receive(:guest).and_return(guest) + + allow(communicator).to receive(:execute).and_return(true) + allow(communicator).to receive(:upload).and_return(true) + + allow(guest).to receive(:capability?).and_return(false) + allow(guest).to receive(:capability).and_return(false) + + allow(client).to receive(:start_service).and_return(true) + allow(client).to receive(:daemon_running?).and_return(true) + + allow(config).to receive(:images).and_return(Set.new) + allow(config).to receive(:build_images).and_return(Set.new) + allow(config).to receive(:containers).and_return(Hash.new) + end + + describe "#provision" do + let(:provisioner) do + prov = VagrantPlugins::Kernel_V2::VagrantConfigProvisioner.new("spec-test", :shell) + prov.config = {} + prov + end + + it "invokes a post_install_provisioner if defined and podman is installed" do + allow(installer).to receive(:ensure_installed).and_return(true) + allow(config).to receive(:post_install_provisioner).and_return(provisioner) + allow(machine).to receive(:env).and_return(iso_env) + allow(machine.env).to receive(:hook).and_return(true) + + expect(machine.env).to receive(:hook).with(:run_provisioner, anything) + subject.provision() + end + + it "does not invoke post_install_provisioner if not defined" do + allow(installer).to receive(:ensure_installed).and_return(true) + allow(config).to receive(:post_install_provisioner).and_return(nil) + allow(machine).to receive(:env).and_return(iso_env) + allow(machine.env).to receive(:hook).and_return(true) + + expect(machine.env).not_to receive(:hook).with(:run_provisioner, anything) + subject.provision() + end + end + +end