From 51b667363ccb16a4d7a72c4c34e75aaba435422c Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Mon, 1 Feb 2016 19:37:48 +0000 Subject: [PATCH 1/4] Adding saucelabs check to monitor --- node_modules/c9/saucelabs.js | 171 +++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 node_modules/c9/saucelabs.js diff --git a/node_modules/c9/saucelabs.js b/node_modules/c9/saucelabs.js new file mode 100644 index 00000000..935ec521 --- /dev/null +++ b/node_modules/c9/saucelabs.js @@ -0,0 +1,171 @@ +var fs = require('fs'); +var child_process = require('child_process'); +var dbg = require("debug")("saucelabs:helpers"); + +var SLTOKEN = "0C309258-40FA-4138-91AF-C226F17C6954"; +var ENDPOINT1 = "https://saucelabs.com/rest/v1/users"; +var PROMOCODE = "C9HotSauce"; +var FILE_LASTUSERINDEX = "./lastuserindex"; +var FILE_USERS_CREATED = "./users_created"; +var FILE_PROMOTED_ACCOUNTS_CREATED = "./promoted_accounts_created"; +var EXPECTED_RESULT_PROMOTE = "7200 Sauce manual minutes"; +var USERNAMESTART = "c9sauce"; +var INDEXTAG = "_INDEX_"; +var EMAIL_TAGGED = "test+sl" + INDEXTAG + "@c9.io"; + + +function getRandomChars(len) { + var text = ""; + if (!len) len = 5; + // no capitals because of https://cloud9ide.jira.com/browse/CLOUD-938 + //var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + var possible = "abcdefghijklmnopqrstuvwxyz0123456789"; + + for (var i=0; i < len; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + + return text; +} + +function readFile(file) { + var data = fs.readFileSync(file, "utf-8"); + return data; +} + +function writeFile(file, text) { + fs.writeFileSync(file, text+'\n', "utf-8"); + return; +} + +function appendFile(file, text) { + fs.appendFileSync(file, text+'\n'); + return; +} + +function createUser(username, password, email, callback) { + dbg("createUser()::username: " + username); + dbg("createUser()::password: " + password); + dbg("createUser()::email: " + email); + + var enc_email = encodeURIComponent(email); + + var postdata = '{"username": "' + username + '", ' + + '"password": "' + password + '", ' + + '"email": "' + enc_email + '", ' + + '"plan": "free", ' + + '"token": "' + SLTOKEN + '"}'; + + dbg("postdata: " + postdata); + + child_process.execFile("curl", [ + "-Ss", + "-X", "POST", + "-d", postdata, + ENDPOINT1 + ], + function(err, stdout, stderr) { + dbg("\nerr: " + JSON.stringify(err, null, 4)); + dbg("\nstdout:\n" + stdout); + dbg("\nstderr:\n" + stderr); + + if (err) + return callback("Error executing curl to create Saucelabs user (error: " + err.message + ")"); + + var response; + + try { + response = JSON.parse(stdout); + } + catch (e) { + return callback("Could not parse curl response (createUser): " + stdout); + } + + if (response.error) + return callback(response.error); + + var user_object = { + username: username, + password: password, + access_key: response.access_key, + email: enc_email + }; + + callback(null, user_object); + } +)} + +function promoteUser(user_object, callback) { + dbg("promoteUser()::username: " + user_object.username); + dbg("createUser()::password: " + user_object.password); + dbg("createUser()::email: " + user_object.email); + dbg("promoteUser()::access_key: " + user_object.access_key); + + var postdata = '{"promocode": "' + PROMOCODE + '"}'; + var url = "https://" + user_object.username + ":" + user_object.access_key + "@saucelabs.com/rest/v1/users/" + user_object.username + "/promotion/submit"; + dbg("url: " + url); + + child_process.execFile("curl", [ + "-Ss", + "-X", "POST", + "-d", postdata, + url + ], + function(err, stdout, stderr) { + dbg("\nerr: " + JSON.stringify(err, null, 4)); + dbg("\nstdout:\n" + stdout); + dbg("\nstderr:\n" + stderr); + + if (err || stdout.indexOf("error") != -1) { + var errmsg = "Error executing curl to promote Saucelabs user ("; + errmsg += (err.message ? err.message+", " : ""); + errmsg += "stdout: " + stdout + ")"; + return callback(errmsg); + } + + if (stdout.indexOf(EXPECTED_RESULT_PROMOTE) == -1) + return callback("Unexpected result promoting Saucelabs user (stdout: " + stdout + ")"); + + user_object.promoted = true; + callback(null, user_object); + } +)} + +function createAndPromoteUser(callback) { + var lastIndex = readFile(FILE_LASTUSERINDEX); + dbg("last index: " + lastIndex); + var index = parseInt(lastIndex, 10) + 1; + dbg("new index: " + index); + var password = getRandomChars(8); + var email = EMAIL_TAGGED.replace(INDEXTAG, index); + var username = USERNAMESTART+index; + createUser(username, password, email, function(err, res1) { + if (err) { + console.error("[ERR] Error occurred: ", JSON.stringify(err)); + process.exit(2); + } + + dbg("writing last index file: " + index); + writeFile(FILE_LASTUSERINDEX, index); + + var readable_result = JSON.stringify(res1); + appendFile(FILE_USERS_CREATED, readable_result); + + promoteUser(res1, function(err, res2) { + if (err) { + console.error("[ERR] Error occurred: ", JSON.stringify(err)); + process.exit(3); + } + + readable_result = JSON.stringify(res2); + appendFile(FILE_PROMOTED_ACCOUNTS_CREATED, readable_result); + + console.info("----> user created successfully ("+res2.username+")"); + callback(null, readable_result); + }); + }); +} + +module.exports = { + createAndPromoteUser: createAndPromoteUser +}; \ No newline at end of file From 2131536c8e3a928d6d50360641cfa42031207d53 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Tue, 2 Feb 2016 17:26:48 +0000 Subject: [PATCH 2/4] Turning saucelabs into an actual database object and fixing bugs --- node_modules/c9/saucelabs.js | 44 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/node_modules/c9/saucelabs.js b/node_modules/c9/saucelabs.js index 935ec521..0d9ce756 100644 --- a/node_modules/c9/saucelabs.js +++ b/node_modules/c9/saucelabs.js @@ -12,6 +12,7 @@ var EXPECTED_RESULT_PROMOTE = "7200 Sauce manual minutes"; var USERNAMESTART = "c9sauce"; var INDEXTAG = "_INDEX_"; var EMAIL_TAGGED = "test+sl" + INDEXTAG + "@c9.io"; +var USE_FILE_LOGS = false; function getRandomChars(len) { @@ -34,11 +35,15 @@ function readFile(file) { } function writeFile(file, text) { + if (!USE_FILE_LOGS) return; + fs.writeFileSync(file, text+'\n', "utf-8"); return; } function appendFile(file, text) { + if (!USE_FILE_LOGS) return; + fs.appendFileSync(file, text+'\n'); return; } @@ -118,47 +123,46 @@ function promoteUser(user_object, callback) { if (err || stdout.indexOf("error") != -1) { var errmsg = "Error executing curl to promote Saucelabs user ("; - errmsg += (err.message ? err.message+", " : ""); + errmsg += (err && err.message ? err.message+", " : ""); errmsg += "stdout: " + stdout + ")"; - return callback(errmsg); + return callback(new Error(errmsg)); } if (stdout.indexOf(EXPECTED_RESULT_PROMOTE) == -1) - return callback("Unexpected result promoting Saucelabs user (stdout: " + stdout + ")"); + return callback(new Error("Unexpected result promoting Saucelabs user (stdout: " + stdout + ")")); user_object.promoted = true; callback(null, user_object); } )} -function createAndPromoteUser(callback) { - var lastIndex = readFile(FILE_LASTUSERINDEX); - dbg("last index: " + lastIndex); - var index = parseInt(lastIndex, 10) + 1; - dbg("new index: " + index); +function createAndPromoteUser(index, callback) { + if (!callback) return createAndPromoteUser(null, index); + var useFileLogs = false + if (!index) { + useFileLogs = true; + var lastIndex = readFile(FILE_LASTUSERINDEX); + dbg("last index: " + lastIndex); + var index = parseInt(lastIndex, 10) + 1; + dbg("new index: " + index); + } var password = getRandomChars(8); var email = EMAIL_TAGGED.replace(INDEXTAG, index); var username = USERNAMESTART+index; createUser(username, password, email, function(err, res1) { - if (err) { - console.error("[ERR] Error occurred: ", JSON.stringify(err)); - process.exit(2); - } + if (err) return callback(err); dbg("writing last index file: " + index); - writeFile(FILE_LASTUSERINDEX, index); + useFileLogs && writeFile(FILE_LASTUSERINDEX, index); var readable_result = JSON.stringify(res1); - appendFile(FILE_USERS_CREATED, readable_result); + useFileLogs && appendFile(FILE_USERS_CREATED, readable_result); promoteUser(res1, function(err, res2) { - if (err) { - console.error("[ERR] Error occurred: ", JSON.stringify(err)); - process.exit(3); - } + if (err) return callback(err); readable_result = JSON.stringify(res2); - appendFile(FILE_PROMOTED_ACCOUNTS_CREATED, readable_result); + useFileLogs && appendFile(FILE_PROMOTED_ACCOUNTS_CREATED, readable_result); console.info("----> user created successfully ("+res2.username+")"); callback(null, readable_result); @@ -167,5 +171,5 @@ function createAndPromoteUser(callback) { } module.exports = { - createAndPromoteUser: createAndPromoteUser + createAndPromoteUser: createAndPromoteUser, }; \ No newline at end of file From 3109cd6f3b32e12b241b9af4446a3f389e681d4f Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Wed, 3 Feb 2016 18:01:01 +0000 Subject: [PATCH 3/4] Turned saucelabs into its own plugin with all functionality contained in it --- node_modules/c9/saucelabs.js | 175 ----------------------------------- 1 file changed, 175 deletions(-) delete mode 100644 node_modules/c9/saucelabs.js diff --git a/node_modules/c9/saucelabs.js b/node_modules/c9/saucelabs.js deleted file mode 100644 index 0d9ce756..00000000 --- a/node_modules/c9/saucelabs.js +++ /dev/null @@ -1,175 +0,0 @@ -var fs = require('fs'); -var child_process = require('child_process'); -var dbg = require("debug")("saucelabs:helpers"); - -var SLTOKEN = "0C309258-40FA-4138-91AF-C226F17C6954"; -var ENDPOINT1 = "https://saucelabs.com/rest/v1/users"; -var PROMOCODE = "C9HotSauce"; -var FILE_LASTUSERINDEX = "./lastuserindex"; -var FILE_USERS_CREATED = "./users_created"; -var FILE_PROMOTED_ACCOUNTS_CREATED = "./promoted_accounts_created"; -var EXPECTED_RESULT_PROMOTE = "7200 Sauce manual minutes"; -var USERNAMESTART = "c9sauce"; -var INDEXTAG = "_INDEX_"; -var EMAIL_TAGGED = "test+sl" + INDEXTAG + "@c9.io"; -var USE_FILE_LOGS = false; - - -function getRandomChars(len) { - var text = ""; - if (!len) len = 5; - // no capitals because of https://cloud9ide.jira.com/browse/CLOUD-938 - //var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - var possible = "abcdefghijklmnopqrstuvwxyz0123456789"; - - for (var i=0; i < len; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - - return text; -} - -function readFile(file) { - var data = fs.readFileSync(file, "utf-8"); - return data; -} - -function writeFile(file, text) { - if (!USE_FILE_LOGS) return; - - fs.writeFileSync(file, text+'\n', "utf-8"); - return; -} - -function appendFile(file, text) { - if (!USE_FILE_LOGS) return; - - fs.appendFileSync(file, text+'\n'); - return; -} - -function createUser(username, password, email, callback) { - dbg("createUser()::username: " + username); - dbg("createUser()::password: " + password); - dbg("createUser()::email: " + email); - - var enc_email = encodeURIComponent(email); - - var postdata = '{"username": "' + username + '", ' - + '"password": "' + password + '", ' - + '"email": "' + enc_email + '", ' - + '"plan": "free", ' - + '"token": "' + SLTOKEN + '"}'; - - dbg("postdata: " + postdata); - - child_process.execFile("curl", [ - "-Ss", - "-X", "POST", - "-d", postdata, - ENDPOINT1 - ], - function(err, stdout, stderr) { - dbg("\nerr: " + JSON.stringify(err, null, 4)); - dbg("\nstdout:\n" + stdout); - dbg("\nstderr:\n" + stderr); - - if (err) - return callback("Error executing curl to create Saucelabs user (error: " + err.message + ")"); - - var response; - - try { - response = JSON.parse(stdout); - } - catch (e) { - return callback("Could not parse curl response (createUser): " + stdout); - } - - if (response.error) - return callback(response.error); - - var user_object = { - username: username, - password: password, - access_key: response.access_key, - email: enc_email - }; - - callback(null, user_object); - } -)} - -function promoteUser(user_object, callback) { - dbg("promoteUser()::username: " + user_object.username); - dbg("createUser()::password: " + user_object.password); - dbg("createUser()::email: " + user_object.email); - dbg("promoteUser()::access_key: " + user_object.access_key); - - var postdata = '{"promocode": "' + PROMOCODE + '"}'; - var url = "https://" + user_object.username + ":" + user_object.access_key + "@saucelabs.com/rest/v1/users/" + user_object.username + "/promotion/submit"; - dbg("url: " + url); - - child_process.execFile("curl", [ - "-Ss", - "-X", "POST", - "-d", postdata, - url - ], - function(err, stdout, stderr) { - dbg("\nerr: " + JSON.stringify(err, null, 4)); - dbg("\nstdout:\n" + stdout); - dbg("\nstderr:\n" + stderr); - - if (err || stdout.indexOf("error") != -1) { - var errmsg = "Error executing curl to promote Saucelabs user ("; - errmsg += (err && err.message ? err.message+", " : ""); - errmsg += "stdout: " + stdout + ")"; - return callback(new Error(errmsg)); - } - - if (stdout.indexOf(EXPECTED_RESULT_PROMOTE) == -1) - return callback(new Error("Unexpected result promoting Saucelabs user (stdout: " + stdout + ")")); - - user_object.promoted = true; - callback(null, user_object); - } -)} - -function createAndPromoteUser(index, callback) { - if (!callback) return createAndPromoteUser(null, index); - var useFileLogs = false - if (!index) { - useFileLogs = true; - var lastIndex = readFile(FILE_LASTUSERINDEX); - dbg("last index: " + lastIndex); - var index = parseInt(lastIndex, 10) + 1; - dbg("new index: " + index); - } - var password = getRandomChars(8); - var email = EMAIL_TAGGED.replace(INDEXTAG, index); - var username = USERNAMESTART+index; - createUser(username, password, email, function(err, res1) { - if (err) return callback(err); - - dbg("writing last index file: " + index); - useFileLogs && writeFile(FILE_LASTUSERINDEX, index); - - var readable_result = JSON.stringify(res1); - useFileLogs && appendFile(FILE_USERS_CREATED, readable_result); - - promoteUser(res1, function(err, res2) { - if (err) return callback(err); - - readable_result = JSON.stringify(res2); - useFileLogs && appendFile(FILE_PROMOTED_ACCOUNTS_CREATED, readable_result); - - console.info("----> user created successfully ("+res2.username+")"); - callback(null, readable_result); - }); - }); -} - -module.exports = { - createAndPromoteUser: createAndPromoteUser, -}; \ No newline at end of file From 5f7d2e58809ef16278f47448f1866588ba352da1 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Wed, 3 Feb 2016 21:32:18 +0000 Subject: [PATCH 4/4] Add randomchars lib --- node_modules/c9/randomchars.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 node_modules/c9/randomchars.js diff --git a/node_modules/c9/randomchars.js b/node_modules/c9/randomchars.js new file mode 100644 index 00000000..0aedac95 --- /dev/null +++ b/node_modules/c9/randomchars.js @@ -0,0 +1,14 @@ +function getRandomChars(len) { + var text = ""; + if (!len) len = 5; + var possible = "abcdefghijklmnopqrstuvwxyz0123456789"; + + for (var i=0; i < len; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + + return text; +} + +module.exports = getRandomChars; +