rhc 1.27.4 → 1.28.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,9 +10,9 @@ _rhc()
10
10
  if [[ "$cur" == -* ]]; then
11
11
  opts="--always-prefix --clean --config --debug --insecure --limit --mock --noprompt --password --raw --rhlogin --server --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --token"
12
12
  elif [ -z $cur ]; then
13
- opts="account alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert app app-configure app-create app-delete app-deploy app-force-stop app-reload app-restart app-scale-down app-scale-up app-show app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage deployment deployment-activate deployment-list deployment-show domain domain-configure domain-create domain-delete domain-leave domain-list domain-rename domain-show env env-list env-set env-show env-unset git-clone logout member member-add member-list member-remove member-update port-forward scp server server-add server-configure server-list server-remove server-show server-status server-use setup snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show tail team team-create team-delete team-leave team-list team-show threaddump"
13
+ opts="account alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert app app-configure app-create app-delete app-deploy app-force-stop app-reload app-restart app-scale-down app-scale-up app-show app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage deployment deployment-activate deployment-list deployment-show domain domain-configure domain-create domain-delete domain-leave domain-list domain-rename domain-show env env-list env-set env-show env-unset git-clone help logout member member-add member-list member-remove member-update port-forward region region-list scp server server-add server-configure server-list server-remove server-show server-status server-use setup snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show tail team team-create team-delete team-leave team-list team-show threaddump"
14
14
  else
15
- opts="account account-logout activate-deployment add-alias add-authorization add-cartridge add-member add-server add-sshkey alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert aliases app app-configure app-create app-delete app-deploy app-env app-force-stop app-reload app-restart app-scale-down app-scale-up app-scp app-show app-snapshot app-ssh app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list authorizations cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage cartridges configure-app configure-domain configure-server create-app create-domain create-team delete-all-authorization delete-app delete-authorization delete-cert-alias delete-domain delete-team deploy deploy-app deployment deployment-activate deployment-list deployment-show deployments domain domain-configure domain-create domain-delete domain-leave domain-list domain-rename domain-show domains env env-add env-list env-remove env-set env-show env-unset force-stop-app git-clone leave-domain leave-team list-alias list-authorization list-cartridge list-deployment list-domain list-env list-member list-server list-sshkey list-team logout member member-add member-list member-remove member-update members port-forward reload-app reload-cartridge remove-alias remove-cartridge remove-member remove-server remove-sshkey rename-domain restart-app restart-cartridge restore-snapshot save-snapshot scale-cartridge scale-down-app scale-up-app scp server server-add server-configure server-list server-remove server-show server-status server-use servers set-env setup show-app show-cartridge show-deployment show-domain show-env show-server show-sshkey show-team snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show start-app start-cartridge status-cartridge status-server stop-app stop-cartridge storage-cartridge tail team team-create team-delete team-leave team-list team-show teams threaddump tidy-app unset-env update-cert-alias update-member use-server"
15
+ opts="account account-logout activate-deployment add-alias add-authorization add-cartridge add-member add-server add-sshkey alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert aliases app app-configure app-create app-delete app-deploy app-env app-force-stop app-reload app-restart app-scale-down app-scale-up app-scp app-show app-snapshot app-ssh app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list authorizations cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage cartridges configure-app configure-domain configure-server create-app create-domain create-team delete-all-authorization delete-app delete-authorization delete-cert-alias delete-domain delete-team deploy deploy-app deployment deployment-activate deployment-list deployment-show deployments domain domain-configure domain-create domain-delete domain-leave domain-list domain-rename domain-show domains env env-add env-list env-remove env-set env-show env-unset envs force-stop-app git-clone help leave-domain leave-team list-alias list-authorization list-cartridge list-deployment list-domain list-env list-member list-region list-server list-sshkey list-team logout member member-add member-list member-remove member-update members port-forward region region-list regions reload-app reload-cartridge remove-alias remove-cartridge remove-member remove-server remove-sshkey rename-domain restart-app restart-cartridge restore-snapshot save-snapshot scale-cartridge scale-down-app scale-up-app scp server server-add server-configure server-list server-remove server-show server-status server-use servers set-env setup show-app show-cartridge show-deployment show-domain show-env show-server show-sshkey show-team snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show sshkeys start-app start-cartridge status-cartridge status-server stop-app stop-cartridge storage-cartridge tail team team-create team-delete team-leave team-list team-show teams threaddump tidy-app unset-env update-cert-alias update-member use-server"
16
16
  fi
17
17
  else
18
18
  prev="${COMP_WORDS[@]:0:COMP_CWORD}"
@@ -86,7 +86,7 @@ _rhc()
86
86
 
87
87
  "rhc add-server")
88
88
  if [[ "$cur" == -* ]]; then
89
- opts="--insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --use --use-authorization-tokens"
89
+ opts="--insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --use --use-authorization-tokens"
90
90
  else
91
91
  opts=""
92
92
  fi
@@ -104,7 +104,7 @@ _rhc()
104
104
  if [[ "$cur" == -* ]]; then
105
105
  opts=""
106
106
  else
107
- opts="add remove update-cert delete-cert list"
107
+ opts="add delete-cert list remove update-cert"
108
108
  fi
109
109
  ;;
110
110
 
@@ -200,7 +200,7 @@ _rhc()
200
200
  if [[ "$cur" == -* ]]; then
201
201
  opts=""
202
202
  else
203
- opts="create delete start stop scale-up scale-down force-stop restart reload tidy show deploy configure env snapshot"
203
+ opts="configure create delete deploy env force-stop reload restart scale-down scale-up show snapshot start stop tidy"
204
204
  fi
205
205
  ;;
206
206
 
@@ -214,7 +214,7 @@ _rhc()
214
214
 
215
215
  "rhc app create")
216
216
  if [[ "$cur" == -* ]]; then
217
- opts="--app --dns --enable-jenkins --env --from-app --from-code --gear-size --git --namespace --no-dns --no-git --no-keys --no-scaling --repo --scaling --type"
217
+ opts="--app --dns --enable-jenkins --env --from-app --from-code --gear-size --git --namespace --no-dns --no-git --no-keys --no-scaling --region --repo --scaling --type"
218
218
  else
219
219
  opts=""
220
220
  fi
@@ -350,7 +350,7 @@ _rhc()
350
350
 
351
351
  "rhc app-create")
352
352
  if [[ "$cur" == -* ]]; then
353
- opts="--app --dns --enable-jenkins --env --from-app --from-code --gear-size --git --namespace --no-dns --no-git --no-keys --no-scaling --repo --scaling --type"
353
+ opts="--app --dns --enable-jenkins --env --from-app --from-code --gear-size --git --namespace --no-dns --no-git --no-keys --no-scaling --region --repo --scaling --type"
354
354
  else
355
355
  opts=""
356
356
  fi
@@ -488,7 +488,7 @@ _rhc()
488
488
  if [[ "$cur" == -* ]]; then
489
489
  opts=""
490
490
  else
491
- opts="list add delete delete-all"
491
+ opts="add delete delete-all list"
492
492
  fi
493
493
  ;;
494
494
 
@@ -568,7 +568,7 @@ _rhc()
568
568
  if [[ "$cur" == -* ]]; then
569
569
  opts=""
570
570
  else
571
- opts="list add show remove start stop restart status reload scale storage"
571
+ opts="add list reload remove restart scale show start status stop storage"
572
572
  fi
573
573
  ;;
574
574
 
@@ -774,7 +774,7 @@ _rhc()
774
774
 
775
775
  "rhc configure-server")
776
776
  if [[ "$cur" == -* ]]; then
777
- opts="--hostname --insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --use --use-authorization-tokens"
777
+ opts="--hostname --insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --use --use-authorization-tokens"
778
778
  else
779
779
  opts=""
780
780
  fi
@@ -782,7 +782,7 @@ _rhc()
782
782
 
783
783
  "rhc create-app")
784
784
  if [[ "$cur" == -* ]]; then
785
- opts="--app --dns --enable-jenkins --env --from-app --from-code --gear-size --git --namespace --no-dns --no-git --no-keys --no-scaling --repo --scaling --type"
785
+ opts="--app --dns --enable-jenkins --env --from-app --from-code --gear-size --git --namespace --no-dns --no-git --no-keys --no-scaling --region --repo --scaling --type"
786
786
  else
787
787
  opts=""
788
788
  fi
@@ -872,7 +872,7 @@ _rhc()
872
872
  if [[ "$cur" == -* ]]; then
873
873
  opts=""
874
874
  else
875
- opts="list show activate"
875
+ opts="activate list show"
876
876
  fi
877
877
  ;;
878
878
 
@@ -936,7 +936,7 @@ _rhc()
936
936
  if [[ "$cur" == -* ]]; then
937
937
  opts=""
938
938
  else
939
- opts="create rename configure show list delete leave"
939
+ opts="configure create delete leave list rename show"
940
940
  fi
941
941
  ;;
942
942
 
@@ -1064,7 +1064,7 @@ _rhc()
1064
1064
  if [[ "$cur" == -* ]]; then
1065
1065
  opts=""
1066
1066
  else
1067
- opts="add set remove unset list show"
1067
+ opts="add list remove set show unset"
1068
1068
  fi
1069
1069
  ;;
1070
1070
 
@@ -1164,6 +1164,14 @@ _rhc()
1164
1164
  fi
1165
1165
  ;;
1166
1166
 
1167
+ "rhc envs")
1168
+ if [[ "$cur" == -* ]]; then
1169
+ opts="--app --application-id --namespace --quotes --table"
1170
+ else
1171
+ opts=""
1172
+ fi
1173
+ ;;
1174
+
1167
1175
  "rhc force-stop-app")
1168
1176
  if [[ "$cur" == -* ]]; then
1169
1177
  opts="--app --application-id --namespace"
@@ -1180,6 +1188,14 @@ _rhc()
1180
1188
  fi
1181
1189
  ;;
1182
1190
 
1191
+ "rhc help")
1192
+ if [[ "$cur" == -* ]]; then
1193
+ opts=""
1194
+ else
1195
+ opts="account account-logout activate-deployment add-alias add-authorization add-cartridge add-member add-server add-sshkey alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert aliases app app-configure app-create app-delete app-deploy app-env app-force-stop app-reload app-restart app-scale-down app-scale-up app-scp app-show app-snapshot app-ssh app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list authorizations cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage cartridges configure-app configure-domain configure-server create-app create-domain create-team delete-all-authorization delete-app delete-authorization delete-cert-alias delete-domain delete-team deploy deploy-app deployment deployment-activate deployment-list deployment-show deployments domain domain-configure domain-create domain-delete domain-leave domain-list domain-rename domain-show domains env env-add env-list env-remove env-set env-show env-unset envs force-stop-app git-clone leave-domain leave-team list-alias list-authorization list-cartridge list-deployment list-domain list-env list-member list-region list-server list-sshkey list-team logout member member-add member-list member-remove member-update members port-forward region region-list regions reload-app reload-cartridge remove-alias remove-cartridge remove-member remove-server remove-sshkey rename-domain restart-app restart-cartridge restore-snapshot save-snapshot scale-cartridge scale-down-app scale-up-app scp server server-add server-configure server-list server-remove server-show server-status server-use servers set-env setup show-app show-cartridge show-deployment show-domain show-env show-server show-sshkey show-team snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show sshkeys start-app start-cartridge status-cartridge status-server stop-app stop-cartridge storage-cartridge tail team team-create team-delete team-leave team-list team-show teams threaddump tidy-app unset-env update-cert-alias update-member use-server"
1196
+ fi
1197
+ ;;
1198
+
1183
1199
  "rhc leave-domain")
1184
1200
  if [[ "$cur" == -* ]]; then
1185
1201
  opts="--namespace"
@@ -1252,6 +1268,14 @@ _rhc()
1252
1268
  fi
1253
1269
  ;;
1254
1270
 
1271
+ "rhc list-region")
1272
+ if [[ "$cur" == -* ]]; then
1273
+ opts=""
1274
+ else
1275
+ opts=""
1276
+ fi
1277
+ ;;
1278
+
1255
1279
  "rhc list-server")
1256
1280
  if [[ "$cur" == -* ]]; then
1257
1281
  opts=""
@@ -1288,7 +1312,7 @@ _rhc()
1288
1312
  if [[ "$cur" == -* ]]; then
1289
1313
  opts=""
1290
1314
  else
1291
- opts="list add update remove"
1315
+ opts="add list remove update"
1292
1316
  fi
1293
1317
  ;;
1294
1318
 
@@ -1372,6 +1396,38 @@ _rhc()
1372
1396
  fi
1373
1397
  ;;
1374
1398
 
1399
+ "rhc region")
1400
+ if [[ "$cur" == -* ]]; then
1401
+ opts=""
1402
+ else
1403
+ opts="list"
1404
+ fi
1405
+ ;;
1406
+
1407
+ "rhc region list")
1408
+ if [[ "$cur" == -* ]]; then
1409
+ opts=""
1410
+ else
1411
+ opts=""
1412
+ fi
1413
+ ;;
1414
+
1415
+ "rhc region-list")
1416
+ if [[ "$cur" == -* ]]; then
1417
+ opts=""
1418
+ else
1419
+ opts=""
1420
+ fi
1421
+ ;;
1422
+
1423
+ "rhc regions")
1424
+ if [[ "$cur" == -* ]]; then
1425
+ opts=""
1426
+ else
1427
+ opts=""
1428
+ fi
1429
+ ;;
1430
+
1375
1431
  "rhc reload-app")
1376
1432
  if [[ "$cur" == -* ]]; then
1377
1433
  opts="--app --application-id --namespace"
@@ -1504,13 +1560,13 @@ _rhc()
1504
1560
  if [[ "$cur" == -* ]]; then
1505
1561
  opts=""
1506
1562
  else
1507
- opts="status add list use remove configure show"
1563
+ opts="add configure list remove show status use"
1508
1564
  fi
1509
1565
  ;;
1510
1566
 
1511
1567
  "rhc server add")
1512
1568
  if [[ "$cur" == -* ]]; then
1513
- opts="--insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --use --use-authorization-tokens"
1569
+ opts="--insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --use --use-authorization-tokens"
1514
1570
  else
1515
1571
  opts=""
1516
1572
  fi
@@ -1518,7 +1574,7 @@ _rhc()
1518
1574
 
1519
1575
  "rhc server configure")
1520
1576
  if [[ "$cur" == -* ]]; then
1521
- opts="--hostname --insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --use --use-authorization-tokens"
1577
+ opts="--hostname --insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --use --use-authorization-tokens"
1522
1578
  else
1523
1579
  opts=""
1524
1580
  fi
@@ -1566,7 +1622,7 @@ _rhc()
1566
1622
 
1567
1623
  "rhc server-add")
1568
1624
  if [[ "$cur" == -* ]]; then
1569
- opts="--insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --use --use-authorization-tokens"
1625
+ opts="--insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --use --use-authorization-tokens"
1570
1626
  else
1571
1627
  opts=""
1572
1628
  fi
@@ -1574,7 +1630,7 @@ _rhc()
1574
1630
 
1575
1631
  "rhc server-configure")
1576
1632
  if [[ "$cur" == -* ]]; then
1577
- opts="--hostname --insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --use --use-authorization-tokens"
1633
+ opts="--hostname --insecure --nickname --no-insecure --no-use-authorization-tokens --rhlogin --server --skip-wizard --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --use --use-authorization-tokens"
1578
1634
  else
1579
1635
  opts=""
1580
1636
  fi
@@ -1712,7 +1768,7 @@ _rhc()
1712
1768
  if [[ "$cur" == -* ]]; then
1713
1769
  opts=""
1714
1770
  else
1715
- opts="save restore"
1771
+ opts="restore save"
1716
1772
  fi
1717
1773
  ;;
1718
1774
 
@@ -1760,7 +1816,7 @@ _rhc()
1760
1816
  if [[ "$cur" == -* ]]; then
1761
1817
  opts=""
1762
1818
  else
1763
- opts="list show add remove"
1819
+ opts="add list remove show"
1764
1820
  fi
1765
1821
  ;;
1766
1822
 
@@ -1828,6 +1884,14 @@ _rhc()
1828
1884
  fi
1829
1885
  ;;
1830
1886
 
1887
+ "rhc sshkeys")
1888
+ if [[ "$cur" == -* ]]; then
1889
+ opts=""
1890
+ else
1891
+ opts=""
1892
+ fi
1893
+ ;;
1894
+
1831
1895
  "rhc start-app")
1832
1896
  if [[ "$cur" == -* ]]; then
1833
1897
  opts="--app --application-id --namespace"
@@ -1896,7 +1960,7 @@ _rhc()
1896
1960
  if [[ "$cur" == -* ]]; then
1897
1961
  opts=""
1898
1962
  else
1899
- opts="create show list delete leave"
1963
+ opts="create delete leave list show"
1900
1964
  fi
1901
1965
  ;;
1902
1966
 
@@ -1,5 +1,6 @@
1
1
  module RHC::Auth
2
2
  autoload :Basic, 'rhc/auth/basic'
3
+ autoload :X509, 'rhc/auth/x509'
3
4
  autoload :Token, 'rhc/auth/token'
4
5
  autoload :TokenStore, 'rhc/auth/token_store'
5
6
  end
@@ -32,6 +32,14 @@ module RHC::Auth
32
32
  username? and not (password.nil? and @skip_interactive and @no_interactive)
33
33
  end
34
34
 
35
+ def expired_token_message
36
+ "Your authorization token has expired. Please sign in now to continue on #{openshift_server}."
37
+ end
38
+
39
+ def get_token_message
40
+ "Please sign in to start a new session to #{openshift_server}."
41
+ end
42
+
35
43
  attr_reader :username
36
44
 
37
45
  protected
@@ -15,18 +15,27 @@ module RHC::Auth
15
15
  end
16
16
 
17
17
  def to_request(request)
18
- if token
19
- debug "Using token authentication"
20
- (request[:headers] ||= {})['authorization'] = "Bearer #{token}"
21
- elsif auth and (!@allows_tokens or @can_get_token == false)
18
+ if auth and !token and (!@allows_tokens or @can_get_token == false)
22
19
  debug "Bypassing token auth"
23
20
  auth.to_request(request)
21
+ else
22
+ # If no token is available an empty one will be submitted at this
23
+ # point. This is actually required in order for the retry logic to be
24
+ # triggered in all cases.
25
+ #
26
+ # Previously a request with no authentication was submitted to trigger
27
+ # this behavior but it was found not to work in certain scenarios where
28
+ # Broker authentication is handled by Apache. In those cases a 403 is
29
+ # returned and not secondary authentication attempt is made.
30
+ debug "Using token authentication"
31
+ (request[:headers] ||= {})['authorization'] = "Bearer #{token}"
24
32
  end
25
33
  request
26
34
  end
27
35
 
28
36
  def retry_auth?(response, client)
29
- if response.status == 401
37
+ case response.status
38
+ when 401
30
39
  token_rejected(response, client)
31
40
  else
32
41
  false
@@ -74,9 +83,9 @@ module RHC::Auth
74
83
  @can_get_token = client.supports_sessions? && @allows_tokens
75
84
 
76
85
  if has_token
77
- warn "Your authorization token has expired. Please sign in now to continue on #{openshift_server}."
86
+ warn auth.expired_token_message
78
87
  elsif @can_get_token
79
- info "Please sign in to start a new session to #{openshift_server}."
88
+ info auth.get_token_message
80
89
  end
81
90
 
82
91
  return auth.retry_auth?(response, client) unless @can_get_token
@@ -0,0 +1,53 @@
1
+ module RHC::Auth
2
+ class X509
3
+ def initialize(*args)
4
+ @options = args[0] || Commander::Command::Options.new
5
+ end
6
+
7
+ def to_request(request)
8
+ request[:client_cert] = certificate_file(options.ssl_client_cert_file)
9
+ request[:client_key] = rsa_key_file(options.ssl_client_key_file)
10
+ request
11
+ end
12
+
13
+ def certificate_file(file)
14
+ file && OpenSSL::X509::Certificate.new(IO.read(File.expand_path(file)))
15
+ rescue => e
16
+ debug e
17
+ raise OptionParser::InvalidOption.new(nil, "The certificate '#{file}' cannot be loaded: #{e.message} (#{e.class})")
18
+ end
19
+
20
+ def rsa_key_file(file)
21
+ file && OpenSSL::PKey::RSA.new(IO.read(File.expand_path(file)))
22
+ rescue => e
23
+ debug e
24
+ raise OptionParser::InvalidOption.new(nil, "The RSA key '#{file}' cannot be loaded: #{e.message} (#{e.class})")
25
+ end
26
+
27
+ def retry_auth?(response, client)
28
+ # This is really only hit in the case of token auth falling back to x509.
29
+ # x509 auth doesn't usually get 401s.
30
+ if response.status == 401
31
+ true
32
+ else
33
+ false
34
+ end
35
+ end
36
+
37
+ def can_authenticate?
38
+ true
39
+ end
40
+
41
+ def expired_token_message
42
+ "Your authorization token has expired. " + get_token_message
43
+ end
44
+
45
+ def get_token_message
46
+ "Fetching a new token from #{openshift_server}."
47
+ end
48
+
49
+ protected
50
+ include RHC::Helpers
51
+ attr_reader :options
52
+ end
53
+ end
@@ -55,6 +55,14 @@ module RHC
55
55
  end.flatten.compact.sort)
56
56
  @commands[name.to_s] = v
57
57
  end
58
+
59
+ # Inject autocomplete for a help command whose possible actions are all other commands in root or hyphenated form
60
+ @top_level_commands << 'help'
61
+ @commands['help'] = {
62
+ :actions => @commands.keys.sort.select {|c| c != '' && c !~ / /},
63
+ :switches => []
64
+ }
65
+
58
66
  @commands.delete('')
59
67
  @commands = @commands.to_a.sort{ |a,b| a[0] <=> b[0] }
60
68
 
@@ -8,9 +8,9 @@ _rhc()
8
8
  cur="${COMP_WORDS[COMP_CWORD]}"
9
9
  if [ $COMP_CWORD -eq 1 ]; then
10
10
  if [[ "$cur" == -* ]]; then
11
- opts=<%= "\"%s\"" % global_options.join(' ') %>
11
+ opts=<%= "\"%s\"" % global_options.sort.join(' ') %>
12
12
  elif [ -z $cur ]; then
13
- opts=<%= "\"%s\"" % top_level_commands.join(' ') %>
13
+ opts=<%= "\"%s\"" % top_level_commands.sort.join(' ') %>
14
14
  else
15
15
  opts=<%= "\"%s\"" % commands.map{ |c| c.first }.delete_if{ |s| s.include? ' ' }.sort.join(' ') %>
16
16
  fi
@@ -22,9 +22,9 @@ _rhc()
22
22
  <%- for name, data in commands %>
23
23
  <%= "\"rhc %s\")" % name %>
24
24
  if [[ "$cur" == -* ]]; then
25
- opts=<%= "\"%s\"" % data[:switches].join(" ") %>
25
+ opts=<%= "\"%s\"" % data[:switches].sort.join(" ") %>
26
26
  else
27
- opts=<%= "\"%s\"" % data[:actions].join(" ") %>
27
+ opts=<%= "\"%s\"" % data[:actions].sort.join(" ") %>
28
28
  fi
29
29
  ;;
30
30
  <%- end %>
@@ -58,6 +58,7 @@ module RHC::Commands
58
58
  option ["-e", "--env VARIABLE=VALUE"], "Environment variable(s) to be set on this app, or path to a file containing environment variables", :type => :list
59
59
  option ["--from-app NAME"], "Create based on another application. All content and configurations will be copied from the original app."
60
60
  option ["--from-code URL"], "URL to a Git repository that will become the initial contents of the application"
61
+ option ["--region REGION"], "The region where the application gears will be located"
61
62
  option ["--[no-]git"], "Skip creating the local Git repository."
62
63
  option ["--[no-]dns"], "Skip waiting for the application DNS name to resolve. Must be used in combination with --no-git"
63
64
  option ['--no-keys'], "Skip checking SSH keys during app creation", :hide => true
@@ -77,7 +78,7 @@ module RHC::Commands
77
78
 
78
79
  if options.from_app
79
80
  raise RHC::AppCloneNotSupportedException, "The server does not support creating apps based on others (rhc create-app --from-app)." if (!rest_domain.has_param?('ADD_APPLICATION', 'cartridges[][name]') || !rest_domain.has_param?('ADD_APPLICATION', 'cartridges[][url]'))
80
- raise ArgumentError, "Option --from-code is incompatible with --from--app. When creating an app based on another resource you can either specify a Git repository URL with --from-code or an existing app name with --from-app." if options.from_code
81
+ raise ArgumentError, "Option --from-code is incompatible with --from-app. When creating an app based on another resource you can either specify a Git repository URL with --from-code or an existing app name with --from-app." if options.from_code
81
82
  raise ArgumentError, "Option --no-dns is incompatible with --from-app. We need to propagate the new app DNS to be able to configure it." if options.dns == false
82
83
  raise ArgumentError, "Do not specify cartridges when creating an app based on another one. All cartridges will be copied from the original app." if !(cartridges || []).empty?
83
84
 
@@ -106,9 +107,13 @@ module RHC::Commands
106
107
  end
107
108
 
108
109
  scaling = options.scaling
110
+ region = options.region
111
+
112
+ raise RHC::RegionsAndZonesNotSupportedException if region.present? && !rest_client.supports_regions_and_zones?
109
113
 
110
114
  if from_app
111
115
  scaling = from_app.scalable if scaling.nil?
116
+ region = from_app.region if region.nil?
112
117
 
113
118
  cartridges = from_app.cartridges.reject{|c| c.tags.include?('web_proxy')}.collect do |cartridge|
114
119
  {
@@ -131,6 +136,7 @@ module RHC::Commands
131
136
  ["Gear Size:", options.gear_size || (from_app ? "Copied from '#{from_app.name}'" : "default")],
132
137
  ["Scaling:", (scaling ? "yes" : "no") + (from_app && options.scaling.nil? ? " (copied from '#{from_app.name}')" : '')],
133
138
  (["Environment Variables:", env.map{|item| "#{item.name}=#{item.value}"}.join(', ')] if env.present?),
139
+ (["Region:", region + (from_app && options.region.nil? ? " (copied from '#{from_app.name}')" : '')] if region),
134
140
  ].compact
135
141
  )
136
142
  end
@@ -139,7 +145,7 @@ module RHC::Commands
139
145
  say "Creating application '#{name}' ... "
140
146
 
141
147
  # create the main app
142
- rest_app = create_app(name, cartridges, rest_domain, options.gear_size, scaling, options.from_code, env, options.auto_deploy, options.keep_deployments, options.deployment_branch, options.deployment_type)
148
+ rest_app = create_app(name, cartridges, rest_domain, options.gear_size, scaling, options.from_code, env, options.auto_deploy, options.keep_deployments, options.deployment_branch, options.deployment_type, region)
143
149
  success "done"
144
150
 
145
151
  paragraph{ indent{ success rest_app.messages.map(&:strip) } }
@@ -403,19 +409,25 @@ module RHC::Commands
403
409
  end
404
410
 
405
411
  elsif options.gears
406
- gear_info = find_app(:with_gear_groups => true).map do |group|
412
+ domain, app = discover_domain_and_app
413
+ gear_info = rest_client.find_application_gear_groups_endpoints(domain, app).map do |group|
407
414
  group.gears.map do |gear|
408
415
  [
409
416
  gear['id'],
410
- gear['state'] == 'started' ? gear['state'] : color(gear['state'], :yellow),
411
- group.cartridges.collect{ |c| c['name'] }.join(' '),
412
- group.gear_profile,
417
+ gear['state'] == 'started' ? color(gear['state'], :green) : color(gear['state'], :yellow),
418
+ (gear['endpoints'].blank? ? group.cartridges : gear['endpoints']).collect{ |c| c['cartridge_name'] || c['name'] }.join(' '),
419
+ group.gear_profile,
420
+ gear['region'],
421
+ gear['zone'],
413
422
  ssh_string(gear['ssh_url'])
414
423
  ]
415
424
  end
416
425
  end.flatten(1)
417
426
 
418
- say table(gear_info, :header => ['ID', 'State', 'Cartridges', 'Size', 'SSH URL'])
427
+ explicit_regions = gear_info.select{|i| !i[4].nil?}.present?
428
+ explicit_zones = gear_info.select{|i| !i[5].nil?}.present?
429
+
430
+ say table(gear_info.map(&:compact), :header => ['ID', 'State', 'Cartridges', 'Size', explicit_regions ? 'Region' : nil, explicit_zones ? 'Zone' : nil, 'SSH URL'].compact)
419
431
 
420
432
  elsif options.configuration
421
433
  display_app_configurations(find_app)
@@ -561,7 +573,7 @@ module RHC::Commands
561
573
  result
562
574
  end
563
575
 
564
- def create_app(name, cartridges, rest_domain, gear_size=nil, scale=nil, from_code=nil, environment_variables=nil, auto_deploy=nil, keep_deployments=nil, deployment_branch=nil, deployment_type=nil)
576
+ def create_app(name, cartridges, rest_domain, gear_size=nil, scale=nil, from_code=nil, environment_variables=nil, auto_deploy=nil, keep_deployments=nil, deployment_branch=nil, deployment_type=nil, region=nil)
565
577
  app_options = {:cartridges => Array(cartridges)}
566
578
  app_options[:gear_profile] = gear_size if gear_size
567
579
  app_options[:scale] = scale if scale
@@ -572,6 +584,7 @@ module RHC::Commands
572
584
  app_options[:keep_deployments] = keep_deployments if keep_deployments
573
585
  app_options[:deployment_branch] = deployment_branch if deployment_branch
574
586
  app_options[:deployment_type] = deployment_type if deployment_type
587
+ app_options[:region] = region if region
575
588
  debug "Creating application '#{name}' with these options - #{app_options.inspect}"
576
589
  rest_domain.add_application(name, app_options)
577
590
  rescue RHC::Rest::Exception => e