knife-server 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.cane +1 -0
- data/.rspec +1 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +12 -8
- data/CHANGELOG.md +32 -1
- data/Gemfile +9 -4
- data/Guardfile +28 -0
- data/README.md +28 -5
- data/Rakefile +31 -10
- data/knife-server.gemspec +18 -8
- data/lib/chef/knife/bootstrap/_omnibus.sh +63 -10
- data/lib/chef/knife/bootstrap/chef10/rhel.erb +2 -0
- data/lib/chef/knife/bootstrap/chef11/omnibus.erb +4 -1
- data/lib/chef/knife/bootstrap/chef11/rhel.erb +2 -0
- data/lib/chef/knife/server_backup.rb +24 -10
- data/lib/chef/knife/server_bootstrap_base.rb +68 -23
- data/lib/chef/knife/server_bootstrap_ec2.rb +33 -20
- data/lib/chef/knife/server_bootstrap_linode.rb +20 -13
- data/lib/chef/knife/server_bootstrap_openstack.rb +128 -0
- data/lib/chef/knife/server_bootstrap_standalone.rb +28 -16
- data/lib/chef/knife/server_restore.rb +23 -9
- data/lib/knife-server.rb +1 -0
- data/lib/knife/server/credentials.rb +78 -42
- data/lib/knife/server/ec2_security_group.rb +24 -21
- data/lib/knife/server/ssh.rb +54 -18
- data/lib/knife/server/version.rb +2 -1
- data/spec/chef/knife/server_backup_spec.rb +58 -44
- data/spec/chef/knife/server_bootstrap_ec2_spec.rb +108 -80
- data/spec/chef/knife/server_bootstrap_linode_spec.rb +93 -64
- data/spec/chef/knife/server_bootstrap_openstack_spec.rb +305 -0
- data/spec/chef/knife/server_bootstrap_standalone_spec.rb +113 -76
- data/spec/chef/knife/server_restore_spec.rb +38 -37
- data/spec/knife/server/credientials_spec.rb +248 -51
- data/spec/knife/server/ec2_security_group_spec.rb +76 -68
- data/spec/knife/server/ssh_spec.rb +138 -22
- metadata +107 -31
| @@ -1,3 +1,4 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 1 2 | 
             
            #
         | 
| 2 3 | 
             
            # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
         | 
| 3 4 | 
             
            # Copyright:: Copyright (c) 2012 Fletcher Nichol
         | 
| @@ -16,10 +17,10 @@ | |
| 16 17 | 
             
            # limitations under the License.
         | 
| 17 18 | 
             
            #
         | 
| 18 19 |  | 
| 19 | 
            -
            require  | 
| 20 | 
            -
            require  | 
| 21 | 
            -
            require  | 
| 22 | 
            -
            require  | 
| 20 | 
            +
            require "chef/knife/server_bootstrap_ec2"
         | 
| 21 | 
            +
            require "chef/knife/ssh"
         | 
| 22 | 
            +
            require "fakefs/spec_helpers"
         | 
| 23 | 
            +
            require "net/ssh"
         | 
| 23 24 | 
             
            Chef::Knife::ServerBootstrapEc2.load_deps
         | 
| 24 25 |  | 
| 25 26 | 
             
            describe Chef::Knife::ServerBootstrapEc2 do
         | 
| @@ -29,15 +30,15 @@ describe Chef::Knife::ServerBootstrapEc2 do | |
| 29 30 | 
             
                Chef::Log.logger = Logger.new(StringIO.new)
         | 
| 30 31 | 
             
                @knife = Chef::Knife::ServerBootstrapEc2.new
         | 
| 31 32 | 
             
                @stdout = StringIO.new
         | 
| 32 | 
            -
                @knife.ui. | 
| 33 | 
            +
                allow(@knife.ui).to receive(:stdout).and_return(@stdout)
         | 
| 33 34 | 
             
                @stderr = StringIO.new
         | 
| 34 | 
            -
                @knife.ui. | 
| 35 | 
            +
                allow(@knife.ui).to receive(:stderr).and_return(@stderr)
         | 
| 35 36 | 
             
                @knife.config[:chef_node_name] = "yakky"
         | 
| 36 37 | 
             
                @knife.config[:platform] = "omnibus"
         | 
| 37 38 | 
             
                @knife.config[:ssh_user] = "root"
         | 
| 38 39 | 
             
              end
         | 
| 39 40 |  | 
| 40 | 
            -
              let(:connection) {  | 
| 41 | 
            +
              let(:connection) { double(Fog::Compute::AWS) }
         | 
| 41 42 |  | 
| 42 43 | 
             
              describe "#ec2_bootstrap" do
         | 
| 43 44 | 
             
                before do
         | 
| @@ -45,94 +46,100 @@ describe Chef::Knife::ServerBootstrapEc2 do | |
| 45 46 | 
             
                  @knife.config[:ssh_user] = "jdoe"
         | 
| 46 47 | 
             
                  @knife.config[:ssh_port] = "2222"
         | 
| 47 48 | 
             
                  @knife.config[:identity_file] = "~/.ssh/mykey_dsa"
         | 
| 48 | 
            -
                  @knife.config[:security_groups] = %w | 
| 49 | 
            -
                  @knife.config[:tags] = %w | 
| 49 | 
            +
                  @knife.config[:security_groups] = %w[x y z]
         | 
| 50 | 
            +
                  @knife.config[:tags] = %w[tag1=val1 tag2=val2]
         | 
| 50 51 | 
             
                  @knife.config[:distro] = "distro-praha"
         | 
| 51 52 | 
             
                  @knife.config[:ebs_size] = "42"
         | 
| 52 53 | 
             
                  @knife.config[:webui_password] = "daweb"
         | 
| 53 54 | 
             
                  @knife.config[:amqp_password] = "queueitup"
         | 
| 54 55 |  | 
| 55 | 
            -
                  ENV[ | 
| 56 | 
            -
                  ENV[ | 
| 56 | 
            +
                  ENV["_SPEC_WEBUI_PASSWORD"] = ENV["WEBUI_PASSWORD"]
         | 
| 57 | 
            +
                  ENV["_SPEC_AMQP_PASSWORD"] = ENV["AMQP_PASSWORD"]
         | 
| 57 58 | 
             
                end
         | 
| 58 59 |  | 
| 59 60 | 
             
                after do
         | 
| 60 | 
            -
                  ENV[ | 
| 61 | 
            -
                  ENV[ | 
| 61 | 
            +
                  ENV["WEBUI_PASSWORD"] = ENV.delete("_SPEC_WEBUI_PASSWORD")
         | 
| 62 | 
            +
                  ENV["AMQP_PASSWORD"] = ENV.delete("_SPEC_AMQP_PASSWORD")
         | 
| 62 63 | 
             
                end
         | 
| 63 64 |  | 
| 64 65 | 
             
                let(:bootstrap) { @knife.ec2_bootstrap }
         | 
| 65 66 |  | 
| 66 67 | 
             
                it "returns an Ec2ServerCreate instance" do
         | 
| 67 | 
            -
                  bootstrap. | 
| 68 | 
            +
                  expect(bootstrap).to be_a(Chef::Knife::Ec2ServerCreate)
         | 
| 68 69 | 
             
                end
         | 
| 69 70 |  | 
| 70 71 | 
             
                it "configs the bootstrap's chef_node_name" do
         | 
| 71 | 
            -
                  bootstrap.config[:chef_node_name]. | 
| 72 | 
            +
                  expect(bootstrap.config[:chef_node_name]).to eq("shave.yak")
         | 
| 72 73 | 
             
                end
         | 
| 73 74 |  | 
| 74 75 | 
             
                it "configs the bootstrap's ssh_user" do
         | 
| 75 | 
            -
                  bootstrap.config[:ssh_user]. | 
| 76 | 
            +
                  expect(bootstrap.config[:ssh_user]).to eq("jdoe")
         | 
| 76 77 | 
             
                end
         | 
| 77 78 |  | 
| 78 79 | 
             
                it "configs the bootstrap's ssh_port" do
         | 
| 79 | 
            -
                  bootstrap.config[:ssh_port]. | 
| 80 | 
            +
                  expect(bootstrap.config[:ssh_port]).to eq("2222")
         | 
| 80 81 | 
             
                end
         | 
| 81 82 |  | 
| 82 83 | 
             
                it "configs the bootstrap's identity_file" do
         | 
| 83 | 
            -
                  bootstrap.config[:identity_file]. | 
| 84 | 
            +
                  expect(bootstrap.config[:identity_file]).to eq("~/.ssh/mykey_dsa")
         | 
| 84 85 | 
             
                end
         | 
| 85 86 |  | 
| 86 87 | 
             
                it "configs the bootstrap's security_groups" do
         | 
| 87 | 
            -
                  bootstrap.config[:security_groups]. | 
| 88 | 
            +
                  expect(bootstrap.config[:security_groups]).to eq(%w[x y z])
         | 
| 88 89 | 
             
                end
         | 
| 89 90 |  | 
| 90 91 | 
             
                it "configs the bootstrap's ebs_size" do
         | 
| 91 | 
            -
                  bootstrap.config[:ebs_size]. | 
| 92 | 
            +
                  expect(bootstrap.config[:ebs_size]).to eq("42")
         | 
| 92 93 | 
             
                end
         | 
| 93 94 |  | 
| 94 95 | 
             
                it "configs the bootstrap's tags" do
         | 
| 95 | 
            -
                  bootstrap.config[:tags]. | 
| 96 | 
            -
                  bootstrap.config[:tags]. | 
| 96 | 
            +
                  expect(bootstrap.config[:tags]).to include("tag1=val1")
         | 
| 97 | 
            +
                  expect(bootstrap.config[:tags]).to include("tag2=val2")
         | 
| 97 98 | 
             
                end
         | 
| 98 99 |  | 
| 99 100 | 
             
                it "adds Role=chef_server to the bootstrap's tags" do
         | 
| 100 | 
            -
                  bootstrap.config[:tags]. | 
| 101 | 
            +
                  expect(bootstrap.config[:tags]).to include("Role=chef_server")
         | 
| 101 102 | 
             
                end
         | 
| 102 103 |  | 
| 103 104 | 
             
                it "configs the bootstrap's distro" do
         | 
| 104 | 
            -
                  bootstrap.config[:distro]. | 
| 105 | 
            +
                  expect(bootstrap.config[:distro]).to eq("distro-praha")
         | 
| 105 106 | 
             
                end
         | 
| 106 107 |  | 
| 107 108 | 
             
                it "configs the bootstrap's distro to chef11/omnibus by default" do
         | 
| 108 109 | 
             
                  @knife.config.delete(:distro)
         | 
| 109 110 |  | 
| 110 | 
            -
                  bootstrap.config[:distro]. | 
| 111 | 
            +
                  expect(bootstrap.config[:distro]).to eq("chef11/omnibus")
         | 
| 111 112 | 
             
                end
         | 
| 112 113 |  | 
| 113 114 | 
             
                it "configs the bootstrap's distro value driven off platform value" do
         | 
| 114 115 | 
             
                  @knife.config.delete(:distro)
         | 
| 115 116 | 
             
                  @knife.config[:platform] = "freebsd"
         | 
| 116 117 |  | 
| 117 | 
            -
                  bootstrap.config[:distro]. | 
| 118 | 
            +
                  expect(bootstrap.config[:distro]).to eq("chef11/freebsd")
         | 
| 118 119 | 
             
                end
         | 
| 119 120 |  | 
| 120 | 
            -
                it "configs the  | 
| 121 | 
            +
                it "configs the distro based on bootstrap_version and platform" do
         | 
| 121 122 | 
             
                  @knife.config.delete(:distro)
         | 
| 122 123 | 
             
                  @knife.config[:platform] = "freebsd"
         | 
| 123 124 | 
             
                  @knife.config[:bootstrap_version] = "10"
         | 
| 124 125 |  | 
| 125 | 
            -
                  bootstrap.config[:distro]. | 
| 126 | 
            +
                  expect(bootstrap.config[:distro]).to eq("chef10/freebsd")
         | 
| 126 127 | 
             
                end
         | 
| 127 128 |  | 
| 128 129 | 
             
                it "configs the bootstrap's ENV with the webui password" do
         | 
| 129 130 | 
             
                  bootstrap
         | 
| 130 | 
            -
             | 
| 131 | 
            +
             | 
| 132 | 
            +
                  expect(ENV["WEBUI_PASSWORD"]).to eq("daweb")
         | 
| 131 133 | 
             
                end
         | 
| 132 134 |  | 
| 133 135 | 
             
                it "configs the bootstrap's ENV with the amqp password" do
         | 
| 134 136 | 
             
                  bootstrap
         | 
| 135 | 
            -
             | 
| 137 | 
            +
             | 
| 138 | 
            +
                  expect(ENV["AMQP_PASSWORD"]).to eq("queueitup")
         | 
| 139 | 
            +
                end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                it "skips config values with nil defaults" do
         | 
| 142 | 
            +
                  expect(bootstrap.config[:bootstrap_version]).to be_nil
         | 
| 136 143 | 
             
                end
         | 
| 137 144 | 
             
              end
         | 
| 138 145 |  | 
| @@ -156,12 +163,12 @@ describe Chef::Knife::ServerBootstrapEc2 do | |
| 156 163 | 
             
                end
         | 
| 157 164 |  | 
| 158 165 | 
             
                it "constructs a connection" do
         | 
| 159 | 
            -
                  Fog::Compute. | 
| 160 | 
            -
                    :provider =>  | 
| 161 | 
            -
                    :aws_access_key_id =>  | 
| 162 | 
            -
                    :aws_secret_access_key =>  | 
| 163 | 
            -
                    :region =>  | 
| 164 | 
            -
                   | 
| 166 | 
            +
                  expect(Fog::Compute).to receive(:new).with(
         | 
| 167 | 
            +
                    :provider => "AWS",
         | 
| 168 | 
            +
                    :aws_access_key_id => "key",
         | 
| 169 | 
            +
                    :aws_secret_access_key => "secret",
         | 
| 170 | 
            +
                    :region => "hell-south-666"
         | 
| 171 | 
            +
                  )
         | 
| 165 172 |  | 
| 166 173 | 
             
                  @knife.ec2_connection
         | 
| 167 174 | 
             
                end
         | 
| @@ -169,37 +176,41 @@ describe Chef::Knife::ServerBootstrapEc2 do | |
| 169 176 |  | 
| 170 177 | 
             
              describe "#server_dns_name" do
         | 
| 171 178 | 
             
                before do
         | 
| 172 | 
            -
                  @knife.config[:chef_node_name] =  | 
| 173 | 
            -
                  @knife. | 
| 179 | 
            +
                  @knife.config[:chef_node_name] = "shavemy.yak"
         | 
| 180 | 
            +
                  allow(@knife).to receive(:ec2_connection) { connection }
         | 
| 174 181 | 
             
                end
         | 
| 175 182 |  | 
| 176 183 | 
             
                context "when server is found" do
         | 
| 177 184 | 
             
                  before do
         | 
| 178 | 
            -
                    connection. | 
| 185 | 
            +
                    expect(connection).to receive(:servers) { [server] }
         | 
| 179 186 | 
             
                  end
         | 
| 180 187 |  | 
| 181 188 | 
             
                  let(:server) do
         | 
| 182 | 
            -
                     | 
| 183 | 
            -
                      : | 
| 189 | 
            +
                    double(
         | 
| 190 | 
            +
                      :dns_name => "blahblah.aws.compute.com",
         | 
| 191 | 
            +
                      :state => "running",
         | 
| 192 | 
            +
                      :tags => { "Name" => "shavemy.yak", "Role" => "chef_server" }
         | 
| 193 | 
            +
                    )
         | 
| 184 194 | 
             
                  end
         | 
| 185 195 |  | 
| 186 196 | 
             
                  it "returns the provisioned dns name" do
         | 
| 187 | 
            -
                    @knife.server_dns_name. | 
| 197 | 
            +
                    expect(@knife.server_dns_name).to eq("blahblah.aws.compute.com")
         | 
| 188 198 | 
             
                  end
         | 
| 189 199 |  | 
| 190 200 | 
             
                  it "ignores terminated instances" do
         | 
| 191 | 
            -
                    server. | 
| 192 | 
            -
             | 
| 201 | 
            +
                    allow(server).to receive(:state) { "terminated" }
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                    expect(@knife.server_dns_name).to be_nil
         | 
| 193 204 | 
             
                  end
         | 
| 194 205 | 
             
                end
         | 
| 195 206 |  | 
| 196 207 | 
             
                context "when server is not found" do
         | 
| 197 208 | 
             
                  before do
         | 
| 198 | 
            -
                    connection. | 
| 209 | 
            +
                    allow(connection).to receive(:servers) { [] }
         | 
| 199 210 | 
             
                  end
         | 
| 200 211 |  | 
| 201 212 | 
             
                  it "returns nil" do
         | 
| 202 | 
            -
                    @knife.server_dns_name. | 
| 213 | 
            +
                    expect(@knife.server_dns_name).to be_nil
         | 
| 203 214 | 
             
                  end
         | 
| 204 215 | 
             
                end
         | 
| 205 216 | 
             
              end
         | 
| @@ -217,15 +228,15 @@ describe Chef::Knife::ServerBootstrapEc2 do | |
| 217 228 | 
             
                  @knife.config[:validation_key] = "/var/tmp/validation.pem"
         | 
| 218 229 | 
             
                  @knife.config[:ssh_port] = "2345"
         | 
| 219 230 | 
             
                  @knife.config[:identity_file] = "~/.ssh/mykey_dsa"
         | 
| 220 | 
            -
                  @knife. | 
| 221 | 
            -
                  @knife. | 
| 222 | 
            -
                  Chef::Knife::Ec2ServerCreate. | 
| 223 | 
            -
                  Knife::Server::Ec2SecurityGroup. | 
| 224 | 
            -
                  Knife::Server::SSH. | 
| 225 | 
            -
                  Knife::Server::Credentials. | 
| 226 | 
            -
                  security_group. | 
| 227 | 
            -
                  credentials. | 
| 228 | 
            -
                  credentials. | 
| 231 | 
            +
                  allow(@knife).to receive(:ec2_connection)  { connection }
         | 
| 232 | 
            +
                  allow(@knife).to receive(:server_dns_name)  { "grapes.wrath" }
         | 
| 233 | 
            +
                  allow(Chef::Knife::Ec2ServerCreate).to receive(:new) { bootstrap }
         | 
| 234 | 
            +
                  allow(Knife::Server::Ec2SecurityGroup).to receive(:new) { security_group }
         | 
| 235 | 
            +
                  allow(Knife::Server::SSH).to receive(:new) { ssh }
         | 
| 236 | 
            +
                  allow(Knife::Server::Credentials).to receive(:new) { credentials }
         | 
| 237 | 
            +
                  allow(security_group).to receive(:configure_chef_server_group)
         | 
| 238 | 
            +
                  allow(credentials).to receive(:install_validation_key)
         | 
| 239 | 
            +
                  allow(credentials).to receive(:create_root_client)
         | 
| 229 240 | 
             
                end
         | 
| 230 241 |  | 
| 231 242 | 
             
                after do
         | 
| @@ -234,66 +245,83 @@ describe Chef::Knife::ServerBootstrapEc2 do | |
| 234 245 | 
             
                  end
         | 
| 235 246 | 
             
                end
         | 
| 236 247 |  | 
| 237 | 
            -
                let(:bootstrap)       {  | 
| 238 | 
            -
                let(:security_group)  {  | 
| 239 | 
            -
                let(:ssh)             {  | 
| 240 | 
            -
                let(:credentials)     {  | 
| 248 | 
            +
                let(:bootstrap)       { double(:run => true, :config => Hash.new) }
         | 
| 249 | 
            +
                let(:security_group)  { double }
         | 
| 250 | 
            +
                let(:ssh)             { double }
         | 
| 251 | 
            +
                let(:credentials)     { double.as_null_object }
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                it "exits if Chef::Config[:node_name] is missing" do
         | 
| 254 | 
            +
                  Chef::Config[:node_name] = nil
         | 
| 255 | 
            +
             | 
| 256 | 
            +
                  expect { @knife.run }.to raise_error SystemExit
         | 
| 257 | 
            +
                end
         | 
| 258 | 
            +
             | 
| 259 | 
            +
                it "exits if Chef::Config[:client_key] is missing" do
         | 
| 260 | 
            +
                  Chef::Config[:client_key] = nil
         | 
| 261 | 
            +
             | 
| 262 | 
            +
                  expect { @knife.run }.to raise_error SystemExit
         | 
| 263 | 
            +
                end
         | 
| 241 264 |  | 
| 242 265 | 
             
                it "exits if node_name option is missing" do
         | 
| 243 | 
            -
                  def @knife.exit( | 
| 266 | 
            +
                  def @knife.exit(_); end
         | 
| 244 267 | 
             
                  @knife.config.delete(:chef_node_name)
         | 
| 245 268 |  | 
| 246 | 
            -
                  @knife. | 
| 269 | 
            +
                  expect(@knife).to receive(:exit)
         | 
| 247 270 | 
             
                  @knife.run
         | 
| 248 271 | 
             
                end
         | 
| 249 272 |  | 
| 250 273 | 
             
                it "configures the ec2 security group" do
         | 
| 251 | 
            -
                  Knife::Server::Ec2SecurityGroup. | 
| 274 | 
            +
                  expect(Knife::Server::Ec2SecurityGroup).to receive(:new).
         | 
| 252 275 | 
             
                    with(connection, @knife.ui)
         | 
| 253 | 
            -
                  security_group. | 
| 254 | 
            -
                    with( | 
| 276 | 
            +
                  expect(security_group).to receive(:configure_chef_server_group).
         | 
| 277 | 
            +
                    with("mygroup", :description => "mygroup group")
         | 
| 255 278 |  | 
| 256 279 | 
             
                  @knife.run
         | 
| 257 280 | 
             
                end
         | 
| 258 281 |  | 
| 259 282 | 
             
                it "bootstraps an ec2 server" do
         | 
| 260 | 
            -
                  bootstrap. | 
| 283 | 
            +
                  expect(bootstrap).to receive(:run)
         | 
| 284 | 
            +
             | 
| 261 285 | 
             
                  @knife.run
         | 
| 262 286 | 
             
                end
         | 
| 263 287 |  | 
| 264 288 | 
             
                it "installs a new validation.pem key from the chef 10 server" do
         | 
| 265 289 | 
             
                  @knife.config[:bootstrap_version] = "10"
         | 
| 266 | 
            -
                  Knife::Server::SSH. | 
| 267 | 
            -
                    :host => "grapes.wrath", | 
| 268 | 
            -
                    : | 
| 269 | 
            -
             | 
| 270 | 
            -
             | 
| 290 | 
            +
                  expect(Knife::Server::SSH).to receive(:new).with(
         | 
| 291 | 
            +
                    :host => "grapes.wrath",
         | 
| 292 | 
            +
                    :user => "root",
         | 
| 293 | 
            +
                    :port => "2345",
         | 
| 294 | 
            +
                    :keys => ["~/.ssh/mykey_dsa"]
         | 
| 295 | 
            +
                  )
         | 
| 296 | 
            +
                  expect(Knife::Server::Credentials).to receive(:new).
         | 
| 271 297 | 
             
                    with(ssh, "/etc/chef/validation.pem", {})
         | 
| 272 | 
            -
                  credentials. | 
| 298 | 
            +
                  expect(credentials).to receive(:install_validation_key)
         | 
| 273 299 |  | 
| 274 300 | 
             
                  @knife.run
         | 
| 275 301 | 
             
                end
         | 
| 276 302 |  | 
| 277 303 | 
             
                it "installs a new validation.pem key from the omnibus server" do
         | 
| 278 | 
            -
                  Knife::Server::SSH. | 
| 279 | 
            -
                    :host => "grapes.wrath", | 
| 280 | 
            -
                    : | 
| 281 | 
            -
             | 
| 282 | 
            -
             | 
| 283 | 
            -
             | 
| 284 | 
            -
                   | 
| 304 | 
            +
                  expect(Knife::Server::SSH).to receive(:new).with(
         | 
| 305 | 
            +
                    :host => "grapes.wrath",
         | 
| 306 | 
            +
                    :user => "root",
         | 
| 307 | 
            +
                    :port => "2345",
         | 
| 308 | 
            +
                    :keys => ["~/.ssh/mykey_dsa"]
         | 
| 309 | 
            +
                  )
         | 
| 310 | 
            +
                  expect(Knife::Server::Credentials).to receive(:new).
         | 
| 311 | 
            +
                    with(ssh, "/etc/chef/validation.pem", :omnibus => true)
         | 
| 312 | 
            +
                  expect(credentials).to receive(:install_validation_key)
         | 
| 285 313 |  | 
| 286 314 | 
             
                  @knife.run
         | 
| 287 315 | 
             
                end
         | 
| 288 316 |  | 
| 289 317 | 
             
                it "create a root client key" do
         | 
| 290 | 
            -
                  credentials. | 
| 318 | 
            +
                  expect(credentials).to receive(:create_root_client)
         | 
| 291 319 |  | 
| 292 320 | 
             
                  @knife.run
         | 
| 293 321 | 
             
                end
         | 
| 294 322 |  | 
| 295 323 | 
             
                it "installs a client key" do
         | 
| 296 | 
            -
                  credentials. | 
| 324 | 
            +
                  expect(credentials).to receive(:install_client_key).
         | 
| 297 325 | 
             
                    with("smithers", "/var/tmp/myclientkey.pem")
         | 
| 298 326 |  | 
| 299 327 | 
             
                  @knife.run
         | 
| @@ -1,3 +1,4 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 1 2 | 
             
            #
         | 
| 2 3 | 
             
            # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
         | 
| 3 4 | 
             
            # Copyright:: Copyright (c) 2013 Fletcher Nichol
         | 
| @@ -16,10 +17,10 @@ | |
| 16 17 | 
             
            # limitations under the License.
         | 
| 17 18 | 
             
            #
         | 
| 18 19 |  | 
| 19 | 
            -
            require  | 
| 20 | 
            -
            require  | 
| 21 | 
            -
            require  | 
| 22 | 
            -
            require  | 
| 20 | 
            +
            require "chef/knife/server_bootstrap_linode"
         | 
| 21 | 
            +
            require "chef/knife/ssh"
         | 
| 22 | 
            +
            require "fakefs/spec_helpers"
         | 
| 23 | 
            +
            require "net/ssh"
         | 
| 23 24 | 
             
            Chef::Knife::ServerBootstrapLinode.load_deps
         | 
| 24 25 |  | 
| 25 26 | 
             
            describe Chef::Knife::ServerBootstrapLinode do
         | 
| @@ -29,15 +30,15 @@ describe Chef::Knife::ServerBootstrapLinode do | |
| 29 30 | 
             
                Chef::Log.logger = Logger.new(StringIO.new)
         | 
| 30 31 | 
             
                @knife = Chef::Knife::ServerBootstrapLinode.new
         | 
| 31 32 | 
             
                @stdout = StringIO.new
         | 
| 32 | 
            -
                @knife.ui. | 
| 33 | 
            +
                allow(@knife.ui).to receive(:stdout).and_return(@stdout)
         | 
| 33 34 | 
             
                @stderr = StringIO.new
         | 
| 34 | 
            -
                @knife.ui. | 
| 35 | 
            +
                allow(@knife.ui).to receive(:stderr).and_return(@stderr)
         | 
| 35 36 | 
             
                @knife.config[:chef_node_name] = "yakky"
         | 
| 36 37 | 
             
                @knife.config[:platform] = "omnibus"
         | 
| 37 38 | 
             
                @knife.config[:ssh_user] = "root"
         | 
| 38 39 | 
             
              end
         | 
| 39 40 |  | 
| 40 | 
            -
              let(:connection) {  | 
| 41 | 
            +
              let(:connection) { double(Fog::Compute::AWS) }
         | 
| 41 42 |  | 
| 42 43 | 
             
              describe "#linode_bootstrap" do
         | 
| 43 44 |  | 
| @@ -50,70 +51,76 @@ describe Chef::Knife::ServerBootstrapLinode do | |
| 50 51 | 
             
                  @knife.config[:webui_password] = "daweb"
         | 
| 51 52 | 
             
                  @knife.config[:amqp_password] = "queueitup"
         | 
| 52 53 |  | 
| 53 | 
            -
                  ENV[ | 
| 54 | 
            -
                  ENV[ | 
| 54 | 
            +
                  ENV["_SPEC_WEBUI_PASSWORD"] = ENV["WEBUI_PASSWORD"]
         | 
| 55 | 
            +
                  ENV["_SPEC_AMQP_PASSWORD"] = ENV["AMQP_PASSWORD"]
         | 
| 55 56 | 
             
                end
         | 
| 56 57 |  | 
| 57 58 | 
             
                after do
         | 
| 58 | 
            -
                  ENV[ | 
| 59 | 
            -
                  ENV[ | 
| 59 | 
            +
                  ENV["WEBUI_PASSWORD"] = ENV.delete("_SPEC_WEBUI_PASSWORD")
         | 
| 60 | 
            +
                  ENV["AMQP_PASSWORD"] = ENV.delete("_SPEC_AMQP_PASSWORD")
         | 
| 60 61 | 
             
                end
         | 
| 61 62 |  | 
| 62 63 | 
             
                let(:bootstrap) { @knife.linode_bootstrap }
         | 
| 63 64 |  | 
| 64 65 | 
             
                it "returns a LinodeServerCreate instance" do
         | 
| 65 | 
            -
                  bootstrap. | 
| 66 | 
            +
                  expect(bootstrap).to be_a(Chef::Knife::LinodeServerCreate)
         | 
| 66 67 | 
             
                end
         | 
| 67 68 |  | 
| 68 69 | 
             
                it "configs the bootstrap's chef_node_name" do
         | 
| 69 | 
            -
                  bootstrap.config[:chef_node_name]. | 
| 70 | 
            +
                  expect(bootstrap.config[:chef_node_name]).to eq("shave.yak")
         | 
| 70 71 | 
             
                end
         | 
| 71 72 |  | 
| 72 73 | 
             
                it "configs the bootstrap's ssh_user" do
         | 
| 73 | 
            -
                  bootstrap.config[:ssh_user]. | 
| 74 | 
            +
                  expect(bootstrap.config[:ssh_user]).to eq("jdoe")
         | 
| 74 75 | 
             
                end
         | 
| 75 76 |  | 
| 76 77 | 
             
                it "configs the bootstrap's identity_file" do
         | 
| 77 | 
            -
                  bootstrap.config[:identity_file]. | 
| 78 | 
            +
                  expect(bootstrap.config[:identity_file]).to eq("~/.ssh/mykey_dsa")
         | 
| 78 79 | 
             
                end
         | 
| 79 80 |  | 
| 80 81 | 
             
                it "configs the bootstrap's linode_api_key" do
         | 
| 81 | 
            -
                  bootstrap.config[:linode_api_key]. | 
| 82 | 
            +
                  expect(bootstrap.config[:linode_api_key]).to eq("linode123")
         | 
| 82 83 | 
             
                end
         | 
| 83 84 |  | 
| 84 85 | 
             
                it "configs the bootstrap's distro" do
         | 
| 85 | 
            -
                  bootstrap.config[:distro]. | 
| 86 | 
            +
                  expect(bootstrap.config[:distro]).to eq("distro-praha")
         | 
| 86 87 | 
             
                end
         | 
| 87 88 |  | 
| 88 89 | 
             
                it "configs the bootstrap's distro to chef11/omnibus by default" do
         | 
| 89 90 | 
             
                  @knife.config.delete(:distro)
         | 
| 90 91 |  | 
| 91 | 
            -
                  bootstrap.config[:distro]. | 
| 92 | 
            +
                  expect(bootstrap.config[:distro]).to eq("chef11/omnibus")
         | 
| 92 93 | 
             
                end
         | 
| 93 94 |  | 
| 94 95 | 
             
                it "configs the bootstrap's distro value driven off platform value" do
         | 
| 95 96 | 
             
                  @knife.config.delete(:distro)
         | 
| 96 97 | 
             
                  @knife.config[:platform] = "freebsd"
         | 
| 97 98 |  | 
| 98 | 
            -
                  bootstrap.config[:distro]. | 
| 99 | 
            +
                  expect(bootstrap.config[:distro]).to eq("chef11/freebsd")
         | 
| 99 100 | 
             
                end
         | 
| 100 101 |  | 
| 101 | 
            -
                it "configs the  | 
| 102 | 
            +
                it "configs the distro based on bootstrap_version and platform" do
         | 
| 102 103 | 
             
                  @knife.config.delete(:distro)
         | 
| 103 104 | 
             
                  @knife.config[:platform] = "freebsd"
         | 
| 104 105 | 
             
                  @knife.config[:bootstrap_version] = "10"
         | 
| 105 106 |  | 
| 106 | 
            -
                  bootstrap.config[:distro]. | 
| 107 | 
            +
                  expect(bootstrap.config[:distro]).to eq("chef10/freebsd")
         | 
| 107 108 | 
             
                end
         | 
| 108 109 |  | 
| 109 110 | 
             
                it "configs the bootstrap's ENV with the webui password" do
         | 
| 110 111 | 
             
                  bootstrap
         | 
| 111 | 
            -
             | 
| 112 | 
            +
             | 
| 113 | 
            +
                  expect(ENV["WEBUI_PASSWORD"]).to eq("daweb")
         | 
| 112 114 | 
             
                end
         | 
| 113 115 |  | 
| 114 116 | 
             
                it "configs the bootstrap's ENV with the amqp password" do
         | 
| 115 117 | 
             
                  bootstrap
         | 
| 116 | 
            -
             | 
| 118 | 
            +
             | 
| 119 | 
            +
                  expect(ENV["AMQP_PASSWORD"]).to eq("queueitup")
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                it "skips config values with nil defaults" do
         | 
| 123 | 
            +
                  expect(bootstrap.config[:bootstrap_version]).to be_nil
         | 
| 117 124 | 
             
                end
         | 
| 118 125 | 
             
              end
         | 
| 119 126 |  | 
| @@ -134,10 +141,10 @@ describe Chef::Knife::ServerBootstrapLinode do | |
| 134 141 | 
             
                end
         | 
| 135 142 |  | 
| 136 143 | 
             
                it "constructs a connection" do
         | 
| 137 | 
            -
                  Fog::Compute. | 
| 138 | 
            -
                    :provider =>  | 
| 139 | 
            -
                    :linode_api_key =>  | 
| 140 | 
            -
                   | 
| 144 | 
            +
                  expect(Fog::Compute).to receive(:new).with(
         | 
| 145 | 
            +
                    :provider => "Linode",
         | 
| 146 | 
            +
                    :linode_api_key => "key"
         | 
| 147 | 
            +
                  )
         | 
| 141 148 |  | 
| 142 149 | 
             
                  @knife.linode_connection
         | 
| 143 150 | 
             
                end
         | 
| @@ -146,38 +153,42 @@ describe Chef::Knife::ServerBootstrapLinode do | |
| 146 153 | 
             
              describe "#server_ip_address" do
         | 
| 147 154 |  | 
| 148 155 | 
             
                before do
         | 
| 149 | 
            -
                  @knife.config[:linode_node_name] =  | 
| 150 | 
            -
                  @knife. | 
| 156 | 
            +
                  @knife.config[:linode_node_name] = "yak"
         | 
| 157 | 
            +
                  allow(@knife).to receive(:linode_connection) { connection }
         | 
| 151 158 | 
             
                end
         | 
| 152 159 |  | 
| 153 160 | 
             
                context "when server is found" do
         | 
| 154 161 |  | 
| 155 162 | 
             
                  before do
         | 
| 156 | 
            -
                    connection. | 
| 163 | 
            +
                    allow(connection).to receive(:servers) { [server] }
         | 
| 157 164 | 
             
                  end
         | 
| 158 165 |  | 
| 159 166 | 
             
                  let(:server) do
         | 
| 160 | 
            -
                     | 
| 167 | 
            +
                    double(
         | 
| 168 | 
            +
                      :name => "yak",
         | 
| 169 | 
            +
                      :status => 1,
         | 
| 170 | 
            +
                      :public_ip_address => "10.11.12.13"
         | 
| 171 | 
            +
                    )
         | 
| 161 172 | 
             
                  end
         | 
| 162 173 |  | 
| 163 174 | 
             
                  it "returns the provisioned ip address" do
         | 
| 164 | 
            -
                    @knife.server_ip_address. | 
| 175 | 
            +
                    expect(@knife.server_ip_address).to eq("10.11.12.13")
         | 
| 165 176 | 
             
                  end
         | 
| 166 177 |  | 
| 167 178 | 
             
                  it "ignores terminated instances" do
         | 
| 168 | 
            -
                    server. | 
| 179 | 
            +
                    allow(server).to receive(:status) { 0 }
         | 
| 169 180 |  | 
| 170 | 
            -
                    @knife.server_ip_address. | 
| 181 | 
            +
                    expect(@knife.server_ip_address).to be_nil
         | 
| 171 182 | 
             
                  end
         | 
| 172 183 | 
             
                end
         | 
| 173 184 |  | 
| 174 185 | 
             
                context "when server is not found" do
         | 
| 175 186 | 
             
                  before do
         | 
| 176 | 
            -
                    connection. | 
| 187 | 
            +
                    allow(connection).to receive(:servers) { [] }
         | 
| 177 188 | 
             
                  end
         | 
| 178 189 |  | 
| 179 190 | 
             
                  it "returns nil" do
         | 
| 180 | 
            -
                    @knife.server_ip_address. | 
| 191 | 
            +
                    expect(@knife.server_ip_address).to be_nil
         | 
| 181 192 | 
             
                  end
         | 
| 182 193 | 
             
                end
         | 
| 183 194 | 
             
              end
         | 
| @@ -195,13 +206,13 @@ describe Chef::Knife::ServerBootstrapLinode do | |
| 195 206 | 
             
                  @knife.config[:validation_key] = "/var/tmp/validation.pem"
         | 
| 196 207 | 
             
                  @knife.config[:identity_file] = "~/.ssh/mykey_dsa"
         | 
| 197 208 | 
             
                  @knife.config[:ssh_password] = "booboo"
         | 
| 198 | 
            -
                  @knife. | 
| 199 | 
            -
                  @knife. | 
| 200 | 
            -
                  Chef::Knife::LinodeServerCreate. | 
| 201 | 
            -
                  Knife::Server::SSH. | 
| 202 | 
            -
                  Knife::Server::Credentials. | 
| 203 | 
            -
                  credentials. | 
| 204 | 
            -
                  credentials. | 
| 209 | 
            +
                  allow(@knife).to receive(:linode_connection)  { connection }
         | 
| 210 | 
            +
                  allow(@knife).to receive(:server_ip_address)  { "11.11.11.13" }
         | 
| 211 | 
            +
                  allow(Chef::Knife::LinodeServerCreate).to receive(:new) { bootstrap }
         | 
| 212 | 
            +
                  allow(Knife::Server::SSH).to receive(:new) { ssh }
         | 
| 213 | 
            +
                  allow(Knife::Server::Credentials).to receive(:new) { credentials }
         | 
| 214 | 
            +
                  allow(credentials).to receive(:install_validation_key)
         | 
| 215 | 
            +
                  allow(credentials).to receive(:create_root_client)
         | 
| 205 216 | 
             
                end
         | 
| 206 217 |  | 
| 207 218 | 
             
                after do
         | 
| @@ -210,61 +221,79 @@ describe Chef::Knife::ServerBootstrapLinode do | |
| 210 221 | 
             
                  end
         | 
| 211 222 | 
             
                end
         | 
| 212 223 |  | 
| 213 | 
            -
                let(:bootstrap)   {  | 
| 214 | 
            -
                let(:ssh)         {  | 
| 215 | 
            -
                let(:credentials) {  | 
| 224 | 
            +
                let(:bootstrap)   { double(:run => true, :config => Hash.new) }
         | 
| 225 | 
            +
                let(:ssh)         { double }
         | 
| 226 | 
            +
                let(:credentials) { double.as_null_object }
         | 
| 227 | 
            +
             | 
| 228 | 
            +
                it "exits if Chef::Config[:node_name] is missing" do
         | 
| 229 | 
            +
                  Chef::Config[:node_name] = nil
         | 
| 230 | 
            +
             | 
| 231 | 
            +
                  expect { @knife.run }.to raise_error SystemExit
         | 
| 232 | 
            +
                end
         | 
| 233 | 
            +
             | 
| 234 | 
            +
                it "exits if Chef::Config[:client_key] is missing" do
         | 
| 235 | 
            +
                  Chef::Config[:client_key] = nil
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                  expect { @knife.run }.to raise_error SystemExit
         | 
| 238 | 
            +
                end
         | 
| 216 239 |  | 
| 217 240 | 
             
                it "exits if node_name option is missing" do
         | 
| 218 241 | 
             
                  @knife.config.delete(:chef_node_name)
         | 
| 219 242 |  | 
| 220 | 
            -
                   | 
| 243 | 
            +
                  expect { @knife.run }.to raise_error(SystemExit)
         | 
| 221 244 | 
             
                end
         | 
| 222 245 |  | 
| 223 246 | 
             
                it "exits if platform is set to auto" do
         | 
| 224 247 | 
             
                  @knife.config[:platform] = "auto"
         | 
| 225 248 |  | 
| 226 | 
            -
                   | 
| 249 | 
            +
                  expect { @knife.run }.to raise_error(SystemExit)
         | 
| 227 250 | 
             
                end
         | 
| 228 251 |  | 
| 229 252 | 
             
                it "bootstraps a linode server" do
         | 
| 230 | 
            -
                  bootstrap. | 
| 253 | 
            +
                  expect(bootstrap).to receive(:run)
         | 
| 231 254 |  | 
| 232 255 | 
             
                  @knife.run
         | 
| 233 256 | 
             
                end
         | 
| 234 257 |  | 
| 235 258 | 
             
                it "installs a new validation.pem key from the chef 10 server" do
         | 
| 236 259 | 
             
                  @knife.config[:bootstrap_version] = "10"
         | 
| 237 | 
            -
                  Knife::Server::SSH. | 
| 238 | 
            -
                    :host => "11.11.11.13", | 
| 239 | 
            -
                    : | 
| 240 | 
            -
             | 
| 241 | 
            -
             | 
| 260 | 
            +
                  expect(Knife::Server::SSH).to receive(:new).with(
         | 
| 261 | 
            +
                    :host => "11.11.11.13",
         | 
| 262 | 
            +
                    :user => "root",
         | 
| 263 | 
            +
                    :port => "22",
         | 
| 264 | 
            +
                    :keys => ["~/.ssh/mykey_dsa"],
         | 
| 265 | 
            +
                    :password => "booboo"
         | 
| 266 | 
            +
                  )
         | 
| 267 | 
            +
                  expect(Knife::Server::Credentials).to receive(:new).
         | 
| 242 268 | 
             
                    with(ssh, "/etc/chef/validation.pem", {})
         | 
| 243 | 
            -
                  credentials. | 
| 269 | 
            +
                  expect(credentials).to receive(:install_validation_key)
         | 
| 244 270 |  | 
| 245 271 | 
             
                  @knife.run
         | 
| 246 272 | 
             
                end
         | 
| 247 273 |  | 
| 248 274 | 
             
                it "installs a new validation.pem key from the omnibus server" do
         | 
| 249 | 
            -
                  Knife::Server::SSH. | 
| 250 | 
            -
                    :host => "11.11.11.13", | 
| 251 | 
            -
                    : | 
| 252 | 
            -
             | 
| 253 | 
            -
             | 
| 254 | 
            -
                     | 
| 255 | 
            -
                   | 
| 275 | 
            +
                  expect(Knife::Server::SSH).to receive(:new).with(
         | 
| 276 | 
            +
                    :host => "11.11.11.13",
         | 
| 277 | 
            +
                    :user => "root",
         | 
| 278 | 
            +
                    :port => "22",
         | 
| 279 | 
            +
                    :keys => ["~/.ssh/mykey_dsa"],
         | 
| 280 | 
            +
                    :password => "booboo"
         | 
| 281 | 
            +
                  )
         | 
| 282 | 
            +
                  expect(Knife::Server::Credentials).to receive(:new).
         | 
| 283 | 
            +
                    with(ssh, "/etc/chef/validation.pem", :omnibus => true)
         | 
| 284 | 
            +
                  expect(credentials).to receive(:install_validation_key)
         | 
| 256 285 |  | 
| 257 286 | 
             
                  @knife.run
         | 
| 258 287 | 
             
                end
         | 
| 259 288 |  | 
| 260 289 | 
             
                it "create a root client key" do
         | 
| 261 | 
            -
                  credentials. | 
| 290 | 
            +
                  expect(credentials).to receive(:create_root_client)
         | 
| 262 291 |  | 
| 263 292 | 
             
                  @knife.run
         | 
| 264 293 | 
             
                end
         | 
| 265 294 |  | 
| 266 295 | 
             
                it "installs a client key" do
         | 
| 267 | 
            -
                  credentials. | 
| 296 | 
            +
                  expect(credentials).to receive(:install_client_key).
         | 
| 268 297 | 
             
                    with("smithers", "/var/tmp/myclientkey.pem")
         | 
| 269 298 |  | 
| 270 299 | 
             
                  @knife.run
         |