engineyard-visualvm 0.5.1 → 0.5.2

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.
data/ChangeLog CHANGED
@@ -1,3 +1,13 @@
1
+ 2011-12-13 Nick Sieger <nick@nicksieger.com>
2
+
3
+ * (Changes): Release 0.5.2
4
+
5
+ * lib/engineyard-visualvm/cli.rb (EngineYard::VisualVM::Helpers#fetch_public_ip):
6
+ Use public hostname from environment's single instance
7
+
8
+ * lib/engineyard-visualvm/cli.rb (EngineYard::VisualVM::CLI#start):
9
+ Ensure host is in known_hosts file before launching visual vm
10
+
1
11
  2011-12-08 Nick Sieger <nick@nicksieger.com>
2
12
 
3
13
  * (Changes): Release 0.5.1
data/README.md CHANGED
@@ -97,6 +97,8 @@ To try it yourself, do the following:
97
97
 
98
98
  - Prompt for a JVM to connect to if more than one JVM process is
99
99
  running on the server
100
+ - Prompt for an instance to connect to if the environment has multiple
101
+ instances
100
102
  - Data collected by `jstatd` is not yet supported, so things like the
101
103
  Visual GC tab are not supported yet.
102
104
  - Additional utilities to make use of the JMX connection remotely
data/Rakefile CHANGED
@@ -45,6 +45,18 @@ RSpec::Core::RakeTask.new
45
45
 
46
46
  task :spec => :jar
47
47
 
48
+ # Override push to use engineyard key
49
+ class Bundler::GemHelper
50
+ def rubygem_push(path)
51
+ if Gem.configuration.api_keys.key? :engineyard
52
+ sh("gem push -k engineyard '#{path}'")
53
+ Bundler.ui.confirm "Pushed #{name} #{version} to rubygems.org"
54
+ else
55
+ raise ":engineyard key not set in ~/.gem/credentials"
56
+ end
57
+ end
58
+ end
59
+
48
60
  begin
49
61
  require 'childprocess'
50
62
  require 'jmx'
@@ -122,15 +122,21 @@ module EngineYard
122
122
  end
123
123
  end
124
124
 
125
- # Return the public IP assigned to an environment (which may or
126
- # may not be a booted cluster of instances) Displays error and
127
- # exits if no public IP assigned to the environment
125
+ # Return the public IP or instance hostname assigned to an
126
+ # environment (which may or may not be a booted cluster of
127
+ # instances) Displays error and exits if no public IP assigned
128
+ # to the environment
128
129
  def fetch_public_ip(environment)
129
- unless environment.load_balancer_ip_address
130
- warn "#{environment.account.name}/#{environment.name} has no assigned public IP address."
130
+ if environment.load_balancer_ip_address
131
+ return environment.load_balancer_ip_address
131
132
  end
132
133
 
133
- environment.load_balancer_ip_address
134
+ if environment.instances.length == 1 && environment.instances.first.public_hostname
135
+ return environment.instances.first.public_hostname
136
+ end
137
+
138
+ warn "#{environment.account.name}/#{environment.name} has no assigned public IP address or hostname."
139
+ nil
134
140
  end
135
141
  end
136
142
 
@@ -173,6 +179,10 @@ module EngineYard
173
179
 
174
180
  if ssh?
175
181
  ssh_dest = ssh_host
182
+ unless system "ssh #{ssh_dest} true"
183
+ warn "Error establishing ssh connection; make sure you can `ssh #{ssh_dest}'."
184
+ exit 3
185
+ end
176
186
 
177
187
  if socks_proxy?
178
188
  proxy_port = next_free_port
@@ -181,7 +191,7 @@ module EngineYard
181
191
  else
182
192
  server_host, server_port = host, port
183
193
  @host, @port = "localhost", next_free_port
184
- @ssh_process = ChildProcess.build("ssh", "-NL", "#{@port}:#{@host}:#{server_port}", "#{ssh_dest}")
194
+ @ssh_process = ChildProcess.build("ssh", "-NL", "#{@port}:#{@host}:#{server_port}", ssh_dest)
185
195
  end
186
196
 
187
197
  @ssh_process.start
@@ -6,6 +6,6 @@
6
6
 
7
7
  module EngineYard
8
8
  module VisualVM
9
- VERSION = "0.5.1"
9
+ VERSION = "0.5.2"
10
10
  end
11
11
  end
@@ -23,7 +23,7 @@ describe EngineYard::VisualVM::Helpers do
23
23
  end
24
24
 
25
25
  describe EngineYard::VisualVM::CLI do
26
- let(:script) { Class.new(EngineYard::VisualVM::CLI) }
26
+ let(:script) { Class.new(EngineYard::VisualVM::CLI) { include SystemDouble } }
27
27
 
28
28
  context "#help" do
29
29
  it "prints the default port" do
@@ -42,6 +42,7 @@ describe EngineYard::VisualVM::CLI do
42
42
  end
43
43
 
44
44
  context "#start" do
45
+ let(:system_double) { double("system").tap {|d| script.system_double = d } }
45
46
  let(:ssh_process) { double("ssh process double").tap {|d| d.should_receive(:start) } }
46
47
  let(:visualvm_process) do
47
48
  double("visualvm process double").tap {|d|
@@ -83,6 +84,7 @@ describe EngineYard::VisualVM::CLI do
83
84
  end
84
85
 
85
86
  it "sets up an ssh tunnel if the user@host format is used" do
87
+ system_double.should_receive(:system).with("ssh user@example.com true").ordered.and_return true
86
88
  ChildProcess.should_receive(:build).ordered.and_return do |*args|
87
89
  args.join(' ').should =~ /ssh -NL.*user@example.com/
88
90
  ssh_process
@@ -97,6 +99,7 @@ describe EngineYard::VisualVM::CLI do
97
99
  end
98
100
 
99
101
  it "allows an ssh tunnel to be forced" do
102
+ system_double.should_receive(:system).ordered.and_return true
100
103
  ChildProcess.should_receive(:build).ordered.and_return do |*args|
101
104
  args.join(' ').should =~ /ssh -NL/
102
105
  ssh_process
@@ -122,6 +125,7 @@ describe EngineYard::VisualVM::CLI do
122
125
  end
123
126
 
124
127
  it "finds an open port for the local side of the ssh tunnel" do
128
+ system_double.should_receive(:system).ordered.and_return true
125
129
  ChildProcess.should_receive(:build).ordered.and_return do |*args|
126
130
  args.join(' ').should =~ /ssh -NL #{@next_port}:localhost:#{@port}/
127
131
  ssh_process
@@ -139,7 +143,6 @@ describe EngineYard::VisualVM::CLI do
139
143
  context "with --environment specified" do
140
144
  let(:environment) do
141
145
  double(:environment).tap {|e|
142
- e.stub!(:load_balancer_ip_address).and_return "0.0.0.0"
143
146
  e.stub!(:username).and_return "deploy"
144
147
  }
145
148
  end
@@ -151,6 +154,7 @@ describe EngineYard::VisualVM::CLI do
151
154
  end
152
155
 
153
156
  it "sets the user to 'deploy' and the host to the load balancer IP address" do
157
+ environment.stub!(:load_balancer_ip_address).and_return "0.0.0.0"
154
158
  ChildProcess.should_receive(:build).ordered.and_return do |*args|
155
159
  args.join(' ').should =~ /ssh -NL.* deploy@0.0.0.0/
156
160
  ssh_process
@@ -163,6 +167,22 @@ describe EngineYard::VisualVM::CLI do
163
167
 
164
168
  script.start(["start", "--environment=jruby"])
165
169
  end
170
+
171
+ it "uses the public hostname of the first instance if no load balancer" do
172
+ environment.stub!(:load_balancer_ip_address).and_return nil
173
+ environment.stub!(:instances).and_return [double("instance").tap{|d| d.stub!(:public_hostname).and_return "example.com" }]
174
+ ChildProcess.should_receive(:build).ordered.and_return do |*args|
175
+ args.join(' ').should =~ /ssh -NL.* deploy@example.com/
176
+ ssh_process
177
+ end
178
+ ChildProcess.should_receive(:build).ordered.and_return do |*args|
179
+ args[2].should =~ /service:jmx:rmi.*localhost:/
180
+ visualvm_process
181
+ end
182
+ ssh_process.should_receive(:stop)
183
+
184
+ script.start(["start", "--environment=jruby"])
185
+ end
166
186
  end
167
187
  end
168
188
 
@@ -25,6 +25,25 @@ module EYVisualVMSpecHelpers
25
25
  alias capture silence
26
26
  end
27
27
 
28
+ module SystemDouble
29
+ def self.included(base)
30
+ def base.system_double
31
+ @@double
32
+ end
33
+ def base.system_double=(d)
34
+ @@double = d
35
+ end
36
+ end
37
+
38
+ def system_double
39
+ @@double
40
+ end
41
+
42
+ def system(*args)
43
+ system_double.system(*args)
44
+ end
45
+ end
46
+
28
47
  RSpec.configure do |config|
29
48
  config.include EYVisualVMSpecHelpers
30
49
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: engineyard-visualvm
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.5.1
5
+ version: 0.5.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nick Sieger
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-12-08 00:00:00 Z
13
+ date: 2011-12-13 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: childprocess