rumm 0.0.23 → 0.0.24

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.
Files changed (53) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +11 -3
  3. data/app.rb +13 -0
  4. data/app/controllers/authentication_controller.rb +12 -11
  5. data/app/controllers/railsifications_controller.rb +24 -21
  6. data/app/controllers/servers_controller.rb +14 -4
  7. data/app/controllers/users_controller.rb +15 -0
  8. data/app/forms/servers/update_form.rb +7 -0
  9. data/app/forms/volumes/create_form.rb +1 -2
  10. data/app/help/create_container.txt +0 -1
  11. data/app/help/create_dbinstance.txt +1 -1
  12. data/app/help/create_server.txt +1 -1
  13. data/app/help/destroy_node_on_loadbalancer.txt +1 -1
  14. data/app/help/railsify_server.txt +1 -1
  15. data/app/help/show_attachment_on_server.txt +4 -4
  16. data/app/help/show_server.txt +1 -1
  17. data/app/help/update_server.txt +19 -0
  18. data/app/providers/configuration_provider.rb +118 -0
  19. data/app/providers/credentials_provider.rb +4 -4
  20. data/app/providers/login_information_provider.rb +34 -0
  21. data/app/providers/users_provider.rb +13 -0
  22. data/app/routes.rb +1 -0
  23. data/app/views/authentication/login.txt.erb +1 -1
  24. data/app/views/help/show.txt.erb +1 -1
  25. data/app/views/servers/update.txt.erb +1 -0
  26. data/app/views/users/create.txt.erb +1 -1
  27. data/app/views/users/destroy.txt.erb +1 -0
  28. data/app/views/users/show.txt.erb +1 -0
  29. data/lib/rumm/exceptions.rb +5 -0
  30. data/lib/rumm/version.rb +1 -1
  31. data/rumm.gemspec +1 -2
  32. data/spec/features/attachments_spec.rb +1 -1
  33. data/spec/features/configuration_spec.rb +143 -0
  34. data/spec/features/containers_spec.rb +1 -1
  35. data/spec/features/databases_spec.rb +1 -1
  36. data/spec/features/dbinstances_spec.rb +1 -1
  37. data/spec/features/files_spec.rb +1 -1
  38. data/spec/features/help_spec.rb +1 -1
  39. data/spec/features/loadbalancers_spec.rb +1 -1
  40. data/spec/features/login_spec.rb +47 -33
  41. data/spec/features/nodes_spec.rb +1 -1
  42. data/spec/features/servers_spec.rb +1 -1
  43. data/spec/features/users_spec.rb +28 -0
  44. data/spec/features/volumes_spec.rb +1 -1
  45. data/spec/fixtures/cassettes/authentication/successful-login.yml +9 -5
  46. data/spec/fixtures/cassettes/authentication/unsuccessful-login.yml +5 -3
  47. data/spec/fixtures/cassettes/users/create.yml +122 -0
  48. data/spec/fixtures/cassettes/users/destroy.yml +200 -0
  49. data/spec/fixtures/cassettes/users/show-all.yml +122 -0
  50. data/spec/fixtures/cassettes/users/show.yml +165 -0
  51. data/spec/spec_helper.rb +19 -11
  52. metadata +25 -19
  53. data/app/providers/user_provider.rb +0 -23
@@ -1,10 +1,10 @@
1
- require 'netrc'
2
-
3
1
  class CredentialsProvider
2
+
3
+ requires :configuration
4
4
 
5
5
  def value
6
- if creds = Netrc.read['api.rackspace.com']
7
- Map(username: creds.first, api_key: creds.last, rackspace_region: :ord)
6
+ if configuration.username
7
+ Map(username: configuration.username, api_key: configuration.api_key, rackspace_region: configuration.region)
8
8
  else
9
9
  fail Rumm::LoginRequired, "login required"
10
10
  end
@@ -0,0 +1,34 @@
1
+ require 'io/console'
2
+
3
+ class LoginInformationProvider
4
+ requires :command
5
+ requires :configuration
6
+
7
+ def value
8
+ name = get_name
9
+ password = get_password
10
+ region = get_default_region
11
+ Map name: name, password: password, region: region
12
+ end
13
+
14
+ private
15
+
16
+ def get_name
17
+ command.output.print "Username: "
18
+ command.input.gets.chomp
19
+ end
20
+
21
+ def get_password
22
+ command.output.print "Password: "
23
+ password = command.input.noecho(&:gets).chomp
24
+ command.output.print "\n"
25
+ password
26
+ end
27
+
28
+ def get_default_region
29
+ command.output.print "Default Region (Enter for #{configuration.region}): "
30
+ region = command.input.gets.chomp
31
+ region.empty? ? configuration.region : region
32
+ end
33
+
34
+ end
@@ -0,0 +1,13 @@
1
+ require 'fog'
2
+ class UsersProvider
3
+ requires :credentials
4
+
5
+ def value
6
+ options = {
7
+ :rackspace_username => credentials.username,
8
+ :rackspace_api_key => credentials.api_key,
9
+ :rackspace_region => credentials.rackspace_region
10
+ }
11
+ Fog::Rackspace::Databases.new(options).users
12
+ end
13
+ end
@@ -44,6 +44,7 @@ match 'destroy database :id on dbinstance :instance_id' => 'databases#destroy'
44
44
  match 'show users on dbinstance :dbinstance_id' => 'users#index'
45
45
  match 'show user :id on dbinstance :dbinstance_id' => 'users#show'
46
46
  match 'create user on dbinstance :dbinstance_id' => 'users#create'
47
+ match 'destroy user :id on dbinstance :dbinstance_id' => 'users#destroy'
47
48
 
48
49
  match 'ssh :id' => 'servers#ssh'
49
50
 
@@ -1,2 +1,2 @@
1
1
 
2
- logged in as <%= this.access.user.name %>, credentials written to ~/.netrc
2
+ logged in as <%= this.access.user.name %>, credentials written to ~/.rummrc
@@ -6,7 +6,7 @@ Rumm: A tasty tool for hackers and pirates
6
6
  rumm login
7
7
  Username: rsteveson
8
8
  Password: ******
9
- logged in as rstevenson, credentials written to ~/.netrc
9
+ logged in as rstevenson, credentials written to ~/.rummrc
10
10
 
11
11
  And you're good to go! For a list of all commands, run:
12
12
 
@@ -0,0 +1 @@
1
+ Sent update request to server.
@@ -1 +1 @@
1
- created user <%= this.name %>
1
+ Created user <%= this.name %>
@@ -0,0 +1 @@
1
+ Requested destruction of user
@@ -0,0 +1 @@
1
+ <%= this.name %>, databases: <% this.databases.each do |database| %> <%= database["name"] %> <% end %>
@@ -0,0 +1,5 @@
1
+ module Rumm
2
+
3
+ class LoginRequired < Exception
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Rumm
2
- VERSION = "0.0.23"
2
+ VERSION = "0.0.24"
3
3
  end
@@ -21,6 +21,5 @@ Gem::Specification.new do |spec|
21
21
  spec.required_ruby_version = ">= 1.9.3"
22
22
 
23
23
  spec.add_dependency "mvcli", "~> 0.0.16"
24
- spec.add_dependency "fog", "~> 1.15.0"
25
- spec.add_dependency "netrc"
24
+ spec.add_dependency "fog", "~> 1.16.0"
26
25
  end
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  describe "using the attachments api" do
4
4
  context "with credentials are present" do
5
5
 
6
- include_context "netrc"
6
+ include_context "rummrc"
7
7
 
8
8
  context "to create" do
9
9
  When { VCR.use_cassette('attachments/create') { run "rumm create attachment on server silly-saffron --volume jumping-jellybean" }}
@@ -0,0 +1,143 @@
1
+ require "spec_helper"
2
+ require "configuration_provider"
3
+
4
+ describe "configuration" do
5
+
6
+ describe "defaults" do
7
+ context "should be initialized with defaults" do
8
+ include_context "set fake home"
9
+ Given(:configuration) { ConfigurationProvider.new.value }
10
+ Then { configuration.region.should == 'ord' }
11
+ And { configuration.username.should == nil }
12
+ And { configuration.api_key.should == nil}
13
+ end
14
+ end
15
+
16
+ describe "Configuration file present" do
17
+ include_context "set home"
18
+ When do
19
+ File.open("#{home}/.rummrc", 'w') do |f|
20
+ f.puts "{\"environments\":{\"default\":{\"region\":\"dfw\",\"username\":\"racker\",\"api_key\":\"1234\"}}}"
21
+ end
22
+ configuration.reload
23
+ end
24
+ Given(:configuration) { ConfigurationProvider.new.value }
25
+ context "should be initialized with .rummrc file if present" do
26
+ Then { configuration.region.should == "dfw" }
27
+ And { configuration.username.should == 'racker' }
28
+ And { configuration.api_key.should == '1234' }
29
+ end
30
+
31
+ # Cleanup
32
+ # File.delete "#{@rumm_dir}/.rummrc" if File.exists? "#{@rumm_dir}/.rummrc"
33
+ describe "region" do
34
+ When { ENV['REGION'] = "SYD" }
35
+ context "should be overridable with REGION environment var" do
36
+ Then { configuration.region.should == "syd" }
37
+ end
38
+ end
39
+
40
+ #Clean up
41
+
42
+ describe "lon_region?" do
43
+ When { ENV['REGION'] = nil }
44
+ Given(:configuration) { ConfigurationProvider.new.value }
45
+ When { configuration.region = region }
46
+
47
+ context "when set with lon" do
48
+ Given (:region) { "lon" }
49
+ Then { configuration.lon_region? }
50
+ end
51
+
52
+ context "when set with LON" do
53
+ Given (:region) { "LON" }
54
+ Then { configuration.lon_region? }
55
+ end
56
+
57
+ context "when set with :lon" do
58
+ Given (:region) { :lon }
59
+ Then { configuration.lon_region? }
60
+ end
61
+
62
+ context "when set as nil" do
63
+ Given (:region) { "nil" }
64
+ Then { !configuration.lon_region? }
65
+ end
66
+
67
+ context "when set as dfw" do
68
+ Given (:region) { "nil" }
69
+ Then { !configuration.lon_region? }
70
+ end
71
+ end
72
+
73
+ describe "auth_endpoint" do
74
+ Given (:configuration) { ConfigurationProvider.new.value }
75
+ When { configuration.region = region }
76
+
77
+ context "when set as :lon" do
78
+ Given (:region) { :lon }
79
+ Then { configuration.auth_endpoint.should == Fog::Rackspace::UK_AUTH_ENDPOINT }
80
+ end
81
+
82
+ context "when set as :syd" do
83
+ Given (:region) { :syd }
84
+ Then { configuration.auth_endpoint.should == Fog::Rackspace::US_AUTH_ENDPOINT }
85
+ end
86
+ end
87
+
88
+ describe "reload" do
89
+ context "should reload configuration if config file is present" do
90
+ Given(:configuration) do
91
+ ConfigurationProvider.new.value
92
+ end
93
+ Given { ENV['REGION'] = nil }
94
+
95
+ When do
96
+ configuration.username = "unclebob"
97
+ configuration.reload.should be_true
98
+ end
99
+ Then { configuration.username.should == "racker" }
100
+ end
101
+ end
102
+ describe "delete" do
103
+ context "should delete file if it exists and revert to default configuration" do
104
+ Given(:configuration) { ConfigurationProvider.new.value }
105
+ Given { File.should_receive(:delete).with "#{File.expand_path(current_dir)}/.rummrc" }
106
+ When { configuration.delete }
107
+ Then { configuration.region.should == 'ord' }
108
+ And { configuration.username.should == nil }
109
+ And { configuration.api_key.should == nil }
110
+ end
111
+ context "should not delete file if it does not exist" do
112
+ Given(:configuration) { ConfigurationProvider.new.value }
113
+ Given { File.stub(:exists?).with("#{File.expand_path(current_dir)}/.rummrc").and_return(false)}
114
+ Given { File.stub(:delete).never }
115
+ When { configuration.delete.should be_true }
116
+ Then { configuration.region.should == 'ord' }
117
+ And { configuration.username.should == nil }
118
+ And { configuration.api_key.should == nil }
119
+ end
120
+ end
121
+ describe "save" do
122
+ context "should save the configuration" do
123
+ Given(:configuration) { ConfigurationProvider.new.value }
124
+ Given { JSON.stub :dump }
125
+ Then { configuration.save.should be_true }
126
+ end
127
+ end
128
+ end
129
+
130
+ context "should not reload values if configuration file does not exist" do
131
+ include_context "set fake home"
132
+
133
+ Given(:configuration) do
134
+ ConfigurationProvider.new.value
135
+ end
136
+ When do
137
+ configuration.username = "unclebob"
138
+ configuration.reload.should be_false
139
+ end
140
+
141
+ Then { configuration.username.should == "unclebob" }
142
+ end
143
+ end
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe "using the containers api" do
4
4
 
5
- include_context "netrc"
5
+ include_context "rummrc"
6
6
 
7
7
  context "to create" do
8
8
  When { VCR.use_cassette('containers/create') { run "rumm create container --name cruising-crouton" }}
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "using the databases api" do
4
- include_context "netrc"
4
+ include_context "rummrc"
5
5
 
6
6
  context "to create" do
7
7
  When { VCR.use_cassette('databases/create') { run "rumm create database on dbinstance decided-irony --name dancing-bear" }}
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe "using the instance api" do
4
4
 
5
- include_context "netrc"
5
+ include_context "rummrc"
6
6
 
7
7
  context "to create" do
8
8
  When { VCR.use_cassette('instances/create') { run "rumm create dbinstance --name dancing-idol" }}
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe "using the files api" do
4
4
 
5
- include_context "netrc"
5
+ include_context "rummrc"
6
6
 
7
7
  context "to create" do
8
8
  Given do
@@ -14,7 +14,7 @@ describe "interactive learning" do
14
14
  # rumm login
15
15
  # Username: rsteveson
16
16
  # Password: ******
17
- # logged in as rstevenson, credentials written to ~/.netrc
17
+ # logged in as rstevenson, credentials written to ~/.rummrc
18
18
  #
19
19
  # And you're good to go! The following commands are available in your Rumm
20
20
  # environment:
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe "using the load balancers api" do
4
4
 
5
- include_context "netrc"
5
+ include_context "rummrc"
6
6
 
7
7
  context "to create" do
8
8
  When { VCR.use_cassette('loadbalancers/create') { run "rumm create loadbalancer --name likable-bear --node 166.78.114.25:80" }}
@@ -1,14 +1,16 @@
1
1
  require "spec_helper"
2
- require "netrc"
3
2
  require 'io/console'
4
3
 
5
4
  describe "logging in" do
6
- include_context "netrc"
7
5
  before do
8
6
  run "rumm logout"
9
7
  end
10
- context "interactively with valid credentials" do
8
+
9
+ context "with valid credentials" do
10
+ Given(:region) { "ord"}
11
+
11
12
  When do
13
+ run "rumm logout"
12
14
  VCR.use_cassette('authentication/successful-login') do
13
15
  if VCR.current_cassette.recording?
14
16
  print "\nUsername: "
@@ -16,46 +18,58 @@ describe "logging in" do
16
18
  print "Password: "
17
19
  password = $stdin.noecho(&:gets).chomp
18
20
  end
19
- will_type username || "<username>"
20
- will_type password || "<password>"
21
+ @username = username || "<username>"
22
+ will_type(@username)
23
+ will_type(password || "<password>")
24
+ will_type region
21
25
  run_interactive "rumm login"
22
26
  stop_process @interactive
23
27
  end
24
28
  end
25
- Then {last_exit_status == 0}
26
29
 
27
- context "places your login credentials in your .netrc" do
28
- Given(:netrc) { Netrc.read["api.rackspace.com"] }
29
- Given(:user) {netrc.first}
30
- Given(:password) {netrc.last}
30
+ Then { last_exit_status == 0 }
31
31
 
32
- Then { user != nil }
33
- And { password != nil }
34
- end
35
- end
32
+ Given(:config_file_path) {
33
+ File.expand_path("~/.rummrc")
34
+ }
36
35
 
37
- context "logging out" do
38
- When {run "rumm logout"}
39
- Then {last_exit_status == 0}
36
+ Then { File.exists?(config_file_path) }
40
37
 
41
- context "removes your login credentials from .netrc" do
42
- Then do
43
- n = Netrc.read
44
- user, pass = n["api.rackspace.com"]
45
- user == nil and pass == nil
38
+ Given(:json) {
39
+ File.open(config_file_path) do |f|
40
+ JSON.load(f)["environments"]["default"]
46
41
  end
47
- end
48
- context "interactively with invalid credentials" do
49
- When do
50
- VCR.use_cassette("authentication/unsuccessful-login") do
51
- will_type "nil"
52
- will_type "nil"
53
- run_interactive "rum login"
54
- stop_process @interactive
55
- end
42
+ }
43
+
44
+ Then { @username == json["username"] }
45
+ Then { json["api_key"] }
46
+ Then { region == json["region"] }
47
+ end
48
+
49
+ context "with invalid credentials" do
50
+ When do
51
+ VCR.use_cassette('authentication/unsuccessful-login') do
52
+ will_type "nil"
53
+ will_type "nil"
54
+ will_type "nil"
55
+ run_interactive "rumm login"
56
+ stop_process @interactive
56
57
  end
57
- Then {last_exit_status != 0}
58
- And {all_stderr =~ /User could not be authenticated/}
59
58
  end
59
+ Then {last_exit_status != 0}
60
+ And {all_stderr =~ /User could not be authenticated/}
61
+ end
62
+
63
+ context "after previous successful login"
64
+
65
+ end
66
+
67
+
68
+ describe "logging out" do
69
+
70
+ When { run "rumm logout" }
71
+ Then { last_exit_status == 0 }
72
+ context "deletes .rummrc" do
73
+ Then { !File.exists? "#{File.expand_path('~')}/.rummrc" }
60
74
  end
61
75
  end
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe "using the nodes api" do
4
4
  $id = "test"
5
- include_context "netrc"
5
+ include_context "rummrc"
6
6
 
7
7
  context "to create" do
8
8
  When { VCR.use_cassette('nodes/create') { run "rumm create node on loadbalancer laughing-barrel --address 198.61.221.220 --condition ENABLED --port: 80" }}