Skip to content
Browse files

Initial version to allow a user to run a custom version of Node.js on

OpenShift. The user can easily switch between Node versions(e.g. 0.8.9 to
0.9.1) by just editing the .openshift/markers/NODEJS_VERSION file.
  • Loading branch information...
1 parent 7e600a7 commit cd62867ca13a10948fc630370429bd367036acb5 @ramr committed Sep 22, 2012
View
32 .openshift/action_hooks/build
@@ -0,0 +1,32 @@
+#!/bin/bash
+# This is a simple build script and will be executed on your CI system if
+# available. Otherwise it will execute while your application is stopped
+# before the deploy step. This script gets executed directly, so it
+# could be python, php, ruby, etc.
+
+
+# Source utility functions.
+source "$OPENSHIFT_REPO_DIR/.openshift/lib/utils"
+
+# Setup path to include the custom Node[.js] version.
+_SHOW_SETUP_PATH_MESSAGES="true" setup_path_for_custom_node_version
+
+
+# So we we moved the package.json file out of the way in pre_build,
+# so that the OpenShift git post-receive hook doesn't try and use the
+# old npm version to install the dependencies. Move it back in.
+tmp_package_json="$(get_node_tmp_dir)/package.json"
+if [ -f "$tmp_package_json" ]; then
+ # Only overlay it if there is no current package.json file.
+ [ -f "${OPENSHIFT_REPO_DIR}/package.json" ] || \
+ mv "$tmp_package_json" "${OPENSHIFT_REPO_DIR}/package.json"
+fi
+
+
+# Do npm install with the new npm binary.
+if [ -f "${OPENSHIFT_REPO_DIR}"/package.json ]; then
+ echo " - Installing dependencies w/ new version of npm ... "
+ echo
+ (cd "${OPENSHIFT_REPO_DIR}"; export TMPDIR="/tmp"; npm install -d)
+fi
+
View
16 .openshift/action_hooks/deploy
@@ -0,0 +1,16 @@
+#!/bin/bash
+# This deploy hook gets executed after dependencies are resolved and the
+# build hook has been run but before the application has been started back
+# up again. This script gets executed directly, so it could be python, php,
+# ruby, etc.
+
+
+# Source utility functions.
+source "$OPENSHIFT_REPO_DIR/.openshift/lib/utils"
+
+
+# On slave/serving gears, need to do the install as part of deploy
+# so check if its needed. Just ensure the custom Node[.js] version is
+# installed.
+ensure_node_is_installed
+
View
4 .openshift/action_hooks/post_deploy
@@ -0,0 +1,4 @@
+#!/bin/bash
+# This is a simple post deploy hook executed after your application
+# is deployed and started. This script gets executed directly, so
+# it could be python, php, ruby, etc.
View
41 .openshift/action_hooks/post_start_nodejs-0.6
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# The pre_start_cartridge and pre_stop_cartridge hooks are *SOURCED*
+# immediately before (re)starting or stopping the specified cartridge.
+# They are able to make any desired environment variable changes as
+# well as other adjustments to the application environment.
+
+# The post_start_cartridge and post_stop_cartridge hooks are executed
+# immediately after (re)starting or stopping the specified cartridge.
+
+# Exercise caution when adding commands to these hooks. They can
+# prevent your application from stopping cleanly or starting at all.
+# Application start and stop is subject to different timeouts
+# throughout the system.
+
+# Source utility functions.
+source "$OPENSHIFT_REPO_DIR/.openshift/lib/utils"
+
+# Get the node version.
+ver=$(get_node_version)
+
+
+# Set URI to the custom sample /env route.
+app_uri="http://$OPENSHIFT_GEAR_DNS/env"
+
+# Wait a bit to give the server time to come up.
+sleep 5
+
+# Check if the app_uri is available - user code could have removed the
+# one in the sample -- we just print this for sanity testing.
+zcode=$(curl --write-out %{http_code} -s -o /dev/null "$app_uri")
+
+if [ "$zcode" -eq 200 ]; then
+ echo ""
+ echo " - Using Node.js version $ver, checking app URI ... "
+ echo " - test URI = $app_uri"
+ echo " - Version from test URI = $(curl -s $app_uri | grep 'Version')"
+ echo ""
+fi
+
+
View
14 .openshift/action_hooks/post_stop_nodejs-0.6
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# The pre_start_cartridge and pre_stop_cartridge hooks are *SOURCED*
+# immediately before (re)starting or stopping the specified cartridge.
+# They are able to make any desired environment variable changes as
+# well as other adjustments to the application environment.
+
+# The post_start_cartridge and post_stop_cartridge hooks are executed
+# immediately after (re)starting or stopping the specified cartridge.
+
+# Exercise caution when adding commands to these hooks. They can
+# prevent your application from stopping cleanly or starting at all.
+# Application start and stop is subject to different timeouts
+# throughout the system.
View
21 .openshift/action_hooks/pre_build
@@ -0,0 +1,21 @@
+#!/bin/bash
+# This is a simple script and will be executed on your CI system if
+# available. Otherwise it will execute while your application is stopped
+# before the build step. This script gets executed directly, so it
+# could be python, php, ruby, etc.
+
+
+# Source utility functions.
+source "$OPENSHIFT_REPO_DIR/.openshift/lib/utils"
+
+# Ensure custom node version if not installed.
+echo ""
+ensure_node_is_installed
+
+
+# We need to move the package.json file out of the way in pre_build, so
+# that the OpenShift git post-receive hook doesn't try and use the old
+# npm version to install the dependencies.
+mv "${OPENSHIFT_REPO_DIR}/package.json" "$(get_node_tmp_dir)"
+
+
View
25 .openshift/action_hooks/pre_start_nodejs-0.6
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# The pre_start_cartridge and pre_stop_cartridge hooks are *SOURCED*
+# immediately before (re)starting or stopping the specified cartridge.
+# They are able to make any desired environment variable changes as
+# well as other adjustments to the application environment.
+
+# The post_start_cartridge and post_stop_cartridge hooks are executed
+# immediately after (re)starting or stopping the specified cartridge.
+
+# Exercise caution when adding commands to these hooks. They can
+# prevent your application from stopping cleanly or starting at all.
+# Application start and stop is subject to different timeouts
+# throughout the system.
+
+
+# Source utility functions.
+source "$OPENSHIFT_REPO_DIR/.openshift/lib/utils"
+
+# Setup path to include the custom Node[.js] version.
+ver=$(get_node_version)
+echo ""
+echo " - pre_start_nodejs: Adding Node.js version $ver binaries to path"
+_SHOW_SETUP_PATH_MESSAGES="true" setup_path_for_custom_node_version
+
View
29 .openshift/action_hooks/pre_stop_nodejs-0.6
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# The pre_start_cartridge and pre_stop_cartridge hooks are *SOURCED*
+# immediately before (re)starting or stopping the specified cartridge.
+# They are able to make any desired environment variable changes as
+# well as other adjustments to the application environment.
+
+# The post_start_cartridge and post_stop_cartridge hooks are executed
+# immediately after (re)starting or stopping the specified cartridge.
+
+# Exercise caution when adding commands to these hooks. They can
+# prevent your application from stopping cleanly or starting at all.
+# Application start and stop is subject to different timeouts
+# throughout the system.
+
+
+# First time in .openshift/lib/utils might not exist, so add a check
+# to ensure file exists.
+if [ -f "$OPENSHIFT_REPO_DIR/.openshift/lib/utils" ]; then
+ # Source utility functions.
+ source "$OPENSHIFT_REPO_DIR/.openshift/lib/utils"
+
+ # Setup path to include the custom Node[.js] version.
+ ver=$(get_node_version)
+ echo ""
+ echo " - pre_stop_nodejs: Adding Node.js version $ver binaries to path"
+ _SHOW_SETUP_PATH_MESSAGES="true" setup_path_for_custom_node_version
+fi
+
View
22 .openshift/cron/README.cron
@@ -0,0 +1,22 @@
+Run scripts or jobs on a periodic basis
+=======================================
+Any scripts or jobs added to the minutely, hourly, daily, weekly or monthly
+directories will be run on a scheduled basis (frequency is as indicated by the
+name of the directory) using run-parts.
+
+run-parts ignores any files that are hidden or dotfiles (.*) or backup
+files (*~ or *,) or named *.{rpmsave,rpmorig,rpmnew,swp,cfsaved}
+
+The presence of two specially named files jobs.deny and jobs.allow controls
+how run-parts executes your scripts/jobs.
+ jobs.deny ===> Prevents specific scripts or jobs from being executed.
+ jobs.allow ===> Only execute the named scripts or jobs (all other/non-named
+ scripts that exist in this directory are ignored).
+
+The principles of jobs.deny and jobs.allow are the same as those of cron.deny
+and cron.allow and are described in detail at:
+ http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-Automating_System_Tasks.html#s2-autotasks-cron-access
+
+See: man crontab or above link for more details and see the the weekly/
+ directory for an example.
+
View
0 .openshift/cron/daily/.gitignore
No changes.
View
0 .openshift/cron/hourly/.gitignore
No changes.
View
0 .openshift/cron/minutely/.gitignore
No changes.
View
0 .openshift/cron/monthly/.gitignore
No changes.
View
16 .openshift/cron/weekly/README
@@ -0,0 +1,16 @@
+Run scripts or jobs on a weekly basis
+=====================================
+Any scripts or jobs added to this directory will be run on a scheduled basis
+(weekly) using run-parts.
+
+run-parts ignores any files that are hidden or dotfiles (.*) or backup
+files (*~ or *,) or named *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} and handles
+the files named jobs.deny and jobs.allow specially.
+
+In this specific example, the chronograph script is the only script or job file
+executed on a weekly basis (due to white-listing it in jobs.allow). And the
+README and chrono.dat file are ignored either as a result of being black-listed
+in jobs.deny or because they are NOT white-listed in the jobs.allow file.
+
+For more details, please see ../README.cron file.
+
View
1 .openshift/cron/weekly/chrono.dat
@@ -0,0 +1 @@
+Time And Relative D...n In Execution (Open)Shift!
View
3 .openshift/cron/weekly/chronograph
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "`date`: `cat $(dirname \"$0\")/chrono.dat`"
View
12 .openshift/cron/weekly/jobs.allow
@@ -0,0 +1,12 @@
+#
+# Script or job files listed in here (one entry per line) will be
+# executed on a weekly-basis.
+#
+# Example: The chronograph script will be executed weekly but the README
+# and chrono.dat files in this directory will be ignored.
+#
+# The README file is actually ignored due to the entry in the
+# jobs.deny which is checked before jobs.allow (this file).
+#
+chronograph
+
View
7 .openshift/cron/weekly/jobs.deny
@@ -0,0 +1,7 @@
+#
+# Any script or job files listed in here (one entry per line) will NOT be
+# executed (read as ignored by run-parts).
+#
+
+README
+
View
40 .openshift/lib/setup_custom_nodejs_env
@@ -0,0 +1,40 @@
+# Utility functions for bash session - sourced in via the user's
+# bash profile ($OPENSHIFT_DATA_DIR/.bash_profile).
+
+# Source utility functions.
+source $OPENSHIFT_REPO_DIR/.openshift/lib/utils
+
+
+# Internal function to setup path and remove the wrappers.
+function _setup_path_and_remove_wrappers() {
+ # First invocation of npm or node, so setup the custom path and
+ # unset the wrappers. Add the custom node binaries to the PATH.
+ [ -z "$ZDEBUG" ] || echo "Setting path to include custom Node version"
+ setup_path_for_custom_node_version
+ unset node
+ unset npm
+ unset _setup_path_and_remove_wrappers
+
+} # End of function _setup_path_and_remove_wrappers.
+
+
+# Temporary wrapper function to setup path before invoking npm.
+function npm() {
+ # Setup path, remove wrappers and reinvoke npm.
+ _setup_path_and_remove_wrappers
+ npm "$@"
+
+} # End of function npm.
+
+
+# Temporary wrapper function to setup path before invoking node.
+function node() {
+ # Setup path, remove wrappers and reinvoke node.
+ _setup_path_and_remove_wrappers
+ node "$@"
+
+} # End of function node.
+
+
+#
+# EOF
View
151 .openshift/lib/utils
@@ -0,0 +1,151 @@
+#!/bin/bash
+#
+# Utility functions.
+#
+
+
+# Returns the configured Node version - defaults to 0.8.9.
+function get_node_version() {
+ marker="$OPENSHIFT_REPO_DIR/.openshift/markers/NODEJS_VERSION"
+ nodejs_ver=$(egrep -v "^\s*#.*" "$marker" | egrep -v "^\s*$" | tail -1)
+ echo "${nodejs_ver:-"0.8.9"}"
+
+} # End of function get_node_version.
+
+
+# Returns the directory where Node is to be installed/is installed.
+function get_node_install_dir() {
+ echo "$OPENSHIFT_DATA_DIR"
+
+} # End of function get_node_install_dir.
+
+
+# Returns the path to the npm binary.
+function get_npm_bin_path() {
+ ver=${1:-"$(get_node_version)"}
+ echo "$(get_node_install_dir)/node-v$ver-linux-x64/bin"
+
+} # End of function get_npm_bin_path.
+
+
+# Returns the path to the node binary.
+function get_node_bin_path() {
+ echo "$(get_npm_bin_path $@)"
+
+} # End of function get_node_bin_path.
+
+
+# Returns the temporary directory we use for processing.
+function get_node_tmp_dir() {
+ ztmpdir="$OPENSHIFT_DATA_DIR/.nodejs.tmp"
+
+ # Ensure temp directory is created.
+ [ -d "$ztmpdir" ] || mkdir -p "$ztmpdir"
+
+ echo "$ztmpdir"
+
+} # End of function get_node_tmp_dir.
+
+
+#
+# Download and install the specified Node.js version.
+#
+function _install_nodejs() {
+ ver=${1:-"$(get_node_version)"}
+
+ # Sample download links:
+ # http://nodejs.org/dist/v0.8.9/node-v0.8.9-linux-x64.tar.gz
+ # http://nodejs.org/dist/v0.9.1/node-v0.9.1-linux-x64.tar.gz
+ zfile="node-v${ver}-linux-x64.tar.gz"
+ zlink="http://nodejs.org/dist/v${ver}/${zfile}"
+
+ instdir="$(get_node_install_dir)"
+
+ # Download and extract the gzipped tarball.
+ dldir="$OPENSHIFT_DATA_DIR/downloads"
+ mkdir -p "$dldir"
+
+ echo " - Downloading and extracting $zlink ... "
+
+ if ! curl -L -o "$dldir/$zfile" "$zlink"; then
+ echo " - ERROR -- download failed for $zlink"
+ echo " - download uri = $dldir/$zfile"
+ return 1
+ fi
+
+ (cd "$instdir"; tar -zxf "$dldir/$zfile")
+ echo " - Done installing Node.js version $ver"
+
+} # End of function _install_nodejs.
+
+
+
+# Ensure the shell env setup bits are added to user's .bash_profile.
+function _ensure_bash_profile_setup() {
+ dot_bash_profile=$OPENSHIFT_DATA_DIR/.bash_profile
+ pattern='\s*source(.*)\.openshift/lib/setup_custom_nodejs_env\s*(.*)\s*'
+ if ! egrep "$pattern" $dot_bash_profile > /dev/null 2>&1 ; then
+
+ cat >> $dot_bash_profile <<SRCEOF
+
+# Setup shell env for the custom Node[.js] version.
+source "\$OPENSHIFT_REPO_DIR/.openshift/lib/setup_custom_nodejs_env"
+SRCEOF
+
+ echo " - Added source setup_custom_nodejs_env to .bash_profile"
+ fi
+
+} # End of function _ensure_bash_profile_setup.
+
+
+# Check and install custom Node[.js] version.
+function ensure_node_is_installed() {
+ ver=${1:-"$(get_node_version)"}
+
+ echo " - Checking to see if Node.js version $ver is installed ... "
+
+ #
+ # To re-download and reinstall Node.js, uncomment these lines.
+ # rm -f downloads/node-v${ver}-linux-x64.tar.gz
+ # rm -rf $OPENSHIFT_DATA_DIR/node-v${ver}-linux-x64/
+ #
+ # Note: This function could be run multiple times on every git push,
+ # so use w/ caution (do once).
+ #
+
+ if [ -d "$(get_node_bin_path)" ]; then
+ echo " - Node.js version $ver is already installed"
+ else
+ _install_nodejs "$ver"
+ fi
+
+ # Ensure .bash_profile sets up path for custom Node[.js] version.
+ _ensure_bash_profile_setup
+
+} # End of function ensure_node_is_installed.
+
+
+# Sets up PATH to include the custom node version binaries.
+function setup_path_for_custom_node_version() {
+ # Get version.
+ ver=${1:-"$(get_node_version)"}
+
+ # Get node binary path.
+ node_bin_path=$(get_node_bin_path "$ver")
+
+ # Add the node binary path to the PATH.
+ export PATH="$node_bin_path:${PATH}"
+
+ if [ -n "$_SHOW_SETUP_PATH_MESSAGES" ]; then
+ echo " - PATH set to include custom node version ($ver) from"
+ echo " $node_bin_path "
+ echo " PATH = $PATH"
+ fi
+
+} # End of function setup_path_for_custom_node_version.
+
+
+
+#
+# EOF
+#
View
9 .openshift/markers/NODEJS_VERSION
@@ -0,0 +1,9 @@
+# Uncomment one of the version lines to select the node version to use.
+# The last "non-blank" version line is the one picked up by the code in
+# .openshift/lib/utils
+# Default: 0.8.9
+#
+# 0.8.9
+# 0.9.1
+0.8.9
+
View
7 .openshift/markers/README
@@ -0,0 +1,7 @@
+Markers
+===========
+
+Adding marker files to this directory will have the following effects:
+
+force_clean_build - Will remove any previously installed npm modules and
+ re-install all the required modules from scratch
View
67 README
@@ -0,0 +1,67 @@
+Feel free to change or remove this file, it is informational only.
+
+Repo layout
+===========
+node_modules/ - Any Node modules packaged with the app
+deplist.txt - Deprecated.
+package.json - npm package descriptor.
+.openshift/ - Location for openshift specific files
+.openshift/action_hooks/pre_build - Script that gets run every git push before
+ the build
+.openshift/action_hooks/build - Script that gets run every git push as
+ part of the build process (on the CI
+ system if available)
+.openshift/action_hooks/deploy - Script that gets run every git push after
+ build but before the app is restarted
+.openshift/action_hooks/post_deploy - Script that gets run every git push after
+ the app is restarted
+
+Notes about layout
+==================
+Please leave the node_modules and .openshift directories but feel free to
+create additional directories if needed.
+
+Note: Every time you push, everything in your remote repo dir gets recreated
+ please store long term items (like an sqlite database) in the OpenShift
+ data directory, which will persist between pushes of your repo.
+ The OpenShift data directory is accessible relative to the remote repo
+ directory (../data) or via an environment variable OPENSHIFT_DATA_DIR.
+
+
+Environment Variables
+=====================
+OpenShift provides several environment variables to reference for ease
+of use. The following list are some common variables but far from exhaustive:
+ process.env.OPENSHIFT_GEAR_NAME - Application name
+ process.env.OPENSHIFT_GEAR_DIR - Application dir
+ process.env.OPENSHIFT_DATA_DIR - For persistent storage (between pushes)
+ process.env.OPENSHIFT_TMP_DIR - Temp storage (unmodified files deleted after 10 days)
+
+When embedding a database using 'rhc app cartridge add', you can reference environment
+variables for username, host and password:
+ process.env.OPENSHIFT_DB_HOST - DB Host
+ process.env.OPENSHIFT_DB_PORT - DB Port
+ process.env.OPENSHIFT_DB_USERNAME - DB Username
+ process.env.OPENSHIFT_DB_PASSWORD - DB Password
+
+When embedding a NoSQL database using 'rhc app cartridge add', you can reference environment
+variables for username, host and password:
+ process.env.OPENSHIFT_NOSQL_DB_HOST - NoSQL DB Host
+ process.env.OPENSHIFT_NOSQL_DB_PORT - NoSQL DB Port
+ process.env.OPENSHIFT_NOSQL_DB_USERNAME - NoSQL DB Username
+ process.env.OPENSHIFT_NOSQL_DB_PASSWORD - NoSQL DB Password
+
+To get a full list of environment variables, simply add a line in your
+.openshift/action_hooks/build script that says "export" and push.
+
+
+deplist.txt
+===========
+A list of node modules to install, line by line on the server. This will happen
+when the user does a git push.
+
+
+Additional information
+======================
+Link to additional information will be here, when we have it :)
+
View
69 README.md
@@ -1,4 +1,67 @@
-nodejs-custom-version-openshift
-===============================
+Running a custom/latest Node[.js] version on RedHat's OpenShift PaaS
+====================================================================
+This git repository is a sample Node application along with the
+"orchestration" bits to help you run the latest or a custom version
+of Node on RedHat's OpenShift PaaS.
+
+
+Selecting a Node version to install/use
+---------------------------------------
+
+To select the version of Node.js that you want to run, just edit or add
+a version to the .openshift/markers/NODEJS_VERSION file.
+
+ Example: To install Node.js version 0.9.1, you can run:
+ $ echo -e "0.9.1\n" >> .openshift/markers/NODEJS_VERSION
+
+
+The action_hooks in this application will use that NODEJS_VERSION marker
+file to download and extract that Node version if it is available on
+nodejs.org and will automatically set the paths up to use the node/npm
+binaries from that install directory.
+
+ See: .openshift/action_hooks/ for more details.
+
+ Note: The last non-blank line in the .openshift/markers/NODEJS_VERSION
+ file.determines the version it will install.
+
+
+Okay, now onto how can you get a custom Node.js version running
+on OpenShift.
+
+
+Steps to get a custom Node.js version running on OpenShift
+----------------------------------------------------------
+
+Create an account at http://openshift.redhat.com/
+
+Create a namespace, if you haven't already do so
+
+ rhc domain create <yournamespace>
+
+Create a nodejs-0.6 application (you can name it anything via -a)
+
+ rhc app create -a palinode -t nodejs-0.6
+
+Add this `github nodejs-custom-version-openshift-quickstart` repository
+
+ cd palinode
+ git remote add upstream -m master git@github.com:ramr/nodejs-custom-version-openshift-quickstart.git
+ git pull -s recursive -X theirs upstream master
+
+Optionally, specify the custom version of Node.js you want to run with
+(Default is v0.8.9).
+If you want to more later version of Node (example v0.9.1), you can change
+to that by just writing it to the end of the NODEJS_VERSION file.
+
+ echo "0.9.1" >> .openshift/markers/NODEJS_VERSION
+
+Then push the repo to OpenShift
+
+ git push
+
+That's it, you can now checkout your application at:
+
+ http://palinode-$yournamespace.rhcloud.com
+ ( See env @ http://palinode-$yournamespace.rhcloud.com/env )
-Node.js quickstart application to run the latest or any custom Node.js version on OpenShift
View
13 deplist.txt
@@ -0,0 +1,13 @@
+#
+# ***************************************************************************
+#
+# Note: This file has been deprecated and exists for backward compatibility.
+# Please use package.json to add dependencies to the Node modules
+# your application requires.
+#
+# ***************************************************************************
+#
+
+#
+# For a list of globally installed modules - see file: npm_global_module_list.
+#
View
166 index.html
@@ -0,0 +1,166 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <title>Welcome to OpenShift</title>
+ <style>
+ html {
+ background: black;
+ }
+ body {
+ background: #333;
+ background: -webkit-linear-gradient(top, black, #666);
+ background: -o-linear-gradient(top, black, #666);
+ background: -moz-linear-gradient(top, black, #666);
+ background: linear-gradient(top, black, #666);
+ color: white;
+ font-family: "Helvetica Neue",Helvetica,"Liberation Sans",Arial,sans-serif;
+ width: 40em;
+ margin: 0 auto;
+ padding: 3em;
+ }
+ a {
+ color: white;
+ }
+
+ h1 {
+ text-transform: capitalize;
+ -moz-text-shadow: -1px -1px 0 black;
+ -webkit-text-shadow: 2px 2px 2px black;
+ text-shadow: -1px -1px 0 black;
+ box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.5);
+ background: #CC0000;
+ width: 22.5em;
+ margin: 1em -2em;
+ padding: .3em 0 .3em 1.5em;
+ position: relative;
+ }
+ h1:before {
+ content: '';
+ width: 0;
+ height: 0;
+ border: .5em solid #91010B;
+ border-left-color: transparent;
+ border-bottom-color: transparent;
+ position: absolute;
+ bottom: -1em;
+ left: 0;
+ z-index: -1000;
+ }
+ h1:after {
+ content: '';
+ width: 0;
+ height: 0;
+ border: .5em solid #91010B;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ position: absolute;
+ bottom: -1em;
+ right: 0;
+ z-index: -1000;
+ }
+ h2 {
+ margin: 2em 0 .5em;
+ border-bottom: 1px solid #999;
+ }
+
+ pre {
+ background: black;
+ padding: 1em 0 0;
+ -webkit-border-radius: 1em;
+ -moz-border-radius: 1em;
+ border-radius: 1em;
+ color: #9cf;
+ }
+
+ ul {
+ margin: 0;
+ padding: 0;
+ }
+ li {
+ list-style-type: none;
+ padding: .5em 0;
+ }
+
+ .brand {
+ display: block;
+ text-decoration: none;
+ }
+ .brand .brand-image {
+ float: left;
+ border: none;
+ }
+ .brand .brand-text {
+ float: left;
+ font-size: 24px;
+ line-height: 24px;
+ padding: 4px 0;
+ color: white;
+ text-transform: uppercase;
+ }
+ .brand:hover,
+ .brand:active {
+ text-decoration: underline;
+ }
+
+ .brand:before,
+ .brand:after {
+ content: ' ';
+ display: table;
+ }
+ .brand:after {
+ clear: both;
+ }
+ .env {
+ font-size: 16px;
+ line-height: 16px;
+ color: #298A08;
+ }
+ </style>
+</head>
+<body>
+ <a href="http://openshift.com" class="brand">
+ <img class="brand-image"
+ alt="OpenShift logo"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAgCAYAAABU1PscAAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAARHgAAER4B27UUrQAABUhJREFUWMPFWFlsVGUU/s5/70zbaSltA7RQpJ2lC9CFkQkWIgSJxkAhRA0JCYFq4hPG6JsoGKNCtPigxqhvGlPAuGIaE4igNaElbIW2yNL2tkOtTYGWCqWF2e79fCh7p1Bmpnge/3vuOef7z/nPJiTxMHS6pMRuu6YqFNTTAJYSyAU4GZB0AH2AGCANAfc5Qrba6T3HrmECScYLwCioSIcV2AjidQDZ45Q/LJRaWrLV03X89P8GwHB5XwG4DcDkGPWEBKimNrzN094efGQAzjm9GWHFr4R4LiHKgFaSL3r8zYcmHEBbkW+KFo7UEyhKsNeHlMgyV8eJo4kQpqId9ub6HCoc+XWcxl8lcBTATwDax8GfZtHa054/f/bNg8ZcnyOhHjBc834E8MJ9/vML8aYZQX1hd1PP3WFXkhMRfYkIlpOoGomc0WRRTnch+XAQWG2KTNJNLbuy68C/cQMwXOWrAKkdgz8A8kMdg9X5fn/gQcI7POXLaMk3AGbe/P8SbF0D1KcGRGXpIJJpIQkWBHhnsf/Ie3GF0DmnMxmQT8bg7RellXr8ze+Ox3gAcBvNf+iUUhH5FODLSvScAerDGpiVxTAyGUYKzICA34nCwbhDyHB7N4L8PAofhVzh9jfvjffR/ZZTnupIsR8G0C9EjW7Tfnii/dBgrPL0u83kmjHy33Z3Z/zG97uKi7xpWA8GHZpE1mcZRne8MvXblfbxqQAWR+Fp+mdW5hZPjAqu5JVlhrTwOgrXi2ABbjjchF4FYGvi0qhprgagjYod4OeldXWRWBUEtdBjEH4mwIJ7vF2V4Dqgot0+NEFdPAqmdZ5tAXA8Slx6LrpKsxMHQJge5ft1v0oe2OOu+PZ39+LCOFqImqiXo8JzAeBkXlnmnoKK9LgACJl2R9gELsHW1saUwKCpnbIoa8UMTokVgGXJmSjHkfNWUlWDy9d6USVdyoiEF8b1iElxQKHuPG1D/bCtVEBhCiykMQQFgCK2mN2sSx+tkdcbhGq7wKSkK9RnmsCG2xVSLsflAR1S6eloWhawtF8yGJGskSJDBdQR8pIjZMXcfFmm1gOg2lRaSRdT1AD1PBPQbCAyxcRMifCpc41HEtILNbh9s8SSvYTUmBp2LDGOdCOB1OD0XbeByWliwY5bugc9nU2T4wqhCx7PNAV9bSGwARp3TzVaP0j09GQUzJubLUgefY3SEHMh63MVr4FIlYL+7C1AlCwAmxM+/plYy6hhgN2xp1HBawAr72krnH3uoicTaXyHx7uIwKZoT0QhUhszAAI7x7ivL0a60/jp77yyTFrWt6N6rxE99c7OkxdiBhC2y/cAorXHpama/aNG8dkOO32b6p3zTzXmeysfPu4LkkKafA3IrGjfCfPtuGfiPlfx+xBsuWtwpa3zIuy2YaoZ5o0eSQc5TVnb53aeeAuk9eBtRvkqUH0MoTsqA7nL429eFzeA3lyfQ08eaiNgCrjTYNozQ1S+WyUfQCosTLqZ+oiDUNwhggPujpZTuCMXGwUV6cJgKYnNIJffR3df2NLLZ5871puQrUR//pzpU7rOnAfJP53eDELrsoPpk4RIGRn5xqIBAAdBOCAoBjBjPJsJUdZSt9HSOGFrld5cn2M4KbwfkIUJzqYhQlYWdJ7YN2FrFQCY3nPsmk61AuSuRNYyUdaiRBk/7tViR37Zcir1JYC8WNshgjWWPfhq0dmzVx/5bhQAWnLKU1Md8gZHOsjxAgmD2GEKq4s6m1sxASQPu16HiBh53goqPg9ac0TEcwNQEOBlQAZEcMgC94dDZt2c7r8GMIH0H43ZRDC51RVCAAAAAElFTkSuQmCC">
+ <div class="brand-text"><strong>Open</strong>Shift</div>
+ </a>
+ <h1>
+ Welcome to OpenShift - &lt;your custom Node.js version here&gt;
+ </h1>
+ <div>
+ <pre>
+ <a href="/env" class="env">Click here to view your Node.js process version and env.</a>
+ </pre>
+ </div>
+ <p>
+ Place your application here
+ </p>
+ <p>
+ In order to commit to your new project, go to your projects git repo (created with the rhc app create command). Make your changes, then run:
+ </p>
+ <pre>
+ git commit -a -m 'Some commit message'
+ git push
+ </pre>
+ <p>
+ Then reload this page.
+ </p>
+
+ <h2>
+ What's next?
+ </h2>
+ <ul>
+ <li>
+ Why not visit us at <a href="http://openshift.redhat.com">http://openshift.redhat.com</a>, or
+ </li>
+ <li>
+ You could get help in the <a href="http://www.redhat.com/openshift">OpenShift forums</a>, or
+ </li>
+ <li>
+ You're welcome to come chat with us in our IRC channel at #openshift on freenode.net
+ </li>
+ </ul>
+</body>
+</html>
View
8 node_modules/read.me
@@ -0,0 +1,8 @@
+
+This directory allows you to package any Node modules (that your application
+depends on) along with your application.
+
+If you just wish to install module(s) from the npm registry (npmjs.org), you
+can specify the module name(s) and optionally version in your application's
+dependency list file (../deplist.txt).
+
View
21 npm_global_module_list
@@ -0,0 +1,21 @@
+#
+# This file contains a list of globally installed and available npm modules.
+#
+
+# DB drivers.
+mongodb
+mysql
+pg
+
+# Other modules (including frameworks, middleware etc).
+async
+connect
+express
+formidable
+generic-pool
+hashish
+mime
+mkdirp
+node-static
+qs
+traverse
View
35 package.json
@@ -0,0 +1,35 @@
+{
+ "name": "OpenShift-Sample-App",
+ "version": "1.0.0",
+ "description": "OpenShift Sample Application",
+ "keywords": [
+ "OpenShift",
+ "Node.js",
+ "application",
+ "openshift"
+ ],
+ "author": {
+ "name": "OpenShift",
+ "email": "ramr@example.org",
+ "url": "http://openshift.redhat.com/"
+ },
+ "homepage": "http://openshift.redhat.com/",
+ "repository": {
+ "type": "git",
+ "url": "https://gitub.com/openshift/crankcase"
+ },
+
+ "engines": {
+ "node": ">= 0.6.0",
+ "npm": ">= 1.0.0"
+ },
+
+ "dependencies": {
+ "express": "*"
+ },
+ "devDependencies": {},
+ "bundleDependencies": [],
+
+ "private": true,
+ "main": "server.js"
+}
View
178 server.js
@@ -0,0 +1,178 @@
+#!/bin/env node
+// OpenShift sample Node application
+var express = require('express');
+var fs = require('fs');
+
+
+/**
+ * Define the sample application.
+ */
+var SampleApp = function() {
+
+ // Scope.
+ var self = this;
+
+
+ /* ================================================================ */
+ /* Helper functions. */
+ /* ================================================================ */
+
+ /**
+ * Set up server IP address and port # using env variables/defaults.
+ */
+ self.setupVariables = function() {
+ // Set the environment variables we need.
+ self.ipaddress = process.env.OPENSHIFT_INTERNAL_IP;
+ self.port = process.env.OPENSHIFT_INTERNAL_PORT || 8080;
+
+ if (typeof self.ipaddress === "undefined") {
+ // Log errors on OpenShift but continue w/ 127.0.0.1 - this
+ // allows us to run/test the app locally.
+ console.warn('No OPENSHIFT_INTERNAL_IP var, using 127.0.0.1');
+ self.ipaddress = "127.0.0.1";
+ };
+ };
+
+
+ /**
+ * Populate the cache.
+ */
+ self.populateCache = function() {
+ if (typeof self.zcache === "undefined") {
+ self.zcache = { 'index.html': '' };
+ }
+
+ // Local cache for static content.
+ self.zcache['index.html'] = fs.readFileSync('./index.html');
+ };
+
+
+ /**
+ * Retrieve entry (content) from cache.
+ * @param {string} key Key identifying content to retrieve from cache.
+ */
+ self.cache_get = function(key) { return self.zcache[key]; };
+
+
+ /**
+ * terminator === the termination handler
+ * Terminate server on receipt of the specified signal.
+ * @param {string} sig Signal to terminate on.
+ */
+ self.terminator = function(sig){
+ if (typeof sig === "string") {
+ console.log('%s: Received %s - terminating sample app ...',
+ Date(Date.now()), sig);
+ process.exit(1);
+ }
+ console.log('%s: Node server stopped.', Date(Date.now()) );
+ };
+
+
+ /**
+ * Setup termination handlers (for exit and a list of signals).
+ */
+ self.setupTerminationHandlers = function(){
+ // Process on exit and signals.
+ process.on('exit', function() { self.terminator(); });
+
+ // Removed 'SIGPIPE' from the list - bugz 852598.
+ ['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
+ 'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
+ ].forEach(function(element, index, array) {
+ process.on(element, function() { self.terminator(element); });
+ });
+ };
+
+
+ /* ================================================================ */
+ /* App server functions (main app logic here). */
+ /* ================================================================ */
+
+ /**
+ * Create the routing table entries + handlers for the application.
+ */
+ self.createRoutes = function() {
+ self.routes = { };
+
+ // Routes for /health, /asciimo, /env and /
+ self.routes['/health'] = function(req, res) {
+ res.send('1');
+ };
+
+ self.routes['/asciimo'] = function(req, res) {
+ var link = "http://i.imgur.com/kmbjB.png";
+ res.send("<html><body><img src='" + link + "'></body></html>");
+ };
+
+ self.routes['/env'] = function(req, res) {
+ var content = 'Version: ' + process.version + '\n<br/>\n' +
+ 'Env: {<br/>\n<pre>';
+ // Add env entries.
+ for (var k in process.env) {
+ content += ' ' + k + ': ' + process.env[k] + '\n';
+ }
+ content += '}\n</pre><br/>\n'
+ res.send(content);
+ res.send('<html>\n' +
+ ' <head><title>Node.js Process Env</title></head>\n' +
+ ' <body>\n<br/>\n' + content + '</body>\n</html>');
+ };
+
+ self.routes['/'] = function(req, res) {
+ res.set('Content-Type', 'text/html');
+ res.send(self.cache_get('index.html') );
+ };
+ };
+
+
+ /**
+ * Initialize the server (express) and create the routes and register
+ * the handlers.
+ */
+ self.initializeServer = function() {
+ self.createRoutes();
+ self.app = express.createServer();
+
+ // Add handlers for the app (from the routes).
+ for (var r in self.routes) {
+ self.app.get(r, self.routes[r]);
+ }
+ };
+
+
+ /**
+ * Initializes the sample application.
+ */
+ self.initialize = function() {
+ self.setupVariables();
+ self.populateCache();
+ self.setupTerminationHandlers();
+
+ // Create the express server and routes.
+ self.initializeServer();
+ };
+
+
+ /**
+ * Start the server (starts up the sample application).
+ */
+ self.start = function() {
+ // Start the app on the specific interface (and port).
+ self.app.listen(self.port, self.ipaddress, function() {
+ console.log('%s: Node server started on %s:%d ...',
+ Date(Date.now() ), self.ipaddress, self.port);
+ });
+ };
+
+}; /* Sample Application. */
+
+
+
+/**
+ * main(): Main code.
+ */
+var zapp = new SampleApp();
+zapp.initialize();
+zapp.start();
+

0 comments on commit cd62867

Please sign in to comment.
Something went wrong with that request. Please try again.