Skip to content

Commit

Permalink
Merge pull request #82 from 4n3w/master
Browse files Browse the repository at this point in the history
Add backups_enabled option on droplet creation (-b true)
  • Loading branch information
pearkes committed Jan 9, 2014
2 parents 29e12cd + 771fb9c commit 967403f
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 11 deletions.
5 changes: 5 additions & 0 deletions lib/tugboat/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,10 @@ def ssh(name=nil)
:type => :boolean,
:aliases => "-p",
:desc => "Enable private networking on the droplet"
method_option "backups_enabled",
:type => :boolean,
:aliases => "-b",
:desc => "Enable backups on the droplet"

def create(name)
Middleware.sequence_create_droplet.call({
Expand All @@ -128,6 +132,7 @@ def create(name)
"create_droplet_region_id" => options[:region],
"create_droplet_ssh_key_ids" => options[:keys],
"create_droplet_private_networking" => options[:private_networking],
"create_droplet_backups_enabled" => options[:backups_enabled],
"create_droplet_name" => name
})
end
Expand Down
14 changes: 12 additions & 2 deletions lib/tugboat/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class Configuration
DEFAULT_SIZE = '66'
DEFAULT_SSH_KEY = ''
DEFAULT_PRIVATE_NETWORKING = 'false'
DEFAULT_BACKUPS_ENABLED = 'false'

def initialize
@path = ENV["TUGBOAT_CONFIG_PATH"] || File.join(File.expand_path("~"), FILE_NAME)
Expand Down Expand Up @@ -72,6 +73,10 @@ def default_private_networking
@data['defaults'].nil? ? DEFAULT_PRIVATE_NETWORKING : @data['defaults']['private_networking']
end

def default_backups_enabled
@data['defaults'].nil? ? DEFAULT_BACKUPS_ENABLED : @data['defaults']['backups_enabled']
end

# Re-runs initialize
def reset!
self.send(:initialize)
Expand All @@ -83,7 +88,7 @@ def reload!
end

# Writes a config file
def create_config_file(client, api, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking)
def create_config_file(client, api, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled)
# Default SSH Key path
if ssh_key_path.empty?
ssh_key_path = File.join(File.expand_path("~"), DEFAULT_SSH_KEY_PATH)
Expand Down Expand Up @@ -117,6 +122,10 @@ def create_config_file(client, api, ssh_key_path, ssh_user, ssh_port, region, im
private_networking = DEFAULT_PRIVATE_NETWORKING
end

if backups_enabled.empty?
backups_enabled = DEFAULT_BACKUPS_ENABLED
end

require 'yaml'
File.open(@path, File::RDWR|File::TRUNC|File::CREAT, 0600) do |file|
data = {
Expand All @@ -132,7 +141,8 @@ def create_config_file(client, api, ssh_key_path, ssh_user, ssh_port, region, im
"image" => image,
"size" => size,
"ssh_key" => ssh_key,
"private_networking" => private_networking
"private_networking" => private_networking,
"backups_enabled" => backups_enabled
}
}
file.write data.to_yaml
Expand Down
3 changes: 2 additions & 1 deletion lib/tugboat/middleware/ask_for_credentials.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ def call(env)
size = ask "Enter your default size ID (optional, defaults to 66 (512MB)):"
ssh_key = ask "Enter your default ssh key ID (optional, defaults to none):"
private_networking = ask "Enter your default for private networking (optional, defaults to false):"
backups_enabled = ask "Enter your default for enabling backups (optional, defaults to false):"

# Write the config file.
env['config'].create_config_file(client_key, api_key, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking)
env['config'].create_config_file(client_key, api_key, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled)
env['config'].reload!

@app.call(env)
Expand Down
8 changes: 7 additions & 1 deletion lib/tugboat/middleware/create_droplet.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,18 @@ def call(env)
droplet_private_networking = env["create_droplet_private_networking"] :
droplet_private_networking = env["config"].default_private_networking

env["create_droplet_backups_enabled"] ?
droplet_backups_enabled = env["create_droplet_backups_enabled"] :
droplet_backups_enabled = env["config"].default_backups_enabled


req = ocean.droplets.create :name => env["create_droplet_name"],
:size_id => droplet_size_id,
:image_id => droplet_image_id,
:region_id => droplet_region_id,
:ssh_key_ids => droplet_ssh_key_id,
:private_networking => droplet_private_networking
:private_networking => droplet_private_networking,
:backups_enabled => droplet_backups_enabled

if req.status == "ERROR"
say req.error_message, :red
Expand Down
8 changes: 7 additions & 1 deletion spec/cli/authorize_cli_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,15 @@
$stdin.should_receive(:gets).and_return(ssh_key_id)
$stdout.should_receive(:print).with("Enter your default for private networking (optional, defaults to false): ")
$stdin.should_receive(:gets).and_return(private_networking)
$stdout.should_receive(:print).with("Enter your default for enabling backups (optional, defaults to false): ")
$stdin.should_receive(:gets).and_return(backups_enabled)


@cli.authorize

expect(a_request(:get, "https://api.digitalocean.com/droplets?api_key=#{api_key}&client_id=#{client_key}")).to have_been_made

File.read(tmp_path).should include "image: '#{image}'", "region: '#{region}'", "size: '#{size}'", "ssh_user: #{ssh_user}", "ssh_key_path: #{ssh_key_path}", "ssh_port: '#{ssh_port}'", "ssh_key: '#{ssh_key_id}'", "private_networking: '#{private_networking}'"
File.read(tmp_path).should include "image: '#{image}'", "region: '#{region}'", "size: '#{size}'", "ssh_user: #{ssh_user}", "ssh_key_path: #{ssh_key_path}", "ssh_port: '#{ssh_port}'", "ssh_key: '#{ssh_key_id}'", "private_networking: '#{private_networking}'", "backups_enabled: '#{backups_enabled}'"

end

Expand All @@ -66,6 +69,9 @@
$stdin.should_receive(:gets).and_return('')
$stdout.should_receive(:print).with("Enter your default for private networking (optional, defaults to false): ")
$stdin.should_receive(:gets).and_return('')
$stdout.should_receive(:print).with("Enter your default for enabling backups (optional, defaults to false): ")
$stdin.should_receive(:gets).and_return('')


@cli.authorize

Expand Down
8 changes: 4 additions & 4 deletions spec/cli/create_cli_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@

describe "create a droplet" do
it "with a name, uses defaults from configuration" do
stub_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=#{image}&name=#{droplet_name}&private_networking=#{private_networking}&region_id=#{region}&size_id=#{size}&ssh_key_ids=#{ssh_key_id}").
stub_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=#{image}&name=#{droplet_name}&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}&region_id=#{region}&size_id=#{size}&ssh_key_ids=#{ssh_key_id}").
to_return(:status => 200, :body => '{"status":"OK"}')

@cli.create(droplet_name)

expect($stdout.string).to eq <<-eos
Queueing creation of droplet '#{droplet_name}'...done
eos
expect(a_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=#{image}&name=#{droplet_name}&private_networking=#{private_networking}&region_id=#{region}&size_id=#{size}&ssh_key_ids=#{ssh_key_id}")).to have_been_made
expect(a_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=#{image}&name=#{droplet_name}&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}&region_id=#{region}&size_id=#{size}&ssh_key_ids=#{ssh_key_id}")).to have_been_made
end

it "with args does not use defaults from configuration" do
stub_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=555&name=foo&private_networking=#{private_networking}&region_id=3&size_id=666&ssh_key_ids=4321").
stub_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=555&name=foo&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}&region_id=3&size_id=666&ssh_key_ids=4321").
to_return(:status => 200, :body => '{"status":"OK"}')

@cli.options = @cli.options.merge(:image => '555', :size => '666', :region => '3', :keys => '4321')
Expand All @@ -27,7 +27,7 @@
Queueing creation of droplet '#{droplet_name}'...done
eos

expect(a_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=555&name=foo&private_networking=#{private_networking}&region_id=3&size_id=666&ssh_key_ids=4321")).to have_been_made
expect(a_request(:get, "https://api.digitalocean.com/droplets/new?api_key=#{api_key}&client_id=#{client_key}&image_id=555&name=foo&backups_enabled=#{backups_enabled}&private_networking=#{private_networking}&region_id=3&size_id=666&ssh_key_ids=4321")).to have_been_made
end
end

Expand Down
14 changes: 13 additions & 1 deletion spec/config_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,13 @@
let(:size) { "66" }
let(:ssh_key_id) { '1234' }
let(:private_networking) { 'true' }
let(:backups_enabled) { 'true' }

let(:config) { config = Tugboat::Configuration.instance }

before :each do
# Create a temporary file
config.create_config_file(client_key, api_key, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking)
config.create_config_file(client_key, api_key, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking, backups_enabled)
end

it "can be created" do
Expand Down Expand Up @@ -90,6 +91,11 @@
private_networking = data["defaults"]
expect(private_networking).to have_key("private_networking")
end

it "should have backups_enabled set" do
backups_enabled = data["defaults"]
expect(backups_enabled).to have_key("backups_enabled")
end
end
describe "backwards compatible" do
let(:client_key) { "foo" }
Expand All @@ -104,6 +110,7 @@
let(:config_default_size) { Tugboat::Configuration::DEFAULT_SIZE }
let(:config_default_ssh_key) { Tugboat::Configuration::DEFAULT_SSH_KEY }
let(:config_default_networking) { Tugboat::Configuration::DEFAULT_PRIVATE_NETWORKING }
let(:config_default_backups) { Tugboat::Configuration::DEFAULT_BACKUPS_ENABLED }
let(:backwards_config) {
{
"authentication" => { "client_key" => client_key, "api_key" => api_key },
Expand Down Expand Up @@ -145,5 +152,10 @@
expect(private_networking).to eql config_default_networking
end

it "should use default backups_enabled if not in the configuration" do
backups_enabled = config.default_backups_enabled
expect(backups_enabled).to eql config_default_backups
end

end
end
3 changes: 2 additions & 1 deletion spec/shared/environment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
let(:ssh_key_name) { 'macbook_pro' }
let(:ssh_public_key) { 'ssh-dss A123= user@host' }
let(:private_networking) { 'false'}
let(:backups_enabled) { 'false'}
let(:ocean) { DigitalOcean::API.new :client_id => client_key, :api_key =>api_key }
let(:app) { lambda { |env| } }
let(:env) { {} }
Expand All @@ -29,7 +30,7 @@
@cli = Tugboat::CLI.new

# Set a temprary project path and create fake config.
config.create_config_file(client_key, api_key, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking)
config.create_config_file(client_key, api_key, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key_id, private_networking, backups_enabled)
config.reload!

# Keep track of the old stderr / out
Expand Down

0 comments on commit 967403f

Please sign in to comment.