rhc 1.27.4 → 1.28.5

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.
@@ -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