rhc 0.98.16 → 1.0.4
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/bin/rhc +7 -49
- data/bin/rhc-app +14 -3
- data/bin/rhc-chk +16 -16
- data/bin/rhc-create-app +2 -0
- data/bin/rhc-create-domain +1 -2
- data/bin/rhc-ctl-app +12 -3
- data/bin/rhc-ctl-domain +1 -2
- data/bin/rhc-domain +1 -2
- data/bin/rhc-domain-info +1 -2
- data/bin/rhc-port-forward +1 -2
- data/bin/rhc-snapshot +3 -0
- data/bin/rhc-sshkey +1 -2
- data/bin/rhc-tail-files +1 -1
- data/bin/rhc-user-info +1 -3
- data/features/application.feature +4 -1
- data/features/domain.feature +0 -4
- data/features/geared_application.feature +11 -0
- data/features/lib/rhc_helper/app.rb +16 -5
- data/features/lib/rhc_helper/cartridge.rb +25 -9
- data/features/lib/rhc_helper/commandify.rb +34 -7
- data/features/lib/rhc_helper/domain.rb +2 -2
- data/features/lib/rhc_helper/httpify.rb +24 -14
- data/features/lib/rhc_helper/persistable.rb +1 -1
- data/features/lib/rhc_helper/sshkey.rb +11 -7
- data/features/lib/rhc_helper.rb +5 -3
- data/features/multiple_cartridge.feature +1 -1
- data/features/scaled_application.feature +48 -0
- data/features/sshkey.feature +37 -31
- data/features/step_definitions/application_steps.rb +18 -7
- data/features/step_definitions/cartridge_steps.rb +29 -3
- data/features/step_definitions/domain_steps.rb +2 -2
- data/features/step_definitions/sshkey_steps.rb +34 -34
- data/features/support/assumptions.rb +21 -9
- data/features/support/before_hooks.rb +24 -6
- data/features/support/env.rb +45 -19
- data/lib/rhc/cartridge_helper.rb +27 -0
- data/lib/rhc/cli.rb +1 -1
- data/lib/rhc/command_runner.rb +31 -3
- data/lib/rhc/commands/alias.rb +38 -0
- data/lib/rhc/commands/app.rb +478 -0
- data/lib/rhc/commands/base.rb +42 -12
- data/lib/rhc/commands/cartridge.rb +189 -0
- data/lib/rhc/commands/domain.rb +11 -49
- data/lib/rhc/commands/port-forward.rb +0 -1
- data/lib/rhc/commands/setup.rb +2 -1
- data/lib/rhc/commands/snapshot.rb +118 -0
- data/lib/rhc/commands/sshkey.rb +24 -38
- data/lib/rhc/commands/tail.rb +24 -0
- data/lib/rhc/commands/threaddump.rb +16 -0
- data/lib/rhc/commands.rb +33 -7
- data/lib/rhc/config.rb +28 -12
- data/lib/rhc/context_helper.rb +19 -5
- data/lib/rhc/core_ext.rb +86 -0
- data/lib/rhc/exceptions.rb +44 -0
- data/lib/rhc/git_helper.rb +59 -0
- data/lib/rhc/helpers.rb +86 -5
- data/lib/rhc/output_helpers.rb +213 -0
- data/lib/rhc/rest/application.rb +134 -67
- data/lib/rhc/rest/base.rb +48 -0
- data/lib/rhc/rest/cartridge.rb +40 -44
- data/lib/rhc/rest/client.rb +127 -59
- data/lib/rhc/rest/domain.rb +29 -39
- data/lib/rhc/rest/gear_group.rb +10 -0
- data/lib/rhc/rest/key.rb +8 -23
- data/lib/rhc/rest/user.rb +8 -24
- data/lib/rhc/rest.rb +22 -11
- data/lib/rhc/ssh_key_helpers.rb +47 -0
- data/lib/rhc/usage_templates/help.erb +0 -1
- data/lib/rhc/version.rb +3 -3
- data/lib/rhc/wizard.rb +123 -225
- data/lib/rhc-common.rb +43 -62
- data/spec/rest_spec_helper.rb +159 -36
- data/spec/rhc/cli_spec.rb +29 -1
- data/spec/rhc/command_spec.rb +32 -35
- data/spec/rhc/commands/alias_spec.rb +123 -0
- data/spec/rhc/commands/app_spec.rb +414 -0
- data/spec/rhc/commands/cartridge_spec.rb +342 -0
- data/spec/rhc/commands/domain_spec.rb +8 -8
- data/spec/rhc/commands/setup_spec.rb +17 -6
- data/spec/rhc/commands/snapshot_spec.rb +140 -0
- data/spec/rhc/commands/sshkey_spec.rb +26 -4
- data/spec/rhc/commands/tail_spec.rb +34 -0
- data/spec/rhc/commands/threaddump_spec.rb +83 -0
- data/spec/rhc/config_spec.rb +39 -13
- data/spec/rhc/context_spec.rb +51 -0
- data/spec/rhc/helpers_spec.rb +52 -12
- data/spec/rhc/rest_application_spec.rb +16 -3
- data/spec/rhc/rest_client_spec.rb +144 -36
- data/spec/rhc/rest_spec.rb +1 -1
- data/spec/rhc/wizard_spec.rb +133 -232
- data/spec/spec_helper.rb +4 -3
- metadata +56 -31
- data/features/support/ssh.sh +0 -2
- data/spec/rhc/common_spec.rb +0 -49
data/bin/rhc
CHANGED
@@ -1,33 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# print help
|
4
|
-
#
|
5
2
|
require 'rhc/coverage_helper'
|
6
3
|
|
7
4
|
# Require rhc-common for wizard invocation
|
8
5
|
require 'rhc-common'
|
9
6
|
|
10
|
-
def p_usage(exit_code = 255)
|
11
|
-
puts <<USAGE
|
12
|
-
|
13
|
-
Usage: rhc (<resource> | --help) [<command>] [<args>]
|
14
|
-
Command line tool for performing operations related to your rhcloud account.
|
15
|
-
|
16
|
-
List of resources
|
17
|
-
domain Manage the namespace for the registered rhcloud user.
|
18
|
-
app Manage applications within the rhcloud account.
|
19
|
-
sshkey Manage multiple keys for the registered rhcloud user.
|
20
|
-
port-forward Forward remote ports to the workstation
|
21
|
-
server Display information about the status of the service.
|
22
|
-
setup Run the setup wizard to configure your account.
|
23
|
-
|
24
|
-
See 'rhc <resource> --help' for more applicable commands and argumments on a specific resource.
|
25
|
-
USAGE
|
26
|
-
|
27
|
-
exit exit_code
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
7
|
def get_args
|
32
8
|
ARGV.shift
|
33
9
|
args = ""
|
@@ -38,32 +14,14 @@ def get_args
|
|
38
14
|
args
|
39
15
|
end
|
40
16
|
|
41
|
-
def run_setup_wizard_if_needed
|
42
|
-
if not (RHC::Config.has_local_config? or
|
43
|
-
RHC::Config.has_opts_config? or
|
44
|
-
ARGV.include?('--noprompt') or
|
45
|
-
ARGV.include?('--help') or
|
46
|
-
ARGV.include?('-h'))
|
47
|
-
RHC::Wizard.new(RHC::Config).run
|
48
|
-
end
|
49
|
-
ARGV.delete('--noprompt')
|
50
|
-
end
|
51
|
-
|
52
17
|
begin
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
retcode =
|
58
|
-
|
59
|
-
|
60
|
-
require 'rhc/cli'
|
61
|
-
RHC::CLI.set_terminal
|
62
|
-
RHC::CLI.start(ARGV)
|
63
|
-
retcode = 0
|
64
|
-
rescue SystemExit => e
|
65
|
-
retcode = e.status
|
66
|
-
end
|
18
|
+
begin
|
19
|
+
require 'rhc/cli'
|
20
|
+
RHC::CLI.set_terminal
|
21
|
+
RHC::CLI.start(ARGV)
|
22
|
+
retcode = 0
|
23
|
+
rescue SystemExit => e
|
24
|
+
retcode = e.status
|
67
25
|
end
|
68
26
|
|
69
27
|
if retcode == nil
|
data/bin/rhc-app
CHANGED
@@ -5,6 +5,18 @@ require 'rhc/coverage_helper'
|
|
5
5
|
require 'rhc-common'
|
6
6
|
require 'base64'
|
7
7
|
|
8
|
+
if ["add-alias", "remove-alias"].include? ARGV[0]
|
9
|
+
RHC::Helpers.deprecated_command('rhc alias (add|remove)',true)
|
10
|
+
elsif "snapshot" == ARGV[0]
|
11
|
+
RHC::Helpers.deprecated_command('rhc snapshot (save|restore)',true)
|
12
|
+
elsif "tail" == ARGV[0]
|
13
|
+
RHC::Helpers.deprecated_command('rhc tail',true)
|
14
|
+
elsif "cartridge" == ARGV[0]
|
15
|
+
RHC::Helpers.deprecated_command('rhc cartridge (add|remove|status|stop|start|restart|reload)',true)
|
16
|
+
else
|
17
|
+
RHC::Helpers.deprecated_command('rhc app (create|delete|show|stop|force-stop|start|restart|reload|tidy)',true)
|
18
|
+
end
|
19
|
+
|
8
20
|
$embed_mapper = { 'add' => 'configure', 'remove' => 'deconfigure' }
|
9
21
|
|
10
22
|
#
|
@@ -32,7 +44,6 @@ List of commands
|
|
32
44
|
tidy Garbage collects the git repo and empties log/tmp dirs
|
33
45
|
add-alias Add a custom domain name for the application
|
34
46
|
remove-alias Remove a custom domain name for the application
|
35
|
-
threaddump Trigger a thread dump for jbossas, jbosseap, and ruby applications
|
36
47
|
tail Tail the logs of an application
|
37
48
|
snapshot [save|restore] Saves/Restores an application snapshot to/from a tarball at the location specified using --filepath (default: ./$APPNAME.tar.gz)
|
38
49
|
cartridge <action> Manage a cartridge running in this application
|
@@ -425,7 +436,7 @@ begin
|
|
425
436
|
["--config", GetoptLong::REQUIRED_ARGUMENT],
|
426
437
|
["--timeout", GetoptLong::REQUIRED_ARGUMENT]
|
427
438
|
)
|
428
|
-
elsif ARGV[0] =~ /^(show|start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias|
|
439
|
+
elsif ARGV[0] =~ /^(show|start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias|destroy)$/
|
429
440
|
ARGV.shift
|
430
441
|
opts = GetoptLong.new(
|
431
442
|
["--debug", "-d", GetoptLong::NO_ARGUMENT],
|
@@ -505,7 +516,7 @@ case argv_c[0]
|
|
505
516
|
create_app
|
506
517
|
when "show"
|
507
518
|
show_app
|
508
|
-
when "start", "stop", "force-stop", "restart", "reload", "status", "tidy", "add-alias", "remove-alias", "
|
519
|
+
when "start", "stop", "force-stop", "restart", "reload", "status", "tidy", "add-alias", "remove-alias", "destroy"
|
509
520
|
control_app(argv_c[0])
|
510
521
|
when "tail"
|
511
522
|
system("rhc-tail-files #{get_args argv_c} 2>&1")
|
data/bin/rhc-chk
CHANGED
@@ -5,6 +5,7 @@ require 'rhc/coverage_helper'
|
|
5
5
|
require 'rhc-common'
|
6
6
|
require 'net/http'
|
7
7
|
require 'net/https'
|
8
|
+
require 'net/ssh'
|
8
9
|
require 'rbconfig'
|
9
10
|
require 'yaml'
|
10
11
|
require 'tempfile'
|
@@ -129,17 +130,8 @@ end
|
|
129
130
|
#
|
130
131
|
# Check for proxy environment
|
131
132
|
#
|
132
|
-
|
133
|
-
|
134
|
-
ENV['http_proxy']="http://" + ENV['http_proxy']
|
135
|
-
end
|
136
|
-
proxy_uri=URI.parse(ENV['http_proxy'])
|
137
|
-
$http = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
|
138
|
-
$debuginfo['environment']['proxy'] = "#{proxy_uri.user}:#{proxy_uri.password}@#{proxy_uri.host}:#{proxy_uri.port}"
|
139
|
-
else
|
140
|
-
$http = Net::HTTP
|
141
|
-
$debuginfo['environment']['proxy'] = "none"
|
142
|
-
end
|
133
|
+
$http = RHC::Config.default_proxy
|
134
|
+
$debuginfo['environment']['proxy'] = (RHC::Config.using_proxy? ? ENV['http_proxy'] : "none")
|
143
135
|
|
144
136
|
#####################################
|
145
137
|
# Done setting up environment #
|
@@ -366,18 +358,26 @@ class Test3_SSH < Test::Unit::TestCase
|
|
366
358
|
end
|
367
359
|
|
368
360
|
def agent_key_fingerprints
|
369
|
-
@@agent_keys.nil? ? nil : @@agent_keys.map{|x| x.
|
361
|
+
@@agent_keys.nil? ? nil : @@agent_keys.map{|x| x.fingerprint }
|
370
362
|
end
|
371
363
|
|
372
364
|
def libra_public_key
|
373
|
-
@@local_ssh_pubkey ||= (
|
374
|
-
|
375
|
-
|
365
|
+
@@local_ssh_pubkey ||= libra_public_key_content.split(' ')[1]
|
366
|
+
end
|
367
|
+
|
368
|
+
def libra_public_key_content
|
369
|
+
@@local_ssh_pubkey_content ||= (
|
370
|
+
fp = File.open(@libra_kpfile)
|
371
|
+
fp.gets
|
376
372
|
)
|
377
373
|
ensure
|
378
374
|
fp.close if fp
|
379
375
|
end
|
380
376
|
|
377
|
+
def libra_public_key_fingerprint
|
378
|
+
@@local_ssh_pubkey_fingerprint ||= Net::SSH::KeyFactory.load_data_public_key(libra_public_key_content).fingerprint
|
379
|
+
end
|
380
|
+
|
381
381
|
def test_01_local_files
|
382
382
|
[
|
383
383
|
[@libra_kfile, /[4-7]00/], # Needs to at least be readable by user and nobody else
|
@@ -390,7 +390,7 @@ class Test3_SSH < Test::Unit::TestCase
|
|
390
390
|
def test_02_ssh_agent
|
391
391
|
require_agent_keys
|
392
392
|
|
393
|
-
assert
|
393
|
+
assert agent_key_fingerprints.include?(libra_public_key_fingerprint) ,error_for(:pubkey_not_loaded, ": #{@libra_kpfile}")
|
394
394
|
end
|
395
395
|
|
396
396
|
def test_03_remote_ssh_keys
|
data/bin/rhc-create-app
CHANGED
@@ -4,6 +4,8 @@ require 'rhc/coverage_helper'
|
|
4
4
|
|
5
5
|
require 'rhc-common'
|
6
6
|
|
7
|
+
RHC::Helpers.deprecated_command('rhc app create',true)
|
8
|
+
|
7
9
|
def p_usage(error_code = 255)
|
8
10
|
libra_server = get_var('libra_server')
|
9
11
|
rhlogin = get_var('default_rhlogin') ? "Default: #{get_var('default_rhlogin')}" : "required"
|
data/bin/rhc-create-domain
CHANGED
@@ -4,8 +4,7 @@ require 'rhc/coverage_helper'
|
|
4
4
|
|
5
5
|
require 'rhc-common'
|
6
6
|
|
7
|
-
|
8
|
-
puts""
|
7
|
+
RHC::Helpers.deprecated_command('rhc domain (create|update)',true)
|
9
8
|
|
10
9
|
#
|
11
10
|
# print help
|
data/bin/rhc-ctl-app
CHANGED
@@ -3,6 +3,15 @@
|
|
3
3
|
require 'rhc/coverage_helper'
|
4
4
|
|
5
5
|
require 'rhc-common'
|
6
|
+
if ARGV.include? "--alias"
|
7
|
+
RHC::Helpers.deprecated_command('rhc alias (add|remove)',true)
|
8
|
+
elsif ARGV.include? "-e" or ARGV.include? "--embed"
|
9
|
+
RHC::Helpers.deprecated_command('rhc cartridge (add|remove)',true)
|
10
|
+
elsif ARGV.include? "-L" or ARGV.include? "--embed-list"
|
11
|
+
RHC::Helpers.deprecated_command('rhc cartridge list',true)
|
12
|
+
else
|
13
|
+
RHC::Helpers.deprecated_command('rhc app (start|stop|force-stop|restart|reload|status|destroy|tidy)',true)
|
14
|
+
end
|
6
15
|
|
7
16
|
embed_mapper = { 'add' => 'configure', 'remove' => 'deconfigure' }
|
8
17
|
|
@@ -16,7 +25,7 @@ Control an OpenShift express app
|
|
16
25
|
-a|--app application Application name (alphanumeric) (required)
|
17
26
|
-l|--rhlogin rhlogin OpenShift login (#{rhlogin})
|
18
27
|
-p|--password password Password (optional, will prompt)
|
19
|
-
-c|--command command (start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias
|
28
|
+
-c|--command command (start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias)
|
20
29
|
-L|--embedded-list List supported embedded cartridges
|
21
30
|
-e|--embed (add|remove|stop|start|restart|status|reload)-$cartridge eg: add-mysql-5.1
|
22
31
|
-b|--bypass Bypass warnings
|
@@ -103,8 +112,8 @@ unless opt["embed"] or opt["command"]
|
|
103
112
|
end
|
104
113
|
|
105
114
|
if opt["command"]
|
106
|
-
unless opt["command"] =~ /^(start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias
|
107
|
-
puts "Invalid command '#{opt["command"]}' specified. Valid commands are (start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias
|
115
|
+
unless opt["command"] =~ /^(start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias)$/
|
116
|
+
puts "Invalid command '#{opt["command"]}' specified. Valid commands are (start|stop|force-stop|restart|reload|status|destroy|tidy|add-alias|remove-alias)"
|
108
117
|
p_usage
|
109
118
|
end
|
110
119
|
elsif opt["embed"]
|
data/bin/rhc-ctl-domain
CHANGED
data/bin/rhc-domain
CHANGED
data/bin/rhc-domain-info
CHANGED
data/bin/rhc-port-forward
CHANGED
@@ -4,8 +4,7 @@ require 'rhc/coverage_helper'
|
|
4
4
|
|
5
5
|
require 'rhc-common'
|
6
6
|
|
7
|
-
|
8
|
-
puts""
|
7
|
+
RHC::Helpers.deprecated_command('rhc port-forward',true)
|
9
8
|
|
10
9
|
#
|
11
10
|
# print help
|
data/bin/rhc-snapshot
CHANGED
data/bin/rhc-sshkey
CHANGED
data/bin/rhc-tail-files
CHANGED
@@ -91,7 +91,7 @@ unless user_info['app_info'][app]
|
|
91
91
|
exit 101
|
92
92
|
end
|
93
93
|
|
94
|
-
opt['files'] = "
|
94
|
+
opt['files'] = "*/log*/*" unless opt['files']
|
95
95
|
file_glob = "#{opt['files']}"
|
96
96
|
app_uuid = user_info['app_info'][app]['uuid']
|
97
97
|
namespace = user_info['user_info']['domains'][0]['namespace']
|
data/bin/rhc-user-info
CHANGED
@@ -21,4 +21,7 @@ Feature: Application Operations
|
|
21
21
|
| running | shown | it | succeed |
|
22
22
|
| running | stopped | the application | not be accessible |
|
23
23
|
| stopped | started | the application | be accessible |
|
24
|
-
|
24
|
+
# After the app is deleted, it is resolving to the OpenShift server
|
25
|
+
# I think it's because of US2108
|
26
|
+
# TODO: This needs to be fixed by "not exist" checking DNS instead of HTTP
|
27
|
+
| running | deleted | it | succeed |
|
data/features/domain.feature
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
@geared_application @geared_user_required @domain_required
|
2
|
+
Feature: Scaled Application Operations
|
3
|
+
|
4
|
+
@init
|
5
|
+
Scenario: Geared Application Creation
|
6
|
+
When a php-5.3 application is created with a medium gear
|
7
|
+
Then the application should be accessible
|
8
|
+
Then the application should have a medium gear
|
9
|
+
|
10
|
+
|
11
|
+
|
@@ -15,14 +15,14 @@ module RHCHelper
|
|
15
15
|
include Httpify
|
16
16
|
|
17
17
|
# attributes to represent the general information of the application
|
18
|
-
attr_accessor :name, :type, :hostname, :repo, :embed, :snapshot, :uid, :alias
|
18
|
+
attr_accessor :name, :type, :hostname, :repo, :embed, :snapshot, :uid, :alias, :scalable, :gear_profile
|
19
19
|
|
20
20
|
# mysql connection information
|
21
21
|
attr_accessor :mysql_hostname, :mysql_user, :mysql_password, :mysql_database
|
22
22
|
|
23
23
|
# Create the data structure for a test application
|
24
|
-
def initialize(type, name)
|
25
|
-
@name, @type = name, type
|
24
|
+
def initialize(type, name, scalable=false, gear_profile=nil)
|
25
|
+
@name, @type, @scalable, @gear_profile = name, type, scalable, gear_profile
|
26
26
|
@hostname = "#{name}-#{$namespace}.#{$domain}"
|
27
27
|
@repo = "#{TEMP_DIR}/#{$namespace}_#{name}_repo"
|
28
28
|
@file = "#{TEMP_DIR}/#{$namespace}.json"
|
@@ -47,7 +47,7 @@ module RHCHelper
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def self.create_unique(type, prefix="test")
|
50
|
+
def self.create_unique(type, scalable, gear_profile=nil, prefix="test")
|
51
51
|
# Get a REST client to verify the application name
|
52
52
|
client = RHC::Rest::Client.new($end_point, $username, $password)
|
53
53
|
|
@@ -68,7 +68,7 @@ module RHCHelper
|
|
68
68
|
next if test_names.index(name)
|
69
69
|
|
70
70
|
# Create the app
|
71
|
-
app = App.new(type, name)
|
71
|
+
app = App.new(type, name, scalable, gear_profile)
|
72
72
|
app.persist
|
73
73
|
return app
|
74
74
|
end
|
@@ -92,6 +92,17 @@ module RHCHelper
|
|
92
92
|
persist
|
93
93
|
end
|
94
94
|
|
95
|
+
def is_created?
|
96
|
+
# Get a REST client to verify the application is on the server
|
97
|
+
client = RHC::Rest::Client.new($end_point, $username, $password)
|
98
|
+
begin
|
99
|
+
client.domains[0].find_application(name)
|
100
|
+
rescue
|
101
|
+
return false
|
102
|
+
end
|
103
|
+
true
|
104
|
+
end
|
105
|
+
|
95
106
|
def cartridge(name)
|
96
107
|
@embed_helpers[name] = RHCHelper::Cartridge.new(self, name) unless @embed_helpers.include?(name)
|
97
108
|
@embed_helpers[name]
|
@@ -24,23 +24,23 @@ module RHCHelper
|
|
24
24
|
@file = "#{TEMP_DIR}/#{$namespace}.json"
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
full_cmd = "rhc
|
29
|
-
full_cmd += "
|
27
|
+
def rhc_cartridge(cmd)
|
28
|
+
full_cmd = "rhc cartridge #{cmd} -l #{$username} -p #{$password} -a #{@app_name}"
|
29
|
+
full_cmd += " #{@name}" if cmd != "list"
|
30
30
|
run(full_cmd, nil) do |exitstatus, out, err, arg|
|
31
31
|
yield exitstatus, out, err, arg if block_given?
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
def add
|
36
|
-
|
36
|
+
rhc_cartridge('add') do |exitstatus, out, err, arg|
|
37
37
|
yield exitstatus, out, err, arg if block_given?
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def status
|
42
42
|
result = ""
|
43
|
-
|
43
|
+
rhc_cartridge('status') do |exitstatus, out, err, arg|
|
44
44
|
result = out
|
45
45
|
end
|
46
46
|
|
@@ -48,19 +48,35 @@ module RHCHelper
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def start
|
51
|
-
|
51
|
+
rhc_cartridge('start')
|
52
52
|
end
|
53
53
|
|
54
54
|
def stop
|
55
|
-
|
55
|
+
rhc_cartridge('stop')
|
56
56
|
end
|
57
57
|
|
58
58
|
def restart
|
59
|
-
|
59
|
+
rhc_cartridge('restart')
|
60
60
|
end
|
61
61
|
|
62
62
|
def remove
|
63
|
-
|
63
|
+
rhc_cartridge('remove --confirm')
|
64
|
+
end
|
65
|
+
|
66
|
+
def scale(values)
|
67
|
+
status = nil
|
68
|
+
rhc_cartridge("scale #{values}") do |exitstatus, out, err, arg|
|
69
|
+
status = exitstatus
|
70
|
+
end
|
71
|
+
status
|
72
|
+
end
|
73
|
+
|
74
|
+
def show
|
75
|
+
result = ""
|
76
|
+
rhc_cartridge('show') do |exitstatus, out, err, arg|
|
77
|
+
result = out
|
78
|
+
end
|
79
|
+
result
|
64
80
|
end
|
65
81
|
end
|
66
82
|
end
|
@@ -51,8 +51,8 @@ module RHCHelper
|
|
51
51
|
def get_args(cmd, arg0=nil, debug=true)
|
52
52
|
args = " "
|
53
53
|
args << "-l #{$username} "
|
54
|
-
args << "-p #{$password} "
|
55
|
-
args << "
|
54
|
+
args << "-p \"#{$password}\" "
|
55
|
+
args << "--debug " if debug
|
56
56
|
|
57
57
|
# Add the application name for all application commands
|
58
58
|
if cmd =~ /app/
|
@@ -62,20 +62,25 @@ module RHCHelper
|
|
62
62
|
|
63
63
|
# Command specific arguments
|
64
64
|
case cmd
|
65
|
+
when /app delete/
|
66
|
+
args << "--confirm "
|
65
67
|
when /domain show/
|
66
68
|
# domain show doesn't take arguments
|
69
|
+
when /domain update/
|
70
|
+
args << "#{$old_namespace} #{$namespace}"
|
67
71
|
when /domain /
|
68
72
|
raise "No namespace set" unless $namespace
|
69
73
|
# use legacy switch for specifying namespace to verify older interface
|
70
74
|
# should switch to using argument once all commands are moved over
|
71
|
-
args << "
|
72
|
-
when /destroy/
|
73
|
-
args << "-b "
|
75
|
+
args << "#{$namespace} "
|
74
76
|
when /snapshot/
|
75
77
|
args << "-f #{@snapshot} "
|
76
78
|
when /create/
|
77
79
|
args << "-r #{@repo} "
|
78
80
|
args << "-t #{@type} "
|
81
|
+
args << "-s " unless @scalable.nil?
|
82
|
+
args << "-g #{@gear_profile} " unless @gear_profile.nil?
|
83
|
+
args << "--noprompt "
|
79
84
|
when /add-alias/
|
80
85
|
raise "No alias set" unless @alias
|
81
86
|
args << "--alias #{@alias} "
|
@@ -123,9 +128,31 @@ module RHCHelper
|
|
123
128
|
# Begin Post Processing Callbacks
|
124
129
|
#
|
125
130
|
def app_create_callback(exitcode, stdout, stderr, arg)
|
126
|
-
match = stdout.
|
131
|
+
match = stdout.match(UUID_OUTPUT_PATTERN)
|
127
132
|
@uid = match[1] if match
|
128
|
-
|
133
|
+
match = stdout.match(GEAR_PROFILE_OUTPUT_PATTERN)
|
134
|
+
@gear_profile = nil
|
135
|
+
@gear_profile = match[1] if match
|
136
|
+
|
137
|
+
def no_match(msg,expected,actual)
|
138
|
+
[ msg,
|
139
|
+
"-"*20,
|
140
|
+
("Expected: %s" % expected),
|
141
|
+
("Actual:\n%s" % actual),
|
142
|
+
"-"*20,
|
143
|
+
].join("\n")
|
144
|
+
end
|
145
|
+
|
146
|
+
raise no_match(
|
147
|
+
"UID not parsed from app create output",
|
148
|
+
UUID_OUTPUT_PATTERN, stdout
|
149
|
+
) unless @uid
|
150
|
+
|
151
|
+
raise no_match(
|
152
|
+
"Gear Profile not parsed from app create output",
|
153
|
+
GEAR_PROFILE_OUTPUT_PATTERN, stdout
|
154
|
+
) unless @gear_profile
|
155
|
+
|
129
156
|
persist
|
130
157
|
end
|
131
158
|
|
@@ -51,7 +51,7 @@ module RHCHelper
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def self.update(prefix="update")
|
54
|
-
old_namespace = $namespace
|
54
|
+
$old_namespace = $namespace
|
55
55
|
$namespace = unique_namespace(prefix)
|
56
56
|
rhc_domain_update
|
57
57
|
|
@@ -62,7 +62,7 @@ module RHCHelper
|
|
62
62
|
f.write($namespace)
|
63
63
|
end
|
64
64
|
else
|
65
|
-
$namespace = old_namespace
|
65
|
+
$namespace = $old_namespace
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -53,13 +53,20 @@ module RHCHelper
|
|
53
53
|
start = Time.now
|
54
54
|
|
55
55
|
# Helper function to log message and sleep
|
56
|
-
def my_sleep(
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
def my_sleep(status,expected,start,options)
|
57
|
+
[
|
58
|
+
["Expecting", expected.class],
|
59
|
+
["Received", status.class ],
|
60
|
+
["Elapsed", Time.now - start ],
|
61
|
+
].each do |values|
|
62
|
+
logger.info "%10s: %s" % values
|
63
|
+
end
|
60
64
|
sleep options[:sleep]
|
61
65
|
end
|
62
66
|
|
67
|
+
expected = options[:expected]
|
68
|
+
expected = (expected.to_s =~ /^Net/) ? expected.new(nil,nil,nil) : expected.new
|
69
|
+
|
63
70
|
begin
|
64
71
|
timeout(options[:timeout]) do
|
65
72
|
loop do
|
@@ -75,18 +82,21 @@ module RHCHelper
|
|
75
82
|
# Pass these up so we can check them
|
76
83
|
return e
|
77
84
|
end
|
78
|
-
logger.debug "Received: %s" % response
|
79
85
|
|
80
86
|
case response
|
81
|
-
|
82
|
-
when
|
87
|
+
# Catch any response if we're expecting it or redirection
|
88
|
+
when expected.class, Net::HTTPRedirection
|
83
89
|
break
|
84
|
-
|
90
|
+
# Retry these responses
|
85
91
|
when Net::HTTPServiceUnavailable, SocketError
|
86
|
-
my_sleep(
|
92
|
+
my_sleep(response,expected,start,options)
|
87
93
|
else
|
88
|
-
|
89
|
-
|
94
|
+
case expected
|
95
|
+
when Net::HTTPServiceUnavailable
|
96
|
+
my_sleep(response,expected,start,options)
|
97
|
+
else
|
98
|
+
break
|
99
|
+
end
|
90
100
|
end
|
91
101
|
end
|
92
102
|
end
|
@@ -111,10 +121,10 @@ module RHCHelper
|
|
111
121
|
return response
|
112
122
|
end
|
113
123
|
|
114
|
-
def is_inaccessible?
|
115
|
-
check_response({
|
124
|
+
def is_inaccessible?(options = {})
|
125
|
+
check_response(options.merge({
|
116
126
|
:expected => Net::HTTPServiceUnavailable
|
117
|
-
})
|
127
|
+
}))
|
118
128
|
end
|
119
129
|
|
120
130
|
def is_accessible?(options = {})
|
@@ -25,7 +25,7 @@ module RHCHelper
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def from_json(json)
|
28
|
-
app = App.new(json['type'], json['name'])
|
28
|
+
app = App.new(json['type'], json['name'], json['scalable'])
|
29
29
|
app.embed = json['embed']
|
30
30
|
app.mysql_user = json['mysql_user']
|
31
31
|
app.mysql_password = json['mysql_password']
|