From 51b667363ccb16a4d7a72c4c34e75aaba435422c Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Mon, 1 Feb 2016 19:37:48 +0000 Subject: [PATCH] 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