rhc 1.2.7 → 1.3.8
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 +6 -8
- data/bin/rhc-chk +23 -10
- data/features/domain.feature +1 -1
- data/features/lib/rhc_helper.rb +3 -2
- data/features/lib/rhc_helper/api.rb +7 -0
- data/features/lib/rhc_helper/app.rb +8 -10
- data/features/lib/rhc_helper/domain.rb +2 -1
- data/features/lib/rhc_helper/runnable.rb +2 -24
- data/features/sshkey.feature +3 -3
- data/features/step_definitions/cartridge_steps.rb +6 -6
- data/features/step_definitions/client_steps.rb +0 -1
- data/features/step_definitions/sshkey_steps.rb +2 -2
- data/features/support/before_hooks.rb +0 -1
- data/features/support/env.rb +5 -3
- data/lib/rhc-common.rb +1 -1
- data/lib/rhc.rb +9 -8
- data/lib/rhc/auth.rb +3 -0
- data/lib/rhc/auth/basic.rb +54 -0
- data/lib/rhc/cartridge_helpers.rb +11 -5
- data/lib/rhc/cli.rb +4 -2
- data/lib/rhc/command_runner.rb +35 -30
- data/lib/rhc/commands.rb +127 -18
- data/lib/rhc/commands/account.rb +24 -0
- data/lib/rhc/commands/alias.rb +1 -1
- data/lib/rhc/commands/app.rb +210 -209
- data/lib/rhc/commands/apps.rb +22 -0
- data/lib/rhc/commands/base.rb +10 -77
- data/lib/rhc/commands/cartridge.rb +35 -35
- data/lib/rhc/commands/domain.rb +20 -13
- data/lib/rhc/commands/git_clone.rb +30 -0
- data/lib/rhc/commands/{port-forward.rb → port_forward.rb} +3 -3
- data/lib/rhc/commands/server.rb +28 -16
- data/lib/rhc/commands/setup.rb +18 -1
- data/lib/rhc/commands/snapshot.rb +4 -4
- data/lib/rhc/commands/sshkey.rb +4 -18
- data/lib/rhc/commands/tail.rb +32 -9
- data/lib/rhc/config.rb +168 -99
- data/lib/rhc/context_helper.rb +22 -9
- data/lib/rhc/core_ext.rb +41 -1
- data/lib/rhc/exceptions.rb +21 -5
- data/lib/rhc/git_helpers.rb +81 -0
- data/lib/rhc/help_formatter.rb +21 -1
- data/lib/rhc/helpers.rb +222 -87
- data/lib/rhc/output_helpers.rb +94 -110
- data/lib/rhc/rest.rb +15 -198
- data/lib/rhc/rest/api.rb +88 -0
- data/lib/rhc/rest/application.rb +29 -30
- data/lib/rhc/rest/attributes.rb +27 -0
- data/lib/rhc/rest/base.rb +29 -33
- data/lib/rhc/rest/cartridge.rb +42 -20
- data/lib/rhc/rest/client.rb +351 -89
- data/lib/rhc/rest/domain.rb +7 -13
- data/lib/rhc/rest/gear_group.rb +1 -1
- data/lib/rhc/rest/key.rb +7 -2
- data/lib/rhc/rest/mock.rb +609 -0
- data/lib/rhc/rest/user.rb +6 -2
- data/lib/rhc/{ssh_key_helpers.rb → ssh_helpers.rb} +58 -28
- data/lib/rhc/{targz.rb → tar_gz.rb} +0 -0
- data/lib/rhc/usage_templates/command_help.erb +4 -1
- data/lib/rhc/usage_templates/help.erb +24 -11
- data/lib/rhc/usage_templates/options_help.erb +14 -0
- data/lib/rhc/wizard.rb +283 -213
- data/spec/keys/example.pem +23 -0
- data/spec/keys/example_private.pem +27 -0
- data/spec/keys/server.pem +19 -0
- data/spec/rest_spec_helper.rb +3 -371
- data/spec/rhc/auth_spec.rb +226 -0
- data/spec/rhc/cli_spec.rb +41 -14
- data/spec/rhc/command_spec.rb +44 -15
- data/spec/rhc/commands/account_spec.rb +41 -0
- data/spec/rhc/commands/alias_spec.rb +16 -15
- data/spec/rhc/commands/app_spec.rb +115 -92
- data/spec/rhc/commands/apps_spec.rb +39 -0
- data/spec/rhc/commands/cartridge_spec.rb +134 -112
- data/spec/rhc/commands/domain_spec.rb +31 -86
- data/spec/rhc/commands/git_clone_spec.rb +56 -0
- data/spec/rhc/commands/{port-forward_spec.rb → port_forward_spec.rb} +27 -32
- data/spec/rhc/commands/server_spec.rb +28 -3
- data/spec/rhc/commands/setup_spec.rb +29 -11
- data/spec/rhc/commands/snapshot_spec.rb +4 -3
- data/spec/rhc/commands/sshkey_spec.rb +24 -56
- data/spec/rhc/commands/tail_spec.rb +26 -9
- data/spec/rhc/commands/threaddump_spec.rb +12 -11
- data/spec/rhc/config_spec.rb +211 -164
- data/spec/rhc/context_spec.rb +2 -0
- data/spec/rhc/helpers_spec.rb +242 -46
- data/spec/rhc/rest_application_spec.rb +42 -28
- data/spec/rhc/rest_client_spec.rb +110 -93
- data/spec/rhc/rest_spec.rb +220 -131
- data/spec/rhc/targz_spec.rb +1 -1
- data/spec/rhc/wizard_spec.rb +435 -624
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +140 -6
- data/spec/wizard_spec_helper.rb +326 -0
- metadata +163 -143
- data/lib/rhc/client.rb +0 -17
- data/lib/rhc/git_helper.rb +0 -59
@@ -6,12 +6,18 @@ module RHC
|
|
6
6
|
|
7
7
|
if carts.length == 0
|
8
8
|
valid_carts = rest_obj.cartridges.collect { |c| c.name if c.type == type }.compact
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
|
10
|
+
msg = if RHC::Rest::Application === rest_obj
|
11
|
+
"Cartridge '#{cartridge_name}' cannot be found in application '#{rest_obj.name}'."
|
12
|
+
else
|
13
|
+
"Cartridge '#{cartridge_name}' is not a valid cartridge name."
|
14
|
+
end
|
15
|
+
|
16
|
+
unless valid_carts.empty?
|
17
|
+
msg += " Valid cartridges are (#{valid_carts.join(', ')})."
|
13
18
|
end
|
14
|
-
|
19
|
+
|
20
|
+
raise RHC::CartridgeNotFoundException, msg
|
15
21
|
elsif carts.length > 1
|
16
22
|
msg = "Multiple cartridge versions match your criteria. Please specify one."
|
17
23
|
carts.each { |cart| msg += "\n #{cart.name}" }
|
data/lib/rhc/cli.rb
CHANGED
@@ -21,10 +21,11 @@ module RHC
|
|
21
21
|
|
22
22
|
def self.set_terminal
|
23
23
|
$terminal.wrap_at = HighLine::SystemExtensions.terminal_size.first rescue 80 if $stdin.tty?
|
24
|
+
$terminal.page_at = :auto if $stdin.tty? and $stdout.tty?
|
24
25
|
# FIXME: ANSI terminals are not default on windows but we may just be
|
25
26
|
# hitting a bug in highline if windows does support another method.
|
26
27
|
# This is a safe fix for now but needs more research.
|
27
|
-
HighLine::use_color = false if RHC::Helpers.windows?
|
28
|
+
HighLine::use_color = false if RHC::Helpers.windows? or not $stdout.tty?
|
28
29
|
end
|
29
30
|
|
30
31
|
def self.start(args)
|
@@ -35,9 +36,10 @@ module RHC
|
|
35
36
|
program :description, 'Command line interface for OpenShift.'
|
36
37
|
program :version, RHC::VERSION::STRING
|
37
38
|
program :help_formatter, RHC::HelpFormatter
|
39
|
+
program :int_message, " Interrupted\n"
|
38
40
|
|
39
41
|
RHC::Commands.load.to_commander
|
40
|
-
|
42
|
+
run! || 0
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
data/lib/rhc/command_runner.rb
CHANGED
@@ -6,8 +6,16 @@ module RHC
|
|
6
6
|
commands.keys.find_all { |name| name if /^#{name}\b/.match arg_string }
|
7
7
|
end
|
8
8
|
|
9
|
+
if Commander::VERSION == '4.0.3'
|
10
|
+
#:nocov:
|
11
|
+
def program(*args)
|
12
|
+
Array(super).first
|
13
|
+
end
|
14
|
+
#:nocov:
|
15
|
+
end
|
16
|
+
|
9
17
|
def options_parse_trace
|
10
|
-
if @args.include?
|
18
|
+
if @args.include?("--trace")
|
11
19
|
@args.delete "--trace"
|
12
20
|
return true
|
13
21
|
end
|
@@ -15,7 +23,7 @@ module RHC
|
|
15
23
|
end
|
16
24
|
|
17
25
|
def options_parse_version
|
18
|
-
if @args.include? "--version"
|
26
|
+
if @args.include? "--version"
|
19
27
|
say version
|
20
28
|
exit 0
|
21
29
|
end
|
@@ -25,16 +33,15 @@ module RHC
|
|
25
33
|
def run!
|
26
34
|
trace = false
|
27
35
|
require_program :version, :description
|
36
|
+
#trap('INT') { abort program(:int_message) } if program(:int_message)
|
37
|
+
#trap('INT') { program(:int_block).call } if program(:int_block)
|
28
38
|
|
29
|
-
|
30
|
-
trap('INT') { program(:int_block).call } if program(:int_block)
|
31
|
-
|
32
|
-
global_option('-h', '--help', 'Display help documentation') do
|
39
|
+
global_option('-h', '--help', 'Help on any command', :hide => true) do
|
33
40
|
args = @args - %w[-h --help]
|
34
41
|
command(:help).run(*args)
|
35
42
|
return
|
36
43
|
end
|
37
|
-
global_option('
|
44
|
+
global_option('--version', 'Display version information', :hide => true) { say version; return }
|
38
45
|
|
39
46
|
# remove these because we monkey patch Commands to process all options
|
40
47
|
# at once, avoiding conflicts between the global and command options
|
@@ -60,15 +67,24 @@ module RHC
|
|
60
67
|
say "See '#{program :name} help' for a list of valid commands."
|
61
68
|
end
|
62
69
|
1
|
70
|
+
rescue \
|
71
|
+
OptionParser::InvalidOption => e
|
72
|
+
RHC::Helpers.error e.message
|
73
|
+
1
|
63
74
|
rescue \
|
64
75
|
ArgumentError,
|
65
|
-
OptionParser::
|
66
|
-
OptionParser::InvalidArgument,
|
67
|
-
OptionParser::MissingArgument => e
|
76
|
+
OptionParser::ParseError => e
|
68
77
|
|
69
78
|
help_bindings = CommandHelpBindings.new(active_command, commands, self)
|
70
79
|
usage = RHC::HelpFormatter.new(self).render_command_syntax(help_bindings)
|
71
|
-
|
80
|
+
message = case e
|
81
|
+
when OptionParser::AmbiguousOption
|
82
|
+
"The option #{e.args.join(' ')} is ambiguous. You will need to specify the entire option."
|
83
|
+
else
|
84
|
+
e.message
|
85
|
+
end
|
86
|
+
|
87
|
+
RHC::Helpers.error message
|
72
88
|
say "#{usage}"
|
73
89
|
1
|
74
90
|
rescue RHC::Exception, RHC::Rest::Exception => e
|
@@ -92,8 +108,15 @@ module RHC
|
|
92
108
|
end
|
93
109
|
|
94
110
|
def create_default_commands
|
111
|
+
command 'help options' do |c|
|
112
|
+
# c.syntax = ''
|
113
|
+
c.description = "Display all global options and information about configuration"
|
114
|
+
c.when_called do |args, options|
|
115
|
+
say help_formatter.render_options self
|
116
|
+
end
|
117
|
+
end
|
95
118
|
command :help do |c|
|
96
|
-
c.syntax = '
|
119
|
+
c.syntax = '<command>'
|
97
120
|
c.description = 'Display global or <command> help documentation.'
|
98
121
|
c.when_called do |args, options|
|
99
122
|
cmd = (1..args.length).reverse_each.map{ |n| args[0,n].join(' ') }.find{ |cmd| command_exists?(cmd) }
|
@@ -113,22 +136,4 @@ module RHC
|
|
113
136
|
end
|
114
137
|
end
|
115
138
|
end
|
116
|
-
|
117
|
-
class CommandHelpBindings
|
118
|
-
def initialize(command, instance_commands, runner)
|
119
|
-
@command = command
|
120
|
-
@actions = instance_commands.collect do |command_name, command_class|
|
121
|
-
next if command_class.summary.nil?
|
122
|
-
m = /^#{command.name} ([^ ]+)/.match(command_name)
|
123
|
-
# if we have a match and it is not an alias then we can use it
|
124
|
-
m and command_name == command_class.name ? {:name => m[1], :summary => command_class.summary || ""} : nil
|
125
|
-
end
|
126
|
-
@actions.compact!
|
127
|
-
@global_options = runner.options
|
128
|
-
@runner = runner
|
129
|
-
end
|
130
|
-
def program(*args)
|
131
|
-
@runner.program *args
|
132
|
-
end
|
133
|
-
end
|
134
139
|
end
|
data/lib/rhc/commands.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'commander'
|
2
|
-
require '
|
2
|
+
require 'commander/command'
|
3
3
|
|
4
4
|
## monkey patch option parsing to also parse global options all at once
|
5
5
|
# to avoid conflicts and side effects of similar short switches
|
@@ -11,14 +11,12 @@ module Commander
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def parse_options_and_call_procs *args
|
14
|
-
return args if args.empty?
|
15
|
-
opts = OptionParser.new
|
16
14
|
runner = Commander::Runner.instance
|
15
|
+
opts = OptionParser.new
|
16
|
+
|
17
17
|
# add global options
|
18
18
|
runner.options.each do |option|
|
19
|
-
opts.on
|
20
|
-
&runner.global_option_proc(option[:switches], &option[:proc])
|
21
|
-
|
19
|
+
opts.on(*option[:args], &runner.global_option_proc(option[:switches], &option[:proc]))
|
22
20
|
end
|
23
21
|
|
24
22
|
# add command options
|
@@ -27,13 +25,76 @@ module Commander
|
|
27
25
|
opts
|
28
26
|
end
|
29
27
|
|
30
|
-
opts.parse! args
|
28
|
+
remaining = opts.parse! args
|
29
|
+
|
30
|
+
_, config_path = proxy_options.find{ |arg| arg[0] == :config }
|
31
|
+
clean, _ = proxy_options.find{ |arg| arg[0] == :clean }
|
32
|
+
|
33
|
+
begin
|
34
|
+
@config = RHC::Config.new
|
35
|
+
@config.use_config(config_path) if config_path
|
36
|
+
|
37
|
+
unless clean
|
38
|
+
@config.to_options.each_pair do |key, value|
|
39
|
+
next if proxy_options.detect{ |arr| arr[0] == key }
|
40
|
+
if sw = opts.send(:search, :long, key.to_s.gsub(/_/, '-'))
|
41
|
+
_, cb, val = sw.send(:conv_arg, nil, value) {|*exc| raise(*exc) }
|
42
|
+
cb.call(val) if cb
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
rescue ArgumentError => e
|
47
|
+
n = OptionParser::InvalidOption.new(e.message)
|
48
|
+
n.reason = "The configuration file #{@config.path} contains an invalid setting"
|
49
|
+
n.set_backtrace(e.backtrace)
|
50
|
+
raise n
|
51
|
+
rescue OptionParser::ParseError => e
|
52
|
+
e.reason = "The configuration file #{@config.path} contains an invalid setting"
|
53
|
+
raise
|
54
|
+
end
|
55
|
+
remaining
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# Allow Command::Options to lazily evaluate procs and lambdas
|
62
|
+
#
|
63
|
+
module Commander
|
64
|
+
class Command
|
65
|
+
class Options
|
66
|
+
def initialize(init=nil)
|
67
|
+
@table = {}
|
68
|
+
default(init) if init
|
69
|
+
end
|
70
|
+
def method_missing meth, *args, &block
|
71
|
+
meth.to_s =~ /=$/ ? self[meth.to_s.chop] = args.first : self[meth]
|
72
|
+
end
|
73
|
+
def []=(meth, value)
|
74
|
+
@table[meth.to_sym] = value
|
75
|
+
end
|
76
|
+
def [](meth)
|
77
|
+
value = @table[meth.to_sym]
|
78
|
+
value = value.call if value.is_a? Proc
|
79
|
+
value
|
80
|
+
end
|
81
|
+
def default defaults = {}
|
82
|
+
@table = @table.reverse_merge!(__to_hash__(defaults))
|
83
|
+
end
|
84
|
+
def __replace__(options)
|
85
|
+
@table = __to_hash__(options).dup
|
86
|
+
end
|
87
|
+
def __to_hash__(obj)
|
88
|
+
Options === obj ? obj.__hash__ : obj
|
89
|
+
end
|
31
90
|
end
|
32
91
|
end
|
33
92
|
end
|
34
93
|
|
35
94
|
module RHC
|
36
95
|
module Commands
|
96
|
+
autoload :Base, 'rhc/commands/base'
|
97
|
+
|
37
98
|
def self.load
|
38
99
|
Dir[File.join(File.dirname(__FILE__), "commands", "*.rb")].each do |file|
|
39
100
|
require file
|
@@ -47,13 +108,6 @@ module RHC
|
|
47
108
|
global_options << [args, block]
|
48
109
|
end
|
49
110
|
|
50
|
-
def self.global_config_setup(options)
|
51
|
-
RHC::Config.set_opts_config(options.config) if options.config
|
52
|
-
RHC::Config.password = options.password if options.password
|
53
|
-
RHC::Config.opts_login = options.rhlogin if options.rhlogin
|
54
|
-
RHC::Config
|
55
|
-
end
|
56
|
-
|
57
111
|
def self.deprecated?
|
58
112
|
command_name = Commander::Runner.instance.command_name_from_args
|
59
113
|
command = Commander::Runner.instance.active_command
|
@@ -125,17 +179,17 @@ module RHC
|
|
125
179
|
end
|
126
180
|
|
127
181
|
c.when_called do |args, options|
|
128
|
-
config = global_config_setup(options)
|
129
182
|
deprecated?
|
130
183
|
|
184
|
+
config = c.instance_variable_get(:@config)
|
185
|
+
|
131
186
|
cmd = opts[:class].new
|
132
187
|
cmd.options = options
|
133
188
|
cmd.config = config
|
134
189
|
|
135
|
-
|
136
|
-
|
190
|
+
args = fill_arguments(cmd, options, args_metadata, options_metadata, args)
|
137
191
|
needs_configuration!(cmd, options, config)
|
138
|
-
cmd
|
192
|
+
execute(cmd, opts[:method], args)
|
139
193
|
end
|
140
194
|
end
|
141
195
|
end
|
@@ -143,6 +197,61 @@ module RHC
|
|
143
197
|
end
|
144
198
|
|
145
199
|
protected
|
200
|
+
def self.execute(cmd, method, args)
|
201
|
+
cmd.send(method, *args)
|
202
|
+
end
|
203
|
+
|
204
|
+
def self.fill_arguments(cmd, options, args_metadata, options_metadata, args)
|
205
|
+
# process options
|
206
|
+
options_metadata.each do |option_meta|
|
207
|
+
arg = option_meta[:arg]
|
208
|
+
|
209
|
+
# Check to see if we've provided a value for an option tagged as deprecated
|
210
|
+
if (!(val = options.__hash__[arg]).nil? && dep_info = option_meta[:deprecated])
|
211
|
+
# Get the arg for the correct option and what the value should be
|
212
|
+
(correct_arg, default) = dep_info.values_at(:key, :value)
|
213
|
+
# Set the default value for the correct option to the passed value
|
214
|
+
## Note: If this isn't triggered, then the original default will be honored
|
215
|
+
## If the user specifies any value for the correct option, it will be used
|
216
|
+
options.default correct_arg => default
|
217
|
+
# Alert the users if they're using a deprecated option
|
218
|
+
(correct, incorrect) = [options_metadata.find{|x| x[:arg] == correct_arg },option_meta].flatten.map{|x| x[:switches].join(", ") }
|
219
|
+
RHC::Helpers.deprecated_option(incorrect, correct)
|
220
|
+
end
|
221
|
+
|
222
|
+
if context_helper = option_meta[:context_helper]
|
223
|
+
options[arg] = lambda{ cmd.send(context_helper) } if options.__hash__[arg].nil?
|
224
|
+
end
|
225
|
+
raise ArgumentError.new("Missing required option '#{arg}'.") if option_meta[:required] && options[arg].nil?
|
226
|
+
end
|
227
|
+
# process args
|
228
|
+
arg_slots = [].fill(nil, 0, args_metadata.length)
|
229
|
+
fill_args = args.reverse
|
230
|
+
args_metadata.each_with_index do |arg_meta, i|
|
231
|
+
# check options
|
232
|
+
option = arg_meta[:option_symbol]
|
233
|
+
context_helper = arg_meta[:context_helper]
|
234
|
+
|
235
|
+
value = options.__hash__[option] if option
|
236
|
+
value = fill_args.pop if value.nil?
|
237
|
+
value = cmd.send(context_helper) if value.nil? and context_helper
|
238
|
+
|
239
|
+
if arg_meta[:arg_type] == :list
|
240
|
+
fill_args.push(value) unless value.nil?
|
241
|
+
value = fill_args.reverse
|
242
|
+
fill_args = []
|
243
|
+
elsif value.nil?
|
244
|
+
raise ArgumentError.new("Missing required argument '#{arg_meta[:name]}'.") if fill_args.empty?
|
245
|
+
end
|
246
|
+
arg_slots[i] = value
|
247
|
+
options.__hash__[option] = value if option
|
248
|
+
end
|
249
|
+
|
250
|
+
raise ArgumentError.new("Too many arguments passed in: #{fill_args.reverse.join(" ")}") unless fill_args.empty?
|
251
|
+
|
252
|
+
arg_slots
|
253
|
+
end
|
254
|
+
|
146
255
|
def self.commands
|
147
256
|
@commands ||= {}
|
148
257
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module RHC::Commands
|
2
|
+
class Account < Base
|
3
|
+
suppress_wizard
|
4
|
+
|
5
|
+
summary "Display details about your OpenShift account"
|
6
|
+
description <<-DESC
|
7
|
+
Shows who you are logged in to the server as and the capabilities
|
8
|
+
available to you on this server.
|
9
|
+
|
10
|
+
To access more details about your account please visit the website.
|
11
|
+
DESC
|
12
|
+
def run
|
13
|
+
user = rest_client.user
|
14
|
+
|
15
|
+
say_table nil, get_properties(user, :login, :plan_id, :consumed_gears, :max_gears) + get_properties(user.capabilities, :gear_sizes), :delete => true
|
16
|
+
|
17
|
+
if openshift_online_server?
|
18
|
+
else
|
19
|
+
end
|
20
|
+
|
21
|
+
0
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rhc/commands/alias.rb
CHANGED
data/lib/rhc/commands/app.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rhc/commands/base'
|
2
2
|
require 'resolv'
|
3
|
-
require 'rhc/
|
3
|
+
require 'rhc/git_helpers'
|
4
4
|
require 'rhc/cartridge_helpers'
|
5
5
|
|
6
6
|
module RHC::Commands
|
@@ -10,13 +10,39 @@ module RHC::Commands
|
|
10
10
|
syntax "<action>"
|
11
11
|
default_action :help
|
12
12
|
|
13
|
-
summary "Create an application
|
14
|
-
description
|
13
|
+
summary "Create an application"
|
14
|
+
description <<-DESC
|
15
|
+
Create an application. Every OpenShift application must have one
|
16
|
+
web cartridge which serves web requests, and can have a number of
|
17
|
+
other cartridges which provide capabilities like databases,
|
18
|
+
scheduled jobs, or continuous integration.
|
19
|
+
|
20
|
+
You can see a list of all valid cartridge types by running
|
21
|
+
'rhc cartridge list'.
|
22
|
+
|
23
|
+
When your application is created, a domain name that is a combination
|
24
|
+
of the name of your app and the namespace of your domain will be
|
25
|
+
registered in DNS. A copy of the code for your application
|
26
|
+
will be checked out locally into a folder with the same name as
|
27
|
+
your application. Note that different types of applications may
|
28
|
+
require different structures - check the README provided with the
|
29
|
+
cartridge if you have questions.
|
30
|
+
|
31
|
+
OpenShift runs the components of your application on small virtual
|
32
|
+
servers called "gears". Each account or plan is limited to a number
|
33
|
+
of gears which you can use across multiple applications. Some
|
34
|
+
accounts or plans provide access to gears with more memory or more
|
35
|
+
CPU. Run 'rhc account' to see the number and sizes of gears available
|
36
|
+
to you. When creating an application the --gear-size parameter
|
37
|
+
may be specified to change the gears used.
|
38
|
+
|
39
|
+
DESC
|
15
40
|
syntax "<name> <cartridge> [-n namespace]"
|
16
|
-
option ["-n", "--namespace namespace"], "Namespace for the application", :context => :namespace_context
|
41
|
+
option ["-n", "--namespace namespace"], "Namespace for the application", :context => :namespace_context
|
17
42
|
option ["-g", "--gear-size size"], "Gear size controls how much memory and CPU your cartridges can use."
|
18
43
|
option ["-s", "--scaling"], "Enable scaling for the web cartridge."
|
19
44
|
option ["-r", "--repo dir"], "Path to the Git repository (defaults to ./$app_name)"
|
45
|
+
option ["--from-code URL"], "URL to a Git repository that will become the initial contents of the application"
|
20
46
|
option ["--[no-]git"], "Skip creating the local Git repository."
|
21
47
|
option ["--nogit"], "DEPRECATED: Skip creating the local Git repository.", :deprecated => {:key => :git, :value => false}
|
22
48
|
option ["--[no-]dns"], "Skip waiting for the application DNS name to resolve. Must be used in combination with --no-git"
|
@@ -25,151 +51,142 @@ module RHC::Commands
|
|
25
51
|
argument :cartridges, "The web framework this application should use", ["-t", "--type cartridge"], :arg_type => :list
|
26
52
|
#argument :additional_cartridges, "A list of other cartridges such as databases you wish to add. Cartridges can also be added later using 'rhc cartridge add'", [], :arg_type => :list
|
27
53
|
def create(name, cartridges)
|
28
|
-
|
54
|
+
cartridges = check_cartridges(cartridges)
|
29
55
|
|
30
56
|
options.default \
|
31
57
|
:dns => true,
|
32
58
|
:git => true
|
33
59
|
|
34
|
-
|
60
|
+
raise ArgumentError, "You have named both your main application and your Jenkins application '#{name}'. In order to continue you'll need to specify a different name with --enable-jenkins or choose a different application name." if jenkins_app_name == name && enable_jenkins?
|
61
|
+
|
62
|
+
raise RHC::DomainNotFoundException.new("No domains found. Please create a domain with 'rhc domain create <namespace>' before creating applications.") if rest_client.domains.empty?
|
63
|
+
rest_domain = rest_client.find_domain(options.namespace)
|
64
|
+
rest_app = nil
|
65
|
+
|
35
66
|
paragraph do
|
36
|
-
|
37
|
-
|
38
|
-
"
|
39
|
-
|
40
|
-
|
67
|
+
header "Application Options"
|
68
|
+
table([["Namespace:", options.namespace],
|
69
|
+
["Cartridges:", cartridges.map(&:name).join(', ')],
|
70
|
+
(["Source Code:", options.from_code] if options.from_code),
|
71
|
+
["Gear Size:", options.gear_size || "default"],
|
72
|
+
["Scaling:", options.scaling ? "yes" : "no"],
|
73
|
+
].compact
|
41
74
|
).each { |s| say " #{s}" }
|
42
75
|
end
|
43
76
|
|
44
|
-
|
77
|
+
messages = []
|
45
78
|
|
46
|
-
|
47
|
-
|
79
|
+
paragraph do
|
80
|
+
say "Creating application '#{name}' ... "
|
48
81
|
|
49
|
-
rest_domain = rest_client.find_domain(options.namespace)
|
50
82
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
# create a jenkins app if not available
|
59
|
-
# don't error out if there are issues, setup warnings instead
|
60
|
-
begin
|
61
|
-
jenkins_rest_app = setup_jenkins_app(rest_domain) if enable_jenkins? and jenkins_rest_app.nil?
|
62
|
-
rescue Exception => e
|
63
|
-
add_issue("Jenkins failed to install - #{e}",
|
64
|
-
"Installing jenkins and jenkins-client",
|
65
|
-
"rhc app create jenkins",
|
66
|
-
"rhc cartridge add jenkins-client -a #{rest_app.name}")
|
83
|
+
# create the main app
|
84
|
+
rest_app = create_app(name, cartridges.map(&:name), rest_domain,
|
85
|
+
options.gear_size, options.scaling, options.from_code)
|
86
|
+
|
87
|
+
messages.concat(rest_app.messages)
|
88
|
+
|
89
|
+
success "done"
|
67
90
|
end
|
68
91
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
92
|
+
build_app_exists = rest_app.building_app
|
93
|
+
|
94
|
+
if enable_jenkins?
|
95
|
+
unless build_app_exists
|
96
|
+
paragraph do
|
97
|
+
say "Setting up a Jenkins application ... "
|
98
|
+
|
99
|
+
begin
|
100
|
+
build_app_exists = add_jenkins_app(rest_domain)
|
101
|
+
|
102
|
+
success "done"
|
103
|
+
messages.concat(build_app_exists.messages)
|
104
|
+
|
105
|
+
rescue Exception => e
|
106
|
+
warn "not complete"
|
107
|
+
add_issue("Jenkins failed to install - #{e}",
|
108
|
+
"Installing jenkins and jenkins-client",
|
109
|
+
"rhc app create jenkins",
|
110
|
+
"rhc cartridge add jenkins-client -a #{rest_app.name}")
|
81
111
|
end
|
82
|
-
exit_code = e.code
|
83
|
-
exit_message = e.message
|
84
|
-
rescue Exception => e
|
85
|
-
# timeout and other exceptions
|
86
|
-
exit_code = 1
|
87
|
-
exit_message = e.message
|
88
112
|
end
|
89
113
|
end
|
90
|
-
|
91
|
-
|
92
|
-
|
114
|
+
|
115
|
+
paragraph do
|
116
|
+
add_jenkins_client_to(rest_app, messages)
|
117
|
+
end if build_app_exists
|
93
118
|
end
|
94
119
|
|
95
120
|
if options.dns
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
121
|
+
paragraph do
|
122
|
+
say "Waiting for your DNS name to be available ... "
|
123
|
+
if dns_propagated? rest_app.host
|
124
|
+
success "done"
|
125
|
+
else
|
126
|
+
warn "failure"
|
127
|
+
add_issue("We were unable to lookup your hostname (#{rest_app.host}) in a reasonable amount of time and can not clone your application.",
|
128
|
+
"Clone your git repo",
|
129
|
+
"rhc git-clone #{rest_app.name}")
|
130
|
+
|
131
|
+
output_issues(rest_app)
|
132
|
+
return 0
|
133
|
+
end
|
104
134
|
end
|
105
135
|
|
106
136
|
if options.git
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
137
|
+
paragraph do
|
138
|
+
debug "Checking SSH keys through the wizard"
|
139
|
+
check_sshkeys! unless options.noprompt
|
140
|
+
|
141
|
+
say "Downloading the application Git repository ..."
|
142
|
+
paragraph do
|
143
|
+
begin
|
144
|
+
git_clone_application(rest_app)
|
145
|
+
rescue RHC::GitException => e
|
146
|
+
warn "#{e}"
|
147
|
+
unless RHC::Helpers.windows? and windows_nslookup_bug?(rest_app)
|
148
|
+
add_issue("We were unable to clone your application's git repo - #{e}",
|
149
|
+
"Clone your git repo",
|
150
|
+
"rhc git-clone #{rest_app.name}")
|
151
|
+
end
|
152
|
+
end
|
115
153
|
end
|
116
154
|
end
|
117
155
|
end
|
118
156
|
end
|
119
157
|
|
120
|
-
display_app(rest_app, rest_app.cartridges
|
158
|
+
display_app(rest_app, rest_app.cartridges)
|
121
159
|
|
122
160
|
if issues?
|
123
161
|
output_issues(rest_app)
|
124
162
|
else
|
125
|
-
results {
|
126
|
-
rest_app.messages.each { |msg| say msg }
|
127
|
-
jenkins_rest_app.messages.each { |msg| say msg } if enable_jenkins? and jenkins_rest_app
|
128
|
-
}
|
163
|
+
results{ messages.each { |msg| success msg } }.blank? and "Application created"
|
129
164
|
end
|
130
165
|
|
131
166
|
0
|
132
167
|
end
|
133
168
|
|
134
|
-
summary "Clone and configure an application's repository locally"
|
135
|
-
description "This is a convenience wrapper for 'git clone' with the added",
|
136
|
-
"benefit of adding configuration data such as the application's",
|
137
|
-
"UUID to the local repository. It also automatically",
|
138
|
-
"figures out the git url from the application name so you don't",
|
139
|
-
"have to look it up."
|
140
|
-
syntax "<app> [--namespace namespace]"
|
141
|
-
option ["-n", "--namespace namespace"], "Namespace to add your application to", :context => :namespace_context, :required => true
|
142
|
-
argument :app, "The application you wish to clone", ["-a", "--app name"]
|
143
|
-
# TODO: Implement default values for arguments once ffranz has added context arguments
|
144
|
-
# argument :directory, "The name of a new directory to clone into", [], :default => nil
|
145
|
-
def git_clone(app)
|
146
|
-
rest_domain = rest_client.find_domain(options.namespace)
|
147
|
-
rest_app = rest_domain.find_application(app)
|
148
|
-
run_git_clone(rest_app)
|
149
|
-
0
|
150
|
-
end
|
151
169
|
|
152
170
|
summary "Delete an application from the server"
|
153
171
|
description "Deletes your application and all of its data from the server.",
|
154
172
|
"Use with caution as this operation is permanent."
|
155
173
|
syntax "<app> [--namespace namespace]"
|
156
|
-
option ["-n", "--namespace namespace"], "Namespace
|
174
|
+
option ["-n", "--namespace namespace"], "Namespace your application belongs to", :context => :namespace_context, :required => true
|
157
175
|
option ["-b", "--bypass"], "DEPRECATED Please use '--confirm'", :deprecated => {:key => :confirm, :value => true}
|
158
|
-
option ["--confirm"], "
|
159
|
-
argument :app, "The application you wish to delete", ["-a", "--app name"]
|
176
|
+
option ["--confirm"], "Pass to confirm deleting the application"
|
177
|
+
argument :app, "The application you wish to delete", ["-a", "--app name"], :context => :app_context
|
160
178
|
alias_action :destroy, :deprecated => true
|
161
179
|
def delete(app)
|
180
|
+
|
162
181
|
rest_domain = rest_client.find_domain(options.namespace)
|
163
182
|
rest_app = rest_domain.find_application(app)
|
164
|
-
do_delete = true
|
165
183
|
|
166
|
-
|
184
|
+
confirm_action "#{color("This is a non-reversible action! Your application code and data will be permanently deleted if you continue!", :yellow)}\n\nAre you sure you want to delete the application '#{app}'?"
|
185
|
+
|
186
|
+
say "Deleting application '#{rest_app.name}' ... "
|
187
|
+
rest_app.destroy
|
188
|
+
success "deleted"
|
167
189
|
|
168
|
-
if do_delete
|
169
|
-
paragraph { say "Deleting application '#{rest_app.name}'" }
|
170
|
-
rest_app.destroy
|
171
|
-
results { say "Application '#{rest_app.name}' successfully deleted" }
|
172
|
-
end
|
173
190
|
0
|
174
191
|
end
|
175
192
|
|
@@ -231,7 +248,7 @@ module RHC::Commands
|
|
231
248
|
summary "Clean out the application's logs and tmp directories and tidy up the git repo on the server"
|
232
249
|
syntax "<app> [--namespace namespace] [--app app]"
|
233
250
|
argument :app, "The name of the application you are tidying", ["-a", "--app app"], :context => :app_context
|
234
|
-
option ["-n", "--namespace namespace"], "Namespace of the application
|
251
|
+
option ["-n", "--namespace namespace"], "Namespace of the application belongs to", :context => :namespace_context, :required => true
|
235
252
|
def tidy(app)
|
236
253
|
app_action app, :tidy
|
237
254
|
|
@@ -240,29 +257,31 @@ module RHC::Commands
|
|
240
257
|
end
|
241
258
|
|
242
259
|
summary "Show information about an application"
|
243
|
-
syntax "<app> [--namespace namespace]
|
260
|
+
syntax "<app> [--namespace namespace]"
|
244
261
|
argument :app, "The name of the application you are getting information on", ["-a", "--app app"], :context => :app_context
|
245
262
|
option ["-n", "--namespace namespace"], "Namespace of the application the cartridge belongs to", :context => :namespace_context, :required => true
|
246
263
|
option ["--state"], "Get the current state of the application's gears"
|
247
|
-
def show(
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
else
|
264
|
+
def show(app_name)
|
265
|
+
domain = rest_client.find_domain(options.namespace)
|
266
|
+
app = domain.find_application(app_name)
|
267
|
+
|
268
|
+
if options.state
|
253
269
|
results do
|
254
|
-
|
255
|
-
say "
|
270
|
+
app.gear_groups.each do |gg|
|
271
|
+
say "Gear group #{gg.cartridges.collect { |c| c['name'] }.join('+')} is #{gg.gears.first['state']}"
|
256
272
|
end
|
257
273
|
end
|
274
|
+
else
|
275
|
+
display_app(app, app.cartridges)
|
258
276
|
end
|
277
|
+
|
259
278
|
0
|
260
279
|
end
|
261
280
|
|
262
|
-
summary "
|
281
|
+
summary "DEPRECATED use 'show <app> --state' instead"
|
263
282
|
syntax "<app> [--namespace namespace] [--app app]"
|
264
283
|
argument :app, "The name of the application you are getting information on", ["-a", "--app app"], :context => :app_context
|
265
|
-
option ["-n", "--namespace namespace"], "Namespace of the application
|
284
|
+
option ["-n", "--namespace namespace"], "Namespace of the application belongs to", :context => :namespace_context, :required => true
|
266
285
|
deprecated "rhc app show --state"
|
267
286
|
def status(app)
|
268
287
|
# TODO: add a way to deprecate this and alias to show --apache
|
@@ -274,33 +293,46 @@ module RHC::Commands
|
|
274
293
|
include RHC::GitHelpers
|
275
294
|
include RHC::CartridgeHelpers
|
276
295
|
|
296
|
+
def check_sshkeys!
|
297
|
+
RHC::SSHWizard.new(rest_client, config, options).run
|
298
|
+
end
|
299
|
+
|
277
300
|
def standalone_cartridges
|
278
|
-
@standalone_cartridges ||=
|
301
|
+
@standalone_cartridges ||= all_cartridges.select{ |c| c.type == 'standalone' }
|
302
|
+
end
|
303
|
+
def all_cartridges
|
304
|
+
@all_cartridges = rest_client.cartridges
|
279
305
|
end
|
280
306
|
|
281
307
|
def check_cartridges(cartridge_names)
|
282
308
|
cartridge_names = Array(cartridge_names).map{ |s| s.strip if s && s.length > 0 }.compact
|
283
309
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
310
|
+
cartridge_names.map do |name|
|
311
|
+
all_cartridges.find{ |c| c.name == name } ||
|
312
|
+
begin
|
313
|
+
matching_cartridges = all_cartridges.select{ |c| c.name.include?(name) }
|
314
|
+
unless matching_cartridges.length == 1
|
315
|
+
if matching_cartridges.present?
|
316
|
+
paragraph { list_cartridges(matching_cartridges) }
|
317
|
+
raise RHC::MultipleCartridgesException, "There are multiple web cartridges named '#{name}'. Please provide the short name of your desired cart." if matching_cartridges.present?
|
318
|
+
else
|
319
|
+
paragraph { list_cartridges(all_cartridges) }
|
320
|
+
raise RHC::CartridgeNotFoundException, "There are no cartridges that match '#{name}'."
|
321
|
+
end
|
322
|
+
end
|
323
|
+
use_cart(matching_cartridges.first, name)
|
324
|
+
end
|
325
|
+
end.tap do |carts|
|
326
|
+
if carts.none?(&:only_in_new?)
|
327
|
+
section(:bottom => 1){ list_cartridges }
|
328
|
+
raise RHC::CartridgeNotFoundException, "Every application needs a web cartridge to handle incoming web requests. Please provide the short name of one of the carts listed above."
|
296
329
|
end
|
297
330
|
end
|
298
|
-
cartridge_names.first(1)
|
299
331
|
end
|
300
332
|
|
301
333
|
def use_cart(cart, for_cartridge_name)
|
302
|
-
info "Using #{cart.name}#{cart.display_name ? " (#{cart.display_name})" : ''}
|
303
|
-
cart
|
334
|
+
info "Using #{cart.name}#{cart.display_name ? " (#{cart.display_name})" : ''} for '#{for_cartridge_name}'"
|
335
|
+
cart
|
304
336
|
end
|
305
337
|
|
306
338
|
def list_cartridges(cartridges=standalone_cartridges)
|
@@ -317,14 +349,14 @@ module RHC::Commands
|
|
317
349
|
result
|
318
350
|
end
|
319
351
|
|
320
|
-
def create_app(name,
|
321
|
-
app_options = {:
|
352
|
+
def create_app(name, cartridges, rest_domain, gear_size=nil, scale=nil, from_code=nil)
|
353
|
+
app_options = {:cartridges => Array(cartridges)}
|
322
354
|
app_options[:gear_profile] = gear_size if gear_size
|
323
355
|
app_options[:scale] = scale if scale
|
356
|
+
app_options[:initial_git_url] = from_code if from_code
|
324
357
|
app_options[:debug] = true if @debug
|
325
|
-
|
326
358
|
debug "Creating application '#{name}' with these options - #{app_options.inspect}"
|
327
|
-
rest_app = rest_domain.add_application
|
359
|
+
rest_app = rest_domain.add_application(name, app_options)
|
328
360
|
debug "'#{rest_app.name}' created"
|
329
361
|
|
330
362
|
rest_app
|
@@ -336,6 +368,48 @@ module RHC::Commands
|
|
336
368
|
raise
|
337
369
|
end
|
338
370
|
|
371
|
+
def add_jenkins_app(rest_domain)
|
372
|
+
create_app(jenkins_app_name, "jenkins-1.4", rest_domain)
|
373
|
+
end
|
374
|
+
|
375
|
+
def add_jenkins_cartridge(rest_app)
|
376
|
+
rest_app.add_cartridge("jenkins-client-1.4")
|
377
|
+
end
|
378
|
+
|
379
|
+
def add_jenkins_client_to(rest_app, messages)
|
380
|
+
say "Setting up Jenkins build ... "
|
381
|
+
successful, attempts, exit_code, exit_message = false, 1, 157, nil
|
382
|
+
while (!successful && exit_code == 157 && attempts < MAX_RETRIES)
|
383
|
+
begin
|
384
|
+
cartridge = add_jenkins_cartridge(rest_app)
|
385
|
+
successful = true
|
386
|
+
|
387
|
+
success "done"
|
388
|
+
messages.concat(cartridge.messages)
|
389
|
+
|
390
|
+
rescue RHC::Rest::ServerErrorException => e
|
391
|
+
if (e.code == 157)
|
392
|
+
# error downloading Jenkins /jnlpJars/jenkins-cli.jar
|
393
|
+
attempts += 1
|
394
|
+
debug "Jenkins server could not be contacted, sleep and then retry: attempt #{attempts}\n #{e.message}"
|
395
|
+
Kernel.sleep(10)
|
396
|
+
end
|
397
|
+
exit_code = e.code
|
398
|
+
exit_message = e.message
|
399
|
+
rescue Exception => e
|
400
|
+
# timeout and other exceptions
|
401
|
+
exit_code = 1
|
402
|
+
exit_message = e.message
|
403
|
+
end
|
404
|
+
end
|
405
|
+
unless successful
|
406
|
+
warn "not complete"
|
407
|
+
add_issue("Jenkins client failed to install - #{exit_message}",
|
408
|
+
"Install the jenkins client",
|
409
|
+
"rhc cartridge add jenkins-client -a #{rest_app.name}")
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
339
413
|
def dns_propagated?(host, sleep_time=2)
|
340
414
|
#
|
341
415
|
# Confirm that the host exists in DNS
|
@@ -362,88 +436,15 @@ module RHC::Commands
|
|
362
436
|
found
|
363
437
|
end
|
364
438
|
|
365
|
-
def check_sshkeys!
|
366
|
-
wizard = RHC::SSHWizard.new(rest_client)
|
367
|
-
wizard.run
|
368
|
-
end
|
369
|
-
|
370
|
-
def run_git_clone(rest_app)
|
371
|
-
debug "Pulling new repo down"
|
372
|
-
|
373
|
-
check_sshkeys! unless options.noprompt
|
374
|
-
|
375
|
-
repo_dir = options.repo || rest_app.name
|
376
|
-
git_clone_repo rest_app.git_url, repo_dir
|
377
|
-
|
378
|
-
configure_git rest_app
|
379
|
-
|
380
|
-
true
|
381
|
-
end
|
382
|
-
|
383
|
-
def configure_git(rest_app)
|
384
|
-
debug "Configuring git repo"
|
385
|
-
|
386
|
-
repo_dir = options.repo || rest_app.name
|
387
|
-
Dir.chdir(repo_dir) do |dir|
|
388
|
-
git_config_set "rhc.app-uuid", rest_app.uuid
|
389
|
-
end
|
390
|
-
end
|
391
|
-
|
392
439
|
def enable_jenkins?
|
393
440
|
# legacy issue, commander 4.0.x will place the option in the hash with nil value (BZ878407)
|
394
441
|
options.__hash__.has_key?(:enable_jenkins)
|
395
442
|
end
|
396
443
|
|
397
444
|
def jenkins_app_name
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
end
|
402
|
-
|
403
|
-
def check_jenkins(app_name, rest_domain)
|
404
|
-
debug "Checking if jenkins arguments are valid"
|
405
|
-
raise ArgumentError, "The --no-dns option can't be used in conjunction with --enable-jenkins when creating an application. Either remove the --no-dns option or first install your application with --no-dns and then use 'rhc cartridge add' to embed the Jenkins client." unless options.dns
|
406
|
-
|
407
|
-
|
408
|
-
begin
|
409
|
-
jenkins_rest_app = rest_domain.find_application(:framework => "jenkins-1.4")
|
410
|
-
rescue RHC::ApplicationNotFoundException
|
411
|
-
debug "No Jenkins apps found during check"
|
412
|
-
|
413
|
-
# app name and jenkins app name are the same
|
414
|
-
raise ArgumentError, "You have named both your main application and your Jenkins application '#{app_name}'. In order to continue you'll need to specify a different name with --enable-jenkins or choose
|
415
|
-
a different application name." if jenkins_app_name == app_name
|
416
|
-
|
417
|
-
# jenkins app name and existing app are the same
|
418
|
-
begin
|
419
|
-
rest_app = rest_domain.find_application(:name => jenkins_app_name)
|
420
|
-
raise ArgumentError, "You have named your Jenkins application the same as an existing application '#{app_name}'. In order to continue you'll need to specify a different name with --enable-jenkins or delete the current application using 'rhc app delete #{app_name}'"
|
421
|
-
rescue RHC::ApplicationNotFoundException
|
422
|
-
end
|
423
|
-
|
424
|
-
debug "Jenkins arguments valid"
|
425
|
-
return nil
|
426
|
-
end
|
427
|
-
|
428
|
-
say "Found existing Jenkins application: #{jenkins_rest_app.name}"
|
429
|
-
say "Ignoring user specified Jenkins app name : #{options.enable_jenkins}" if jenkins_rest_app.name != options.enable_jenkins and options.enable_jenkins.is_a?(String)
|
430
|
-
|
431
|
-
debug "Jenkins arguments valid"
|
432
|
-
jenkins_rest_app
|
433
|
-
end
|
434
|
-
|
435
|
-
def setup_jenkins_app(rest_domain)
|
436
|
-
debug "Creating a new jenkins application"
|
437
|
-
rest_app = create_app(jenkins_app_name, "jenkins-1.4", rest_domain)
|
438
|
-
|
439
|
-
say "Jenkins domain name is being propagated worldwide (this might take a minute)..."
|
440
|
-
# If we can't get the dns we can't install the client so return nil
|
441
|
-
dns_propagated?(rest_app.host) ? rest_app : nil
|
442
|
-
|
443
|
-
end
|
444
|
-
|
445
|
-
def setup_jenkins_client(rest_app)
|
446
|
-
rest_app.add_cartridge("jenkins-client-1.4", 300)
|
445
|
+
if options.enable_jenkins.is_a? String
|
446
|
+
options.enable_jenkins
|
447
|
+
end || "jenkins"
|
447
448
|
end
|
448
449
|
|
449
450
|
def run_nslookup(host)
|
@@ -477,7 +478,7 @@ We recommend you wait a few minutes then clone your git repository manually.
|
|
477
478
|
WINSOCKISSUE
|
478
479
|
add_issue(issue,
|
479
480
|
"Clone your git repo",
|
480
|
-
"rhc
|
481
|
+
"rhc git-clone #{rest_app.name}")
|
481
482
|
|
482
483
|
return true
|
483
484
|
end
|