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
    
        data/lib/rhc/ssh_helpers.rb
    CHANGED
    
    | @@ -122,7 +122,7 @@ module RHC | |
| 122 122 | 
             
                  error e.message
         | 
| 123 123 | 
             
                  nil
         | 
| 124 124 | 
             
                rescue => e
         | 
| 125 | 
            -
                   | 
| 125 | 
            +
                  debug e.message
         | 
| 126 126 | 
             
                  nil
         | 
| 127 127 | 
             
                end
         | 
| 128 128 |  | 
| @@ -135,13 +135,12 @@ module RHC | |
| 135 135 | 
             
                # which is basically the space-separated list of the SSH public key content
         | 
| 136 136 | 
             
                def ssh_key_triple_for(key)
         | 
| 137 137 | 
             
                  begin
         | 
| 138 | 
            -
                     | 
| 138 | 
            +
                    IO.read(key).chomp.split
         | 
| 139 139 | 
             
                  rescue Errno::ENOENT => e
         | 
| 140 140 | 
             
                    raise ::RHC::KeyFileNotExistentException.new("File '#{key}' does not exist.")
         | 
| 141 141 | 
             
                  rescue Errno::EACCES => e
         | 
| 142 142 | 
             
                    raise ::RHC::KeyFileAccessDeniedException.new("Access denied to '#{key}'.")
         | 
| 143 143 | 
             
                  end
         | 
| 144 | 
            -
                  file.gets.chomp.split
         | 
| 145 144 | 
             
                end
         | 
| 146 145 |  | 
| 147 146 | 
             
                def ssh_key_triple_for_default_key
         | 
    
        data/lib/rhc/wizard.rb
    CHANGED
    
    | @@ -245,7 +245,7 @@ module RHC | |
| 245 245 | 
             
                    key_fingerprint = fingerprint_for_default_key
         | 
| 246 246 | 
             
                    unless key_fingerprint
         | 
| 247 247 | 
             
                      paragraph do
         | 
| 248 | 
            -
                         | 
| 248 | 
            +
                        warn "Your ssh public key at #{system_path(RHC::Config.ssh_pub_key_file_path)} is invalid or unreadable. "\
         | 
| 249 249 | 
             
                            "Setup can not continue until you manually remove or fix your "\
         | 
| 250 250 | 
             
                            "public and private keys id_rsa keys."
         | 
| 251 251 | 
             
                      end
         | 
| @@ -420,9 +420,8 @@ module RHC | |
| 420 420 | 
             
                # Thus, we force an order with #sort to ensure spec passage on both.
         | 
| 421 421 | 
             
                def setup_test_stage
         | 
| 422 422 | 
             
                  say "Checking common problems "
         | 
| 423 | 
            -
                  tests = private_methods.select {|m| m.to_s.start_with? 'test_'}
         | 
| 424 423 | 
             
                  failed = false
         | 
| 425 | 
            -
                   | 
| 424 | 
            +
                  all_test_methods.sort.each do |test|
         | 
| 426 425 | 
             
                    begin
         | 
| 427 426 | 
             
                      send(test)
         | 
| 428 427 | 
             
                      print_dot unless failed
         | 
| @@ -440,6 +439,10 @@ module RHC | |
| 440 439 | 
             
                  true
         | 
| 441 440 | 
             
                end
         | 
| 442 441 |  | 
| 442 | 
            +
                def all_test_methods
         | 
| 443 | 
            +
                  private_methods.select {|m| m.to_s.start_with? 'test_'}
         | 
| 444 | 
            +
                end
         | 
| 445 | 
            +
             | 
| 443 446 | 
             
                # cached list of applications needed for test stage
         | 
| 444 447 | 
             
                def applications
         | 
| 445 448 | 
             
                  @applications ||= rest_client.domains.map(&:applications).flatten
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            +
            MIIDoDCCAogCCQDzF8AJCHnrbjANBgkqhkiG9w0BAQUFADCBkTELMAkGA1UEBhMC
         | 
| 3 | 
            +
            VVMxCzAJBgNVBAgMAkNBMRIwEAYDVQQHDAlTdW5ueXZhbGUxDzANBgNVBAoMBnJl
         | 
| 4 | 
            +
            ZGhhdDESMBAGA1UECwwJb3BlbnNoaWZ0MRIwEAYDVQQDDAlvcGVuc2hpZnQxKDAm
         | 
| 5 | 
            +
            BgkqhkiG9w0BCQEWGWluZm9Ab3BlbnNoaWZ0LnJlZGhhdC5jb20wHhcNMTMwMjE5
         | 
| 6 | 
            +
            MjExMTQ4WhcNMTQwMjE5MjExMTQ4WjCBkTELMAkGA1UEBhMCVVMxCzAJBgNVBAgM
         | 
| 7 | 
            +
            AkNBMRIwEAYDVQQHDAlTdW5ueXZhbGUxDzANBgNVBAoMBnJlZGhhdDESMBAGA1UE
         | 
| 8 | 
            +
            CwwJb3BlbnNoaWZ0MRIwEAYDVQQDDAlvcGVuc2hpZnQxKDAmBgkqhkiG9w0BCQEW
         | 
| 9 | 
            +
            GWluZm9Ab3BlbnNoaWZ0LnJlZGhhdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
         | 
| 10 | 
            +
            DwAwggEKAoIBAQDAEbH4MCi3iIDP1HS+/Xwu8SjdSc5WJX6htV7hJpmFZ8HohV/8
         | 
| 11 | 
            +
            ba0v6aM9IJIIt+sIe2J62t/9G3leOdIHBxeACN4fV2l/iA/fvxvlnFKeD7sHm9Oc
         | 
| 12 | 
            +
            Yj1H6YYJ57sIOf/oLDpJl6l3Rw8VC3+3W0/lzlVpA8qt7fpkiW7XQJCPplUSrdVC
         | 
| 13 | 
            +
            3okQ2T5NAod5+wVIOqELgE5bLX1LRs5VPsjytHkJ7rKXs55FHR3kpsoImn5xD0Ky
         | 
| 14 | 
            +
            6lRn8cIMolQoyN5HIGr8f5P+07hrHibve8jje/DKTssb5yEUAEmh6iGHQsRAnsUW
         | 
| 15 | 
            +
            QoIEUOLqQCu9re2No4G52Kl2xQIjyJF7rCfxAgMBAAEwDQYJKoZIhvcNAQEFBQAD
         | 
| 16 | 
            +
            ggEBAGHrya/ZkiAje2kHsOajXMlO2+y1iLfUDcRLuEWpUa8sI5EM4YtemQrsupFp
         | 
| 17 | 
            +
            8lVYG5C4Vh8476oF9t8Wex5eH3ocwbSvPIUqE07hdmrubiMq4wxFVRYq7g9lHAnx
         | 
| 18 | 
            +
            l+bABuN/orbAcPcGAGg7AkXVoAc3Fza/ZcgMcw7NOtDTEss70V9OdgCfQUJL0KdO
         | 
| 19 | 
            +
            hCO8bQ1EaEiq6zEh8RpZe8mu+f/GYATX1I+eJUc6F6cn83oJjE9bqAVzk7TzTHeK
         | 
| 20 | 
            +
            EBKN50C14wWtXeG7n2+ugaVO+0xnvHeUrQBLHSRyOHqxXrQQ5XmzcaBiyI0f2IQM
         | 
| 21 | 
            +
            Hst1BVXyX0n/L/ZoYYsv5juJmDo=
         | 
| 22 | 
            +
            -----END CERTIFICATE-----
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            -----BEGIN RSA PRIVATE KEY-----
         | 
| 2 | 
            +
            MIIEogIBAAKCAQEAwBGx+DAot4iAz9R0vv18LvEo3UnOViV+obVe4SaZhWfB6IVf
         | 
| 3 | 
            +
            /G2tL+mjPSCSCLfrCHtietrf/Rt5XjnSBwcXgAjeH1dpf4gP378b5ZxSng+7B5vT
         | 
| 4 | 
            +
            nGI9R+mGCee7CDn/6Cw6SZepd0cPFQt/t1tP5c5VaQPKre36ZIlu10CQj6ZVEq3V
         | 
| 5 | 
            +
            Qt6JENk+TQKHefsFSDqhC4BOWy19S0bOVT7I8rR5Ce6yl7OeRR0d5KbKCJp+cQ9C
         | 
| 6 | 
            +
            supUZ/HCDKJUKMjeRyBq/H+T/tO4ax4m73vI43vwyk7LG+chFABJoeohh0LEQJ7F
         | 
| 7 | 
            +
            FkKCBFDi6kArva3tjaOBudipdsUCI8iRe6wn8QIDAQABAoIBAG/on4JVRRQSw8LU
         | 
| 8 | 
            +
            LiWt+jI7ryyoOUH2XL8JtzuGSwLwvomlVJT2rmbxQXx3Qr8zsgziHzIn30RRQrkF
         | 
| 9 | 
            +
            BXu0xRuDjzBBtSVqeJ1Mc4uoNncEAVxgjb5bewswZDnXPCGB8bosMtX4OPRXgdEo
         | 
| 10 | 
            +
            PwTtfjMOsrMaU3hd5Xu4m81tQA2BvwOlx8aYDyH0jeTnervc5uRGbeTBQG4Bu40E
         | 
| 11 | 
            +
            rWNmXvgNq2EzTAwbbN6Ma97gw9KgXnM4Nlh29Fxb5TBeUU9lkzuTZAZIDXKIm7AG
         | 
| 12 | 
            +
            UwMbj/A038yAumYQtThTE/3e4W3rn7F2Vko900bC4aAC1KQOAzjIeQqzqkVxWTWq
         | 
| 13 | 
            +
            4SUFQAECgYEA/ODwifOTuI6hdZK6JRgc4wp6Rc0fkqHuxLzABXoIGuSVlWyimqIN
         | 
| 14 | 
            +
            ZySAkpo5EW6DNraRJxNCOBmWeGPEhHGrea+JPiPEwCK0F7SxvSmg3jzNzw3Es31T
         | 
| 15 | 
            +
            ecET7eDwuSOY9v4XDzLyiXXkEUUReD7Ng2hEYL+HaQrl5jWj4lxgq/ECgYEAwnCb
         | 
| 16 | 
            +
            Krz7FwX8AqtFAEi6uUrc12k1xYKQfrwSxbfdK2vBBUpgB71Iq/fqP+1BittEljDG
         | 
| 17 | 
            +
            8f4jEtMBFfEPhLzGIHaI3UiHUHXS4GetA77TRgR8lnKKpj1FcMIY2iKU479707O5
         | 
| 18 | 
            +
            Q08pgWRUDQ8BVg2ePgbo5QjLMc/rv7UF3AHvPAECgYB/auAIwqDGN6gHU/1TP4ke
         | 
| 19 | 
            +
            pWLi1O55tfpXSzv+BnUbB96PQgPUop7aP7xBIlBrBiI7aVZOOBf/qHT3CF421geu
         | 
| 20 | 
            +
            8tHWa7NxlIrl/vgn9lfGYyDYmXlpb1amXLEsBVGGF/e1TGZWFDe9J5fZU9HvosVu
         | 
| 21 | 
            +
            1xTNIvSZ6xHYI2MGZcGYIQKBgEYeebaV5C7PV6xWu1F46O19U9rS9DM//H/XryVi
         | 
| 22 | 
            +
            Qv4vo7IWuj7QQe7SPsXC98ntfPR0rqoCLf/R3ChfgGsr8H8wf/bc+v9HHj8S5E/f
         | 
| 23 | 
            +
            dy1e3Nccg2ej3PDm7jNsGSlwmmUkAQGHAL7KwYzcBm1UB+bycvZ1j2FtS+UckPpg
         | 
| 24 | 
            +
            MDgBAoGALD8PkxHb4U4DtbNFSYRrUdvS9heav/yph3lTMfifNkOir36io6v8RPgb
         | 
| 25 | 
            +
            D2bHKKZgmYlTgJrxD45Er9agC5jclJO35QRU/OfGf3GcnABkBI7vlvUKADAo65Sq
         | 
| 26 | 
            +
            weZkdJnbrIadcvLOHOzkKC9m+rxFTC9VoN1dwK2zwYvUXfa1VJA=
         | 
| 27 | 
            +
            -----END RSA PRIVATE KEY-----
         | 
| 
            File without changes
         | 
    
        data/spec/rhc/cli_spec.rb
    CHANGED
    
    | @@ -95,6 +95,11 @@ describe RHC::CLI do | |
| 95 95 | 
             
                context 'with --help' do
         | 
| 96 96 | 
             
                  before(:each){ @arguments = ['--help'] }
         | 
| 97 97 | 
             
                  it_should_behave_like 'a global help page'
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  context 'without a config file' do
         | 
| 100 | 
            +
                    before{ RHC::Wizard.stub(:has_configuration?).and_return(false) }
         | 
| 101 | 
            +
                    it_should_behave_like 'a global help page'
         | 
| 102 | 
            +
                  end
         | 
| 98 103 | 
             
                end
         | 
| 99 104 |  | 
| 100 105 | 
             
                context 'with -h' do
         | 
| @@ -23,14 +23,14 @@ describe RHC::Commands::Account do | |
| 23 23 | 
             
                it('should show the maximum gears') { run_output.should =~ /Gears Allowed:\s*3/ }
         | 
| 24 24 | 
             
                it { expect { run }.should exit_with_code(0) }
         | 
| 25 25 |  | 
| 26 | 
            -
                context 'with a  | 
| 27 | 
            -
                  let(:user_plan_id){ ' | 
| 28 | 
            -
                  it('should show') { run_output.should =~ /Plan:\s* | 
| 26 | 
            +
                context 'with a free plan' do
         | 
| 27 | 
            +
                  let(:user_plan_id){ 'free' }
         | 
| 28 | 
            +
                  it('should show') { run_output.should =~ /Plan:\s*Free/ }
         | 
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 | 
            -
                context 'with a  | 
| 32 | 
            -
                  let(:user_plan_id){ ' | 
| 33 | 
            -
                  it('should show') { run_output.should =~ /Plan:\s* | 
| 31 | 
            +
                context 'with a silver plan' do
         | 
| 32 | 
            +
                  let(:user_plan_id){ 'silver' }
         | 
| 33 | 
            +
                  it('should show') { run_output.should =~ /Plan:\s*Silver/ }
         | 
| 34 34 | 
             
                end
         | 
| 35 35 |  | 
| 36 36 | 
             
                context 'with a arbitrary plan' do
         | 
| @@ -8,10 +8,13 @@ describe RHC::Commands::Alias do | |
| 8 8 | 
             
              let(:domain_0_links) { mock_response_links(mock_domain_links('mock_domain_0')) }
         | 
| 9 9 | 
             
              let(:domain_1_links) { mock_response_links(mock_domain_links('mock_domain_1')) }
         | 
| 10 10 | 
             
              let(:app_0_links)    { mock_response_links(mock_app_links('mock_domain_0', 'mock_app_0')) }
         | 
| 11 | 
            +
              let(:alias_0_links)  { mock_response_links(mock_alias_links('mock_domain_0', 'mock_app_0', 'www.foo.bar')) }
         | 
| 11 12 | 
             
              let!(:rest_client){ MockRestClient.new }
         | 
| 12 13 | 
             
              before(:each) do
         | 
| 13 14 | 
             
                user_config
         | 
| 14 | 
            -
                rest_client.add_domain("mock_domain_0") | 
| 15 | 
            +
                domain = rest_client.add_domain("mock_domain_0")
         | 
| 16 | 
            +
                domain.add_application("mock_app_0", "ruby-1.8.7").add_alias("www.foo.bar")
         | 
| 17 | 
            +
                domain.add_application("mock_app_1", "ruby-1.8.7")
         | 
| 15 18 | 
             
                stub_api_request(:any, client_links['LIST_DOMAINS']['relative']).
         | 
| 16 19 | 
             
                        to_return({ :body   => {
         | 
| 17 20 | 
             
                                      :type => 'domains',
         | 
| @@ -74,6 +77,20 @@ describe RHC::Commands::Alias do | |
| 74 77 | 
             
                                    }.to_json,
         | 
| 75 78 | 
             
                                    :status => 200
         | 
| 76 79 | 
             
                                  })
         | 
| 80 | 
            +
                stub_api_request(:any, app_0_links['LIST_ALIASES']['relative'], false).
         | 
| 81 | 
            +
                        to_return({ :body   => {
         | 
| 82 | 
            +
                                :type => 'aliases',
         | 
| 83 | 
            +
                                :data =>
         | 
| 84 | 
            +
                                [{ :domain_id                   => 'mock_domain_0',
         | 
| 85 | 
            +
                                   :application_id              => 'mock_app_0',
         | 
| 86 | 
            +
                                   :id                          => 'www.foo.bar',
         | 
| 87 | 
            +
                                   :certificate_added_at        => nil,
         | 
| 88 | 
            +
                                   :has_private_ssl_certificate => false,
         | 
| 89 | 
            +
                                   :links                       => mock_response_links(mock_alias_links('mock_domain_0','mock_app_0', 'www.foo.bar')),
         | 
| 90 | 
            +
                                 }]
         | 
| 91 | 
            +
                              }.to_json,
         | 
| 92 | 
            +
                              :status => 200
         | 
| 93 | 
            +
                            })
         | 
| 77 94 |  | 
| 78 95 | 
             
              end
         | 
| 79 96 |  | 
| @@ -110,15 +127,172 @@ describe RHC::Commands::Alias do | |
| 110 127 | 
             
                end
         | 
| 111 128 | 
             
              end
         | 
| 112 129 |  | 
| 130 | 
            +
              describe 'alias update-cert --help' do
         | 
| 131 | 
            +
                let(:arguments) { ['alias', 'update-cert', '--help'] }
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                context 'help is run' do
         | 
| 134 | 
            +
                  it "should display help" do
         | 
| 135 | 
            +
                    expect { run }.should exit_with_code(0)
         | 
| 136 | 
            +
                  end
         | 
| 137 | 
            +
                  it('should output usage') { run_output.should match("Usage: rhc alias update-cert <application> <alias> --certificate FILE --private-key FILE [--passphrase passphrase]") }
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              describe 'alias delete-cert --help' do
         | 
| 142 | 
            +
                let(:arguments) { ['alias', 'delete-cert', '--help'] }
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                context 'help is run' do
         | 
| 145 | 
            +
                  it "should display help" do
         | 
| 146 | 
            +
                    expect { run }.should exit_with_code(0)
         | 
| 147 | 
            +
                  end
         | 
| 148 | 
            +
                  it('should output usage') { run_output.should match("Usage: rhc alias delete-cert <application> <alias>") }
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              describe 'alias list --help' do
         | 
| 153 | 
            +
                let(:arguments) { ['alias', 'list', '--help'] }
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                context 'help is run' do
         | 
| 156 | 
            +
                  it "should display help" do
         | 
| 157 | 
            +
                    expect { run }.should exit_with_code(0)
         | 
| 158 | 
            +
                  end
         | 
| 159 | 
            +
                  it('should output usage') { run_output.should match("Usage: rhc alias list <application>") }
         | 
| 160 | 
            +
                end
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
             | 
| 113 163 | 
             
              describe 'add alias' do
         | 
| 114 164 | 
             
                let(:arguments) { ['alias', 'add', 'mock_app_0', 'www.foo.bar' ] }
         | 
| 115 165 | 
             
                it { expect { run }.should exit_with_code(0) }
         | 
| 116 | 
            -
                it { run_output.should =~ /' | 
| 166 | 
            +
                it { run_output.should =~ /Alias 'www.foo.bar' has been added/m }
         | 
| 117 167 | 
             
              end
         | 
| 118 168 |  | 
| 119 169 | 
             
              describe 'remove alias' do
         | 
| 120 | 
            -
                 | 
| 121 | 
            -
             | 
| 122 | 
            -
                 | 
| 170 | 
            +
                before do 
         | 
| 171 | 
            +
                  rest_client.stub(:api_version_negotiated).and_return(1.4)
         | 
| 172 | 
            +
                end
         | 
| 173 | 
            +
                context 'remove alias successfully' do
         | 
| 174 | 
            +
                  let(:arguments) { ['alias', 'remove', 'mock_app_0', 'www.foo.bar' ] }
         | 
| 175 | 
            +
                  it { expect { run }.should exit_with_code(0) }
         | 
| 176 | 
            +
                  it { run_output.should =~ /Alias 'www.foo.bar' has been removed/m }
         | 
| 177 | 
            +
                end
         | 
| 178 | 
            +
                context 'remove alias with server api <= 1.3' do
         | 
| 179 | 
            +
                  let(:arguments) { ['alias', 'remove', 'mock_app_0', 'www.foo.bar' ] }
         | 
| 180 | 
            +
                  before do 
         | 
| 181 | 
            +
                    rest_client.stub(:api_version_negotiated).and_return(1.3)
         | 
| 182 | 
            +
                  end
         | 
| 183 | 
            +
                  it { expect { run }.should exit_with_code(0) }
         | 
| 184 | 
            +
                  it { run_output.should =~ /Alias 'www.foo.bar' has been removed/m }
         | 
| 185 | 
            +
                end
         | 
| 186 | 
            +
              end
         | 
| 187 | 
            +
             | 
| 188 | 
            +
              describe 'alias update-cert' do
         | 
| 189 | 
            +
                before do 
         | 
| 190 | 
            +
                  rest_client.stub(:api_version_negotiated).and_return(1.4)
         | 
| 191 | 
            +
                end
         | 
| 192 | 
            +
                context 'add valid certificate with valid private key without pass phrase' do
         | 
| 193 | 
            +
                  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar', 
         | 
| 194 | 
            +
                    '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
         | 
| 195 | 
            +
                    '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
         | 
| 196 | 
            +
                  it { expect { run }.should exit_with_code(0) }
         | 
| 197 | 
            +
                  it { run_output.should =~ /SSL certificate successfully added/m }
         | 
| 198 | 
            +
                end
         | 
| 199 | 
            +
                context 'cert file not found' do
         | 
| 200 | 
            +
                  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar', 
         | 
| 201 | 
            +
                    '--certificate', File.expand_path('../../assets/nothing.foo', __FILE__),
         | 
| 202 | 
            +
                    '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
         | 
| 203 | 
            +
                  it { expect { run }.should exit_with_code(1) }
         | 
| 204 | 
            +
                  it { run_output.should =~ /Certificate file not found/m }
         | 
| 205 | 
            +
                end
         | 
| 206 | 
            +
                context 'private key file not found' do
         | 
| 207 | 
            +
                  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar', 
         | 
| 208 | 
            +
                    '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
         | 
| 209 | 
            +
                    '--private-key', File.expand_path('../../assets/nothing.foo', __FILE__) ] }
         | 
| 210 | 
            +
                  it { expect { run }.should exit_with_code(1) }
         | 
| 211 | 
            +
                  it { run_output.should =~ /Private key file not found/m }
         | 
| 212 | 
            +
                end
         | 
| 213 | 
            +
                context 'not existing certificate alias' do
         | 
| 214 | 
            +
                  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.unicorns.com', 
         | 
| 215 | 
            +
                    '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
         | 
| 216 | 
            +
                    '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
         | 
| 217 | 
            +
                  it { expect { run }.should exit_with_code(156) }
         | 
| 218 | 
            +
                  it { run_output.should =~ /Alias www.unicorns.com can't be found in application/m }
         | 
| 219 | 
            +
                end
         | 
| 220 | 
            +
                context 'fails if server does not support' do
         | 
| 221 | 
            +
                  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar', 
         | 
| 222 | 
            +
                    '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
         | 
| 223 | 
            +
                    '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
         | 
| 224 | 
            +
                  before do 
         | 
| 225 | 
            +
                    rest_client.stub(:api_version_negotiated).and_return(1.3)
         | 
| 226 | 
            +
                  end
         | 
| 227 | 
            +
                  it { expect { run }.should exit_with_code(1) }
         | 
| 228 | 
            +
                  it { run_output.should =~ /The server does not support SSL certificates for custom aliases/m }
         | 
| 229 | 
            +
                end
         | 
| 230 | 
            +
                context 'invalid certificate file (empty)' do
         | 
| 231 | 
            +
                  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar', 
         | 
| 232 | 
            +
                    '--certificate', File.expand_path('../../assets/empty.txt', __FILE__),
         | 
| 233 | 
            +
                    '--private-key', File.expand_path('../../assets/cert_key_rsa', __FILE__) ] }
         | 
| 234 | 
            +
                  it { expect { run }.should exit_with_code(1) }
         | 
| 235 | 
            +
                  it { run_output.should =~ /Invalid certificate file/m }
         | 
| 236 | 
            +
                end
         | 
| 237 | 
            +
                context 'invalid private key file (empty)' do
         | 
| 238 | 
            +
                  let(:arguments) { ['alias', 'update-cert', 'mock_app_0', 'www.foo.bar', 
         | 
| 239 | 
            +
                    '--certificate', File.expand_path('../../assets/cert.crt', __FILE__),
         | 
| 240 | 
            +
                    '--private-key', File.expand_path('../../assets/empty.txt', __FILE__) ] }
         | 
| 241 | 
            +
                  it { expect { run }.should exit_with_code(1) }
         | 
| 242 | 
            +
                  it { run_output.should =~ /Invalid private key file/m }
         | 
| 243 | 
            +
                end
         | 
| 123 244 | 
             
              end
         | 
| 245 | 
            +
             | 
| 246 | 
            +
              describe 'alias delete-cert' do
         | 
| 247 | 
            +
                before do 
         | 
| 248 | 
            +
                  rest_client.stub(:api_version_negotiated).and_return(1.4)
         | 
| 249 | 
            +
                end
         | 
| 250 | 
            +
                context 'delete existing certificate' do
         | 
| 251 | 
            +
                  let(:arguments) { ['alias', 'delete-cert', 'mock_app_0', 'www.foo.bar', '--confirm'] }
         | 
| 252 | 
            +
                  it { expect { run }.should exit_with_code(0) }
         | 
| 253 | 
            +
                  it { run_output.should =~ /SSL certificate successfully deleted/m }
         | 
| 254 | 
            +
                end
         | 
| 255 | 
            +
                context 'delete not existing certificate' do
         | 
| 256 | 
            +
                  let(:arguments) { ['alias', 'delete-cert', 'mock_app_0', 'www.unicorns.com', '--confirm'] }
         | 
| 257 | 
            +
                  it { expect { run }.should exit_with_code(156) }
         | 
| 258 | 
            +
                  it { run_output.should =~ /Alias www.unicorns.com can't be found in application mock_app_0/m }
         | 
| 259 | 
            +
                end
         | 
| 260 | 
            +
                context 'fails if server does not support' do
         | 
| 261 | 
            +
                  let(:arguments) { ['alias', 'delete-cert', 'mock_app_0', 'www.foo.bar', '--confirm'] }
         | 
| 262 | 
            +
                  before do 
         | 
| 263 | 
            +
                    rest_client.stub(:api_version_negotiated).and_return(1.3)
         | 
| 264 | 
            +
                  end
         | 
| 265 | 
            +
                  it { expect { run }.should exit_with_code(1) }
         | 
| 266 | 
            +
                  it { run_output.should =~ /The server does not support SSL certificates for custom aliases/m }
         | 
| 267 | 
            +
                end
         | 
| 268 | 
            +
              end
         | 
| 269 | 
            +
             | 
| 270 | 
            +
              describe 'alias list' do
         | 
| 271 | 
            +
                before do 
         | 
| 272 | 
            +
                  rest_client.stub(:api_version_negotiated).and_return(1.4)
         | 
| 273 | 
            +
                end
         | 
| 274 | 
            +
                context 'list app with existing certificate' do
         | 
| 275 | 
            +
                  let(:arguments) { ['alias', 'list', 'mock_app_0'] }
         | 
| 276 | 
            +
                  it { expect { run }.should exit_with_code(0) }
         | 
| 277 | 
            +
                  it { run_output.should =~ /Has Certificate?/m }
         | 
| 278 | 
            +
                  it { run_output.should =~ /Certificate Added/m }
         | 
| 279 | 
            +
                  it { run_output.should =~ /www.foo.bar/m }
         | 
| 280 | 
            +
                end
         | 
| 281 | 
            +
                context 'list app without certificates' do
         | 
| 282 | 
            +
                  let(:arguments) { ['alias', 'list', 'mock_app_1'] }
         | 
| 283 | 
            +
                  it { expect { run }.should exit_with_code(0) }
         | 
| 284 | 
            +
                  it { run_output.should =~ /No aliases associated with the application mock_app_1/m }
         | 
| 285 | 
            +
                end
         | 
| 286 | 
            +
                context 'simple list is server does not support ssl certs' do
         | 
| 287 | 
            +
                  let(:arguments) { ['alias', 'list', 'mock_app_0'] }
         | 
| 288 | 
            +
                  before do 
         | 
| 289 | 
            +
                    rest_client.stub(:api_version_negotiated).and_return(1.3)
         | 
| 290 | 
            +
                  end
         | 
| 291 | 
            +
                  it { expect { run }.should exit_with_code(0) }
         | 
| 292 | 
            +
                  it { run_output.should =~ /no/m }
         | 
| 293 | 
            +
                  it { run_output.should =~ /-/m }
         | 
| 294 | 
            +
                  it { run_output.should =~ /www.foo.bar/m }
         | 
| 295 | 
            +
                end
         | 
| 296 | 
            +
              end
         | 
| 297 | 
            +
             | 
| 124 298 | 
             
            end
         | 
| @@ -74,7 +74,7 @@ describe RHC::Commands::App do | |
| 74 74 | 
             
                    Resolv::Hosts.should_receive(:new).and_return(resolver)
         | 
| 75 75 | 
             
                    resolver.should_receive(:getaddress).with('app1-mockdomain.fake.foo').and_raise(ArgumentError)
         | 
| 76 76 | 
             
                  end
         | 
| 77 | 
            -
             | 
| 77 | 
            +
             | 
| 78 78 | 
             
                  it { expect { run }.should exit_with_code(0) }
         | 
| 79 79 | 
             
                  it { run_output.should match("Success") }
         | 
| 80 80 | 
             
                end
         | 
| @@ -109,6 +109,7 @@ describe RHC::Commands::App do | |
| 109 109 | 
             
                    it { expect { run }.should raise_error(RHC::CartridgeNotFoundException, "There are no cartridges that match 'nomatch_cart'.") }
         | 
| 110 110 | 
             
                  end
         | 
| 111 111 | 
             
                end
         | 
| 112 | 
            +
             | 
| 112 113 | 
             
              end
         | 
| 113 114 |  | 
| 114 115 | 
             
              describe 'cart matching behavior' do
         | 
| @@ -42,6 +42,15 @@ describe RHC::Commands::Authorization do | |
| 42 42 |  | 
| 43 43 | 
             
                expect_an_unsupported_message
         | 
| 44 44 | 
             
              end
         | 
| 45 | 
            +
              
         | 
| 46 | 
            +
              describe '#run' do
         | 
| 47 | 
            +
                let(:arguments) { ['authorization', '--h']}
         | 
| 48 | 
            +
                context 'given --h' do
         | 
| 49 | 
            +
                  it 'should not raise SystemStackError' do
         | 
| 50 | 
            +
                    expect{ run }.should_not raise_error(SystemStackError)
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 45 54 |  | 
| 46 55 | 
             
              describe "#delete" do
         | 
| 47 56 | 
             
                let(:arguments) { ['authorization', 'delete', 'foo', 'bar'] }
         | 
| @@ -49,6 +49,7 @@ describe RHC::Commands::Cartridge do | |
| 49 49 | 
             
                  it{ run_output.should match /mock_standalone_cart\-1\s+Mock1 Cart\s+web/ }
         | 
| 50 50 | 
             
                  it{ run_output.should match /mock_standalone_cart\-2\s+web/ }
         | 
| 51 51 | 
             
                  it{ run_output.should match /mock_embedded_cart\-1\s+Mock1 Embedded Cart\s+addon/ }
         | 
| 52 | 
            +
                  it{ run_output.should match /premium_cart\-1 \(\*\)\s+Premium Cart\s+web/ }
         | 
| 52 53 | 
             
                  it{ expect{ run }.should exit_with_code(0) }
         | 
| 53 54 |  | 
| 54 55 | 
             
                  context 'with verbose list' do
         | 
| @@ -164,6 +165,17 @@ describe RHC::Commands::Cartridge do | |
| 164 165 | 
             
                    fail_with_code 155
         | 
| 165 166 | 
             
                  }
         | 
| 166 167 | 
             
                end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                context 'when cart is premium' do
         | 
| 170 | 
            +
                  let(:arguments) { ['cartridge', 'add', 'premium_cart', '-a', 'app1','--noprompt', '--config', 'test.conf', '-l', 'test@test.foo', '-p',  'password'] }
         | 
| 171 | 
            +
                  before(:each) do
         | 
| 172 | 
            +
                    domain = rest_client.add_domain("mock_domain")
         | 
| 173 | 
            +
                    app = domain.add_application("app1", "mock_type")
         | 
| 174 | 
            +
                  end
         | 
| 175 | 
            +
                  it {
         | 
| 176 | 
            +
                    succeed_with_message /This gear costs an additional \$0\.05 per gear after the first 3 gears\./
         | 
| 177 | 
            +
                  }
         | 
| 178 | 
            +
                end
         | 
| 167 179 | 
             
              end
         | 
| 168 180 |  | 
| 169 181 | 
             
              describe 'cartridge remove' do
         | 
| @@ -306,6 +318,21 @@ describe RHC::Commands::Cartridge do | |
| 306 318 | 
             
                end
         | 
| 307 319 | 
             
              end
         | 
| 308 320 |  | 
| 321 | 
            +
              describe 'cartridge show' do
         | 
| 322 | 
            +
                let(:arguments) { ['cartridge', 'show', 'premium_cart', '-a', 'app1', '--noprompt', '--config', 'test.conf', '-l', 'test@test.foo', '-p',  'password'] }
         | 
| 323 | 
            +
             | 
| 324 | 
            +
                before(:each) do
         | 
| 325 | 
            +
                  @rc = MockRestClient.new
         | 
| 326 | 
            +
                  domain = @rc.add_domain("mock_domain")
         | 
| 327 | 
            +
                  app = domain.add_application("app1", "mock_type")
         | 
| 328 | 
            +
                  app.cartridges << @rc.cartridges.find {|c| c.name == 'premium_cart'}
         | 
| 329 | 
            +
                end
         | 
| 330 | 
            +
             | 
| 331 | 
            +
                context 'when run with a premium cartridge' do
         | 
| 332 | 
            +
                  it { run_output.should match(/This gear costs an additional \$0\.05 per gear after the first 3 gears./) }
         | 
| 333 | 
            +
                end
         | 
| 334 | 
            +
              end
         | 
| 335 | 
            +
             | 
| 309 336 | 
             
              describe 'cartridge show scaled' do
         | 
| 310 337 | 
             
                let!(:rest_client){ MockRestClient.new }
         | 
| 311 338 | 
             
                let(:arguments) { ['cartridge', 'show', 'mock_type', '-a', 'app1', '--noprompt', '--config', 'test.conf', '-l', 'test@test.foo', '-p',  'password'] }
         | 
| @@ -8,6 +8,8 @@ describe RHC::Commands::Setup do | |
| 8 8 | 
             
              let(:instance){ subject.new }
         | 
| 9 9 | 
             
              let!(:config){ base_config }
         | 
| 10 10 | 
             
              before{ described_class.send(:public, *described_class.protected_instance_methods) }
         | 
| 11 | 
            +
              before{ FakeFS::FileSystem.clear }
         | 
| 12 | 
            +
              before{ RHC::Config.stub(:home_dir).and_return('/home/mock_user') }
         | 
| 11 13 |  | 
| 12 14 | 
             
              describe '#run' do
         | 
| 13 15 | 
             
                it{ expects_running('setup').should call(:run).on(instance).with(no_args) }
         | 
| @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'rest_spec_helper'
         | 
| 2 3 | 
             
            require 'rhc/commands/sshkey'
         | 
| 3 4 | 
             
            require 'rhc/config'
         | 
| 4 5 |  | 
| @@ -58,6 +59,24 @@ describe RHC::Commands::Sshkey do | |
| 58 59 | 
             
                      rest_client.sshkeys.length.should == num_keys
         | 
| 59 60 | 
             
                    end
         | 
| 60 61 | 
             
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  it "does not throw an error on an empty file" do
         | 
| 64 | 
            +
                    FakeFS do
         | 
| 65 | 
            +
                      keys = rest_client.sshkeys
         | 
| 66 | 
            +
                      num_keys = keys.length
         | 
| 67 | 
            +
                      File.open('id_rsa.pub', 'w') do |f|
         | 
| 68 | 
            +
                        f << ''
         | 
| 69 | 
            +
                      end
         | 
| 70 | 
            +
                      expect { run }.should exit_with_code(128)
         | 
| 71 | 
            +
                      expect { run_output.should match(/Name:.* mockkey/) }
         | 
| 72 | 
            +
                      rest_client.sshkeys.length.should == num_keys
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  it "exits with status code Errno::EACCES::Errno" do
         | 
| 77 | 
            +
                    IO.should_receive(:read).and_return("ssh_foo bar")
         | 
| 78 | 
            +
                    expect { run }.should exit_with_code(128)
         | 
| 79 | 
            +
                  end
         | 
| 61 80 | 
             
                end
         | 
| 62 81 |  | 
| 63 82 | 
             
                context "when adding an invalid key with --confirm" do
         | 
| @@ -99,7 +118,7 @@ describe RHC::Commands::Sshkey do | |
| 99 118 | 
             
                  #end
         | 
| 100 119 |  | 
| 101 120 | 
             
                  it "exits with status code Errno::EACCES::Errno" do
         | 
| 102 | 
            -
                     | 
| 121 | 
            +
                    IO.should_receive(:read).and_raise(Errno::EACCES)
         | 
| 103 122 | 
             
                    expect { run }.should exit_with_code(128)
         | 
| 104 123 | 
             
                  end
         | 
| 105 124 |  |