cben / mathdown

Collaborative markdown with math
https://www.mathdown.net
Other
421 stars 46 forks source link

RHcloud deploys get stuck & time out #115

Closed cben closed 8 years ago

cben commented 8 years ago

Bah! Why won't production Just Work and leave me alone? :-(

Tonight:

+ git push rhcloud origin/gh-pages:master
Counting objects: 18, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (18/18), 3.20 KiB | 0 bytes/s, done.
Total 18 (delta 10), reused 0 (delta 0)
remote: Stopping NodeJS cartridge
remote: Thu Aug 13 2015 18:34:04 GMT-0400 (EDT): Stopping application 'mathdown' ...
remote: Thu Aug 13 2015 18:34:06 GMT-0400 (EDT): Stopped Node application 'mathdown'

Write failed: Broken pipe
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

today I re-run deploy.sh (same up to README changes) and it's now stuck too on:

remote: Stopping NodeJS cartridge
remote: Fri Aug 14 2015 03:05:52 GMT-0400 (EDT): Stopping application 'mathdown' ...
remote: Fri Aug 14 2015 03:05:52 GMT-0400 (EDT): Stopped Node application 'mathdown'

https://mathdown-cben.rhcloud.com/haproxy-status/ shows it's the "local-gear" (the one co-living with haproxy)

cben commented 8 years ago

Will wait to see if it comes back automatically (just out of curiousity).

Then probably will pull the "Restart Application" trigger in the dashboard.

cben commented 8 years ago

git push is still stuck; the gear is back up. interestingly, both gears have been restarted — 9m37s UP (local) & 10m20s UP (the other). If both have been pushed, git push should have printed a lot about that. https://mathdown-cben.rhcloud.com/deployment/deploy.sh (new file in this commit) is 404.

$ rhc ssh --gears mathdown -- ls app-root/repo/deployment
=== 546a6d7e5973cac907000028 haproxy-1.4+nodejs-0.10
deploy.sh
dns-cloudflare
dns-dnsimple
README.md
tls-certs-startcom
=== 54e3b3f2fcf933a3060000cd haproxy-1.4+nodejs-0.10
dns-cloudflare
dns-dnsimple
README.md
tls-certs-startcom

Yes, only one has been deployed. (conceptually, that's worse than one node staying down: mixed versions served randomly to users!)

It's strange they're both listed as having haproxy! But rhc ssh --gears mathdown -- ps aux shows only 546a6d7e5973cac907000028 actually runs haproxy.

cben commented 8 years ago

Pulled the restart trigger => Application mathdown has restarted. ssh ls shows they're still mixed versions :-( Let's try deploy again.

cben commented 8 years ago
+ git push rhcloud origin/gh-pages:master
Everything up-to-date

Since the main gear is up-to-date and the secondary isn't, let's try reducing to 1 gear and back.

cben commented 8 years ago

Downscaling from 2–5 gears to 1–1 worked. Upscaling back to 2–5 failed, twice:

Unable to complete the requested operation. Show less

deployment_id must be supplied Unable to complete the requested operation due to: An invalid exit code (1) was returned from the server ex-std-node638.prod.rhcloud.com. This indicates an unexpected problem during the execution of your request. Reference ID: 9aba0349e6e0858d78523d977b666ea6

should contact support.

cben commented 8 years ago

git fsck on the gear (under app-root/git/mathdown.git) had no complaints.

Didn't find any problems (or generally traces of the attempted deploys & scaling) anywhere in app-root/logs/...

Same from command line:

$ rhc cartridge scale -a mathdown
Missing required argument 'cartridge'.
Usage: rhc cartridge-scale <cartridge> [multiplier] [--namespace NAME] [--app NAME] [--min min] [--max max]
Pass '--help' to see the full list of options
~ $ rhc cartridge scale node -a mathdown --min 2 --max 5
Using nodejs-0.10 (Node.js 0.10) for 'node'
This operation will run until the application is at the minimum scale and may take several minutes.
Setting scale range for nodejs-0.10 ... 
Unable to complete the requested operation due to: An invalid exit code (1) was returned from the server ex-std-node638.prod.rhcloud.com.  This indicates an unexpected problem during the execution of your
request.
Reference ID: 05e26de2bd916e2fd87907a53a5c8108

Turns out I have no support on bronze plan, only IRC. Though that might be actually faster. Except it might be unproductive if I can't stay in the conversation.

A hypothesis I want to check: now that I have 1 gear, git push deploys will probably work. It seems it's the main gear -> extra gears deploy that's borked.

cben commented 8 years ago

Simpler idea: since RHcloud currenly only serves mathdown.com (mathdown.net points to Heroku), I'll just destroy and re-create the app. I'm 90% sure it'll work.

cben commented 8 years ago

First did a last experiment:

$ rhc app tidy -a mathdown
RESULT:
mathdown cleaned up

followed by deploy.sh. I don't really expect app tidy to help but the deploy might succeed since I now have only 1 gear. (Side effect of having 1 gear: "Monitor is DOWN: mathdown.com" — deploys cause downtime)

=> Yes, deploy worked.

cben commented 8 years ago

But as already established, main gear -> extra gears copy is the broken part:

$ rhc cartridge scale node -a mathdown --min 2 --max 5
Using nodejs-0.10 (Node.js 0.10) for 'node'
This operation will run until the application is at the minimum scale and may take several minutes.
Setting scale range for nodejs-0.10 ... Server returned an unexpected error code: 504
cben commented 8 years ago

Pulled the trigger:

$ rhc app delete -a mathdown
... deleted

Created via Launch on OpenShift button in readme. Enabled scaling (but still at 1 gear). Wow, it's slow. (aka I'm spoiled by Heroku). App exists, haproxy still shows 0 gears, gear status in dashboard is "Building". Scaling is default 1-16.

Wait, what just happened?!

Application '55e22d8f7628e18a6f0000d9' does not exist Reference #92544a002fc757c7b015476bc10d0cb7

cben commented 8 years ago

random theory (for what just happened, not the original issue): I hit the inodes limit. This doesn't hold water. mathdown8staging was created fine (though it's now giving 95% inodes warning).

Anyway trying again, this time will increase to 2GB as soon as dashboard is live. => "Unable to perform action on app object. Another operation is already running."

Bah.

Application '55e230252d5271f1970000d6' does not exist

OK, again, without scaling (which is how the Launch on OpenShift has worked so far).

cben commented 8 years ago

Yay! It's up. Set storage to 2GB.

Bah! I can't turn it to scalable now :-(

mathdown is not scalable

This application is not currently scalable. For the time being applications must be set to scale when they are created. To make a new application scalable you will need to pass the command line option --scaling:

rhc create-app --scaling -a ... or select "scaling" from the advanced options on the Create Application page.

cben commented 8 years ago

OK, let's set up TLS certs to be back up, tomorrow study the problem on another app.

$ ./deployment/tls-certs-startcom/rhc-set-certs.sh mathdown ~/StartSSL/my-private-decrypted.key
++ dirname ./deployment/tls-certs-startcom/rhc-set-certs.sh
+ cd ./deployment/tls-certs-startcom
+ appopts=($1)
+ '[' -z '' ']'
+ keyopts=(--private-key="$2")
+ cat mathdown.com-until-2016-02-12.pem StartCom-chain-sub.class1.server.ca.pem
+ cat mathdown.net-until-2016-02-15.pem StartCom-chain-sub.class1.server.ca.pem
+ echo '== before: =='
== before: ==
+ rhc alias list mathdown
No aliases associated with the application mathdown.
+ rhc alias add mathdown mathdown.net
Alias 'mathdown.net' has been added.
+ rhc alias add mathdown www.mathdown.net
Alias 'www.mathdown.net' has been added.
+ rhc alias add mathdown mathdown.com
Alias 'mathdown.com' has been added.
+ rhc alias add mathdown www.mathdown.com
Alias 'www.mathdown.com' has been added.
+ rhc alias update-cert mathdown mathdown.net --certificate GENERATED-CHAINED-mathdown.net.pem --private-key=/home/beni/StartSSL/my-private-decrypted.key
SSL certificate successfully added.
+ rhc alias update-cert mathdown www.mathdown.net --certificate GENERATED-CHAINED-mathdown.net.pem --private-key=/home/beni/StartSSL/my-private-decrypted.key
SSL certificate successfully added.
+ rhc alias update-cert mathdown mathdown.com --certificate GENERATED-CHAINED-mathdown.com.pem --private-key=/home/beni/StartSSL/my-private-decrypted.key
SSL certificate successfully added.
+ rhc alias update-cert mathdown www.mathdown.com --certificate GENERATED-CHAINED-mathdown.com.pem --private-key=/home/beni/StartSSL/my-private-decrypted.key
SSL certificate successfully added.
+ echo '== after: =='
== after: ==
+ rhc alias list mathdown
Alias            Has Certificate? Certificate Added
---------------- ---------------- -----------------
mathdown.net     yes              2015-08-29
www.mathdown.net yes              2015-08-29
mathdown.com     yes              2015-08-29
www.mathdown.com yes              2015-08-29

New theory: the gear state wasn't broken, there is something inherent in my current code that's undeployable to a new gear. Best random guess: npm shrinkwrap (see warnings https://github.com/cben/mathdown/issues/82#issuecomment-131003794). But I can do better that guess: I can create from empty repo and and then try pushing current code, and I can even git bisect creation (by moving a branch wherever git bisect points me)!

cben commented 8 years ago

Postmortem

cben commented 8 years ago

BTW, yes, http{s,}://{www.,}mathdown.com are back up (manually and pass smoke test).

cben commented 8 years ago

Tried first(?) commit that was supposed to run on rhcloud: $ git branch bisect 759c608edc9b2144a37c8c450bcb39541f8de8a0

$ git push origin bisect
$ rhc app create -n cben -a mathdown8bisect --from-code https://github.com/cben/mathdown\#bisect --scaling -t nodejs-0.10
Application Options
-------------------
Domain:      cben
Cartridges:  nodejs-0.10
Source Code: https://github.com/cben/mathdown#bisect
Gear Size:   default
Scaling:     yes

Creating application 'mathdown8bisect' ... Server returned an unexpected error code: 504

However, without --scaling it fails with same 504 error. Looking for a different commit...

cben commented 8 years ago

#gh-pages with no --scaling worked. So the command line is correct.

Trying the slightly later fe166dd29b242e39c62720d8da80bd2770da62c7, which according to commit messages seems to have been the first that really worked on RHcloud.

The bad news is that it too failed even without --scaling. The good news is that at last I see some detailed output!

$ git branch bisect fe166dd29b242e39c62720d8da80bd2770da62c7 -f
$ rhc app create -n cben -a mathdown8bisect --from-code https://github.com/cben/mathdown\#bisect -t nodejs-0.10
Application Options
-------------------
Domain:      cben
Cartridges:  nodejs-0.10
Source Code: https://github.com/cben/mathdown#bisect
Gear Size:   default
Scaling:     no

Creating application 'mathdown8bisect' ... Warning: Gear 55e34cb10c1e66bd2000019c is using 96.4% of inodes allowed
The initial build for the application failed: Shell command '/sbin/runuser -s /bin/sh
55e34cb10c1e66bd2000019c -c "exec /usr/bin/runcon 'unconfined_u:system_r:openshift_t:s0:c1,c841' /bin/sh
-c \"gear postreceive --init >> /tmp/initial-build.log 2>&1\""' returned an error. rc=255

.Last 10 kB of build output:
11
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/http-signature/node_modules/asn1
npm info linkStuff asn1@0.1.11
npm info install asn1@0.1.11
npm info postinstall asn1@0.1.11
npm info preinstall hawk@0.13.1
npm info retry fetch attempt 1 at 14:36:23
npm info retry fetch attempt 1 at 14:36:23
npm info retry fetch attempt 1 at 14:36:23
npm http GET https://registry.npmjs.org/hoek/-/hoek-0.8.5.tgz
npm info retry fetch attempt 1 at 14:36:23
npm http GET https://registry.npmjs.org/boom/-/boom-0.4.2.tgz
npm http GET https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz
npm http GET https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz
npm http 200 https://registry.npmjs.org/hoek/-/hoek-0.8.5.tgz
npm http 200 https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz
npm http 200 https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz
npm http 200 https://registry.npmjs.org/boom/-/boom-0.4.2.tgz
npm info install hoek@0.8.5 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info install cryptiles@0.2.2 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info install sntp@0.2.4 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info install boom@0.4.2 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info installOne hoek@0.8.5
npm info installOne cryptiles@0.2.2
npm info installOne sntp@0.2.4
npm info installOne boom@0.4.2
npm info preinstall form-data@0.0.8
npm info trying registry request attempt 1 at 14:36:23
npm http GET https://registry.npmjs.org/async
npm info preinstall cryptiles@0.2.2
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/cryptiles
npm info linkStuff cryptiles@0.2.2
npm info install cryptiles@0.2.2
npm info postinstall cryptiles@0.2.2
npm http 304 https://registry.npmjs.org/async
npm info retry fetch attempt 1 at 14:36:23
npm http GET https://registry.npmjs.org/async/-/async-0.2.10.tgz
npm info preinstall sntp@0.2.4
npm http 200 https://registry.npmjs.org/async/-/async-0.2.10.tgz
npm info retry fetch attempt 1 at 14:36:23
npm http GET https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz
npm info install combined-stream@0.0.7 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data
npm info install async@0.2.10 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data
npm info installOne combined-stream@0.0.7
npm info installOne async@0.2.10
npm info preinstall boom@0.4.2
npm http 200 https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz
npm info install hoek@0.9.1 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/sntp
npm info installOne hoek@0.9.1
npm info install hoek@0.9.1 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/boom
npm info installOne hoek@0.9.1
npm info preinstall ctype@0.5.2
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/http-signature/node_modules/ctype
npm info linkStuff ctype@0.5.2
npm info install ctype@0.5.2
npm info postinstall ctype@0.5.2
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/http-signature
npm info linkStuff http-signature@0.9.11
npm info install http-signature@0.9.11
npm info postinstall http-signature@0.9.11
npm info preinstall combined-stream@0.0.7
npm info install delayed-stream@0.0.5 into
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/combined-stream
npm info installOne delayed-stream@0.0.5
npm info preinstall hoek@0.8.5
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/hoek
npm info linkStuff hoek@0.8.5
npm info install hoek@0.8.5
npm info postinstall hoek@0.8.5
npm info preinstall async@0.2.10
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/async
npm info linkStuff async@0.2.10
npm info install async@0.2.10
npm info postinstall async@0.2.10
npm info preinstall delayed-stream@0.0.5
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream
npm info linkStuff delayed-stream@0.0.5
npm info install delayed-stream@0.0.5
npm info postinstall delayed-stream@0.0.5
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/combined-stream
npm info linkStuff combined-stream@0.0.7
npm info install combined-stream@0.0.7
npm info postinstall combined-stream@0.0.7
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data
npm info linkStuff form-data@0.0.8
npm info install form-data@0.0.8
npm info postinstall form-data@0.0.8
npm info preinstall hoek@0.9.1
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/sntp/node_modules/hoek
npm info linkStuff hoek@0.9.1
npm info install hoek@0.9.1
npm info postinstall hoek@0.9.1
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/sntp
npm info linkStuff sntp@0.2.4
npm info install sntp@0.2.4
npm info postinstall sntp@0.2.4
npm info preinstall hoek@0.9.1
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/boom/node_modules/hoek
npm info linkStuff hoek@0.9.1
npm info install hoek@0.9.1
npm info postinstall hoek@0.9.1
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/boom
npm info linkStuff boom@0.4.2
npm info install boom@0.4.2
npm info postinstall boom@0.4.2
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info linkStuff hawk@0.13.1
npm info install hawk@0.13.1
npm info postinstall hawk@0.13.1
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request
npm info linkStuff request@2.21.0
npm info install request@2.21.0
npm info postinstall request@2.21.0
npm info build
/var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo/node_modules/sauce-tunnel
npm info linkStuff sauce-tunnel@2.2.3
npm info install sauce-tunnel@2.2.3
npm info postinstall sauce-tunnel@2.2.3
npm info build /var/lib/openshift/55e34cb10c1e66bd2000019c/app-root/runtime/repo
npm info linkStuff mathdown@0.0.0
npm info install mathdown@0.0.0
npm info postinstall mathdown@0.0.0
npm info prepublish mathdown@0.0.0
chalk@1.1.1 node_modules/chalk
├── escape-string-regexp@1.0.3
├── supports-color@2.0.0
├── ansi-styles@2.1.0
├── has-ansi@2.0.0 (ansi-regex@2.0.0)
└── strip-ansi@3.0.0 (ansi-regex@2.0.0)

coffee-script@1.9.3 node_modules/coffee-script

st@0.5.5 node_modules/st
├── graceful-fs@4.1.2
├── negotiator@0.5.3
├── mime@1.3.4
├── fd@0.0.2
├── bl@1.0.0 (readable-stream@2.0.2)
└── async-cache@1.0.0 (lru-cache@2.3.1)

wd@0.3.12 node_modules/wd
├── vargs@0.1.0
├── async@1.0.0
├── q@1.4.1
├── underscore.string@3.0.3
├── request@2.55.0 (caseless@0.9.0, aws-sign2@0.5.0, forever-agent@0.6.1, stringstream@0.0.4,
oauth-sign@0.6.0, tunnel-agent@0.4.1, isstream@0.1.2, json-stringify-safe@5.0.1, node-uuid@1.4.3,
qs@2.4.2, combined-stream@0.0.7, form-data@0.2.0, mime-types@2.0.14, http-signature@0.10.1, bl@0.9.4,
tough-cookie@2.0.0, hawk@2.3.1, har-validator@1.8.0)
├── archiver@0.14.4 (buffer-crc32@0.2.5, lazystream@0.1.0, async@0.9.2, readable-stream@1.0.33,
tar-stream@1.1.5, zip-stream@0.5.2, glob@4.3.5, lodash@3.2.0)
└── lodash@3.9.3

sauce-tunnel@2.2.3 node_modules/sauce-tunnel
├── split@0.3.3 (through@2.3.8)
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.1.0, supports-color@1.3.1, strip-ansi@2.0.1,
has-ansi@1.0.3)
└── request@2.21.0 (json-stringify-safe@4.0.0, forever-agent@0.5.2, aws-sign@0.3.0, qs@0.6.6,
tunnel-agent@0.3.0, oauth-sign@0.3.0, cookie-jar@0.3.0, mime@1.2.11, node-uuid@1.4.3,
http-signature@0.9.11, form-data@0.0.8, hawk@0.13.1)
npm info ok 
Preparing build for deployment
Deployment id is 774b45e5
Activating deployment
Starting NodeJS cartridge
Sun Aug 30 2015 14:36:50 GMT-0400 (EDT): Starting application 'mathdown8bisect' ...
Waiting for application port (8080) become available ...
Application 'mathdown8bisect' failed to start (port 8080 not available)
-------------------------
Git Post-Receive Result: failure
Activation status: failure
Activation failed for the following gears:
55e34cb10c1e66bd2000019c (Error activating gear: CLIENT_ERROR: Failed to execute: 'control start' for
/var/lib/openshift/55e34cb10c1e66bd2000019c/nodejs
#<IO:0x00000002450298>
#<IO:0x00000002450220>
)
Deployment completed with status: failure
postreceive failed
cben commented 8 years ago

Wait, I forgot to push. So the above was still for 759c608edc9b2144a37c8c450bcb39541f8de8a0. The error is as expected: at that revision, the server did not start/did not listen on 8080.

cben commented 8 years ago

I did a few steps of bisecting to find where it starts working without --scaling. Except I got some of the good/bad inverted. 468cf5aaf346a62f73717bf1011590e8da346f7d works without scaling, but "app create" got stuck and never exited. It seems same commit worked with scaling too! => running an automated bisect for the night...

cben commented 8 years ago

Bisecting via re-pointing the 'bisect' branch fell over itself in a cascade of The supplied application name 'mathdown8bisect' already exists and Unable to perform action on app object. Another operation is already running. errors... (Also it created CI noise as Travis & Codeship checked out the branch only to have it move during checkout.)

So I switched to per-commit apps and discovered it's possible to give --from-code a commit SHA1 instead of branch. Current bisect.sh:

#!/bin/bash -x
set -e
COMMIT="$(git rev-parse HEAD)"
APP="mathdown$(echo $COMMIT | git rev-parse --short=10 HEAD)"
echo
echo "==== $COMMIT ===="
echo
rhc app create -n cben -a $APP --from-code https://github.com/cben/mathdown\#$COMMIT -t nodejs-0.10 --scaling
curl http://$APP-cben.rhcloud.com/ | grep MathJax
#echo yes | rhc app delete -a $APP || true
cben commented 8 years ago

Turns out sometimes I get 504 code yet the app was created and works fine:

$ ./bisect.sh 
+ set -e
++ git rev-parse HEAD
+ COMMIT=97354e5f7a08095a6be331658986d1c1379842f4
+ echo

+ echo '==== 97354e5f7a08095a6be331658986d1c1379842f4 ===='
==== 97354e5f7a08095a6be331658986d1c1379842f4 ====
+ echo

++ echo 97354e5f7a08095a6be331658986d1c1379842f4
++ head -c 10
+ APP=mathdown97354e5f7a
+ rhc app create -n cben -a mathdown97354e5f7a --from-code https://github.com/cben/mathdown#97354e5f7a08095a6be331658986d1c1379842f4 -t nodejs-0.10 --scaling
Application Options
-------------------
Domain:      cben
Cartridges:  nodejs-0.10
Source Code: https://github.com/cben/mathdown#97354e5f7a08095a6be331658986d1c1379842f4
Gear Size:   default
Scaling:     yes

Creating application 'mathdown97354e5f7a' ... Server returned an unexpected error code: 504

https://mathdown97354e5f7a-cben.rhcloud.com/?doc=about

Same story at b3eda26cbb1d703e15254d85c023cc8cb5607acc — 504 but exists. Let's log in and see what's up:

[mathdownb3eda26cbb-cben.rhcloud.com 55e4381389f5cf028d000194]\> pstree 
?─┬─bash───ruby───{ruby}
  ├─haproxy
  ├─logshifter───5*[{logshifter}]
  └─logshifter───4*[{logshifter}]
[mathdownb3eda26cbb-cben.rhcloud.com 55e4381389f5cf028d000194]\> pstree -hap
Segmentation fault (core dumped)

weird but whatever. somewhat later:

...
[mathdownb3eda26cbb-cben.rhcloud.com 55e4381389f5cf028d000194]\> ps auxf
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
4348     182208  0.0  0.0 108792  2744 ?        S    07:26   0:00 sshd: 55e4381389f5cf028d000194@pts/0
4348     182209  0.2  0.0 106640  2224 pts/0    Ss   07:26   0:00  \_ /bin/bash --init-file /usr/bin/rhcsh -i
4348     186512  2.0  0.0 108104   972 pts/0    R+   07:27   0:00      \_ ps auxf
4348     170317  0.0  0.0 106104  1168 ?        Ss   07:23   0:00 /bin/sh -c gear postreceive --init >> /tmp/initial-build.log 2>&1
4348     170318  5.5  0.2 362372 36776 ?        Sl   07:23   0:11  \_ ruby /usr/bin/gear postreceive --init
4348     183895  0.0  0.0   9232  1060 ?        S    07:26   0:00      \_ sh -c tar -c --exclude metadata.json . | tar -xO | sha1sum | cut -f 1 -d ' '
4348     183898 11.2  0.0  17072   984 ?        D    07:26   0:01          \_ tar -c --exclude metadata.json .
4348     183899  1.0  0.0  17072   928 ?        S    07:26   0:00          \_ tar -xO
4348     183900  1.4  0.0   4084   532 ?        S    07:26   0:00          \_ sha1sum
4348     183901  0.0  0.0   4092   500 ?        S    07:26   0:00          \_ cut -f 1 -d  
4348     170050  0.0  0.0 120216  2348 ?        Sl   07:23   0:00 /usr/bin/logshifter -tag haproxy_ctld
4348     170049  0.0  0.0   9240  1108 ?        S    07:23   0:00 bash /var/lib/openshift/55e4381389f5cf028d000194/haproxy/usr/bin/haproxy_ctld
4348     170061  0.0  0.0  40768  8160 ?        Sl   07:23   0:00  \_ ruby /var/lib/openshift/55e4381389f5cf028d000194/haproxy/usr/bin/haproxy_ctld.rb
4348     170048  0.0  0.0  15368  1288 ?        S    07:23   0:00 /usr/sbin/haproxy -f /var/lib/openshift/55e4381389f5cf028d000194/haproxy//conf/haproxy.cfg
4348     170047  0.0  0.0 261532  4444 ?        Sl   07:23   0:00 /usr/bin/logshifter -tag haproxy

Later: By now dashboard shows gear as "Started" but browsing still returns "503 Service Unavailable".

[mathdownb3eda26cbb-cben.rhcloud.com 55e4381389f5cf028d000194]\> ps auxf
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
4348     182208  0.0  0.0 108792  2744 ?        S    07:26   0:00 sshd: 55e4381389f5cf028d000194@pts/0
4348     182209  0.0  0.0 106640  2224 pts/0    Ss   07:26   0:00  \_ /bin/bash --init-file /usr/bin/rhcsh -i
4348     197292  0.0  0.0 108104   972 pts/0    R+   07:29   0:00      \_ ps auxf
4348     187163  0.0  0.0 185624  4404 ?        Sl   07:27   0:00 /usr/bin/logshifter -tag nodejs
4348     187162  0.0  0.0 796712 11928 ?        Sl   07:27   0:00 node /opt/rh/nodejs010/root/usr/bin/supervisor -e node|js|coffee -p 10000 --watch /var/lib/openshift/55e4381389f5cf028d000194/app-root/data/.nod
4348     187182  0.1  0.1 692860 18764 ?        Sl   07:27   0:00  \_ node /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/.bin/coffee server.coffee
4348     170050  0.0  0.0 120216  2344 ?        Sl   07:23   0:00 /usr/bin/logshifter -tag haproxy_ctld
4348     170049  0.0  0.0   9240  1108 ?        S    07:23   0:00 bash /var/lib/openshift/55e4381389f5cf028d000194/haproxy/usr/bin/haproxy_ctld
4348     170061  0.0  0.0  40768  8160 ?        Sl   07:23   0:00  \_ ruby /var/lib/openshift/55e4381389f5cf028d000194/haproxy/usr/bin/haproxy_ctld.rb
4348     170048  0.0  0.0  15368  1288 ?        S    07:23   0:00 /usr/sbin/haproxy -f /var/lib/openshift/55e4381389f5cf028d000194/haproxy//conf/haproxy.cfg
4348     170047  0.0  0.0 261532  4440 ?        Sl   07:23   0:00 /usr/bin/logshifter -tag haproxy

What's weird is that nodejs.log says it's listening on 8080, running curl 'http://127.8.126.1:8080/?doc=demo' from within the node is wrong, yet it publicly returns 503?! Aha! https://mathdownb3eda26cbb-cben.rhcloud.com/haproxy-status/ shows that Haproxy is unaware the nodejs gear even exists.

Let's try scaling?

=> What I think happens is simply that 504 is an arbitrary timeout!

cben commented 8 years ago

Googling!

OH! Searching "rhc app create 504" revealed several things, including https://bugzilla.redhat.com/show_bug.cgi?id=975540#c8 — yes, the broker can time out before it's ready — and the fact that rhc commands take an (undocumented in --help!) -d / --debug flag :-) For example:

$ rhc cartridge scale node -a mathdownb3eda26cbb --min 2 --max 5 -d
DEBUG: Using config file /home/beni/.openshift/express.conf
DEBUG: Git config 'git config --get rhc.app-id' returned ''
DEBUG: Git config 'git config --get rhc.app-name' returned ''
DEBUG: Git config 'git config --get rhc.domain-name' returned ''
DEBUG: Authenticating with RHC::Auth::Token
DEBUG: Connecting to https://openshift.redhat.com/broker/rest/api
DEBUG: Getting all domains
DEBUG: Client supports API versions 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7
DEBUG: Created new httpclient
DEBUG: Request GET https://openshift.redhat.com/broker/rest/api
DEBUG:    code 200  837 ms
DEBUG: Server supports API versions 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7
DEBUG:    Using API version 1.7
DEBUG: Client API version 1.7 is not current. Refetching API
DEBUG: Request GET https://openshift.redhat.com/broker/rest/api
DEBUG:    code 200  203 ms
DEBUG: Using token authentication
DEBUG: Request GET https://openshift.redhat.com/broker/rest/domains
DEBUG:    code 200  183 ms
DEBUG: Using token authentication
DEBUG: Request GET https://openshift.redhat.com/broker/rest/domain/cben/application/mathdownb3eda26cbb?include=cartridges
DEBUG:    code 200  386 ms
Using nodejs-0.10 (Node.js 0.10) for 'node'
This operation will run until the application is at the minimum scale and may take several minutes.
Setting scale range for nodejs-0.10 ... DEBUG: Setting scales = scales_from: 2 scales_to: 5
DEBUG: Using token authentication
DEBUG: Request PUT https://openshift.redhat.com/broker/rest/application/55e4381389f5cf028d000194/cartridge/nodejs-0.10
DEBUG:    code 422 276805 ms
Warning: Gear 55e4381389f5cf028d000194 is using 96.5% of inodes allowed
The initial build for the application failed: Shell command '/sbin/runuser -s /bin/sh 55e4381389f5cf028d000194 -c "exec /usr/bin/runcon 'unconfined_u:system_r:openshift_t:s0:c4,c266' /bin/sh -c \"gear
postreceive --init >> /tmp/initial-build.log 2>&1\""' exceeded timeout of 200

.Last 10 kB of build output:
e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info install hoek@0.8.5 into /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info install boom@0.4.2 into /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info installOne sntp@0.2.4
npm info installOne cryptiles@0.2.2
npm info installOne hoek@0.8.5
npm info installOne boom@0.4.2
npm info preinstall form-data@0.0.8
npm info trying registry request attempt 1 at 07:26:00
npm http GET https://registry.npmjs.org/combined-stream
npm info trying registry request attempt 1 at 07:26:00
npm http GET https://registry.npmjs.org/async
npm info preinstall asn1@0.1.11
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/http-signature/node_modules/asn1
npm info linkStuff asn1@0.1.11
npm info install asn1@0.1.11
npm info postinstall asn1@0.1.11
npm http 304 https://registry.npmjs.org/combined-stream
npm http 304 https://registry.npmjs.org/async
npm info retry fetch attempt 1 at 07:26:01
npm http GET https://registry.npmjs.org/async/-/async-0.2.10.tgz
npm info preinstall cryptiles@0.2.2
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/cryptiles
npm info linkStuff cryptiles@0.2.2
npm info install cryptiles@0.2.2
npm info postinstall cryptiles@0.2.2
npm http 200 https://registry.npmjs.org/async/-/async-0.2.10.tgz
npm info preinstall sntp@0.2.4
npm info install combined-stream@0.0.7 into /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data
npm info install async@0.2.10 into /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data
npm info installOne combined-stream@0.0.7
npm info installOne async@0.2.10
npm info retry fetch attempt 1 at 07:26:01
npm http GET https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz
npm info preinstall boom@0.4.2
npm info preinstall combined-stream@0.0.7
npm http 200 https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz
npm info trying registry request attempt 1 at 07:26:01
npm http GET https://registry.npmjs.org/delayed-stream
npm info install hoek@0.9.1 into /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/sntp
npm info installOne hoek@0.9.1
npm info install hoek@0.9.1 into /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/boom
npm info installOne hoek@0.9.1
npm info preinstall hoek@0.8.5
npm http 304 https://registry.npmjs.org/delayed-stream
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/hoek
npm info linkStuff hoek@0.8.5
npm info install hoek@0.8.5
npm info postinstall hoek@0.8.5
npm info install delayed-stream@0.0.5 into /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/combined-stream
npm info installOne delayed-stream@0.0.5
npm info preinstall async@0.2.10
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/async
npm info linkStuff async@0.2.10
npm info install async@0.2.10
npm info postinstall async@0.2.10
npm info preinstall delayed-stream@0.0.5
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream
npm info linkStuff delayed-stream@0.0.5
npm info install delayed-stream@0.0.5
npm info postinstall delayed-stream@0.0.5
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data/node_modules/combined-stream
npm info linkStuff combined-stream@0.0.7
npm info install combined-stream@0.0.7
npm info postinstall combined-stream@0.0.7
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/form-data
npm info linkStuff form-data@0.0.8
npm info install form-data@0.0.8
npm info postinstall form-data@0.0.8
npm info preinstall ctype@0.5.2
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/http-signature/node_modules/ctype
npm info linkStuff ctype@0.5.2
npm info install ctype@0.5.2
npm info postinstall ctype@0.5.2
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/http-signature
npm info linkStuff http-signature@0.9.11
npm info install http-signature@0.9.11
npm info postinstall http-signature@0.9.11
npm info preinstall hoek@0.9.1
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/sntp/node_modules/hoek
npm info linkStuff hoek@0.9.1
npm info install hoek@0.9.1
npm info postinstall hoek@0.9.1
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/sntp
npm info linkStuff sntp@0.2.4
npm info install sntp@0.2.4
npm info postinstall sntp@0.2.4
npm info preinstall hoek@0.9.1
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/boom/node_modules/hoek
npm info linkStuff hoek@0.9.1
npm info install hoek@0.9.1
npm info postinstall hoek@0.9.1
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk/node_modules/boom
npm info linkStuff boom@0.4.2
npm info install boom@0.4.2
npm info postinstall boom@0.4.2
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request/node_modules/hawk
npm info linkStuff hawk@0.13.1
npm info install hawk@0.13.1
npm info postinstall hawk@0.13.1
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel/node_modules/request
npm info linkStuff request@2.21.0
npm info install request@2.21.0
npm info postinstall request@2.21.0
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo/node_modules/sauce-tunnel
npm info linkStuff sauce-tunnel@2.2.3
npm info install sauce-tunnel@2.2.3
npm info postinstall sauce-tunnel@2.2.3
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo
npm info linkStuff mathdown@0.0.0
npm info install mathdown@0.0.0
npm info postinstall mathdown@0.0.0
npm info prepublish mathdown@0.0.0
chalk@1.1.1 node_modules/chalk
├── escape-string-regexp@1.0.3
├── ansi-styles@2.1.0
├── supports-color@2.0.0
├── has-ansi@2.0.0 (ansi-regex@2.0.0)
└── strip-ansi@3.0.0 (ansi-regex@2.0.0)

coffee-script@1.9.3 node_modules/coffee-script

st@0.5.5 node_modules/st
├── graceful-fs@4.1.2
├── negotiator@0.5.3
├── mime@1.3.4
├── fd@0.0.2
├── bl@1.0.0 (readable-stream@2.0.2)
└── async-cache@1.0.0 (lru-cache@2.3.1)

wd@0.3.12 node_modules/wd
├── vargs@0.1.0
├── async@1.0.0
├── q@1.4.1
├── underscore.string@3.0.3
├── request@2.55.0 (caseless@0.9.0, forever-agent@0.6.1, aws-sign2@0.5.0, stringstream@0.0.4, oauth-sign@0.6.0, tunnel-agent@0.4.1, isstream@0.1.2, json-stringify-safe@5.0.1, node-uuid@1.4.3, qs@2.4.2,
combined-stream@0.0.7, form-data@0.2.0, mime-types@2.0.14, bl@0.9.4, http-signature@0.10.1, tough-cookie@2.0.0, hawk@2.3.1, har-validator@1.8.0)
├── archiver@0.14.4 (buffer-crc32@0.2.5, lazystream@0.1.0, async@0.9.2, readable-stream@1.0.33, zip-stream@0.5.2, tar-stream@1.1.5, glob@4.3.5, lodash@3.2.0)
└── lodash@3.9.3

sauce-tunnel@2.2.3 node_modules/sauce-tunnel
├── split@0.3.3 (through@2.3.8)
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.1.0, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
└── request@2.21.0 (json-stringify-safe@4.0.0, aws-sign@0.3.0, forever-agent@0.5.2, qs@0.6.6, tunnel-agent@0.3.0, oauth-sign@0.3.0, cookie-jar@0.3.0, mime@1.2.11, node-uuid@1.4.3, form-data@0.0.8,
http-signature@0.9.11, hawk@0.13.1)
npm info ok 
Preparing build for deployment
Deployment id is baf890d5
Activating deployment
HAProxy already running
HAProxy instance is started
Starting NodeJS cartridge
Mon Aug 31 2015 07:27:29 GMT-0400 (EDT): Starting application 'mathdownb3eda26cbb' ...
Waiting for application port (8080) become available ...
Found 127.8.126.1:8080 listening port
Warning: Gear 55e4381389f5cf028d000194 is using 96.5% of inodes allowed
-------------------------
Git Post-Receive Result: success
Activation status: success
Deployment completed with status: success
Stopping NodeJS cartridge
Mon Aug 31 2015 07:51:28 GMT-0400 (EDT): Stopping application 'mathdownb3eda26cbb' ...
Mon Aug 31 2015 07:51:28 GMT-0400 (EDT): Stopped Node application 'mathdownb3eda26cbb'
Saving away previously installed Node modules
Building git ref 'master', commit b3eda26
Building NodeJS cartridge
npm info it worked if it ends with ok
npm info using npm@1.4.28
npm info using node@v0.10.35
npm info preinstall mathdown@0.0.0
npm info build /var/lib/openshift/55e4381389f5cf028d000194/app-root/runtime/repo
npm info linkStuff mathdown@0.0.0
npm info install mathdown@0.0.0
npm info postinstall mathdown@0.0.0
npm info prepublish mathdown@0.0.0
npm info ok 
Preparing build for deployment
Deployment id is 868cb4fa
Activating deployment
cben commented 8 years ago

(the above looks OK except for "exceeded timeout of 200")

cben commented 8 years ago

Deploying last version with --debug shows nothing more than 5min timeout:

+ rhc app create -d -n cben -a mathdownc350ee5572 --from-code https://github.com/cben/mathdown#c350ee557243b33111e78946225558e1a252be6f -t nodejs-0.10 --scaling
DEBUG: Using config file /home/beni/.openshift/express.conf
DEBUG: Authenticating with RHC::Auth::Token
DEBUG: Connecting to https://openshift.redhat.com/broker/rest/api
DEBUG: Finding domain cben
DEBUG: Client supports API versions 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7
DEBUG: Created new httpclient
DEBUG: Request GET https://openshift.redhat.com/broker/rest/api
DEBUG:    code 200 1108 ms
DEBUG: Server supports API versions 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7
DEBUG:    Using API version 1.7
DEBUG: Client API version 1.7 is not current. Refetching API
DEBUG: Request GET https://openshift.redhat.com/broker/rest/api
DEBUG:    code 200  172 ms
DEBUG: Using token authentication
DEBUG: Request GET https://openshift.redhat.com/broker/rest/domain/cben
DEBUG:    code 200  176 ms
DEBUG: Getting all cartridges
DEBUG: Using token authentication
DEBUG: Request GET https://openshift.redhat.com/broker/rest/cartridges
DEBUG:    code 200  456 ms
Application Options
-------------------
Domain:      cben
Cartridges:  nodejs-0.10
Source Code: https://github.com/cben/mathdown#c350ee557243b33111e78946225558e1a252be6f
Gear Size:   default
Scaling:     yes

Creating application 'mathdownc350ee5572' ... DEBUG: Creating application 'mathdownc350ee5572' with these options - {:cartridges=>[#<RHC::Rest::Cartridge:0x00000003bea2c8 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js is perfect for data-intensive real-time applications that run across distributed devices.", "display_name"=>"Node.js 0.10", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c0bc6e0b8cd3da5000001", "license"=>"MIT License", "license_url"=>"https://raw.github.com/joyent/node/v0.10/LICENSE", "maintained_by"=>"redhat", "name"=>"nodejs-0.10", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "javascript", "nodejs", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"0.10", "website"=>"http://www.nodejs.org/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 @end_point="https://openshift.redhat.com/broker/rest/api", @debug=false, @preferred_api_versions=[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], @auth=#<RHC::Auth::Token:0x000000024c1308 @options=#<Commander::Command::Options:0x000000026bff60 @defaults={:dns=>true, :git=>true}, @table={:namespace=>"cben", :app=>"mathdownc350ee5572", :from_code=>"https://github.com/cben/mathdown#c350ee557243b33111e78946225558e1a252be6f", :type=>["nodejs-0.10"], :scaling=>true, :server=>"openshift.redhat.com", :rhlogin=>"beni.cherniavsky@gmail.com", :use_authorization_tokens=>true, :insecure=>false}>, @token="321f83f34c5a08062011d898138510d90c69f0bca01af3e51e8acf26144e6cac", @no_interactive=nil, @allows_tokens=true, @auth=#<RHC::Auth::Basic:0x00000002599730 @options=#<Commander::Command::Options:0x000000026bff60 @defaults={:dns=>true, :git=>true}, @table={:namespace=>"cben", :app=>"mathdownc350ee5572", :from_code=>"https://github.com/cben/mathdown#c350ee557243b33111e78946225558e1a252be6f", :type=>["nodejs-0.10"], :scaling=>true, :server=>"openshift.redhat.com", :rhlogin=>"beni.cherniavsky@gmail.com", :use_authorization_tokens=>true, :insecure=>false}>, @username="beni.cherniavsky@gmail.com", @password=nil, @no_interactive=nil, @skip_interactive=false>, @store=#<RHC::Auth::TokenStore:0x000000024c13a8 @dir="/home/beni/.openshift">, @servers=#<RHC::Servers:0x000000024c1060 @servers=[]>>, @headers={:accept=>:json}, @options={:timeout=>nil, :warn=>#<Proc:0x00000001f70368 (lambda)>}, @last_options={:timeout=>nil, :warn=>#<Proc:0x00000001f70368 (lambda)>, :connect_timeout=>120, :receive_timeout=>0, :send_timeout=>0}, @httpclient=#<RHC::Rest::HTTPClient:0x00000002998728 @proxy=nil, @no_proxy=nil, @no_proxy_regexps=[], @base_url=nil, @default_header={}, @www_auth=#<RHC::Rest::WWWAuth:0x0000000298eb38 @basic_auth=#<RHC::Rest::WWWAuth::DeferredBasic:0x0000000298ddc8 @_mutex=#<Mutex:0x0000000298dd28>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=false>, @digest_auth=#<HTTPClient::DigestAuth:0x0000000298e958 @_mutex=#<Mutex:0x0000000298e868>, @scheme="Digest", @challenge={}, @auth={}, @nonce_count=0>, @negotiate_auth=#<HTTPClient::NegotiateAuth:0x0000000298e6d8 @_mutex=#<Mutex:0x0000000298e570>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @ntlm_auth=#<HTTPClient::NegotiateAuth:0x0000000298e430 @_mutex=#<Mutex:0x0000000298e3e0>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @sspi_negotiate_auth=#<HTTPClient::SSPINegotiateAuth:0x0000000298e318 @_mutex=#<Mutex:0x0000000298e160>, @scheme="Negotiate", @challenge={}>, @oauth=#<HTTPClient::OAuth:0x0000000298e0e8 @_mutex=#<Mutex:0x0000000298e048>, @scheme="OAuth", @challenge={}, @config=nil, @auth={}, @nonce_count=0, @signature_handler={"HMAC-SHA1"=>#<Method: HTTPClient::OAuth#sign_hmac_sha1>}>, @authenticator=[#<RHC::Rest::WWWAuth::OAuth2:0x0000000298de40 @cred=nil, @auth={}, @set=false, @scheme="Bearer">, #<HTTPClient::OAuth:0x0000000298e0e8 @_mutex=#<Mutex:0x0000000298e048>, @scheme="OAuth", @challenge={}, @config=nil, @auth={}, @nonce_count=0, @signature_handler={"HMAC-SHA1"=>#<Method: HTTPClient::OAuth#sign_hmac_sha1>}>, #<HTTPClient::NegotiateAuth:0x0000000298e6d8 @_mutex=#<Mutex:0x0000000298e570>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::NegotiateAuth:0x0000000298e430 @_mutex=#<Mutex:0x0000000298e3e0>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::SSPINegotiateAuth:0x0000000298e318 @_mutex=#<Mutex:0x0000000298e160>, @scheme="Negotiate", @challenge={}>, #<HTTPClient::DigestAuth:0x0000000298e958 @_mutex=#<Mutex:0x0000000298e868>, @scheme="Digest", @challenge={}, @auth={}, @nonce_count=0>, #<RHC::Rest::WWWAuth::DeferredBasic:0x0000000298ddc8 @_mutex=#<Mutex:0x0000000298dd28>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=false>], @oauth2=#<RHC::Rest::WWWAuth::OAuth2:0x0000000298de40 @cred=nil, @auth={}, @set=false, @scheme="Bearer">>, @proxy_auth=#<HTTPClient::ProxyAuth:0x0000000298fad8 @basic_auth=#<HTTPClient::ProxyBasicAuth:0x0000000298fab0 @_mutex=#<Mutex:0x0000000298fa38>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=nil>, @negotiate_auth=#<HTTPClient::NegotiateAuth:0x0000000298f9c0 @_mutex=#<Mutex:0x0000000298f948>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @ntlm_auth=#<HTTPClient::NegotiateAuth:0x0000000298f808 @_mutex=#<Mutex:0x0000000298f790>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @sspi_negotiate_auth=#<HTTPClient::SSPINegotiateAuth:0x0000000298f6f0 @_mutex=#<Mutex:0x0000000298f5b0>, @scheme="Negotiate", @challenge={}>, @digest_auth=#<HTTPClient::ProxyDigestAuth:0x0000000298f560 @_mutex=#<Mutex:0x0000000298f4c0>, @scheme="Digest", @challenge=nil, @auth={}, @nonce_count=0>, @authenticator=[#<HTTPClient::NegotiateAuth:0x0000000298f9c0 @_mutex=#<Mutex:0x0000000298f948>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::NegotiateAuth:0x0000000298f808 @_mutex=#<Mutex:0x0000000298f790>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::SSPINegotiateAuth:0x0000000298f6f0 @_mutex=#<Mutex:0x0000000298f5b0>, @scheme="Negotiate", @challenge={}>, #<HTTPClient::ProxyDigestAuth:0x0000000298f560 @_mutex=#<Mutex:0x0000000298f4c0>, @scheme="Digest", @challenge=nil, @auth={}, @nonce_count=0>, #<HTTPClient::ProxyBasicAuth:0x0000000298fab0 @_mutex=#<Mutex:0x0000000298fa38>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=nil>]>, @request_filter=[#<HTTPClient::ProxyAuth:0x0000000298fad8 @basic_auth=#<HTTPClient::ProxyBasicAuth:0x0000000298fab0 @_mutex=#<Mutex:0x0000000298fa38>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=nil>, @negotiate_auth=#<HTTPClient::NegotiateAuth:0x0000000298f9c0 @_mutex=#<Mutex:0x0000000298f948>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @ntlm_auth=#<HTTPClient::NegotiateAuth:0x0000000298f808 @_mutex=#<Mutex:0x0000000298f790>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @sspi_negotiate_auth=#<HTTPClient::SSPINegotiateAuth:0x0000000298f6f0 @_mutex=#<Mutex:0x0000000298f5b0>, @scheme="Negotiate", @challenge={}>, @digest_auth=#<HTTPClient::ProxyDigestAuth:0x0000000298f560 @_mutex=#<Mutex:0x0000000298f4c0>, @scheme="Digest", @challenge=nil, @auth={}, @nonce_count=0>, @authenticator=[#<HTTPClient::NegotiateAuth:0x0000000298f9c0 @_mutex=#<Mutex:0x0000000298f948>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::NegotiateAuth:0x0000000298f808 @_mutex=#<Mutex:0x0000000298f790>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::SSPINegotiateAuth:0x0000000298f6f0 @_mutex=#<Mutex:0x0000000298f5b0>, @scheme="Negotiate", @challenge={}>, #<HTTPClient::ProxyDigestAuth:0x0000000298f560 @_mutex=#<Mutex:0x0000000298f4c0>, @scheme="Digest", @challenge=nil, @auth={}, @nonce_count=0>, #<HTTPClient::ProxyBasicAuth:0x0000000298fab0 @_mutex=#<Mutex:0x0000000298fa38>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=nil>]>, #<RHC::Rest::WWWAuth:0x0000000298eb38 @basic_auth=#<RHC::Rest::WWWAuth::DeferredBasic:0x0000000298ddc8 @_mutex=#<Mutex:0x0000000298dd28>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=false>, @digest_auth=#<HTTPClient::DigestAuth:0x0000000298e958 @_mutex=#<Mutex:0x0000000298e868>, @scheme="Digest", @challenge={}, @auth={}, @nonce_count=0>, @negotiate_auth=#<HTTPClient::NegotiateAuth:0x0000000298e6d8 @_mutex=#<Mutex:0x0000000298e570>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @ntlm_auth=#<HTTPClient::NegotiateAuth:0x0000000298e430 @_mutex=#<Mutex:0x0000000298e3e0>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, @sspi_negotiate_auth=#<HTTPClient::SSPINegotiateAuth:0x0000000298e318 @_mutex=#<Mutex:0x0000000298e160>, @scheme="Negotiate", @challenge={}>, @oauth=#<HTTPClient::OAuth:0x0000000298e0e8 @_mutex=#<Mutex:0x0000000298e048>, @scheme="OAuth", @challenge={}, @config=nil, @auth={}, @nonce_count=0, @signature_handler={"HMAC-SHA1"=>#<Method: HTTPClient::OAuth#sign_hmac_sha1>}>, @authenticator=[#<RHC::Rest::WWWAuth::OAuth2:0x0000000298de40 @cred=nil, @auth={}, @set=false, @scheme="Bearer">, #<HTTPClient::OAuth:0x0000000298e0e8 @_mutex=#<Mutex:0x0000000298e048>, @scheme="OAuth", @challenge={}, @config=nil, @auth={}, @nonce_count=0, @signature_handler={"HMAC-SHA1"=>#<Method: HTTPClient::OAuth#sign_hmac_sha1>}>, #<HTTPClient::NegotiateAuth:0x0000000298e6d8 @_mutex=#<Mutex:0x0000000298e570>, @scheme="Negotiate", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::NegotiateAuth:0x0000000298e430 @_mutex=#<Mutex:0x0000000298e3e0>, @scheme="NTLM", @challenge={}, @auth={}, @auth_default=nil, @ntlm_opt={:ntlmv2=>true}>, #<HTTPClient::SSPINegotiateAuth:0x0000000298e318 @_mutex=#<Mutex:0x0000000298e160>, @scheme="Negotiate", @challenge={}>, #<HTTPClient::DigestAuth:0x0000000298e958 @_mutex=#<Mutex:0x0000000298e868>, @scheme="Digest", @challenge={}, @auth={}, @nonce_count=0>, #<RHC::Rest::WWWAuth::DeferredBasic:0x0000000298ddc8 @_mutex=#<Mutex:0x0000000298dd28>, @scheme="Basic", @challenge={}, @cred=nil, @auth={}, @force_auth=false>], @oauth2=#<RHC::Rest::WWWAuth::OAuth2:0x0000000298de40 @cred=nil, @auth={}, @set=false, @scheme="Bearer">>], @debug_dev=nil, @redirect_uri_callback=#<Method: RHC::Rest::HTTPClient(HTTPClient)#default_redirect_uri_callback>, @test_loopback_response=[], @session_manager=#<HTTPClient::SessionManager:0x0000000298f380 @client=#<RHC::Rest::HTTPClient:0x00000002998728 ...>, @proxy=nil, @agent_name="rhc/1.36.4 (ruby 2.1.2; x86_64-linux-gnu) (API [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7])", @from=nil, @protocol_version=nil, @debug_dev=nil, @socket_sync=true, @chunk_size=16384, @connect_timeout=120, @connect_retry=1, @send_timeout=0, @receive_timeout=0, @keep_alive_timeout=15, @read_block_size=16384, @protocol_retry_count=5, @ssl_config=#<HTTPClient::SSLConfig:0x0000000298f150 @client=#<RHC::Rest::HTTPClient:0x00000002998728 ...>, @cert_store=#<OpenSSL::X509::Store:0x0000000298f128 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @client_ca=nil, @client_key=nil, @client_cert=nil, @verify_mode=3, @verify_depth=nil, @verify_callback=#<Proc:0x0000000298d468@/var/lib/gems/2.1.0/gems/rhc-1.36.4/lib/rhc/rest/client.rb:550 (lambda)>, @dest=nil, @timeout=nil, @ssl_version=:auto, @options=-2097019905, @ciphers="ALL:!aNULL:!eNULL:!SSLv2", @cacerts_loaded=true>, @test_loopback_http_response=[], @transparent_gzip_decompression=false, @socket_local=#<HTTPClient::Site:0x14c7984 tcp://0.0.0.0:0>, @sess_pool={#<HTTPClient::Site:0x14bb774 https://openshift.redhat.com:443>=>[#<HTTPClient::Session:0x00000002976e48 @client=#<RHC::Rest::HTTPClient:0x00000002998728 ...>, @dest=#<HTTPClient::Site:0x14bb774 https://openshift.redhat.com:443>, @proxy=nil, @socket_sync=true, @requested_version=nil, @debug_dev=nil, @connect_timeout=120, @connect_retry=1, @send_timeout=0, @receive_timeout=0, @read_block_size=16384, @protocol_retry_count=5, @ssl_config=#<HTTPClient::SSLConfig:0x0000000298f150 @client=#<RHC::Rest::HTTPClient:0x00000002998728 ...>, @cert_store=#<OpenSSL::X509::Store:0x0000000298f128 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @client_ca=nil, @client_key=nil, @client_cert=nil, @verify_mode=3, @verify_depth=nil, @verify_callback=#<Proc:0x0000000298d468@/var/lib/gems/2.1.0/gems/rhc-1.36.4/lib/rhc/rest/client.rb:550 (lambda)>, @dest=nil, @timeout=nil, @ssl_version=:auto, @options=-2097019905, @ciphers="ALL:!aNULL:!eNULL:!SSLv2", @cacerts_loaded=true>, @ssl_peer_cert=#<OpenSSL::X509::Certificate subject=#<OpenSSL::X509::Name:0x00000003bd7fb0>, issuer=#<OpenSSL::X509::Name:0x00000003bd7f38>, serial=#<OpenSSL::BN:0x00000003bd7ec0>, not_before=2014-07-23 00:00:00 UTC, not_after=2017-07-27 12:00:00 UTC>, @test_loopback_http_response=[], @socket_local=#<HTTPClient::Site:0x14c7984 tcp://0.0.0.0:0>, @agent_name="rhc/1.36.4 (ruby 2.1.2; x86_64-linux-gnu) (API [1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7])", @from=nil, @state=:WAIT, @requests=[], @status=200, @reason="OK", @headers=[["Cache-Control", "must-revalidate, private, max-age=0"], ["Content-Type", "application/json; charset=utf-8"], ["Date", "Tue, 01 Sep 2015 09:46:05 GMT"], ["ETag", "\"d05add626f0ac48075919bf4d8f0b73a\""], ["ProxyTime", "D=160537"], ["Server", "Apache/2.2.15 (Red Hat)"], ["Status", "200"], ["Strict-Transport-Security", "max-age=15768000, includeSubDomains"], ["Vary", "Accept-Encoding,User-Agent"], ["X-Powered-By", "Phusion Passenger (mod_rails/mod_rack) 3.0.21"], ["X-Rack-Cache", "miss"], ["X-Request-Id", "60cb7212812fbbc45b0bceed8cca9527"], ["X-Runtime", "0.154751"], ["X-UA-Compatible", "IE=Edge,chrome=1"], ["Content-Length", "26722"], ["Connection", "keep-alive"]], @socket=#<HTTPClient::SSLSocketWrap:0x000000029769e8 @context=#<HTTPClient::SSLConfig:0x0000000298f150 @client=#<RHC::Rest::HTTPClient:0x00000002998728 ...>, @cert_store=#<OpenSSL::X509::Store:0x0000000298f128 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @client_ca=nil, @client_key=nil, @client_cert=nil, @verify_mode=3, @verify_depth=nil, @verify_callback=#<Proc:0x0000000298d468@/var/lib/gems/2.1.0/gems/rhc-1.36.4/lib/rhc/rest/client.rb:550 (lambda)>, @dest=nil, @timeout=nil, @ssl_version=:auto, @options=-2097019905, @ciphers="ALL:!aNULL:!eNULL:!SSLv2", @cacerts_loaded=true>, @socket=#<TCPSocket:fd 7>, @ssl_socket=#<OpenSSL::SSL::SSLSocket:0x00000002976830 @io=#<TCPSocket:fd 7>, @context=#<OpenSSL::SSL::SSLContext:0x00000002976998 @cert=nil, @key=nil, @client_ca=nil, @ca_file=nil, @ca_path=nil, @timeout=nil, @verify_mode=3, @verify_depth=nil, @renegotiation_cb=nil, @verify_callback=#<Proc:0x0000000298d468@/var/lib/gems/2.1.0/gems/rhc-1.36.4/lib/rhc/rest/client.rb:550 (lambda)>, @options=-2097019905, @cert_store=#<OpenSSL::X509::Store:0x0000000298f128 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @extra_chain_cert=nil, @client_cert_cb=nil, @tmp_dh_callback=nil, @session_id_context=nil, @session_get_cb=nil, @session_new_cb=nil, @session_remove_cb=nil, @servername_cb=nil, @npn_protocols=nil, @npn_select_cb=nil>, @sync_close=false, @hostname="openshift.redhat.com", @eof=false, @rbuffer="", @sync=true, @callback_state=nil, @wbuffer="">, @debug_dev=nil>, @readbuf=nil, @transparent_gzip_decompression=false, @last_used=2015-09-01 12:46:05 +0300, @next_connection=true, @content_length=0, @chunked=false, @gzipped=false, @chunk_length=0, @version="1.1">]}, @sess_pool_mutex=#<Mutex:0x0000000298f218>, @sess_pool_last_checked=2015-09-01 12:46:03 +0300>, @ssl_config=#<HTTPClient::SSLConfig:0x0000000298f150 @client=#<RHC::Rest::HTTPClient:0x00000002998728 ...>, @cert_store=#<OpenSSL::X509::Store:0x0000000298f128 @verify_callback=nil, @error=nil, @error_string=nil, @chain=nil, @time=nil>, @client_ca=nil, @client_key=nil, @client_cert=nil, @verify_mode=3, @verify_depth=nil, @verify_callback=#<Proc:0x0000000298d468@/var/lib/gems/2.1.0/gems/rhc-1.36.4/lib/rhc/rest/client.rb:550 (lambda)>, @dest=nil, @timeout=nil, @ssl_version=:auto, @options=-2097019905, @ciphers="ALL:!aNULL:!eNULL:!SSLv2", @cacerts_loaded=true>, @cookie_manager=nil, @follow_redirect_count=10>, @self_signed=false, @current_api_version=1.7, @api=#<RHC::Rest::Api:0x000000029b7470 @attributes={"messages"=>[], "links"=>{"API"=>{"href"=>"https://openshift.redhat.com/broker/rest/api", "method"=>"GET", "optional_params"=>[], "rel"=>"API entry point", "required_params"=>[]}, "GET_ENVIRONMENT"=>{"href"=>"https://openshift.redhat.com/broker/rest/environment", "method"=>"GET", "optional_params"=>[], "rel"=>"Get environment information", "required_params"=>[]}, "GET_USER"=>{"href"=>"https://openshift.redhat.com/broker/rest/user", "method"=>"GET", "optional_params"=>[], "rel"=>"Get user information", "required_params"=>[]}, "ADD_DOMAIN"=>{"href"=>"https://openshift.redhat.com/broker/rest/domains", "method"=>"POST", "optional_params"=>[{"default_value"=>nil, "description"=>"A list of gear sizes that are allowed to be created on this domain", "name"=>"allowed_gear_sizes", "type"=>"array", "valid_options"=>["small", "medium", "large", "small.highcpu"]}], "rel"=>"Create new domain", "required_params"=>[{"description"=>"Name of the domain", "invalid_options"=>["amentra", "aop", "apiviz", "arquillian", "blacktie", "boxgrinder", "byteman", "cirras", "cloud", "cloudforms", "cygwin", "davcache", "dogtag", "drools", "drools", "ejb3", "errai", "esb", "fedora", "freeipa", "gatein", "git", "gfs", "gravel", "guvnor", "hibernate", "hornetq", "iiop", "infinispan", "ironjacamar", "javassist", "jbcaa", "jbcd", "jboss", "jbpm", "jdcom", "jgroups", "jmx", "jopr", "jrunit", "jsfunit", "kosmos", "liberation", "makara", "mass", "maven", "metajizer", "metamatrix", "mobicents", "mod_cluster", "modeshape", "mugshot", "mysql", "netty", "openshift", "osgi", "overlord", "ovirt", "penrose", "picketbox", "picketlink", "portletbridge", "portletswap", "posse", "pressgang", "qumranet", "railo", "redhat", "resteasy", "rhca", "rhcds", "rhce", "rhcsa", "rhcss", "rhct", "rhcva", "rhel", "rhev", "rhq", "rhx", "richfaces", "riftsaw", "savara", "scribble", "seam", "shadowman", "shotoku", "shrinkwrap", "snowdrop", "solidice", "spacewalk", "spice", "steamcannon", "stormgrind", "switchyard", "tattletale", "teiid", "tohu", "torquebox", "weld", "wise", "xnio"], "name"=>"name", "type"=>"string", "valid_options"=>[]}]}, "LIST_DOMAINS"=>{"href"=>"https://openshift.redhat.com/broker/rest/domains", "method"=>"GET", "optional_params"=>[], "rel"=>"List all domains you have access to", "required_params"=>[]}, "LIST_DOMAINS_BY_OWNER"=>{"href"=>"https://openshift.redhat.com/broker/rest/domains", "method"=>"GET", "optional_params"=>[], "rel"=>"List domains by owner", "required_params"=>[{"description"=>"Return only the domains owned by the specified user id or identity.  Use @self to refer to the current user.", "invalid_options"=>[], "name"=>"owner", "type"=>"string", "valid_options"=>["@self"]}]}, "SHOW_DOMAIN"=>{"href"=>"https://openshift.redhat.com/broker/rest/domain/:name", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve a domain by its name", "required_params"=>[{"description"=>"Unique name of the domain", "invalid_options"=>[], "name"=>":name", "type"=>"string", "valid_options"=>[]}]}, "SHOW_APPLICATION_BY_DOMAIN"=>{"href"=>"https://openshift.redhat.com/broker/rest/domain/:domain_name/application/:name", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve an application by its name and domain", "required_params"=>[{"description"=>"Unique name of the domain", "invalid_options"=>[], "name"=>":domain_name", "type"=>"string", "valid_options"=>[]}, {"description"=>"Name of the application", "invalid_options"=>[], "name"=>":name", "type"=>"string", "valid_options"=>[]}]}, "LIST_CARTRIDGES"=>{"href"=>"https://openshift.redhat.com/broker/rest/cartridges", "method"=>"GET", "optional_params"=>[{"default_value"=>nil, "description"=>"Show all cartridges with the given category", "name"=>"category", "type"=>"string", "valid_options"=>[]}], "rel"=>"List public cartridges", "required_params"=>[]}, "SHOW_CARTRIDGE"=>{"href"=>"https://openshift.redhat.com/broker/rest/cartridge/:name", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve a public cartridge by name", "required_params"=>[{"description"=>"Name of the cartridge", "invalid_options"=>[], "name"=>":name", "type"=>"string", "valid_options"=>[]}]}, "SHOW_CARTRIDGE_BY_ID"=>{"href"=>"https://openshift.redhat.com/broker/rest/cartridge/:id", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve a cartridge by id", "required_params"=>[{"description"=>"Unique identifier of the cartridge", "invalid_options"=>[], "name"=>":id", "type"=>"string", "valid_options"=>[]}]}, "ADD_TEAM"=>{"href"=>"https://openshift.redhat.com/broker/rest/teams", "method"=>"POST", "optional_params"=>[], "rel"=>"Create new team", "required_params"=>[{"description"=>"Name of the team", "invalid_options"=>[], "name"=>"name", "type"=>"string", "valid_options"=>[]}]}, "LIST_TEAMS"=>{"href"=>"https://openshift.redhat.com/broker/rest/teams", "method"=>"GET", "optional_params"=>[], "rel"=>"List all teams you are a member of", "required_params"=>[]}, "LIST_TEAMS_BY_OWNER"=>{"href"=>"https://openshift.redhat.com/broker/rest/teams", "method"=>"GET", "optional_params"=>[], "rel"=>"List teams by owner", "required_params"=>[{"description"=>"Return only the teams owned by the specified user id or identity.  Use @self to refer to the current user.", "invalid_options"=>[], "name"=>"owner", "type"=>"string", "valid_options"=>["@self"]}]}, "SHOW_TEAM"=>{"href"=>"https://openshift.redhat.com/broker/rest/team/:id", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve a team by it's id", "required_params"=>[{"description"=>"Id of the team", "invalid_options"=>[], "name"=>":id", "type"=>"string", "valid_options"=>[]}]}, "SEARCH_TEAMS"=>{"href"=>"https://openshift.redhat.com/broker/rest/teams", "method"=>"GET", "optional_params"=>[], "rel"=>"Search teams by name", "required_params"=>[{"description"=>"Search string must be at least 2 characters", "invalid_options"=>[], "name"=>"search", "type"=>"string", "valid_options"=>[]}, {"description"=>"Search global teams", "invalid_options"=>[], "name"=>"global", "type"=>"boolean", "valid_options"=>[true, false]}]}, "LIST_REGIONS"=>{"href"=>"https://openshift.redhat.com/broker/rest/regions", "method"=>"GET", "optional_params"=>[], "rel"=>"List all regions", "required_params"=>[]}, "LIST_APPLICATIONS"=>{"href"=>"https://openshift.redhat.com/broker/rest/applications", "method"=>"GET", "optional_params"=>[], "rel"=>"List application", "required_params"=>[]}, "LIST_APPLICATIONS_BY_OWNER"=>{"href"=>"https://openshift.redhat.com/broker/rest/applications", "method"=>"GET", "optional_params"=>[], "rel"=>"List applications by owner", "required_params"=>[{"description"=>"Return only the applications owned by the specified user id or identity.  Use @self to refer to the current user.", "invalid_options"=>[], "name"=>"owner", "type"=>"string", "valid_options"=>["@self"]}]}, "SHOW_APPLICATION"=>{"href"=>"https://openshift.redhat.com/broker/rest/application/:id", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve application by id", "required_params"=>[{"description"=>"Unique identifier of the application", "invalid_options"=>[], "name"=>":id", "type"=>"string", "valid_options"=>[]}]}, "LIST_AUTHORIZATIONS"=>{"href"=>"https://openshift.redhat.com/broker/rest/user/authorizations", "method"=>"GET", "optional_params"=>[], "rel"=>"List authorizations", "required_params"=>[]}, "SHOW_AUTHORIZATION"=>{"href"=>"https://openshift.redhat.com/broker/rest/user/authorization/:id", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve authorization :id", "required_params"=>[{"description"=>"Unique identifier of the authorization", "invalid_options"=>[], "name"=>":id", "type"=>"string", "valid_options"=>[]}]}, "ADD_AUTHORIZATION"=>{"href"=>"https://openshift.redhat.com/broker/rest/user/authorizations", "method"=>"POST", "optional_params"=>[{"default_value"=>"userinfo", "description"=>"Select one or more scopes that this authorization will grant access to:\n\n*  session\n   Grants a client the authority to perform all API actions against your account. Valid for about 1 month.\n*  read\n   Allows the client to access resources you own without making changes. Does not allow access to view authorization tokens. Valid for 6 months.\n*  userinfo\n   Allows a client to view your login name, unique id, and your user capabilities. Valid for 6 months.\n*  domain/:id/view\n   Grant read-only access to a single domain. Valid for 6 months.\n*  domain/:id/edit\n   Grant edit access to a single domain and all its applications. Valid for 6 months.\n*  domain/:id/admin\n   Grant full administrative access to a single domain and all its applications. Valid for 6 months.\n*  application/:id/view\n   Grant read-only access to a single application. Valid for 6 months.\n*  application/:id/edit\n   Grant edit access to a single application. Valid for 6 months.\n*  application/:id/admin\n   Grant full administrative access to a single application. Valid for 6 months.", "name"=>"scope", "type"=>"string", "valid_options"=>["session", "read", "userinfo", "domain/:id/view", "domain/:id/edit", "domain/:id/admin", "application/:id/view", "application/:id/edit", "application/:id/admin"]}, {"default_value"=>nil, "description"=>"A description to remind you what this authorization is for.", "name"=>"note", "type"=>"string", "valid_options"=>[]}, {"default_value"=>-1, "description"=>"The number of seconds before this authorization expires. Out of range values will be set to the maximum allowed time.", "name"=>"expires_in", "type"=>"integer", "valid_options"=>[]}, {"default_value"=>false, "description"=>"Attempt to locate and reuse an authorization that matches the scope and note and has not yet expired.", "name"=>"reuse", "type"=>"boolean", "valid_options"=>[true, false]}], "rel"=>"Add new authorization", "required_params"=>[]}, "LIST_QUICKSTARTS"=>{"href"=>"https://hub.openshift.com/api/v1/quickstarts/promoted.json", "method"=>"GET", "optional_params"=>[], "rel"=>"List quickstarts", "required_params"=>[]}, "SHOW_QUICKSTART"=>{"href"=>"https://hub.openshift.com/api/v1/quickstarts/:id", "method"=>"GET", "optional_params"=>[], "rel"=>"Retrieve quickstart with :id", "required_params"=>[{"description"=>"Unique identifier of the quickstart", "invalid_options"=>[], "name"=>":id", "type"=>"string", "valid_options"=>[]}]}, "SEARCH_QUICKSTARTS"=>{"href"=>"https://hub.openshift.com/api/v1/quickstarts.json", "method"=>"GET", "optional_params"=>[], "rel"=>"Search quickstarts", "required_params"=>[{"description"=>"The search term to use for the quickstart", "invalid_options"=>[], "name"=>"search", "type"=>"string", "valid_options"=>[]}]}}}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>, @server_api_versions=[1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], @client_api_versions=[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], @current_api_version=1.7>, @cartridges=[#<RHC::Rest::Cartridge:0x00000003beabb0 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"The Cron cartridge allows you to run command line programs at scheduled times. Use this for background jobs and periodic processing.", "display_name"=>"Cron 1.4", "help_topics"=>{"Getting Started Guide"=>"https://www.openshift.com/blogs/getting-started-with-cron-jobs-on-openshift"}, "id"=>"559c0bc6e0b8cd3da500000e", "license"=>"ASL 2.0", "license_url"=>"http://www.apache.org/licenses/LICENSE-2.0.txt", "maintained_by"=>"redhat", "name"=>"cron-1.4", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["embedded", "plugin"], "type"=>"embedded", "usage_rates"=>[], "version"=>"1.4", "website"=>"http://www.openshift.com/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003beaae8 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"The Do-It-Yourself (DIY) application type is a blank slate for trying unsupported languages, frameworks, and middleware on OpenShift. See the community site for examples of bringing your favorite framework to OpenShift.", "display_name"=>"Do-It-Yourself 0.1", "help_topics"=>{"Getting Started"=>"https://www.openshift.com/videos/getting-started-with-diy-applications-on-openshift"}, "id"=>"552c0bc1e0b8cdb48d00000e", "license"=>"ASL 2.0", "license_url"=>"http://www.apache.org/licenses/LICENSE-2.0.txt", "maintained_by"=>"redhat", "name"=>"diy-0.1", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["web_framework", "experimental"], "type"=>"standalone", "usage_rates"=>[], "version"=>"0.1", "website"=>"", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003beaa48 @attributes={"activation_time"=>"2015-03-03T03:52:24Z", "automatic_updates"=>false, "creation_time"=>"2015-03-03T03:52:24Z", "description"=>"A complete data provisioning, federation, integration and management solution that enables organizations to gain actionable and unified information.", "display_name"=>"JBoss Data Virtualization 6", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"54f52ff8e0b8cdac96000001", "license"=>"LGPL", "license_url"=>"http://www.gnu.org/copyleft/lesser.txt", "name"=>"jboss-dv-6.1.0", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["service", "web_framework", "java", "jboss", "java_ee_6", "xpaas"], "type"=>"standalone", "url"=>"https://raw.githubusercontent.com/jboss-datavirtualization/openshift-cartridge-datavirtualization/current/metadata/manifest.yml", "usage_rates"=>[], "version"=>"6.1.0", "website"=>"http://www.jboss.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea9a8 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"Acts as a load balancer for your web cartridge and will automatically scale up to handle incoming traffic. Is automatically added to scaled applications when they are created and cannot be removed or added to an application after the fact.", "display_name"=>"Web Load Balancer", "help_topics"=>{}, "id"=>"559c0bc6e0b8cd3da5000008", "license"=>"GPLv2+", "license_url"=>"http://www.gnu.org/licenses/gpl-2.0.html", "maintained_by"=>"redhat", "name"=>"haproxy-1.4", "requires"=>[["web_framework"], ["web_proxy"]], "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["web_proxy", "scales", "embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"1.4", "website"=>"http://haproxy.1wt.eu/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea8e0 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"The leading open source Java EE6 application server for enterprise Java applications. Popular development frameworks include CDI, DeltaSpike and Spring.", "display_name"=>"JBoss Application Server 7", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d000007", "license"=>"LGPL", "license_url"=>"http://www.gnu.org/copyleft/lesser.txt", "maintained_by"=>"redhat", "name"=>"jbossas-7", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "web_framework", "java", "jboss", "java_ee_6"], "type"=>"standalone", "usage_rates"=>[], "version"=>"7", "website"=>"http://www.jboss.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea840 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"Market-leading open source enterprise platform for next-generation, highly transactional enterprise Java applications. Build and deploy enterprise Java in the cloud.", "display_name"=>"JBoss Enterprise Application Platform 6", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c0bc6e0b8cd3da5000002", "license"=>"LGPL", "license_url"=>"http://www.gnu.org/copyleft/lesser.txt", "maintained_by"=>"redhat", "name"=>"jbosseap-6", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "web_framework", "java", "jboss", "java_ee_6", "xpaas"], "type"=>"standalone", "usage_rates"=>[{"plan_id"=>"bronze", "usd"=>0.03, "cad"=>0.03, "eur"=>0.02, "duration"=>"hour"}, {"plan_id"=>"silver", "usd"=>0.03, "cad"=>0.03, "eur"=>0.02, "duration"=>"hour"}], "version"=>"6", "website"=>"http://www.redhat.com/products/jbossenterprisemiddleware/application-platform/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea750 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"JBoss Enterprise Web Server is the enterprise-class Java web container for large-scale lightweight web applications based on Tomcat 7. Build and deploy JSPs and Servlets in the cloud.", "display_name"=>"Tomcat 7 (JBoss EWS 2.0)", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c0bc6e0b8cd3da5000004", "license"=>"LGPL", "license_url"=>"http://www.gnu.org/copyleft/lesser.txt", "maintained_by"=>"redhat", "name"=>"jbossews-2.0", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "java", "jboss", "tomcat", "tomcat7", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"2.0", "website"=>"http://www.redhat.com/products/jbossenterprisemiddleware/web-server/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea6b0 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"JBoss Enterprise Web Server is the enterprise-class Java web container for large-scale lightweight web applications based on Tomcat 6. Build and deploy JSPs and Servlets in the cloud.", "display_name"=>"Tomcat 6 (JBoss EWS 1.0)", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d000006", "license"=>"LGPL", "license_url"=>"http://www.gnu.org/copyleft/lesser.txt", "maintained_by"=>"redhat", "name"=>"jbossews-1.0", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "java", "jboss", "tomcat", "tomcat6", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"1.0", "website"=>"http://www.redhat.com/products/jbossenterprisemiddleware/web-server/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea610 @attributes={"activation_time"=>"2015-03-02T23:59:40Z", "automatic_updates"=>true, "creation_time"=>"2015-03-02T23:59:40Z", "description"=>"Jenkins is a continuous integration (CI) build server that is deeply integrated into OpenShift. See the Jenkins info page for more. Based on Jenkins 1.509+", "display_name"=>"Jenkins Server", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"54f4f96be0b8cd594d00000a", "license"=>"MIT license", "license_url"=>"https://jenkins-ci.org/mit-license", "maintained_by"=>"redhat", "name"=>"jenkins-1", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["web_framework", "instant_app", "ci", "domain_scope"], "type"=>"standalone", "usage_rates"=>[], "version"=>"1", "website"=>"http://www.jenkins-ci.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea548 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"The Jenkins client connects to your Jenkins application and enables builds and testing of your application. Requires that a Jenkins Server application exists in your domain.  This can be created via the new application page. Based on Jenkins Client 1.509+", "display_name"=>"Jenkins Client", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c0bc6e0b8cd3da500000d", "license"=>"ASL 2.0", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"jenkins-client-1", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["ci_builder", "embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"1", "website"=>"http://www.jenkins-ci.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea4a8 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"MongoDB is a scalable, high-performance, open source NoSQL database.", "display_name"=>"MongoDB 2.4", "help_topics"=>{"Building with MongoDB"=>"https://www.openshift.com/developers/mongodb"}, "id"=>"559c0bc6e0b8cd3da500000b", "license"=>"ASL 2.0", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"mongodb-2.4", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["service", "database", "nosql", "embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"2.4", "website"=>"http://www.10gen.com", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea408 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"MySQL is a multi-user, multi-threaded SQL database server.", "display_name"=>"MySQL 5.5", "help_topics"=>{"Building with MySQL"=>"https://www.openshift.com/developers/mysql"}, "id"=>"559c0bc6e0b8cd3da500000a", "license"=>"GPL", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"mysql-5.5", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["service", "database", "embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"5.5", "website"=>"http://www.mysql.com", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea368 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"MySQL is a multi-user, multi-threaded SQL database server.", "display_name"=>"MySQL 5.1", "help_topics"=>{"Building with MySQL"=>"https://www.openshift.com/developers/mysql"}, "id"=>"559c0bc6e0b8cd3da5000009", "license"=>"GPL", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"mysql-5.1", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["service", "database", "embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"5.1", "website"=>"http://www.mysql.com", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea2c8 ...>, #<RHC::Rest::Cartridge:0x00000003bea228 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"Perl is a high-level, general-purpose, interpreted, dynamic programming language. Dynamic content produced by Perl scripts can be served in response to incoming web requests.", "display_name"=>"Perl 5.10", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d00000b", "license"=>"GPL v2", "license_url"=>"http://dev.perl.org/licenses/", "maintained_by"=>"redhat", "name"=>"perl-5.10", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "perl", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"5.10", "website"=>"http://www.perl.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea188 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"PHP is a general-purpose server-side scripting language originally designed for Web development to produce dynamic Web pages. Popular development frameworks include CakePHP, Zend, Symfony, and Code Igniter.", "display_name"=>"PHP 5.4", "help_topics"=>{"Developer Portal"=>"https://developers.openshift.com/en/php-overview.html"}, "id"=>"559c0bc6e0b8cd3da5000006", "license"=>"The PHP License, version 3.0", "license_url"=>"http://www.php.net/license/3_0.txt", "maintained_by"=>"redhat", "name"=>"php-5.4", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "php", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"5.4", "website"=>"http://www.php.net", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea0e8 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"PHP is a general-purpose server-side scripting language originally designed for Web development to produce dynamic Web pages. Popular development frameworks include CakePHP, Zend, Symfony, and Code Igniter.", "display_name"=>"PHP 5.3", "help_topics"=>{"Developer Portal"=>"https://developers.openshift.com/en/php-overview.html"}, "id"=>"559c0bc6e0b8cd3da5000007", "license"=>"The PHP License, version 3.0", "license_url"=>"http://www.php.net/license/3_0.txt", "maintained_by"=>"redhat", "name"=>"php-5.3", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "php", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"5.3", "website"=>"http://www.php.net", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003bea048 @attributes={"activation_time"=>"2014-06-26T18:34:55Z", "automatic_updates"=>true, "creation_time"=>"2014-06-26T18:34:55Z", "description"=>"Web based MySQL admin tool. Requires the MySQL cartridge to be installed", "display_name"=>"phpMyAdmin 4.0", "help_topics"=>{}, "id"=>"53ac67cfe0b8cdd8bd000014", "license"=>"GPLv2", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"phpmyadmin-4", "requires"=>[["mysql-5.5", "mysql-5.1"]], "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["embedded", "administration"], "type"=>"embedded", "usage_rates"=>[], "version"=>"4", "website"=>"http://www.phpmyadmin.net/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9f80 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"PostgreSQL is an advanced Object-Relational database management system", "display_name"=>"PostgreSQL 9.2", "help_topics"=>{"Building with PostGreSQL"=>"https://access.redhat.com/site/documentation/en-US/OpenShift/2.0/html/User_Guide/sect-OpenShift-User_Guide-Working_With_Database_Cartridges.html"}, "id"=>"552c0bc1e0b8cdb48d000011", "license"=>"ASL 2.0", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"postgresql-9.2", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["service", "database", "embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"9.2", "website"=>"http://www.postgresql.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9ee0 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"PostgreSQL is an advanced Object-Relational database management system", "display_name"=>"PostgreSQL 8.4", "help_topics"=>{"Building with PostGreSQL"=>"https://access.redhat.com/site/documentation/en-US/OpenShift/2.0/html/User_Guide/sect-OpenShift-User_Guide-Working_With_Database_Cartridges.html"}, "id"=>"552c0bc1e0b8cdb48d000012", "license"=>"ASL 2.0", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"postgresql-8.4", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["service", "database", "embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"8.4", "website"=>"http://www.postgresql.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9e40 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"Python is a general-purpose, high-level programming language whose design philosophy emphasizes code readability. Popular development frameworks include: Django, Bottle, Pylons, Zope and TurboGears.", "display_name"=>"Python 3.3", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d000004", "license"=>"The Python License, version 3.3", "license_url"=>"http://docs.python.org/3/license.html", "maintained_by"=>"redhat", "name"=>"python-3.3", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "python", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"3.3", "website"=>"http://www.python.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9da0 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"Python is a general-purpose, high-level programming language whose design philosophy emphasizes code readability. Popular development frameworks include: Django, Bottle, Pylons, Zope and TurboGears.", "display_name"=>"Python 2.7", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c0bc6e0b8cd3da5000005", "license"=>"The Python License, version 2.7.3", "license_url"=>"http://docs.python.org/3/license.html", "maintained_by"=>"redhat", "name"=>"python-2.7", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "python", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"2.7", "website"=>"http://www.python.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9d00 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"Python is a general-purpose, high-level programming language whose design philosophy emphasizes code readability. Popular development frameworks include: Django, Bottle, Pylons, Zope and TurboGears.", "display_name"=>"Python 2.6", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d000014", "license"=>"The Python License, version 2.6", "license_url"=>"http://docs.python.org/3/license.html", "maintained_by"=>"redhat", "name"=>"python-2.6", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "python", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"2.6", "website"=>"http://www.python.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9c60 @attributes={"activation_time"=>"2014-05-13T20:58:00Z", "automatic_updates"=>true, "creation_time"=>"2014-05-13T20:58:00Z", "description"=>"Web based MongoDB administration tool. Requires the MongoDB cartridge to be installed first.", "display_name"=>"RockMongo 1.1", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"53728758e0b8cdf96600000f", "license"=>"ASL 2.0", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"rockmongo-1.1", "requires"=>[["mongodb-2.4"]], "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["embedded", "administration"], "type"=>"embedded", "usage_rates"=>[], "version"=>"1.1", "website"=>"http://rockmongo.com/", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9bc0 @attributes={"activation_time"=>"2015-07-07T17:26:30Z", "automatic_updates"=>true, "creation_time"=>"2015-07-07T17:26:30Z", "description"=>"Ruby is a dynamic, reflective, general-purpose object-oriented programming language. Popular development frameworks include Ruby on Rails and Sinatra.", "display_name"=>"Ruby 2.0", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c0bc6e0b8cd3da5000003", "license"=>"Ruby BSDL", "license_url"=>"http://www.ruby-lang.org/en/about/license.txt", "maintained_by"=>"redhat", "name"=>"ruby-2.0", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "ruby", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"2.0", "website"=>"http://www.ruby-lang.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9b20 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"Ruby is a dynamic, reflective, general-purpose object-oriented programming language. Popular development frameworks include Ruby on Rails and Sinatra.", "display_name"=>"Ruby 1.9", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d00000f", "license"=>"Ruby BSDL", "license_url"=>"http://www.ruby-lang.org/en/about/license.txt", "maintained_by"=>"redhat", "name"=>"ruby-1.9", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "ruby", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"1.9", "website"=>"http://www.ruby-lang.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9a80 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"Ruby is a dynamic, reflective, general-purpose object-oriented programming language. Popular development frameworks include Ruby on Rails and Sinatra.", "display_name"=>"Ruby 1.8", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d000013", "license"=>"Ruby BSDL", "license_url"=>"http://www.ruby-lang.org/en/about/license.txt", "maintained_by"=>"redhat", "name"=>"ruby-1.8", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "ruby", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"1.8", "website"=>"http://www.ruby-lang.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be99b8 @attributes={"activation_time"=>"2015-01-27T03:49:36Z", "automatic_updates"=>true, "creation_time"=>"2015-01-27T03:49:36Z", "description"=>"SwitchYard is a lightweight service delivery framework providing full lifecycle support for developing, deploying, and managing service-oriented applications.", "display_name"=>"SwitchYard 0.8.0", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"54c70acfe0b8cd7e6d00001a", "license"=>"ASL 2.0", "license_url"=>"", "maintained_by"=>"redhat", "name"=>"switchyard-0", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["embedded"], "type"=>"embedded", "usage_rates"=>[], "version"=>"0", "website"=>"http://www.jboss.org/switchyard", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9918 @attributes={"activation_time"=>"2015-07-07T19:20:58Z", "automatic_updates"=>false, "creation_time"=>"2015-07-07T19:20:58Z", "description"=>"The Red Hat JBoss Unified Push server allows developers to send native push messages to Apple's Push Notification Service (APNS) and Google's Cloud Messaging (GCM). It features a built-in administration console that makes it easy for developers to create and manage push related aspects of their applications for any mobile development environment. Includes client SDKs (iOS, Android, & Cordova), and a REST based sender service with an available Java sender library", "display_name"=>"JBoss Unified Push Server 1.0.0.Beta2", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c269ae0b8cd371b000001", "license"=>"ASL 2.0", "license_url"=>"http://www.apache.org/licenses/LICENSE-2.0.txt", "name"=>"jboss-unified-push-2", "requires"=>[["mysql-5.5"]], "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "web_framework", "java", "jboss", "jee_full_profile", "xpaas"], "type"=>"standalone", "url"=>"https://raw.githubusercontent.com/jboss-mobile/jboss-unified-push-openshift-cartridge/openshift_production/metadata/manifest.yml", "usage_rates"=>[], "version"=>"2", "website"=>"http://www.jboss.org/unifiedpush", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9878 @attributes={"activation_time"=>"2014-11-18T20:48:57Z", "automatic_updates"=>false, "creation_time"=>"2014-11-18T20:48:57Z", "description"=>"The Red Hat JBoss Unified Push server allows developers to send native push messages to Apple's Push Notification Service (APNS) and Google's Cloud Messaging (GCM). It features a built-in administration console that makes it easy for developers to create and manage push related aspects of their applications for any mobile development environment. Includes client SDKs (iOS, Android, & Cordova), and a REST based sender service with an available Java sender library", "display_name"=>"JBoss Unified Push Server 1.0.0.Beta1", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"546bb0b95973ca7dc5000001", "license"=>"ASL 2.0", "license_url"=>"http://www.apache.org/licenses/LICENSE-2.0.txt", "name"=>"jboss-unified-push-1", "requires"=>[["mysql-5.5"]], "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "web_framework", "java", "jboss", "jee_full_profile", "xpaas"], "type"=>"standalone", "url"=>"https://raw.githubusercontent.com/jboss-mobile/jboss-unified-push-openshift-cartridge/openshift_production/metadata/manifest.yml", "usage_rates"=>[], "version"=>"1", "website"=>"http://www.jboss.org/unifiedpush", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be97d8 @attributes={"activation_time"=>"2014-11-18T20:49:15Z", "automatic_updates"=>false, "creation_time"=>"2014-11-18T20:49:15Z", "description"=>"Vert.x is a lightweight, high performance application platform for the JVM that's designed for modern mobile, web, and enterprise applications.", "display_name"=>"Vert.x 2.1", "help_topics"=>{"Developer Center"=>"http://vertx.io"}, "id"=>"546bb0cb5973ca9dd1000001", "license"=>"EPL 1.0", "license_url"=>"http://www.eclipse.org/legal/epl-v10.html", "name"=>"jboss-vertx-2.1", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["web_framework", "community", "java", "polyglot"], "type"=>"standalone", "url"=>"https://raw.github.com/vert-x/openshift-cartridge/master/metadata/manifest.yml", "usage_rates"=>[], "version"=>"2.1", "website"=>"http://vertx.io", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9738 @attributes={"activation_time"=>"2015-07-07T19:20:49Z", "automatic_updates"=>false, "creation_time"=>"2015-07-07T19:20:49Z", "description"=>"The leading open source Java EE7 application server for enterprise Java applications. Popular development frameworks include CDI, DeltaSpike and Spring.", "display_name"=>"WildFly Application Server 9", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"559c2691e0b8cdadb7000001", "license"=>"LGPL", "license_url"=>"http://www.gnu.org/copyleft/lesser.txt", "name"=>"jboss-wildfly-9", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "web_framework", "java", "wildfly", "java_ee_7"], "type"=>"standalone", "url"=>"https://raw.githubusercontent.com/openshift-cartridges/openshift-wildfly-cartridge/wildfly-9/metadata/manifest.yml", "usage_rates"=>[], "version"=>"9", "website"=>"http://www.wildfly.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be9698 @attributes={"activation_time"=>"2014-12-08T20:10:58Z", "automatic_updates"=>false, "creation_time"=>"2014-12-08T20:10:58Z", "description"=>"The leading open source Java EE7 application server for enterprise Java applications. Popular development frameworks include CDI, DeltaSpike and Spring", "display_name"=>"WildFly Application Server 8.2.0.Final", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"548605d24382ec0ddf000001", "license"=>"LGPL", "license_url"=>"http://www.gnu.org/copyleft/lesser.txt", "name"=>"jboss-wildfly-8", "supported_scales_from"=>1, "supported_scales_to"=>-1, "tags"=>["service", "web_framework", "java", "wildfly", "java_ee_7"], "type"=>"standalone", "url"=>"https://raw.githubusercontent.com/openshift-cartridges/openshift-wildfly-cartridge/wildfly-8/metadata/manifest.yml", "usage_rates"=>[], "version"=>"8", "website"=>"http://www.wildfly.org", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>, #<RHC::Rest::Cartridge:0x00000003be95f8 @attributes={"activation_time"=>"2015-04-13T18:32:33Z", "automatic_updates"=>true, "creation_time"=>"2015-04-13T18:32:33Z", "description"=>"A PHP server by Zend for applications that require performance, reliability and security. Zend Server combined with Zend Studio offers code optimization, debugging, and code assist.", "display_name"=>"PHP 5.4 with Zend Server 6.1", "help_topics"=>{"Developer Center"=>"https://www.openshift.com/developers"}, "id"=>"552c0bc1e0b8cdb48d00000a", "license"=>"Commercial", "license_url"=>"http://static.zend.com/topics/Zend-License-EULA-2010-09-2.pdf", "maintained_by"=>"redhat", "name"=>"zend-6.1", "supported_scales_from"=>1, "supported_scales_to"=>1, "tags"=>["service", "php", "web_framework"], "type"=>"standalone", "usage_rates"=>[], "version"=>"6.1", "website"=>"http://www.zend.com", "messages"=>["Listing cartridges"], "warnings"=>[]}, @client=#<RHC::Rest::Client:0x000000029ce0f8 ...>>]>>], :scale=>true, :initial_git_url=>"https://github.com/cben/mathdown#c350ee557243b33111e78946225558e1a252be6f"}
DEBUG: Adding application mathdownc350ee5572 to domain 546a6d115973ca9461000002
DEBUG: Using token authentication
DEBUG: Created new httpclient
DEBUG: Request POST https://openshift.redhat.com/broker/rest/domain/cben/applications
DEBUG:    code 504 299946 ms
DEBUG: Response did not include a message from server: unexpected nil
Server returned an unexpected error code: 504

http://stackoverflow.com/a/22490332/239657 mentions trying --timeout (that doesn't help). I tried it and it doesn't help (code 504 300050 ms).

cben commented 8 years ago

Aside: I'm getting tired of RHcloud.

Perhaps I should just deploy a docker to digitalocean or something. However, configuring haproxy + auto-scaling far from trivial. Tutum could help but I don't want another proprietary piece. Or I could try out self-hosting OpenShift Origin (the next docker-based version which should be saner)? It seems not mature enough yet. Or one of the heroku-alikes? dokku sounds limited to 1 host? dokku-alt? deis.io says I want at least 4GB droplets ($40/mo). rancher.com looks good but is still beta and mentioned somewhere being AWS-only.

Here's the deeper thing: most of these tools support scaling by fitting containers into a fixed fleet of machines. That's going to be either expensive or limited — for a single tenant like me it'd better to scale by auto renting and releasing nodes of the underlying IaaS. tsuru.io says it does auto EC2 provisioning.

Is native docker getting more usable as-is? Should read a bit about Docker Machine, Swarm etc... How about native docker hosting? Orchard & StackDock are dead. http://www.cloud66.com/, http://sloppy.io/ etc? It does sound like Tutum on top of bring-your-own-IaaS is less proprietary.

Or native Node.JS hosting? Trying now Modulus (which also mumbled something about Docker support).

P.S. https://mod.it/welcome looks cool!

Scratch all that.

What should matter is whether it'll easy (and to the degree possible gratis) to run a your own [forked] version. Heroku and RHcloud more or less passed this test; so must a replacement. [Plus RHcloud/OpenShift is fully open source which is awesome and not to be taken lightly.]

cben commented 8 years ago

Today I've managed to create from one of the "good" versions from bisecting (468cf5aaf346a62f73717bf1011590e8da346f7d), push the latest gh-pages AND scale to 2 gears. (Yesterday I didn't - it was a different "good" version but creation failed.)

Timing: create took 4min (out of 5min timeout):

+ rhc app create -d -n cben -a mathdown468cf5aaf3 --from-code https://github.com/cben/mathdown#468cf5aaf346a62f73717bf1011590e8da346f7d -t nodejs-0.10 --scaling
...
DEBUG: Request POST https://openshift.redhat.com/broker/rest/domain/cben/applications
DEBUG:    code 201 239128 ms
  Application mathdown468cf5aaf3 was created.
...
DEBUG: Checking SSH keys through the wizard
DEBUG: Request GET https://openshift.redhat.com/broker/rest/user
DEBUG:    code 200  822 ms
...
DEBUG: Request GET https://openshift.redhat.com/broker/rest/user/keys
DEBUG:    code 200  184 ms

Waiting for your DNS name to be available ... 
Cloning into 'mathdown468cf5aaf3'...

push latest took 30sec for unclear what, 1min for "Saving away previously installed Node modules", <10sec for npm install, and 1min for "Preparing build for deployment".

$ time git push ssh://55e6a5cb7628e167f0000141@mathdown468cf5aaf3-cben.rhcloud.com/~/git/mathdown468cf5aaf3.git/ origin/gh-pages:master ^| ts -s
00:00:04 remote: Stopping NodeJS cartridge        
00:00:04 remote: Wed Sep 02 2015 03:40:31 GMT-0400 (EDT): Stopping application 'mathdown468cf5aaf3' ...        
00:00:05 remote: Wed Sep 02 2015 03:40:32 GMT-0400 (EDT): Stopped Node application 'mathdown468cf5aaf3'        
00:00:33 remote: Syncing git content to other proxy gears        
00:00:33 remote: Saving away previously installed Node modules        
00:01:39 remote: Building git ref 'master', commit c350ee5        
00:01:39 remote: Building NodeJS cartridge        
...
00:01:44 remote: npm info ok         
00:01:44 remote: Preparing build for deployment        
00:02:38 remote: Deployment id is 37cb86e3        
00:02:40 remote: HAProxy already running        
00:02:41 remote: Wed Sep 02 2015 03:43:08 GMT-0400 (EDT): Starting application 'mathdown468cf5aaf3' ...        
00:02:43 remote: Waiting for application port (8080) become available ...        
00:02:43 remote: Found 127.5.202.129:8080 listening port        
...
00:02:44 remote: Git Post-Receive Result: success        

Scale to 2 gears took 3min (with no details):

$ rhc cartridge scale node -a mathdown468cf5aaf3 --min 2 --max 5 -d ^| ts
...
This operation will run until the application is at the minimum scale and may take several minutes.
Setting scale range for nodejs-0.10 ... 
Sep 02 10:45:50 DEBUG: Setting scales = scales_from: 2 scales_to: 5
Sep 02 10:45:50 DEBUG: Request PUT https://openshift.redhat.com/broker/rest/application/55e6a5cb7628e167f0000141/cartridge/nodejs-0.10
Sep 02 10:48:49 DEBUG:    code 200 178540 ms
...done...
  Scaling: x2 (minimum: 2, maximum: 5) on small gears
cben commented 8 years ago

Tried the same app create with --env NPM_CONFIG_PRODUCTION="true" per http://stackoverflow.com/a/23749201/239657 (in hope that cutting down a little bit on the npm install time might help) but instead it timed out (504) after 5min. So it's not like any version works reproducibly :-( However the app was created (https://openshift.redhat.com/app/console/application/55e73c8c0c1e66c54c00000d-mathdown468cf5aaf3prod).

Push newest timing:

...
00:00:07 remote: Wed Sep 02 2015 15:17:28 GMT-0400 (EDT): Stopped Node application 'mathdown468cf5aaf3prod'        
00:01:08 remote: Syncing git content to other proxy gears        
00:01:08 remote: Saving away previously installed Node modules        
00:03:48 remote: Building git ref 'master', commit c350ee5        
...
00:04:10 remote: npm info ok         
00:04:10 remote: Preparing build for deployment        
00:05:15 remote: Deployment id is 4e1ad892        
...
00:05:19 remote: Found 127.12.231.129:8080 listening port        
...
00:05:21 remote: Deployment completed with status: success        

Remarkably, most of the gaps are between "done X" and "starting Y" so it's hard to understand what's taking the time...

Trying scaling now...

cben commented 8 years ago

Aha!

OpenShift Online Operations is actively investigating reports of customers experiencing intermittent API failures. — a day ago The cause of the API issues has been resolved and we will continue to monitor. — a day ago — https://openshift.redhat.com/app/status

Lesson: I should have asked on IRC long ago. There wasn't much that I can do from my side anyway.

cben commented 8 years ago

scale timing: 00:00:07 DEBUG: Request PUT https://openshift.redhat.com/broker/rest/application/55e73c8c0c1e66c54c00000d/cartridge/nodejs-0.10 00:03:25 DEBUG: code 200 197727 ms

OK, I'm going to assume this Works Now. I need to destroy the 'mathdown' app and re-create it as scaled. But let's be careful and first flip the DNS to mathdown468cf5aaf3prod.

cben commented 8 years ago

Oops, flipped DNS before configuring CNAMEs and certs. Flipped back for now.

UPDATE: didn't help, as new app is not getting traffic because it can't respond to an alias at the same time as the old. So I had to kill the old app and now re-assigning aliases to the new.

cben commented 8 years ago

Setting NPM_CONFIG_PRODUCTION=true helped space-wise if not time-wise: 407,228,416 & 410,562,560 vs 515,297,280 & 532,316,160 bytes (2 numbers because 2 gears).

AFAICT, I can't set env vars in workflow URL. I'd like to have it set for any instance launched, to avoid situation when I test by "Launch on OpenShift" button and it works (with all devDependencies), but fails in the main app because the devDependencies are missing. So I'd rather config it somewhere in the source rather than while creating the app. But I do not want to have it in standard .npmrc location, as that would affect everybody checking out the project and doing npm install. I want something Openshift-specific.

https://developers.openshift.com/en/managing-action-hooks.html lists many hooks that can export env vars, but not for building. (BTW, https://docs.openshift.org/origin-m4/oo_cartridge_developers_guide.html#openshift-builds gives good info on the build process.) So I'm trying to make .openshift/action_hooks/pre_build add production = true to .npmrc...

cben commented 8 years ago

This is not fixed. It still frequntly times out.

ssh'd in early during creation. It seems /usr/libexec/openshift/lib/archive_git_submodules.sh takes a lot of time. It's doing funny and slow stuff like git submodule foreach --recursive git archive --format=tar HEAD (the heavy part is probably MathJax with its gazillion of image font files. Should experiment with #109 in case npm modules deploy faster?

cben commented 8 years ago

While I'm pointed to a temp app, switching to better named prod-mathdown.rhcloud.com & staging-mathdown.rhcloud.com.

cben commented 8 years ago

Experimented with mathjax via npm instead of submodule [6eff9f6008ce5e0d6b083cd6d73cbd03acc41dce, f7e06184796a1e6d749bdc15c61c77bf5f2857f9]. Timed out.

Learnt a trick for timing build: as soon as possible to ssh, run:

rhc ssh APP -n mathdown 'tail -f /tmp/initial-build.log' | ts -i

Let's try that again...

cben commented 8 years ago
$ rhc ssh npmmathjax -n mathdown 'ps auxf; tail -f /tmp/initial-build.log' | ts -i
00:00:05 USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
00:00:00 2389     388071  0.0  0.0 108792  2744 ?        S    08:03   0:00 sshd: 55ed7c8b0c1e66582e0000b7@notty
00:00:00 2389     388073  0.0  0.0 106104  1196 ?        Ss   08:03   0:00  \_ /bin/bash -c ps auxf; tail -f /tmp/initial-build.log
00:00:00 2389     388074  0.0  0.0 108108   984 ?        R    08:03   0:00      \_ ps auxf
00:00:00 2389     386804  0.0  0.0 106104  1172 ?        Ss   08:03   0:00 /bin/sh -c gear postreceive --init >> /tmp/initial-build.log 2>&1
00:00:00 2389     386805  5.5  0.2 362360 36768 ?        Sl   08:03   0:01  \_ ruby /usr/bin/gear postreceive --init
00:00:00 2389     387879  0.0  0.0   9236  1092 ?        S    08:03   0:00      \_ sh -c set -e; /var/lib/openshift/55ed7c8b0c1e66582e0000b7/nodejs/bin/control build 
00:00:00 2389     387882  0.0  0.0   9504  1472 ?        S    08:03   0:00          \_ /bin/bash /var/lib/openshift/55ed7c8b0c1e66582e0000b7/nodejs/bin/control build
00:00:00 2389     387950  0.0  0.0   9504   888 ?        S    08:03   0:00              \_ /bin/bash /var/lib/openshift/55ed7c8b0c1e66582e0000b7/nodejs/bin/control build
00:00:00 2389     387951  0.0  0.0   4068   520 ?        S    08:03   0:00                  \_ /usr/bin/scl enable v8314 nodejs010 npm install -d
00:00:00 2389     387952  0.0  0.0   9236  1192 ?        S    08:03   0:00                      \_ /bin/bash /var/tmp/scl4DgQ2j
00:00:00 2389     387963 85.1  0.8 1071476 125172 ?      Rl   08:03   0:09                          \_ npm                                               
00:00:00 2389     386505  0.0  0.0 185752  4400 ?        Sl   08:03   0:00 /usr/bin/logshifter -tag haproxy_ctld
00:00:00 2389     386504  0.0  0.0   9240  1108 ?        S    08:03   0:00 bash /var/lib/openshift/55ed7c8b0c1e66582e0000b7/haproxy/usr/bin/haproxy_ctld
00:00:00 2389     386521  0.1  0.0  40768  8156 ?        Sl   08:03   0:00  \_ ruby /var/lib/openshift/55ed7c8b0c1e66582e0000b7/haproxy/usr/bin/haproxy_ctld.rb
00:00:00 2389     386503  0.0  0.0  15368  1260 ?        S    08:03   0:00 /usr/sbin/haproxy -f /var/lib/openshift/55ed7c8b0c1e66582e0000b7/haproxy//conf/haproxy.cfg
00:00:00 2389     386502  0.0  0.0 185624  4404 ?        Sl   08:03   0:00 /usr/bin/logshifter -tag haproxy
00:00:00 npm info retry fetch attempt 1 at 08:03:47
00:00:00 npm http GET https://registry.npmjs.org/mathjax/-/mathjax-2.5.1.tgz
00:00:00 npm info retry fetch attempt 1 at 08:03:47
00:00:00 npm http GET https://registry.npmjs.org/st/-/st-0.5.5.tgz
00:00:00 npm http GET https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz
00:00:00 npm http GET https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz
00:00:00 npm http 200 https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz
00:00:00 npm http 200 https://registry.npmjs.org/st/-/st-0.5.5.tgz
00:00:00 npm http 200 https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz
00:00:00 npm http 200 https://registry.npmjs.org/mathjax/-/mathjax-2.5.1.tgz
00:01:26 npm info install chalk@1.1.1 into /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo
00:00:00 npm info install st@0.5.5 into /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo
00:00:00 npm info install coffee-script@1.10.0 into /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo
00:00:00 npm info install mathjax@2.5.1 into /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo
00:00:00 npm info installOne chalk@1.1.1
...
00:00:00 npm http GET https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz
00:00:00 npm http GET https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz
...
00:00:00 npm info build /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo/node_modules/chalk/node_modules/escape-string-regexp
00:00:00 npm info linkStuff escape-string-regexp@1.0.3
00:00:00 npm info preinstall strip-ansi@3.0.0
...
00:00:00 npm info build /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo/node_modules/st
00:00:00 npm info linkStuff st@0.5.5
00:00:00 npm info install st@0.5.5
00:00:00 npm info postinstall st@0.5.5
00:01:31 npm info preinstall mathjax@2.5.1
00:00:00 npm info build /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo/node_modules/mathjax
00:00:00 npm info linkStuff mathjax@2.5.1
00:00:00 npm info install mathjax@2.5.1
00:00:00 npm info postinstall mathjax@2.5.1
...
00:00:00 npm info ok 
00:00:00 Preparing build for deployment
00:00:21 An error occurred executing 'gear postreceive' (exit code: 23)
00:00:00 Error message: Shell command '/usr/bin/rsync -avS --delete /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-root/runtime/repo/ /var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/' returned an error. rc=23
00:00:00 stdout: sending incremental file list
00:00:00 ./
00:00:00 .gitignore
...
00:00:00 node_modules/mathjax/fonts/HTML-CSS/TeX/png/AMS/Regular/100/21B0.png
00:00:01 node_modules/mathjax/fonts/HTML-CSS/TeX/png/AMS/Regular/100/21B1.png
00:00:00 node_modules/mathjax/fonts/HTML-CSS/TeX/png/AMS/Regular/100/21B6.png
...
00:00:00 node_modules/st/node_modules/
00:00:00 node_modules/st/test/
00:00:00 
00:00:00 sent 32980256 bytes  received 250077 bytes  1545596.88 bytes/sec
00:00:00 total size is 67171997  speedup is 2.02
00:00:00 stderr: rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/085/.03A8.png.OyJdtw" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/085/.03A9.png.sNffOO" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/085/.2002.png.q8yl96" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/085/.2003.png.1Naxup" failed: Disk quota exceeded (122)
...
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/336/.2227.png.tu0H6V" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/336/.2228.png.cyaZXh" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/336/.2229.png.UXHwQD" failed: Disk quota exceeded (122)
00:00:00 rsync: recv_generator: mkdir "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Italic/050" failed: Disk quota exceeded (122)
00:00:00 *** Skipping any contents from this failed directory ***
00:00:00 rsync: recv_generator: mkdir "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Italic/060" failed: Disk quota exceeded (122)
00:00:00 *** Skipping any contents from this failed directory ***
00:00:00 rsync: recv_generator: mkdir "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Italic/071" failed: Disk quota exceeded (122)
00:00:00 *** Skipping any contents from this failed directory ***
00:00:00 rsync: recv_generator: mkdir "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Italic/085" failed: Disk quota exceeded (122)
00:00:00 *** Skipping any contents from this failed directory ***
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/336/.222A.png.pebSKZ" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/336/.222B.png.fk0lFl" failed: Disk quota exceeded (122)
...
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/400/.006A.png.ERBMvg" failed: Disk quota exceeded (122)
Write failed: Broken pipe
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/400/.006B.png.zN4LFC" failed: Disk quota exceeded (122)
...
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/476/.02D9.png.FvN0TD" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/var/lib/openshift/55ed7c8b0c1e66582e0000b7/app-deployments/2015-09-07_08-03-29.315/repo/node_modules/mathjax/fonts/HTML-CSS/TeX/png/Main/Bold/476/.02DA.png.VG8IF0" failed: Disk quota exceeded (122)
00:00:00 rsync: mkstemp "/⏎                                                                                                                                                                                        

Hmm.

cben commented 8 years ago

Tried medium gear. Subjectively faster, failed quota too:

DEBUG: Request POST https://openshift.redhat.com/broker/rest/domain/mathdown/applications
DEBUG:    code 422 169655 ms
Warning: Gear 55edcc3c7628e1a63200018d is using 100.0% of inodes allowed
The initial build for the application failed: Shell command '/sbin/runuser -s /bin/sh 55edcc3c7628e1a63200018d -c "exec /usr/bin/runcon 'unconfined_u:system_r:openshift_t:s0:c2,c144' /bin/sh -c \"gear
postreceive --init >> /tmp/initial-build.log 2>&1\""' returned an error. rc=255

.Last 10 kB of build output:
 recv_generator: mkdir "/var/lib/openshift/55edcc3c7628e1a63200018d/app-deployments/2015-09-07_13-41-54.314/repo/node_modules/mathjax/localization/oc" failed: Disk quota exceeded (122)
*** Skipping any contents from this failed directory ***
...
cben commented 8 years ago

Another undocumented option?

For more details about the problem, try running the command again with the '--trace' option.

On second attempt with -g medium --trace, created successfully and rather fast:

DEBUG: Request POST https://openshift.redhat.com/broker/rest/domain/mathdown/applications
DEBUG:    code 201 138436 ms

EDIT: ah, that's for deploying gh-pages, not the npm-mathjax branch.

This is embarassingly simple. If I want stuff to move faster I should pay for a beefier machine slice!

Let's try small.highcpu gear.

cben commented 8 years ago

small.highcpu worked too (151041ms for the critical POST). That's good as small.highcpu is already $18/mo per gear, and I want at least 2 (for zero-downtime deploys), vs $36/mo per medium gear.

cben commented 8 years ago

Quota is same for any gear size: 381 MB used / 1 GB limit.

cben commented 8 years ago

More interesting: a deploy with --enable-jenkins succeeded, on small gear!

I now have a https://jenkins-mathdown.rhcloud.com, and a Jenkins Client cartridge in the gear. On create, it seems the target app was created first (which was fast), then the build was sent to Jenkins, which created a new app for building (TARGETbldr), copied source there, built, copied result to the target app, and only then it started serving. [https://developers.openshift.com/en/managing-continuous-integration.html]

On git push, a similarly complicated dance happens and the build claimed success; however the git push timed out, and I don't see the effect).

=> I think I'll do both. Jenkins, small for the staging and small.highcpu (no jenkins) for the prod.

cben commented 8 years ago

Nah, this morning I found the Jenkins instance unresponsive. After destroying the jenkins app, creating with --enable-jenkins timed out. I then tried first creating the jenkins app, then creating mathdown with --enable-jenkins — also timed out but the app was created. Documenting it, but giving up.


However I now tried something I should have done from the beginning: creating empty app (without --from-code) [49sec], then git push -f [1m19sec] — worked! (an empty app gets some initial scaffolding; most tutorials involving an empty app recommend git pull/merge from it, but I didn't want to pollute my history just to deploy an existing version. For some reason I never tried push -f to replace OpenShift's initial commit...)

=> The new both strategies I'm gonna do is use the empty create + push for staging, and small.highcpu gears for prod.

cben commented 8 years ago

flipping DNS to https://prod-mathdown.rhcloud.com:

cben commented 8 years ago

eh, removing aliases means http stopped working too (no longer routed to the right gear). but removing only SSL alias would not be enough, prevents adding alias on new app :-(

cben commented 8 years ago

PHEW. CLOSING. Might re-open if it happens again (staging is using small gears in hope I'll catch problems there before they hit prod)

cben commented 8 years ago

Hmm. Load tested staging (2 small gears) twice using https://loader.io. Started misbehaving (latency AND errors) at ~1600 "clients/sec" but I'm not sure they actually mean 1600 https reqs/sec ("clients" is climbing, bandwidth stays ~constant?): https://loader.io/reports/946e577dd04b776c8ae541c7c66e37dc/results/c59a6f817f6af8f1ac59b6e6074ac076#connections Good news is that it tried to scale (not fast enough but this load climbs unrealisticially fast), bad news is first time it failed with 504:

==> app-root/logs/haproxy_ctld.log <==
I, [2015-09-10T03:08:07.646220 #505490]  INFO -- : add-gear - exit_code: 1  output: The add-gear request failed with http_code: 504

==> app-root/logs/haproxy.log <==
[WARNING] 252/030820 (350021) : config : log format ignored for proxy 'stats' since it has no log address.
[WARNING] 252/030820 (350021) : config : log format ignored for proxy 'express' since it has no log address.
[WARNING] 252/030820 (159622) : Stopping proxy stats in 0 ms.
[WARNING] 252/030820 (159622) : Stopping proxy express in 0 ms.
[WARNING] 252/030820 (159622) : Proxy stats stopped (FE: 2 conns, BE: 0 conns).
[WARNING] 252/030820 (159622) : Proxy express stopped (FE: 1618 conns, BE: 116043 conns).

Second time it scaled successfully, and scaled down 10min later:

==> app-root/logs/haproxy_ctld.log <==
I, [2015-09-10T03:19:28.211013 #505490]  INFO -- : add-gear - capacity: 96.875% gear_count: 2 sessions: 31 up_thresh: 90.0%

==> app-root/logs/haproxy.log <==
[WARNING] 252/032144 (401660) : config : log format ignored for proxy 'stats' since it has no log address.
[WARNING] 252/032144 (401660) : config : log format ignored for proxy 'express' since it has no log address.
[WARNING] 252/032144 (350021) : Stopping proxy stats in 0 ms.
[WARNING] 252/032144 (350021) : Stopping proxy express in 0 ms.
[WARNING] 252/032144 (350021) : Proxy stats stopped (FE: 1 conns, BE: 0 conns).
[WARNING] 252/032144 (350021) : Proxy express stopped (FE: 707 conns, BE: 82985 conns).
[WARNING] 252/032146 (401660) : Server express/local-gear is DOWN for maintenance.
[WARNING] 252/032146 (401660) : Server express/local-gear is UP (leaving maintenance).

==> app-root/logs/haproxy_ctld.log <==
I, [2015-09-10T03:21:46.239648 #505490]  INFO -- : add-gear - exit_code: 0  output: 

==> app-root/logs/haproxy.log <==
[WARNING] 252/032149 (401765) : config : log format ignored for proxy 'stats' since it has no log address.
[WARNING] 252/032149 (401765) : config : log format ignored for proxy 'express' since it has no log address.
[WARNING] 252/032149 (401660) : Stopping proxy stats in 0 ms.
[WARNING] 252/032149 (401660) : Stopping proxy express in 0 ms.
[WARNING] 252/032149 (401660) : Proxy stats stopped (FE: 2 conns, BE: 0 conns).
[WARNING] 252/032149 (401660) : Proxy express stopped (FE: 0 conns, BE: 0 conns).

==> app-root/logs/haproxy_ctld.log <==
I, [2015-09-10T03:29:31.434609 #505490]  INFO -- : remove-gear - capacity: 0.0% gear_count: 3 sessions: 0 remove_thresh: 46.5%

==> app-root/logs/haproxy.log <==
[WARNING] 252/032937 (401765) : Server express/gear-55f12f0889f5cfc3c3000144-mathdown is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 1ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[WARNING] 252/033012 (401765) : Stopping proxy stats in 0 ms.
[WARNING] 252/033012 (401765) : Stopping proxy express in 0 ms.
[WARNING] 252/033012 (401765) : Proxy stats stopped (FE: 1 conns, BE: 0 conns).
[WARNING] 252/033012 (401765) : Proxy express stopped (FE: 5 conns, BE: 27 conns).
[WARNING] 252/033012 (428636) : config : log format ignored for proxy 'stats' since it has no log address.
[WARNING] 252/033012 (428636) : config : log format ignored for proxy 'express' since it has no log address.

==> app-root/logs/haproxy_ctld.log <==
I, [2015-09-10T03:30:15.244630 #505490]  INFO -- : remove-gear - exit_code: 0  output: 

The only thing here I don't understand is the brief "express/local-gear is DOWN for maintenance"...