Skip to content

Instantly share code, notes, and snippets.

@Smithx10
Created November 29, 2023 18:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Smithx10/4ed25b55d523478448f7331dec738230 to your computer and use it in GitHub Desktop.
Save Smithx10/4ed25b55d523478448f7331dec738230 to your computer and use it in GitHub Desktop.
{
"execution": "failed",
"chain_results": [
{
"result": "All parameters OK!",
"error": "",
"name": "cnapi.validate_params",
"started_at": "2023-11-29T18:31:02.898Z",
"finished_at": "2023-11-29T18:31:02.931Z"
},
{
"result": "No nics specified",
"error": "",
"name": "napi.validate_nic_params",
"started_at": "2023-11-29T18:31:03.098Z",
"finished_at": "2023-11-29T18:31:03.135Z"
},
{
"result": "0 nics retrieved from NAPI",
"error": "",
"name": "napi.get_current_nics",
"started_at": "2023-11-29T18:31:03.270Z",
"finished_at": "2023-11-29T18:31:03.346Z"
},
{
"result": "No nics to get changes for",
"error": "",
"name": "napi.apply_nic_updates",
"started_at": "2023-11-29T18:31:03.417Z",
"finished_at": "2023-11-29T18:31:03.449Z"
},
{
"result": "No nics to update",
"error": "",
"name": "napi.update_nics",
"started_at": "2023-11-29T18:31:03.507Z",
"finished_at": "2023-11-29T18:31:03.537Z"
},
{
"result": "OK",
"error": "",
"name": "cnapi.mark_as_setting_up",
"started_at": "2023-11-29T18:31:03.607Z",
"finished_at": "2023-11-29T18:31:03.758Z"
},
{
"result": "OK",
"error": "",
"name": "cnapi.clear_server_agents",
"started_at": "2023-11-29T18:31:03.828Z",
"finished_at": "2023-11-29T18:31:03.978Z"
},
{
"result": "OK",
"error": "",
"name": "cnapi.fetch_setup_files",
"started_at": "2023-11-29T18:31:04.047Z",
"finished_at": "2023-11-29T18:31:04.210Z"
},
{
"result": "",
"error": {
"message": "Error executing on remote system",
"statusCode": 500,
"body": {
"code": "InternalError",
"message": "Error executing on remote system"
},
"restCode": "InternalError",
"name": "InternalError"
},
"name": "cnapi.execute_joysetup_script",
"started_at": "2023-11-29T18:31:04.289Z",
"finished_at": "2023-11-29T18:31:04.551Z"
}
],
"params": {
"nic_action": "update",
"amqp_host": "rabbitmq.us-east-2.cloud.iqvia.net",
"cnapi_url": "http://10.80.1.25",
"assets_url": "http://10.80.1.11",
"server_uuid": "00000000-0000-0000-0000-3cecefd8c050",
"server_nics": []
},
"server_uuid": "00000000-0000-0000-0000-3cecefd8c050",
"target": "00000000-0000-0000-0000-3cecefd8c050",
"workflow": "1e39d400-3f8e-4548-b353-5cce3a8c2070",
"exec_after": null,
"num_attempts": 0,
"name": "server-setup-1.0.6",
"version": "1.0.6",
"timeout": 7200,
"workflow_uuid": "1e39d400-3f8e-4548-b353-5cce3a8c2070",
"created_at": "2023-11-29T18:31:01.666Z",
"onerror_results": [
{
"result": "",
"error": {
"name": "Error",
"message": "Error executing job"
},
"name": "onerror",
"started_at": "2023-11-29T18:31:04.627Z",
"finished_at": "2023-11-29T18:31:04.659Z"
}
],
"started": 1701282662898,
"elapsed": 1.899,
"uuid": "f9fc0c8b-3fc3-4c8e-bf7d-5e59bb8231bf",
"onerror": [
{
"name": "onerror",
"body": "function (_job, cb) {\n cb(new Error('Error executing job'));\n }"
}
],
"chain": [
{
"name": "cnapi.validate_params",
"timeout": 10,
"retry": 1,
"body": "function validateParams(job, callback) {\n if (!job.params.server_uuid) {\n callback(new Error('Must specify server_uuid'));\n return;\n }\n\n if (!job.params.cnapi_url) {\n callback(new Error('Must specify cnapi_url'));\n return;\n }\n\n if (!job.params.assets_url) {\n callback(new Error('Must specify assets_url'));\n return;\n }\n\n if (!job.params.amqp_host) {\n callback(new Error('Must specify amqp_host'));\n return;\n }\n\n callback(null, 'All parameters OK!');\n}"
},
{
"name": "napi.validate_nic_params",
"timeout": 10,
"retry": 1,
"body": "function validateNicParams(job, callback) {\n var filtered = [];\n\n if (!job.params.nics) {\n return callback(null, 'No nics specified');\n }\n\n if (!napiUrl) {\n callback(new Error('No napiUrl workflow parameter'));\n return;\n }\n\n if ((typeof (job.params.nics) !== 'object') ||\n !job.params.nics.hasOwnProperty('length')) {\n return callback(new Error('nics object must be an array'));\n }\n\n for (var n in job.params.nics) {\n var nicObj = job.params.nics[n];\n if (typeof (nicObj) !== 'object' ||\n nicObj.hasOwnProperty('length')) {\n return callback(\n new Error('nics object must be an array of objects'));\n }\n\n if (nicObj.hasOwnProperty('mac') &&\n nicObj.hasOwnProperty('nic_tags_provided')) {\n filtered.push({\n mac: nicObj.mac,\n nic_tags_provided: nicObj.nic_tags_provided\n });\n }\n }\n\n job.params.nics = filtered;\n\n callback(null, 'nic parameters OK!');\n}"
},
{
"name": "napi.get_current_nics",
"timeout": 120,
"retry": 1,
"body": "function getServerNics(job, callback) {\n // XXX: if something is set in job.params, return here\n if (!job.params.server_uuid) {\n return callback(new Error('No server_uuid specified'));\n }\n\n var napi = new sdcClients.NAPI({ url: napiUrl });\n napi.listNics({ belongs_to_uuid: job.params.server_uuid },\n function (err, res) {\n if (err) {\n job.log.error(err,\n 'error listing server nics for server: '\n + job.params.server_uuid);\n return callback(err);\n }\n\n\n job.log.debug(res, 'successfully got nics for server: '\n + job.params.server_uuid);\n job.params.server_nics = res;\n\n return callback(null, res.length + ' nics retrieved from NAPI');\n });\n}"
},
{
"name": "napi.apply_nic_updates",
"timeout": 10,
"retry": 1,
"body": "function applyNicUpdates(job, callback) {\n if (!job.params.nics || job.params.nics.length === 0) {\n return callback(null, 'No nics to get changes for');\n }\n\n if (!job.params.nic_action) {\n return callback(new Error('No nic action specified'));\n }\n\n if (job.params.nic_action === 'replace') {\n return callback(null, 'replacing nic values');\n }\n\n if (!job.params.server_nics) {\n return callback(new Error('No server nics to update'));\n }\n\n var oldNics = {};\n job.params.server_nics.forEach(function (nic) {\n oldNics[nic.mac] = nic;\n });\n\n job.log.debug(oldNics, 'old nics');\n for (var n in job.params.nics) {\n var newNic = job.params.nics[n];\n if (!newNic.hasOwnProperty('mac') ||\n !oldNics.hasOwnProperty(newNic.mac)) {\n job.log.warn(newNic, 'missing mac or unknown nic');\n continue;\n }\n\n // Only allow updating nic_tags_provided for now\n if (!newNic.hasOwnProperty('nic_tags_provided')) {\n job.log.warn(newNic, 'missing nic_tags_provided');\n continue;\n }\n\n var oldNic = oldNics[newNic.mac];\n\n if (job.params.nic_action === 'delete') {\n var afterDeletes = [];\n\n // No nic tags to begin with, so there's nothing to delete\n if (!oldNic.nic_tags_provided) {\n continue;\n }\n\n oldNic.nic_tags_provided.forEach(function (tag) {\n if (newNic.nic_tags_provided.indexOf(tag) === -1) {\n afterDeletes.push(tag);\n }\n });\n\n oldNic.nic_tags_provided = afterDeletes;\n continue;\n }\n\n if (job.params.nic_action === 'update') {\n newNic.nic_tags_provided.forEach(function (tag) {\n if (!oldNic.nic_tags_provided) {\n oldNic.nic_tags_provided = [];\n }\n\n if (oldNic.nic_tags_provided.indexOf(tag) === -1) {\n oldNic.nic_tags_provided.push(tag);\n }\n });\n }\n }\n\n var newNicParams = [];\n for (var o in oldNics) {\n newNicParams.push({\n mac: o,\n nic_tags_provided: oldNics[o].nic_tags_provided\n });\n }\n\n var msg = 'applied nic ' + job.params.nic_action + 's';\n job.log.info(newNicParams, msg);\n job.params.nics = newNicParams;\n return callback(null, msg);\n}"
},
{
"name": "napi.update_nics",
"timeout": 120,
"retry": 1,
"body": "function updateNics(job, callback) {\n if (!job.params.nics || job.params.nics.length === 0) {\n return callback(null, 'No nics to update');\n }\n\n var napi = new sdcClients.NAPI({ url: napiUrl });\n return async.forEach(job.params.nics, function (nic, cb) {\n var mac = nic.mac;\n napi.updateNic(mac, nic, function (err, res) {\n if (err) {\n job.log.error(err, 'error updating nic: ' + mac);\n return cb(err);\n }\n\n job.log.debug(res, 'successfully updated nic: ' + mac);\n return cb();\n });\n }, function (err) {\n if (err) {\n return callback(err);\n }\n\n return callback(null, 'nics updated in NAPI successfully');\n });\n}"
},
{
"name": "cnapi.mark_as_setting_up",
"timeout": 10,
"retry": 1,
"body": "function markServerAsSettingUp(job, callback) {\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n var serverUrl = '/servers/' + job.params.server_uuid;\n\n var payload = {\n etag_retries: 3,\n setting_up: true\n };\n\n cnapi.post(serverUrl, payload, function (error, req, res) {\n if (error) {\n job.log.info('Error setting server as setting_up');\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.clear_server_agents",
"timeout": 10,
"retry": 1,
"body": "function clearServerAgents(job, callback) {\n var serverUrl = '/servers/' + job.params.server_uuid;\n var cnapi = restify.createJsonClient({ url: job.params.cnapi_url});\n\n var update = {\n agents: []\n };\n cnapi.post(serverUrl, update, function (err, req, res) {\n if (err) {\n job.log.info('Error clearing server.agents: ' + err.message);\n job.log.info(err.stack.toString());\n callback(err);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.fetch_setup_files",
"timeout": 10,
"retry": 1,
"body": "function fetchSetupFiles(job, callback) {\n var urUrl = '/servers/' + job.params.server_uuid + '/execute';\n var cnapiUrl = job.params.cnapi_url;\n var assetsUrl = job.params.assets_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n var nodeConfigDir = 'config-' + job.params.server_uuid;\n var diskCfg = '';\n if (job.params.disk_layout) {\n diskCfg += 'echo \"layout=\\'' + job.params.disk_layout + '\\'\"; ';\n }\n if (job.params.hasOwnProperty('disk_cache')) {\n diskCfg += 'echo \"cache=\\'' + job.params.disk_cache + '\\'\"; ';\n }\n if (job.params.hasOwnProperty('disk_spares')) {\n diskCfg += 'echo \"spares=' + job.params.disk_spares + '\"; ';\n }\n if (job.params.hasOwnProperty('disk_width')) {\n diskCfg += 'echo \"width=' + job.params.disk_width + '\"; ';\n }\n\n if (job.params.hasOwnProperty('disk_exclude')) {\n diskCfg += 'echo \"disk_exclude=\\'' +\n job.params.disk_exclude + '\\'\"; ';\n }\n\n if (job.params.hasOwnProperty('encryption_enabled')) {\n diskCfg += 'echo \"encryption_enabled=\\'' +\n job.params.encryption_enabled + '\\'\"; ';\n }\n\n var script = [\n '#!/bin/bash',\n 'set -o xtrace',\n 'cd /var/tmp',\n 'mkdir /var/tmp/node.config',\n 'mkdir /var/tmp/' + nodeConfigDir,\n '(' + diskCfg +\n 'curl $1/extra/joysetup/node.config) | tee ' + nodeConfigDir +\n '/node.config node.config/node.config >&-',\n 'curl -O $1/extra/joysetup/joysetup.sh',\n 'curl -O $1/extra/joysetup/agentsetup.sh',\n 'chmod +x *.sh'\n ].join('\\n');\n\n var payload = {\n script: script,\n args: [assetsUrl]\n };\n\n cnapi.post(urUrl, payload, function (error, req, res) {\n if (error) {\n job.log.info('Error fetching setup files: ' + error.message);\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.execute_joysetup_script",
"timeout": 3600,
"retry": 1,
"body": "function executeJoysetupScript(job, callback) {\n var urUrl = '/servers/' + job.params.server_uuid + '/execute';\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n\n var script = [\n '#!/bin/bash',\n 'set -o xtrace',\n 'cd /var/tmp',\n './joysetup.sh'\n ].join('\\n');\n\n var payload = {\n script: script\n };\n\n cnapi.post(urUrl, payload, function (error, req, res) {\n if (error) {\n job.log.info('Error executing joysetup: ' + error.message);\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n job.log.info('Successfully executed joysetup script');\n callback();\n });\n}"
},
{
"name": "cnapi.execute_agentsetup_script",
"timeout": 3600,
"retry": 1,
"body": "function executeAgentSetupScript(job, callback) {\n var urUrl = '/servers/' + job.params.server_uuid + '/execute';\n var cnapiUrl = job.params.cnapi_url;\n var assetsUrl = job.params.assets_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n\n var script = [\n '#!/bin/bash',\n 'set -o xtrace',\n 'cd /var/tmp',\n 'echo ASSETS_URL = $ASSETS_URL',\n './agentsetup.sh'\n ].join('\\n');\n\n var payload = {\n script: script,\n env: { ASSETS_URL: assetsUrl }\n };\n\n cnapi.post(urUrl, payload, function (error, req, res) {\n if (error) {\n job.log.info('Error executing agent setup via CNAPI:'\n + error.message);\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.update_nics",
"timeout": 3600,
"retry": 1,
"body": "function nicUpdate(job, callback) {\n if (!job.params.nics || job.params.nics.length === 0) {\n return callback(null, 'No nics to update');\n }\n\n var cnapi = new sdcClients.CNAPI({ url: cnapiUrl });\n var endpoint = '/servers/' + job.params.server_uuid + '/nics/update';\n job.params.taskIDs = [];\n\n job.log.debug(job.params.nics, 'Updating rules on server \"%s\"',\n job.params.server_uuid);\n\n return cnapi.post(endpoint, { nics: job.params.nics },\n function (err, task) {\n if (err) {\n return callback(err);\n }\n\n job.log.debug(task, 'Server \"%s\": nic update task \"%s\"',\n job.params.server_uuid, task.id);\n job.params.taskIDs.push({ server_uuid: job.params.server_uuid,\n task_id: task.id});\n return callback(null, 'Started nic update task on server');\n });\n}"
},
{
"name": "cnapi.poll_tasks",
"timeout": 3600,
"retry": 1,
"body": "function pollTasks(job, callback) {\n if (!job.params.taskIDs || job.params.taskIDs.length === 0) {\n return callback(null, 'No tasks to poll');\n }\n\n var cnapi = new sdcClients.CNAPI({ url: cnapiUrl });\n\n job.params.taskSuccesses = [];\n job.params.taskFailures = [];\n\n return async.forEach(job.params.taskIDs, function (detail, cb) {\n var timeout = null;\n\n function pollOne() {\n cnapi.getTask(detail.task_id, function onCnapi(err, task) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n if (err) {\n return cb(err);\n }\n\n job.log.debug(task, 'retrieved task for server \"%s\"',\n detail.server_uuid);\n if (task.status == 'failure') {\n job.params.taskFailures.push(detail);\n return cb(new Error('CNAPI task \"' + detail.task_id\n + '\" failed for server \"' + detail.server_uuid + '\"'));\n }\n\n if (task.status == 'complete') {\n if (task.history &&\n task.history[0] &&\n task.history[0].event) {\n\n job.returned_sysinfo = task.history[0].event.sysinfo;\n }\n\n job.log.debug({\n sysinfo: job.returned_sysinfo\n }, 'task complete');\n\n job.params.taskSuccesses.push(detail);\n return cb(null);\n }\n\n timeout = setTimeout(pollOne, 1000);\n });\n }\n\n pollOne();\n }, function (err) {\n if (err) {\n return callback(err);\n }\n\n return callback(null, 'All server tasks returned successfully');\n });\n}"
},
{
"name": "cnapi.touch_setup_complete",
"timeout": 1000,
"retry": 1,
"body": "function touchSetupComplete(job, callback) {\n var urUrl = '/servers/' + job.params.server_uuid + '/execute';\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n\n var script = [\n '#!/bin/bash',\n 'touch /var/svc/setup_complete'\n ].join('\\n');\n\n var payload = {\n script: script\n };\n\n cnapi.post(urUrl, payload, function (error, req, res) {\n if (error) {\n job.log.info('Error posting to Ur via CNAPI:' + error.message);\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.reboot_server",
"timeout": 600,
"retry": 1,
"body": "function rebootServer(job, callback) {\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n var urUrl = '/servers/' + job.params.server_uuid + '/execute';\n\n var payload = {\n script: '#!/bin/bash\\nexit 113'\n };\n\n job.log.info('rebootServer');\n\n cnapi.post(urUrl, payload, function (error, req, res) {\n job.log.info('rebootServer (post)');\n if (error) {\n job.log.info('Error posting to Ur via CNAPI:' + error.message);\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.wait_for_reboot",
"timeout": 1200,
"retry": 1,
"body": "function waitForReboot(job, callback) {\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n var timer;\n var serverUrl = '/servers/' + job.params.server_uuid;\n\n job.log.info('waitForReboot()');\n\n function checkRebooted() {\n cnapi.get(serverUrl, function (err, req, res, server) {\n var cn_state;\n var created_at;\n var last_boot;\n\n if (err) {\n job.log.info(\n 'Error getting server info from CNAPI:' + err.message);\n job.log.info(err.stack.toString());\n clearTimeout(timer);\n callback(err);\n return;\n }\n\n job.log.info('waitForReboot() got result from CNAPI');\n\n cn_state = server.status;\n job.log.info('cn_state: ' + cn_state);\n created_at = (new Date(job.created_at).getTime() / 1000);\n job.log.info('created_at: ' + created_at);\n last_boot = (new Date(server.last_boot).getTime() / 1000);\n job.log.info('last_boot: ' + last_boot);\n\n if (cn_state === 'running' && (last_boot > created_at)) {\n clearTimeout(timer);\n callback();\n return;\n }\n timer = setTimeout(checkRebooted, 5000);\n });\n }\n\n timer = setTimeout(checkRebooted, 5000);\n}"
},
{
"name": "cnapi.run_postsetup_script",
"timeout": 1000,
"retry": 1,
"body": "function runPostSetupScript(job, callback) {\n var urUrl = '/servers/' + job.params.server_uuid + '/execute';\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n\n if (!job.params.postsetup_script) {\n callback();\n return;\n }\n\n var payload = {\n script: job.params.postsetup_script\n };\n\n cnapi.post(urUrl, payload, function (error, req, res) {\n if (error) {\n job.log.info('Error posting to Ur via CNAPI:' + error.message);\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.restart_ur",
"timeout": 1000,
"retry": 1,
"body": "function restartUr(job, callback) {\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n var urUrl = '/servers/' + job.params.server_uuid + '/execute';\n\n var payload = {\n script:\n '#!/bin/bash\\n' +\n 'nohup /bin/bash -c ' +\n '\"(/usr/bin/sleep 5; /usr/sbin/svcadm restart ur) &\"'\n };\n\n job.log.info('restartUr');\n\n cnapi.post(urUrl, payload, function (error, req, res) {\n job.log.info('restartUr (post)');\n if (error) {\n job.log.info('Error posting to Ur via CNAPI:' + error.message);\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
},
{
"name": "cnapi.mark_server_as_setup",
"timeout": 1000,
"retry": 1,
"body": "function markServerAsSetup(job, callback) {\n var cnapiUrl = job.params.cnapi_url;\n var cnapi = restify.createJsonClient({ url: cnapiUrl});\n var serverUrl = '/servers/' + job.params.server_uuid;\n\n var payload = {\n etag_retries: 3,\n setup: true,\n setting_up: false\n };\n\n cnapi.post(serverUrl, payload, function (error, req, res) {\n if (error) {\n job.log.info('Error setting server as setup');\n job.log.info(error.stack.toString());\n callback(error);\n return;\n }\n callback();\n });\n}"
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment