rhc 1.5.13 → 1.6.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/features/application.feature +1 -1
- data/features/cartridge.feature +10 -9
- data/features/geared_application.feature +3 -6
- data/features/lib/rhc_helper/app.rb +2 -2
- data/features/multiple_cartridge.feature +9 -8
- data/features/scaled_application.feature +5 -5
- data/features/step_definitions/application_steps.rb +4 -3
- data/features/step_definitions/cartridge_steps.rb +8 -1
- data/features/support/before_hooks.rb +12 -6
- data/features/support/env.rb +8 -1
- data/features/support/platform_support.rb +29 -0
- data/lib/rhc/command_runner.rb +33 -21
- data/lib/rhc/commands/account.rb +1 -1
- data/lib/rhc/commands/alias.rb +90 -7
- data/lib/rhc/commands/app.rb +15 -11
- data/lib/rhc/commands/cartridge.rb +9 -2
- data/lib/rhc/exceptions.rb +6 -0
- data/lib/rhc/helpers.rb +3 -0
- data/lib/rhc/output_helpers.rb +12 -3
- data/lib/rhc/rest.rb +3 -0
- data/lib/rhc/rest/alias.rb +50 -0
- data/lib/rhc/rest/application.rb +26 -2
- data/lib/rhc/rest/cartridge.rb +16 -1
- data/lib/rhc/rest/client.rb +24 -4
- data/lib/rhc/rest/mock.rb +66 -2
- data/lib/rhc/ssh_helpers.rb +2 -3
- data/lib/rhc/wizard.rb +6 -3
- data/spec/rhc/assets/cert.crt +22 -0
- data/spec/rhc/assets/cert_key_rsa +27 -0
- data/spec/rhc/assets/empty.txt +0 -0
- data/spec/rhc/cli_spec.rb +5 -0
- data/spec/rhc/commands/account_spec.rb +6 -6
- data/spec/rhc/commands/alias_spec.rb +179 -5
- data/spec/rhc/commands/app_spec.rb +2 -1
- data/spec/rhc/commands/authorization_spec.rb +9 -0
- data/spec/rhc/commands/cartridge_spec.rb +27 -0
- data/spec/rhc/commands/setup_spec.rb +2 -0
- data/spec/rhc/commands/sshkey_spec.rb +20 -1
- data/spec/rhc/helpers_spec.rb +1 -2
- data/spec/rhc/rest_client_spec.rb +26 -5
- data/spec/rhc/wizard_spec.rb +22 -0
- data/spec/spec_helper.rb +25 -2
- data/spec/wizard_spec_helper.rb +1 -1
- metadata +153 -144
@@ -3,7 +3,7 @@ Feature: Application Operations
|
|
3
3
|
|
4
4
|
@init
|
5
5
|
Scenario: Application Creation
|
6
|
-
When a php
|
6
|
+
When a php application is created
|
7
7
|
Then the application should be accessible
|
8
8
|
|
9
9
|
# The state in these examples should be able to be broken into before hooks when we update cucumber
|
data/features/cartridge.feature
CHANGED
@@ -10,12 +10,12 @@ Feature: Single Cartridge Tests
|
|
10
10
|
|
11
11
|
Examples:
|
12
12
|
| type | command | status |
|
13
|
-
| mysql
|
13
|
+
| mysql | added | running |
|
14
14
|
|
15
15
|
Scenario Outline: Cartridge Commands
|
16
|
-
Given we have a <state> mysql
|
17
|
-
When the mysql
|
18
|
-
Then the mysql
|
16
|
+
Given we have a <state> mysql cartridge
|
17
|
+
When the mysql cartridge is <command>
|
18
|
+
Then the mysql cartridge should be <status>
|
19
19
|
|
20
20
|
Examples:
|
21
21
|
| state | command | status |
|
@@ -25,13 +25,14 @@ Feature: Single Cartridge Tests
|
|
25
25
|
|
26
26
|
Scenario Outline: Cartridge List
|
27
27
|
When we list cartridges
|
28
|
-
Then the list should contain the cartridge <cart> with display name
|
28
|
+
Then the list should contain the cartridge <cart> with display name
|
29
29
|
|
30
30
|
Examples:
|
31
|
-
| cart
|
32
|
-
| php
|
33
|
-
| mongodb
|
34
|
-
| cron
|
31
|
+
| cart |
|
32
|
+
| php |
|
33
|
+
| mongodb |
|
34
|
+
| cron |
|
35
|
+
|
35
36
|
|
36
37
|
# Commenting this out for US2438
|
37
38
|
# Scenario Outline: Cartridge Storage
|
@@ -1,11 +1,8 @@
|
|
1
1
|
@geared_application @geared_user_required @domain_required
|
2
2
|
Feature: Scaled Application Operations
|
3
3
|
|
4
|
-
@init
|
4
|
+
@init @not-origin
|
5
5
|
Scenario: Geared Application Creation
|
6
|
-
When a php
|
6
|
+
When a php application is created with a medium gear
|
7
7
|
Then the application should be accessible
|
8
|
-
Then the application should have a medium gear
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
Then the application should have a medium gear
|
@@ -118,7 +118,7 @@ module RHCHelper
|
|
118
118
|
|
119
119
|
def get_index_file
|
120
120
|
case @type
|
121
|
-
when "php-5.3" then "php/index.php"
|
121
|
+
when "php-5.3","php-5.4" then "php/index.php"
|
122
122
|
when "ruby-1.8" then "config.ru"
|
123
123
|
when "python-2.6" then "wsgi/application"
|
124
124
|
when "perl-5.10" then "perl/index.pl"
|
@@ -130,7 +130,7 @@ module RHCHelper
|
|
130
130
|
|
131
131
|
def get_mysql_file
|
132
132
|
case @type
|
133
|
-
when "php-5.3" then File.expand_path("../misc/php/db_test.php", File.expand_path(File.dirname(__FILE__)))
|
133
|
+
when "php-5.3","php-5.4" then File.expand_path("../misc/php/db_test.php", File.expand_path(File.dirname(__FILE__)))
|
134
134
|
end
|
135
135
|
end
|
136
136
|
end
|
@@ -3,15 +3,16 @@ Feature: Multiple Cartridge Tests
|
|
3
3
|
|
4
4
|
@init
|
5
5
|
Scenario: Supporting Cartridge Added
|
6
|
-
Given an existing or new php
|
7
|
-
When the phpmyadmin
|
8
|
-
Then the phpmyadmin
|
6
|
+
Given an existing or new php application with an embedded mysql cartridge
|
7
|
+
When the phpmyadmin cartridge is added
|
8
|
+
Then the phpmyadmin cartridge should be running
|
9
9
|
|
10
|
+
@not-origin
|
10
11
|
Scenario: Conflicting Cartridge Fails
|
11
|
-
Then adding the postgresql
|
12
|
+
Then adding the postgresql cartridge should fail
|
12
13
|
|
13
14
|
Scenario: Cartridge Removed
|
14
|
-
When the phpmyadmin
|
15
|
-
When the mysql
|
16
|
-
Then the phpmyadmin
|
17
|
-
Then the mysql
|
15
|
+
When the phpmyadmin cartridge is removed
|
16
|
+
When the mysql cartridge is removed
|
17
|
+
Then the phpmyadmin cartridge should be removed
|
18
|
+
Then the mysql cartridge should be removed
|
@@ -3,7 +3,7 @@ Feature: Scaled Application Operations
|
|
3
3
|
|
4
4
|
@init
|
5
5
|
Scenario: Scaled Application Creation
|
6
|
-
When a scaled php
|
6
|
+
When a scaled php application is created
|
7
7
|
Then the application should be accessible
|
8
8
|
Then the application should be scalable
|
9
9
|
|
@@ -34,9 +34,9 @@ Feature: Scaled Application Operations
|
|
34
34
|
|
35
35
|
Examples:
|
36
36
|
| cart | type | value |
|
37
|
-
| php
|
38
|
-
| php
|
39
|
-
| php
|
37
|
+
| php | min | 1 |
|
38
|
+
| php | max | 5 |
|
39
|
+
| php | max | -1 |
|
40
40
|
|
41
41
|
Scenario Outline: Invalid Scaling Values
|
42
42
|
When we are updating the <cart> cartridge
|
@@ -45,4 +45,4 @@ Feature: Scaled Application Operations
|
|
45
45
|
|
46
46
|
Examples:
|
47
47
|
| cart | type | value | code |
|
48
|
-
| php
|
48
|
+
| php | min | a | 1 |
|
@@ -18,7 +18,7 @@ end
|
|
18
18
|
# Use the transformed array so we can reuse this step for all combinations
|
19
19
|
Given /^an existing (or new )?(scaled )?(.+) (application with.*)$/ do |create, scaled, type, embeds|
|
20
20
|
options = { :type => type }
|
21
|
-
options[:embed] = embeds if embeds
|
21
|
+
options[:embed] = embeds.map{ |c| map_cartridge_type(c) } if embeds
|
22
22
|
options[:scalable] = scaled if scaled
|
23
23
|
@app = App.find_on_fs(options)
|
24
24
|
|
@@ -51,7 +51,8 @@ When /^(\d+) (.+) applications are created$/ do |app_count, type|
|
|
51
51
|
@app = old_app
|
52
52
|
end
|
53
53
|
|
54
|
-
When /^a (scaled )?(.+) application is created(?: with a (.*) gear)?$/ do |scaled, type, gear_profile|
|
54
|
+
When /^a (scaled )?(.+) application is created(?: with a (.*) gear)?$/ do |scaled, type, gear_profile|
|
55
|
+
type = map_cartridge_type(type)
|
55
56
|
@app = App.create_unique(type, scaled, gear_profile)
|
56
57
|
@app.rhc_app_create
|
57
58
|
end
|
@@ -111,7 +112,7 @@ Then /^it should succeed$/ do
|
|
111
112
|
end
|
112
113
|
|
113
114
|
Then /^the application should be scalable/ do
|
114
|
-
step "the haproxy
|
115
|
+
step "the haproxy cartridge should be running"
|
115
116
|
end
|
116
117
|
|
117
118
|
Then /^the application should have a (.*) gear$/ do |gear_profile|
|
@@ -4,14 +4,17 @@ require 'rhc/config'
|
|
4
4
|
include RHCHelper
|
5
5
|
|
6
6
|
When /^the (.+) cartridge is added$/ do |name|
|
7
|
+
name = map_cartridge_type(name)
|
7
8
|
@app.add_cartridge name
|
8
9
|
end
|
9
10
|
|
10
11
|
When /^the (.+) cartridge is removed$/ do |name|
|
12
|
+
name = map_cartridge_type(name)
|
11
13
|
@app.remove_cartridge name
|
12
14
|
end
|
13
15
|
|
14
16
|
When /^the (.+) cartridge is (stopped|(?:re)?started)$/ do |name,command|
|
17
|
+
name = map_cartridge_type(name)
|
15
18
|
cmd = case command.to_sym
|
16
19
|
when :stopped
|
17
20
|
'stop'
|
@@ -26,6 +29,7 @@ When /^the (.+) cartridge is (stopped|(?:re)?started)$/ do |name,command|
|
|
26
29
|
end
|
27
30
|
|
28
31
|
Then /^the (.+) cartridge should be (.*)$/ do |name,status|
|
32
|
+
name = map_cartridge_type(name)
|
29
33
|
expected = case status.to_sym
|
30
34
|
when :running
|
31
35
|
"(.+) is running|Uptime:"
|
@@ -40,10 +44,12 @@ Then /^the (.+) cartridge should be (.*)$/ do |name,status|
|
|
40
44
|
end
|
41
45
|
|
42
46
|
Then /^adding the (.+) cartridge should fail$/ do |name|
|
47
|
+
name = map_cartridge_type(name)
|
43
48
|
@app.add_cartridge(name).should == 154
|
44
49
|
end
|
45
50
|
|
46
51
|
When /^we are updating the (.+) cartridge$/ do |cart|
|
52
|
+
cart = map_cartridge_type(cart)
|
47
53
|
@cartridge_name = cart
|
48
54
|
end
|
49
55
|
|
@@ -81,7 +87,8 @@ Then /^it should fail with code (\d+)$/ do |code|
|
|
81
87
|
@exitcode.should == code.to_i
|
82
88
|
end
|
83
89
|
|
84
|
-
Then /^the list should contain the cartridge ([^\s]+) with display name
|
90
|
+
Then /^the list should contain the cartridge ([^\s]+) with display name$/ do |name|
|
91
|
+
display_name = map_cartridge_name(name)
|
85
92
|
line = @cartridge_output.each_line.find{ |s| s.include?(name) }
|
86
93
|
line.should_not be_nil
|
87
94
|
line.should match(display_name)
|
@@ -18,6 +18,12 @@ Before('@geared_user_required') do
|
|
18
18
|
$namespace = nil
|
19
19
|
end
|
20
20
|
|
21
|
+
Before('@certificates_capable_user_required') do
|
22
|
+
$old_username = $username
|
23
|
+
$username = "user_with_certificate_capabilities@test.com"
|
24
|
+
$namespace = nil
|
25
|
+
end
|
26
|
+
|
21
27
|
After do
|
22
28
|
if $old_username
|
23
29
|
$username = $old_username
|
@@ -42,19 +48,19 @@ Before('@client_tools_required') do
|
|
42
48
|
end
|
43
49
|
|
44
50
|
Before('@single_cartridge','@init') do
|
45
|
-
step
|
51
|
+
step "an existing or new php application without an embedded cartridge"
|
46
52
|
end
|
47
53
|
|
48
54
|
# These assumptions help to ensure any steps that are run independently have the same state as after the @init step
|
49
55
|
{
|
50
|
-
:application =>
|
51
|
-
:scaled_application =>
|
56
|
+
:application => "an existing or new php application without an embedded cartridge",
|
57
|
+
:scaled_application => "an existing or new scaled php application without an embedded cartridge",
|
52
58
|
:domain => 'we have an existing domain',
|
53
59
|
:client => 'we have the client tools setup',
|
54
|
-
:single_cartridge =>
|
55
|
-
:multiple_cartridge =>
|
60
|
+
:single_cartridge => "an existing or new php application with an embedded mysql cartridge",
|
61
|
+
:multiple_cartridge => "an existing or new php application with embedded mysql and phpmyadmin cartridges",
|
56
62
|
}.each do |tag,assumption|
|
57
63
|
Before("@#{tag}",'~@init') do
|
58
64
|
step assumption
|
59
65
|
end
|
60
|
-
end
|
66
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -70,7 +70,14 @@ raise "Password not found in environment (RHC_PASSWORD)" unless $password
|
|
70
70
|
$user_register_script_format = "oo-register-user -l admin -p admin --username %s --userpass %s"
|
71
71
|
if ENV['REGISTER_USER']
|
72
72
|
command = $user_register_script_format % [$username,$password]
|
73
|
-
|
73
|
+
if Object.const_defined?('Bundler')
|
74
|
+
Bundler::with_clean_env do
|
75
|
+
system "gem install activeresource bundler parseconfig --no-ri --no-rdoc"
|
76
|
+
system command
|
77
|
+
end
|
78
|
+
else
|
79
|
+
system command
|
80
|
+
end
|
74
81
|
end
|
75
82
|
|
76
83
|
def _log(msg)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
if File.exist?("/etc/fedora-release")
|
2
|
+
CARTRIDGE_MAP = {
|
3
|
+
"php" => { type: "php-5.4", name: "PHP 5.4" },
|
4
|
+
"mysql" => { type: "mysql-5.1", name: "MySQL Database 5.1" },
|
5
|
+
"phpmyadmin" => { type: "phpmyadmin-3.5", name: "phpMyAdmin 3.5" },
|
6
|
+
"mongodb" => { type: "mongodb-2.2", name: "MongoDB NoSQL Database 2.2" },
|
7
|
+
"postgresql" => { type: "postgresql-9.2", name: "PostgreSQL Database 9.2" },
|
8
|
+
"cron" => { type: "cron-1.4", name: "Cron 1.4" },
|
9
|
+
"haproxy" => { type: "haproxy-1.4", name: "" }
|
10
|
+
}
|
11
|
+
else
|
12
|
+
CARTRIDGE_MAP = {
|
13
|
+
"php" => { type: "php-5.3", name: "PHP 5.3" },
|
14
|
+
"mysql" => { type: "mysql-5.1", name: "MySQL Database 5.1" },
|
15
|
+
"phpmyadmin" => { type: "phpmyadmin-3.4", name: "phpMyAdmin 3.4" },
|
16
|
+
"mongodb" => { type: "mongodb-2.2", name: "MongoDB NoSQL Database 2.2" },
|
17
|
+
"postgresql" => { type: "postgresql-8.4", name: "PostgreSQL Database 8.4" },
|
18
|
+
"cron" => { type: "cron-1.4", name: "Cron 1.4" },
|
19
|
+
"haproxy" => { type: "haproxy-1.4", name: "" }
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def map_cartridge_type(type)
|
24
|
+
CARTRIDGE_MAP[type][:type]
|
25
|
+
end
|
26
|
+
|
27
|
+
def map_cartridge_name(type)
|
28
|
+
CARTRIDGE_MAP[type][:name]
|
29
|
+
end
|
data/lib/rhc/command_runner.rb
CHANGED
@@ -29,6 +29,16 @@ module RHC
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
HELP_OPTIONS = ['--help', '-h']
|
33
|
+
|
34
|
+
def options_parse_help
|
35
|
+
if (@args & HELP_OPTIONS).present?
|
36
|
+
args = (@args -= HELP_OPTIONS)
|
37
|
+
args.shift if args.first == 'help' && !command_exists?(args.join(' '))
|
38
|
+
exit run_help(args, nil)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
32
42
|
# override so we can do our own error handling
|
33
43
|
def run!
|
34
44
|
trace = false
|
@@ -36,12 +46,8 @@ module RHC
|
|
36
46
|
#trap('INT') { abort program(:int_message) } if program(:int_message)
|
37
47
|
#trap('INT') { program(:int_block).call } if program(:int_block)
|
38
48
|
|
39
|
-
global_option('-h', '--help', 'Help on any command', :hide => true)
|
40
|
-
|
41
|
-
command(:help).run(*args)
|
42
|
-
return
|
43
|
-
end
|
44
|
-
global_option('--version', 'Display version information', :hide => true) { say version; return }
|
49
|
+
global_option('-h', '--help', 'Help on any command', :hide => true)
|
50
|
+
global_option('--version', 'Display version information', :hide => true)
|
45
51
|
|
46
52
|
# remove these because we monkey patch Commands to process all options
|
47
53
|
# at once, avoiding conflicts between the global and command options
|
@@ -56,6 +62,9 @@ module RHC
|
|
56
62
|
# special case --version so it is processed before an invalid command
|
57
63
|
options_parse_version
|
58
64
|
|
65
|
+
# help is a special branch prior to command execution
|
66
|
+
options_parse_help
|
67
|
+
|
59
68
|
unless trace
|
60
69
|
begin
|
61
70
|
run_active_command
|
@@ -110,7 +119,6 @@ module RHC
|
|
110
119
|
|
111
120
|
def create_default_commands
|
112
121
|
command 'help options' do |c|
|
113
|
-
# c.syntax = ''
|
114
122
|
c.description = "Display all global options and information about configuration"
|
115
123
|
c.when_called do |args, options|
|
116
124
|
say help_formatter.render_options self
|
@@ -119,21 +127,25 @@ module RHC
|
|
119
127
|
command :help do |c|
|
120
128
|
c.syntax = '<command>'
|
121
129
|
c.description = 'Display global or <command> help documentation.'
|
122
|
-
c.when_called
|
123
|
-
|
130
|
+
c.when_called(&method(:run_help))
|
131
|
+
end
|
132
|
+
end
|
124
133
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
134
|
+
def run_help(args, options)
|
135
|
+
cmd = (1..args.length).reverse_each.map{ |n| args[0,n].join(' ') }.find{ |cmd| command_exists?(cmd) }
|
136
|
+
|
137
|
+
if args.empty?
|
138
|
+
say help_formatter.render
|
139
|
+
0
|
140
|
+
elsif cmd.nil?
|
141
|
+
RHC::Helpers.error "The command '#{program :name} #{provided_arguments.join(' ')}' is not recognized.\n"
|
142
|
+
say "See '#{program :name} help' for a list of valid commands."
|
143
|
+
1
|
144
|
+
else
|
145
|
+
command = command(cmd)
|
146
|
+
help_bindings = CommandHelpBindings.new command, commands, self
|
147
|
+
say help_formatter.render_command help_bindings
|
148
|
+
0
|
137
149
|
end
|
138
150
|
end
|
139
151
|
end
|
data/lib/rhc/commands/account.rb
CHANGED
@@ -12,7 +12,7 @@ module RHC::Commands
|
|
12
12
|
def run
|
13
13
|
user = rest_client.user
|
14
14
|
|
15
|
-
say_table nil, get_properties(user, :login, :plan_id, :consumed_gears, :max_gears) + get_properties(user.capabilities, :gear_sizes).unshift(['Server', openshift_server]), :delete => true
|
15
|
+
say_table nil, get_properties(user, :login, :plan_id, :consumed_gears, :max_gears) + get_properties(user.capabilities, :gear_sizes).unshift(['Server:', openshift_server]) << ['SSL Certificates Supported:', user.capabilities.private_ssl_certificates ? 'yes' : 'no'], :delete => true
|
16
16
|
|
17
17
|
if openshift_online_server?
|
18
18
|
else
|
data/lib/rhc/commands/alias.rb
CHANGED
@@ -3,34 +3,117 @@ require 'rhc/config'
|
|
3
3
|
|
4
4
|
module RHC::Commands
|
5
5
|
class Alias < Base
|
6
|
-
summary "Add or remove a custom domain name for the application"
|
6
|
+
summary "Add or remove a custom domain name (alias) for the application"
|
7
7
|
syntax "<command> <application> <alias> [--namespace namespace]"
|
8
8
|
default_action :help
|
9
9
|
|
10
10
|
summary "Add a custom domain name for the application"
|
11
11
|
syntax "<application> <alias> [--namespace namespace]"
|
12
|
-
argument :app, "Application name (required)", []
|
12
|
+
argument :app, "Application name (required)", ["-a", "--app name"], :context => :app_context, :required => true
|
13
13
|
argument :app_alias, "Custom domain name for the application", []
|
14
14
|
option ["-n", "--namespace namespace"], "Namespace of your application", :context => :namespace_context, :required => true
|
15
15
|
alias_action :"app add-alias", :root_command => true, :deprecated => true
|
16
16
|
def add(app, app_alias)
|
17
17
|
rest_app = rest_client.find_application(options.namespace, app)
|
18
|
-
|
19
|
-
results { say
|
18
|
+
rest_app.add_alias(app_alias)
|
19
|
+
results { say "Alias '#{app_alias}' has been added." }
|
20
20
|
0
|
21
21
|
end
|
22
22
|
|
23
23
|
summary "Remove a custom domain name for the application"
|
24
24
|
syntax "<application> <alias> [--namespace namespace]"
|
25
|
-
argument :app, "Application name (required)", []
|
25
|
+
argument :app, "Application name (required)", ["-a", "--app name"], :context => :app_context, :required => true
|
26
26
|
argument :app_alias, "Custom domain name for the application", []
|
27
27
|
option ["-n", "--namespace namespace"], "Namespace of your application", :context => :namespace_context, :required => true
|
28
28
|
alias_action :"app remove-alias", :root_command => true, :deprecated => true
|
29
29
|
def remove(app, app_alias)
|
30
30
|
rest_app = rest_client.find_application(options.namespace, app)
|
31
|
-
|
32
|
-
results { say
|
31
|
+
rest_app.remove_alias(app_alias)
|
32
|
+
results { say "Alias '#{app_alias}' has been removed." }
|
33
33
|
0
|
34
34
|
end
|
35
|
+
|
36
|
+
summary "Add or change the SSL certificate for an existing alias"
|
37
|
+
description <<-DESC
|
38
|
+
Add or update the SSL certificate for your custom domain alias to
|
39
|
+
allow secure HTTPS communication with your app.
|
40
|
+
|
41
|
+
Certificate files must be Base64 PEM-encoded and typically have a
|
42
|
+
.crt or .pem extension. You may combine multiple certificates and
|
43
|
+
certificate chains in a single file. The RSA or DSA private key
|
44
|
+
must always be provided in a separate file.
|
45
|
+
|
46
|
+
Pass phrase for the certificate private key is required if the
|
47
|
+
provided private key is encrypted.
|
48
|
+
DESC
|
49
|
+
syntax "<application> <alias> --certificate FILE --private-key FILE [--passphrase passphrase]"
|
50
|
+
argument :app, "Application name (required)", ["-a", "--app name"], :context => :app_context, :required => true
|
51
|
+
argument :app_alias, "Custom domain name for the application (required)", []
|
52
|
+
option ["--certificate FILE"], "SSL certificate filepath (file in .crt or .pem format)", :required => true
|
53
|
+
option ["--private-key FILE"], "Private key filepath for the given SSL certificate", :required => true
|
54
|
+
option ["--passphrase passphrase"], "Private key pass phrase, required if the private key is encripted", :required => false
|
55
|
+
option ["-n", "--namespace namespace"], "Namespace of your application", :context => :namespace_context, :required => true
|
56
|
+
def update_cert(app, app_alias)
|
57
|
+
certificate_file_path = options.certificate
|
58
|
+
raise ArgumentError, "Certificate file not found: #{certificate_file_path}" if !File.exist?(certificate_file_path) || !File.file?(certificate_file_path)
|
59
|
+
|
60
|
+
private_key_file_path = options.private_key
|
61
|
+
raise ArgumentError, "Private key file not found: #{private_key_file_path}" if !File.exist?(private_key_file_path) || !File.file?(private_key_file_path)
|
62
|
+
|
63
|
+
certificate_content = File.read(certificate_file_path)
|
64
|
+
raise ArgumentError, "Invalid certificate file: #{certificate_file_path} is empty" if certificate_content.to_s.strip.length == 0
|
65
|
+
|
66
|
+
private_key_content = File.read(private_key_file_path)
|
67
|
+
raise ArgumentError, "Invalid private key file: #{private_key_file_path} is empty" if private_key_content.to_s.strip.length == 0
|
68
|
+
|
69
|
+
rest_app = rest_client.find_application(options.namespace, app)
|
70
|
+
rest_alias = rest_app.find_alias(app_alias)
|
71
|
+
if rest_client.api_version_negotiated >= 1.4
|
72
|
+
rest_alias.add_certificate(certificate_content, private_key_content, options.passphrase)
|
73
|
+
results { say "SSL certificate successfully added." }
|
74
|
+
0
|
75
|
+
else
|
76
|
+
raise RHC::Rest::SslCertificatesNotSupported, "The server does not support SSL certificates for custom aliases."
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
summary "Delete the SSL certificate from an existing alias"
|
81
|
+
syntax "<application> <alias>"
|
82
|
+
argument :app, "Application name (required)", ["-a", "--app name"], :context => :app_context, :required => true
|
83
|
+
argument :app_alias, "Custom domain name for the application (required)", []
|
84
|
+
option ["--confirm"], "Pass to confirm deleting the application"
|
85
|
+
option ["-n", "--namespace namespace"], "Namespace of your application", :context => :namespace_context, :required => true
|
86
|
+
def delete_cert(app, app_alias)
|
87
|
+
rest_app = rest_client.find_application(options.namespace, app)
|
88
|
+
rest_alias = rest_app.find_alias(app_alias)
|
89
|
+
if rest_client.api_version_negotiated >= 1.4
|
90
|
+
confirm_action "#{color("This is a non-reversible action! Your SSL certificate will be permanently deleted from application '#{app}'.", :yellow)}\n\nAre you sure you want to delete the SSL certificate?"
|
91
|
+
rest_alias.delete_certificate
|
92
|
+
results { say "SSL certificate successfully deleted." }
|
93
|
+
0
|
94
|
+
else
|
95
|
+
raise RHC::Rest::SslCertificatesNotSupported, "The server does not support SSL certificates for custom aliases."
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
summary "List the aliases on an application"
|
100
|
+
syntax "<application>"
|
101
|
+
argument :app, "Application name (required)", ["-a", "--app name"], :context => :app_context, :required => true
|
102
|
+
option ["-n", "--namespace namespace"], "Namespace of your application", :context => :namespace_context, :required => true
|
103
|
+
def list(app)
|
104
|
+
rest_app = rest_client.find_application(options.namespace, app)
|
105
|
+
items = rest_app.aliases.map do |a|
|
106
|
+
a.is_a?(String) ?
|
107
|
+
[a, 'no', '-'] :
|
108
|
+
[a.id, a.has_private_ssl_certificate? ? 'yes' : 'no', a.has_private_ssl_certificate? ? Date.parse(a.certificate_added_at) : '-']
|
109
|
+
end
|
110
|
+
if items.empty?
|
111
|
+
results { say "No aliases associated with the application #{app}." }
|
112
|
+
else
|
113
|
+
table(items, :header => ["Alias", "Has Certificate?", "Certificate Added"]).each { |s| say s }
|
114
|
+
end
|
115
|
+
0
|
116
|
+
end
|
117
|
+
|
35
118
|
end
|
36
119
|
end
|