UNPKG

@itentialopensource/adapter-openstack_nova

Version:

This adapter integrates with system described as: Opensatck Compute (Nova) Service.

1,179 lines (1,079 loc) 922 kB
/* @copyright Itential, LLC 2019 (pre-modifications) */ /* eslint import/no-dynamic-require: warn */ /* eslint object-curly-newline: warn */ // Set globals /* global log */ /* Required libraries. */ const path = require('path'); /* Fetch in the other needed components for the this Adaptor */ const AdapterBaseCl = require(path.join(__dirname, 'adapterBase.js')); /** * This is the adapter/interface into Openstack_nova */ /* GENERAL ADAPTER FUNCTIONS */ class OpenstackNova extends AdapterBaseCl { /** * OpenstackNova Adapter * @constructor */ /* Working on changing the way we do Emit methods due to size and time constrainsts constructor(prongid, properties) { // Instantiate the AdapterBase super class super(prongid, properties); const restFunctionNames = this.iapGetAdapterWorkflowFunctions(); // Dynamically bind emit functions for (let i = 0; i < restFunctionNames.length; i += 1) { // Bind function to have name fnNameEmit for fnName const version = restFunctionNames[i].match(/__v[0-9]+/); const baseFnName = restFunctionNames[i].replace(/__v[0-9]+/, ''); const fnNameEmit = version ? `${baseFnName}Emit${version}` : `${baseFnName}Emit`; this[fnNameEmit] = function (...args) { // extract the callback const callback = args[args.length - 1]; // slice the callback from args so we can insert our own const functionArgs = args.slice(0, args.length - 1); // create a random name for the listener const eventName = `${restFunctionNames[i]}:${Math.random().toString(36)}`; // tell the calling class to start listening callback({ event: eventName, status: 'received' }); // store parent for use of this context later const parent = this; // store emission function const func = function (val, err) { parent.removeListener(eventName, func); parent.emit(eventName, val, err); }; // Use apply to call the function in a specific context this[restFunctionNames[i]].apply(this, functionArgs.concat([func])); // eslint-disable-line prefer-spread }; } // Uncomment if you have things to add to the constructor like using your own properties. // Otherwise the constructor in the adapterBase will be used. // Capture my own properties - they need to be defined in propertiesSchema.json // if (this.allProps && this.allProps.myownproperty) { // mypropvariable = this.allProps.myownproperty; // } } */ /** * @callback healthCallback * @param {Object} reqObj - the request to send into the healthcheck * @param {Callback} callback - The results of the call */ healthCheck(reqObj, callback) { // you can modify what is passed into the healthcheck by changing things in the newReq let newReq = null; if (reqObj) { newReq = Object.assign(...reqObj); } else { newReq = {}; newReq.authData = { auth: { identity: { methods: [ 'password' ], password: { user: { name: this.allProps.authentication.username, domain: { name: this.allProps.authentication.os_user_domain_name }, password: this.allProps.authentication.password } } }, scope: { project: { name: this.allProps.authentication.os_project_name, domain: { name: this.allProps.authentication.os_project_domain_name } } } } }; newReq.callProperties = { ssl: { enabled: true, accept_invalid_cert: true } }; } super.healthCheck(newReq, callback); } /** * @iapGetAdapterWorkflowFunctions */ iapGetAdapterWorkflowFunctions(inIgnore) { let myIgnore = [ 'healthCheck', 'iapGetAdapterWorkflowFunctions', 'hasEntities', 'getAuthorization' ]; if (!inIgnore && Array.isArray(inIgnore)) { myIgnore = inIgnore; } else if (!inIgnore && typeof inIgnore === 'string') { myIgnore = [inIgnore]; } // The generic adapter functions should already be ignored (e.g. healthCheck) // you can add specific methods that you do not want to be workflow functions to ignore like below // myIgnore.push('myMethodNotInWorkflow'); return super.iapGetAdapterWorkflowFunctions(myIgnore); } /** * iapUpdateAdapterConfiguration is used to update any of the adapter configuration files. This * allows customers to make changes to adapter configuration without having to be on the * file system. * * @function iapUpdateAdapterConfiguration * @param {string} configFile - the name of the file being updated (required) * @param {Object} changes - an object containing all of the changes = formatted like the configuration file (required) * @param {string} entity - the entity to be changed, if an action, schema or mock data file (optional) * @param {string} type - the type of entity file to change, (action, schema, mock) (optional) * @param {string} action - the action to be changed, if an action, schema or mock data file (optional) * @param {boolean} replace - true to replace entire mock data, false to merge/append * @param {Callback} callback - The results of the call */ iapUpdateAdapterConfiguration(configFile, changes, entity, type, action, replace, callback) { const meth = 'adapter-iapUpdateAdapterConfiguration'; const origin = `${this.id}-${meth}`; log.trace(origin); super.iapUpdateAdapterConfiguration(configFile, changes, entity, type, action, replace, callback); } /** * @summary Suspends adapter * * @function iapSuspendAdapter * @param {Callback} callback - callback function */ iapSuspendAdapter(mode, callback) { const meth = 'adapter-iapSuspendAdapter'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapSuspendAdapter(mode, callback); } catch (error) { log.error(`${origin}: ${error}`); return callback(null, error); } } /** * @summary Unsuspends adapter * * @function iapUnsuspendAdapter * @param {Callback} callback - callback function */ iapUnsuspendAdapter(callback) { const meth = 'adapter-iapUnsuspendAdapter'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapUnsuspendAdapter(callback); } catch (error) { log.error(`${origin}: ${error}`); return callback(null, error); } } /** * @summary Get the Adapter Queue * * @function iapGetAdapterQueue * @param {Callback} callback - callback function */ iapGetAdapterQueue(callback) { const meth = 'adapter-iapGetAdapterQueue'; const origin = `${this.id}-${meth}`; log.trace(origin); return super.iapGetAdapterQueue(callback); } /* SCRIPT CALLS */ /** * See if the API path provided is found in this adapter * * @function iapFindAdapterPath * @param {string} apiPath - the api path to check on * @param {Callback} callback - The results of the call */ iapFindAdapterPath(apiPath, callback) { const meth = 'adapter-iapFindAdapterPath'; const origin = `${this.id}-${meth}`; log.trace(origin); super.iapFindAdapterPath(apiPath, callback); } /** * @summary Runs troubleshoot scripts for adapter * * @function iapTroubleshootAdapter * @param {Object} props - the connection, healthcheck and authentication properties * * @param {Callback} callback - The results of the call */ iapTroubleshootAdapter(props, callback) { const meth = 'adapter-iapTroubleshootAdapter'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapTroubleshootAdapter(props, this, callback); } catch (error) { log.error(`${origin}: ${error}`); return callback(null, error); } } /** * @summary runs healthcheck script for adapter * * @function iapRunAdapterHealthcheck * @param {Adapter} adapter - adapter instance to troubleshoot * @param {Callback} callback - callback function */ iapRunAdapterHealthcheck(callback) { const meth = 'adapter-iapRunAdapterHealthcheck'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapRunAdapterHealthcheck(this, callback); } catch (error) { log.error(`${origin}: ${error}`); return callback(null, error); } } /** * @summary runs connectivity check script for adapter * * @function iapRunAdapterConnectivity * @param {Callback} callback - callback function */ iapRunAdapterConnectivity(callback) { const meth = 'adapter-iapRunAdapterConnectivity'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapRunAdapterConnectivity(callback); } catch (error) { log.error(`${origin}: ${error}`); return callback(null, error); } } /** * @summary runs basicGet script for adapter * * @function iapRunAdapterBasicGet * @param {number} maxCalls - how many GET endpoints to test (optional) * @param {Callback} callback - callback function */ iapRunAdapterBasicGet(maxCalls, callback) { const meth = 'adapter-iapRunAdapterBasicGet'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapRunAdapterBasicGet(maxCalls, callback); } catch (error) { log.error(`${origin}: ${error}`); return callback(null, error); } } /** * @summary moves entites into Mongo DB * * @function iapMoveAdapterEntitiesToDB * @param {getCallback} callback - a callback function to return the result (Generics) * or the error */ iapMoveAdapterEntitiesToDB(callback) { const meth = 'adapter-iapMoveAdapterEntitiesToDB'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapMoveAdapterEntitiesToDB(callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Deactivate adapter tasks * * @function iapDeactivateTasks * * @param {Array} tasks - List of tasks to deactivate * @param {Callback} callback */ iapDeactivateTasks(tasks, callback) { const meth = 'adapter-iapDeactivateTasks'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapDeactivateTasks(tasks, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Activate adapter tasks that have previously been deactivated * * @function iapActivateTasks * * @param {Array} tasks - List of tasks to activate * @param {Callback} callback */ iapActivateTasks(tasks, callback) { const meth = 'adapter-iapActivateTasks'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapActivateTasks(tasks, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /* CACHE CALLS */ /** * @summary Populate the cache for the given entities * * @function iapPopulateEntityCache * @param {String/Array of Strings} entityType - the entity type(s) to populate * @param {Callback} callback - whether the cache was updated or not for each entity type * * @returns status of the populate */ iapPopulateEntityCache(entityTypes, callback) { const meth = 'adapter-iapPopulateEntityCache'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapPopulateEntityCache(entityTypes, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Retrieves data from cache for specified entity type * * @function iapRetrieveEntitiesCache * @param {String} entityType - entity of which to retrieve * @param {Object} options - settings of which data to return and how to return it * @param {Callback} callback - the data if it was retrieved */ iapRetrieveEntitiesCache(entityType, options, callback) { const meth = 'adapter-iapCheckEiapRetrieveEntitiesCachentityCached'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapRetrieveEntitiesCache(entityType, options, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /* BROKER CALLS */ /** * @summary Determines if this adapter supports any in a list of entities * * @function hasEntities * @param {String} entityType - the entity type to check for * @param {Array} entityList - the list of entities we are looking for * * @param {Callback} callback - A map where the entity is the key and the * value is true or false */ hasEntities(entityType, entityList, callback) { const meth = 'adapter-hasEntities'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.hasEntities(entityType, entityList, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Get Appliance that match the deviceName * * @function getDevice * @param {String} deviceName - the deviceName to find (required) * * @param {getCallback} callback - a callback function to return the result * (appliance) or the error */ getDevice(deviceName, callback) { const meth = 'adapter-getDevice'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.getDevice(deviceName, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Get Appliances that match the filter * * @function getDevicesFiltered * @param {Object} options - the data to use to filter the appliances (optional) * * @param {getCallback} callback - a callback function to return the result * (appliances) or the error */ getDevicesFiltered(options, callback) { const meth = 'adapter-getDevicesFiltered'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.getDevicesFiltered(options, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Gets the status for the provided appliance * * @function isAlive * @param {String} deviceName - the deviceName of the appliance. (required) * * @param {configCallback} callback - callback function to return the result * (appliance isAlive) or the error */ isAlive(deviceName, callback) { const meth = 'adapter-isAlive'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.isAlive(deviceName, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Gets a config for the provided Appliance * * @function getConfig * @param {String} deviceName - the deviceName of the appliance. (required) * @param {String} format - the desired format of the config. (optional) * * @param {configCallback} callback - callback function to return the result * (appliance config) or the error */ getConfig(deviceName, format, callback) { const meth = 'adapter-getConfig'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.getConfig(deviceName, format, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * @summary Gets the device count from the system * * @function iapGetDeviceCount * * @param {getCallback} callback - callback function to return the result * (count) or the error */ iapGetDeviceCount(callback) { const meth = 'adapter-iapGetDeviceCount'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return super.iapGetDeviceCount(callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /* GENERIC ADAPTER REQUEST - allows extension of adapter without new calls being added */ /** * Makes the requested generic call * * @function iapExpandedGenericAdapterRequest * @param {Object} metadata - metadata for the call (optional). * Can be a stringified Object. * @param {String} uriPath - the path of the api call - do not include the host, port, base path or version (optional) * @param {String} restMethod - the rest method (GET, POST, PUT, PATCH, DELETE) (optional) * @param {Object} pathVars - the parameters to be put within the url path (optional). * Can be a stringified Object. * @param {Object} queryData - the parameters to be put on the url (optional). * Can be a stringified Object. * @param {Object} requestBody - the body to add to the request (optional). * Can be a stringified Object. * @param {Object} addlHeaders - additional headers to be put on the call (optional). * Can be a stringified Object. * @param {getCallback} callback - a callback function to return the result (Generics) * or the error */ iapExpandedGenericAdapterRequest(metadata, uriPath, restMethod, pathVars, queryData, requestBody, addlHeaders, callback) { const meth = 'adapter-iapExpandedGenericAdapterRequest'; const origin = `${this.id}-${meth}`; log.trace(origin); if (metadata === undefined || metadata === null || metadata === '') { // eslint-disable-next-line no-param-reassign metadata = {}; } // eslint-disable-next-line no-param-reassign metadata.authData = { auth: { identity: { methods: [ 'password' ], password: { user: { name: this.allProps.authentication.username, domain: { name: this.allProps.authentication.os_user_domain_name }, password: this.allProps.authentication.password } } }, scope: { project: { name: this.allProps.authentication.os_project_name, domain: { name: this.allProps.authentication.os_project_domain_name } } } } }; // eslint-disable-next-line no-param-reassign metadata.callProperties = { ssl: { enabled: true, accept_invalid_cert: true } }; try { return super.iapExpandedGenericAdapterRequest(metadata, uriPath, restMethod, pathVars, queryData, requestBody, addlHeaders, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * Makes the requested generic call * * @function genericAdapterRequest * @param {String} uriPath - the path of the api call - do not include the host, port, base path or version (required) * @param {String} restMethod - the rest method (GET, POST, PUT, PATCH, DELETE) (required) * @param {Object} queryData - the parameters to be put on the url (optional). * Can be a stringified Object. * @param {Object} requestBody - the body to add to the request (optional). * Can be a stringified Object. * @param {Object} addlHeaders - additional headers to be put on the call (optional). * Can be a stringified Object. * @param {getCallback} callback - a callback function to return the result (Generics) * or the error */ genericAdapterRequest(uriPath, restMethod, queryData, requestBody, addlHeaders, callback) { const meth = 'adapter-genericAdapterRequest'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return this.iapExpandedGenericAdapterRequest(null, uriPath, restMethod, null, queryData, requestBody, addlHeaders, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /** * Makes the requested generic call with no base path or version * * @function genericAdapterRequestNoBasePath * @param {String} uriPath - the path of the api call - do not include the host, port, base path or version (required) * @param {String} restMethod - the rest method (GET, POST, PUT, PATCH, DELETE) (required) * @param {Object} queryData - the parameters to be put on the url (optional). * Can be a stringified Object. * @param {Object} requestBody - the body to add to the request (optional). * Can be a stringified Object. * @param {Object} addlHeaders - additional headers to be put on the call (optional). * Can be a stringified Object. * @param {getCallback} callback - a callback function to return the result (Generics) * or the error */ genericAdapterRequestNoBasePath(uriPath, restMethod, queryData, requestBody, addlHeaders, callback) { const meth = 'adapter-genericAdapterRequestNoBasePath'; const origin = `${this.id}-${meth}`; log.trace(origin); try { return this.iapExpandedGenericAdapterRequest(null, uriPath, restMethod, null, queryData, requestBody, addlHeaders, callback); } catch (err) { log.error(`${origin}: ${err}`); return callback(null, err); } } /* INVENTORY CALLS */ /** * @summary run the adapter lint script to return the results. * * @function iapRunAdapterLint * @param {Callback} callback - callback function */ iapRunAdapterLint(callback) { const meth = 'adapter-iapRunAdapterLint'; const origin = `${this.id}-${meth}`; log.trace(origin); return super.iapRunAdapterLint(callback); } /** * @summary run the adapter test scripts (baseunit and unit) to return the results. * can not run integration as there can be implications with that. * * @function iapRunAdapterTests * @param {Callback} callback - callback function */ iapRunAdapterTests(callback) { const meth = 'adapter-iapRunAdapterTests'; const origin = `${this.id}-${meth}`; log.trace(origin); return super.iapRunAdapterTests(callback); } /** * @summary provide inventory information abbout the adapter * * @function iapGetAdapterInventory * @param {Callback} callback - callback function */ iapGetAdapterInventory(callback) { const meth = 'adapter-iapGetAdapterInventory'; const origin = `${this.id}-${meth}`; log.trace(origin); return super.iapGetAdapterInventory(callback); } /** * @callback healthCallback * @param {Object} result - the result of the get request (contains an id and a status) */ /** * @callback getCallback * @param {Object} result - the result of the get request (entity/ies) * @param {String} error - any error that occurred */ /** * @callback createCallback * @param {Object} item - the newly created entity * @param {String} error - any error that occurred */ /** * @callback updateCallback * @param {String} status - the status of the update action * @param {String} error - any error that occurred */ /** * @callback deleteCallback * @param {String} status - the status of the delete action * @param {String} error - any error that occurred */ /** * @function showDetailsOfSpecificAPIVersion * @pronghornType method * @name showDetailsOfSpecificAPIVersion * @summary Show Details of Specific API Version * * @param {string} apiVersion - The API version as returned in the links from the GET / call. * @param {getCallback} callback - a callback function to return the result * @return {object} results - An object containing the response of the action * * @route {POST} /showDetailsOfSpecificAPIVersion * @roles admin * @task true */ /* YOU CAN CHANGE THE PARAMETERS YOU TAKE IN HERE AND IN THE pronghorn.json FILE */ showDetailsOfSpecificAPIVersion(apiVersion, callback) { const meth = 'adapter-showDetailsOfSpecificAPIVersion'; const origin = `${this.id}-${meth}`; log.trace(origin); if (this.suspended && this.suspendMode === 'error') { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'AD.600', [], null, null, null); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } /* HERE IS WHERE YOU VALIDATE DATA */ if (apiVersion === undefined || apiVersion === null || apiVersion === '') { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['apiVersion'], null, null, null); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } /* HERE IS WHERE YOU SET THE DATA TO PASS INTO REQUEST */ const queryParamsAvailable = {}; const queryParams = {}; const pathVars = [apiVersion]; const bodyVars = {}; // loop in template. long callback arg name to avoid identifier conflicts Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => { if (queryParamsAvailable[thisKeyInQueryParamsAvailable] !== undefined && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== null && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== '') { queryParams[thisKeyInQueryParamsAvailable] = queryParamsAvailable[thisKeyInQueryParamsAvailable]; } }); // set up the request object - payload, uriPathVars, uriQuery, uriOptions, addlHeaders, authData, callProperties, filter, priority, event // see adapter code documentation for more information on the request object's fields const reqObj = { payload: bodyVars, uriPathVars: pathVars, uriQuery: queryParams }; reqObj.authData = { auth: { identity: { methods: [ 'password' ], password: { user: { name: this.allProps.authentication.username, domain: { name: this.allProps.authentication.os_user_domain_name }, password: this.allProps.authentication.password } } }, scope: { project: { name: this.allProps.authentication.os_project_name, domain: { name: this.allProps.authentication.os_project_domain_name } } } } }; reqObj.callProperties = { ssl: { enabled: true, accept_invalid_cert: true } }; try { // Make the call - // identifyRequest(entity, action, requestObj, returnDataFlag, callback) return this.requestHandlerInst.identifyRequest('ApiVersion', 'showDetailsOfSpecificAPIVersion', reqObj, true, (irReturnData, irReturnError) => { // if we received an error or their is no response on the results // return an error if (irReturnError) { /* HERE IS WHERE YOU CAN ALTER THE ERROR MESSAGE */ return callback(null, irReturnError); } if (!Object.hasOwnProperty.call(irReturnData, 'response')) { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['showDetailsOfSpecificAPIVersion'], null, null, null); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } /* HERE IS WHERE YOU CAN ALTER THE RETURN DATA */ // return the response return callback(irReturnData, null); }); } catch (ex) { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } } /** * @function listServers * @pronghornType method * @name listServers * @summary List Servers * * @param {string} [accessIpV4] - Filter server list result by IPv4 address that should be used to access the server. * @param {string} [accessIpV6] - Filter server list result by IPv6 address that should be used to access the server. * @param {boolean} [allTenants] - Specify the all_tenants query parameter to list all instances for all projects. By default this is only allowed by administrators. If this parameter is specified without ...(description truncated) * @param {string} [autoDiskConfig] - Filter the server list result by the disk_config setting of the server, Valid values are: * @param {string} [availabilityZone] - Filter the server list result by server availability zone. * @param {string} [changesSince] - Filters the response by a date and time stamp when the server last changed status. To help keep track of changes this may also return recently deleted servers. * @param {string} [configDrive] - Filter the server list result by the config drive setting of the server. * @param {string} [createdAt] - Filter the server list result by a date and time stamp when server was created. * @param {boolean} [deleted] - Show deleted items only. In some circumstances deleted items will still be accessible via the backend database, however there is no contract on how long, so this paramete...(description truncated) * @param {string} [description] - Filter the server list result by description. * @param {string} [flavor] - Filters the response by a flavor, as a UUID. A flavor is a combination of memory, disk size, and CPUs. * @param {string} [host] - Filter the server list result by the host name of compute node. * @param {string} [hostname] - Filter the server list result by the host name of server. * @param {string} [image] - Filters the response by an image, as a UUID. * @param {string} [ip] - An IPv4 address to filter results by. * @param {string} [ip6] - An IPv6 address to filter results by. * @param {string} [kernelId] - Filter the server list result by the UUID of the kernel image when using an AMI. * @param {string} [keyName] - Filter the server list result by keypair name. * @param {number} [launchIndex] - Filter the server list result by the sequence in which the servers were launched. * @param {string} [launchedAt] - Filter the server list result by a date and time stamp when the instance was launched. The date and time stamp format is ISO 8601: * @param {number} [limit] - Requests a page size of items. Returns a number of items up to a limit value. Use the limit parameter to make an initial limited request and use the ID of the last-seen i...(description truncated) * @param {string} [lockedBy] - Filter the server list result by who locked the server, possible value could be admin or owner. * @param {string} [marker] - The ID of the last-seen item. Use the limit parameter to make an initial limited request and use the ID of the last-seen item from the response as the marker parameter va...(description truncated) * @param {string} [name] - Filters the response by a server name, as a string. You can use regular expressions in the query. For example, the ?name=bob regular expression returns both bob and bobb....(description truncated) * @param {string} [node] - Filter the server list result by the node. * @param {number} [powerState] - Filter the server list result by server power state. * @param {number} [progress] - Filter the server list result by the progress of the server. The value could be from 0 to 100 as integer. * @param {string} [projectId] - Filter the list of servers by the given project ID. * @param {string} [ramdiskId] - Filter the server list result by the UUID of the ramdisk image when using an AMI. * @param {string} [reservationId] - A reservation id as returned by a servers multiple create call. * @param {string} [rootDeviceName] - Filter the server list result by the root device name of the server. * @param {boolean} [softDeleted] - Filter the server list by SOFT_DELETED status. This parameter is only valid when the deleted=True filter parameter is specified. * @param {string} [sortDir] - Sort direction. A valid value is asc (ascending) or desc (descending). Default is desc. You can specify multiple pairs of sort key and sort direction query parameters. If...(description truncated) * @param {string} [sortKey] - Sorts by a server attribute. Default attribute is created_at. You can specify multiple pairs of sort key and sort direction query parameters. If you omit the sort directi...(description truncated) * @param {string} [status] - Filters the response by a server status, as a string. For example, ACTIVE. * @param {string} [taskState] - Filter the server list result by task state. * @param {string} [terminatedAt] - Filter the server list result by a date and time stamp when instance was terminated. The date and time stamp format is ISO 8601: * @param {string} [userId] - Filter the list of servers by the given user ID. * @param {string} [uuid] - Filter the server list result by the UUID of the server. * @param {string} [vmState] - Filter the server list result by vm state. * @param {string} [notTags] - A list of tags to filter the server list by. Servers that don’t match all tags in this list will be returned. Boolean expression in this case is ‘NOT (t1 AND t2)’. Tags i...(description truncated) * @param {string} [notTagsAny] - A list of tags to filter the server list by. Servers that don’t match any tags in this list will be returned. Boolean expression in this case is ‘NOT (t1 OR t2)’. Tags in...(description truncated) * @param {string} [tags] - A list of tags to filter the server list by. Servers that match all tags in this list will be returned. Boolean expression in this case is ‘t1 AND t2’. Tags in query must...(description truncated) * @param {string} [tagsAny] - A list of tags to filter the server list by. Servers that match any tag in this list will be returned. Boolean expression in this case is ‘t1 OR t2’. Tags in query must b...(description truncated) * @param {string} [changesBefore] - Filters the response by a date and time stamp when the server last changed. Those servers that changed before or equal to the specified date and time stamp are returned. ...(description truncated) * @param {boolean} [locked] - Specify the locked query parameter to list all locked or unlocked instances. If the value is specified, 1, t, true, on, y and yes are treated as True. 0, f, false, off, n...(description truncated) * @param {getCallback} callback - a callback function to return the result * @return {object} results - An object containing the response of the action * * @route {POST} /listServers * @roles admin * @task true */ /* YOU CAN CHANGE THE PARAMETERS YOU TAKE IN HERE AND IN THE pronghorn.json FILE */ listServers(accessIpV4, accessIpV6, allTenants, autoDiskConfig, availabilityZone, changesSince, configDrive, createdAt, deleted, description, flavor, host, hostname, image, ip, ip6, kernelId, keyName, launchIndex, launchedAt, limit, lockedBy, marker, name, node, powerState, progress, projectId, ramdiskId, reservationId, rootDeviceName, softDeleted, sortDir, sortKey, status, taskState, terminatedAt, userId, uuid, vmState, notTags, notTagsAny, tags, tagsAny, changesBefore, locked, callback) { const meth = 'adapter-listServers'; const origin = `${this.id}-${meth}`; log.trace(origin); if (this.suspended && this.suspendMode === 'error') { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'AD.600', [], null, null, null); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } /* HERE IS WHERE YOU VALIDATE DATA */ /* HERE IS WHERE YOU SET THE DATA TO PASS INTO REQUEST */ const queryParamsAvailable = { accessIpV4, accessIpV6, allTenants, autoDiskConfig, availabilityZone, changesSince, configDrive, createdAt, deleted, description, flavor, host, hostname, image, ip, ip6, kernelId, keyName, launchIndex, launchedAt, limit, lockedBy, marker, name, node, powerState, progress, projectId, ramdiskId, reservationId, rootDeviceName, softDeleted, sortDir, sortKey, status, taskState, terminatedAt, userId, uuid, vmState, notTags, notTagsAny, tags, tagsAny, changesBefore, locked }; const queryParams = {}; const pathVars = []; const bodyVars = {}; // loop in template. long callback arg name to avoid identifier conflicts Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => { if (queryParamsAvailable[thisKeyInQueryParamsAvailable] !== undefined && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== null && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== '') { queryParams[thisKeyInQueryParamsAvailable] = queryParamsAvailable[thisKeyInQueryParamsAvailable]; } }); // set up the request object - payload, uriPathVars, uriQuery, uriOptions, addlHeaders, authData, callProperties, filter, priority, event // see adapter code documentation for more information on the request object's fields const reqObj = { payload: bodyVars, uriPathVars: pathVars, uriQuery: queryParams }; reqObj.authData = { auth: { identity: { methods: [ 'password' ], password: { user: { name: this.allProps.authentication.username, domain: { name: this.allProps.authentication.os_user_domain_name }, password: this.allProps.authentication.password } } }, scope: { project: { name: this.allProps.authentication.os_project_name, domain: { name: this.allProps.authentication.os_project_domain_name } } } } }; reqObj.callProperties = { ssl: { enabled: true, accept_invalid_cert: true } }; try { // Make the call - // identifyRequest(entity, action, requestObj, returnDataFlag, callback) return this.requestHandlerInst.identifyRequest('Servers', 'listServers', reqObj, true, (irReturnData, irReturnError) => { // if we received an error or their is no response on the results // return an error if (irReturnError) { /* HERE IS WHERE YOU CAN ALTER THE ERROR MESSAGE */ return callback(null, irReturnError); } if (!Object.hasOwnProperty.call(irReturnData, 'response')) { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['listServers'], null, null, null); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } /* HERE IS WHERE YOU CAN ALTER THE RETURN DATA */ // return the response return callback(irReturnData, null); }); } catch (ex) { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } } /** * @function createServer * @pronghornType method * @name createServer * @summary Create Server * * @param {object} [body] - body param * @param {getCallback} callback - a callback function to return the result * @return {object} results - An object containing the response of the action * * @route {POST} /createServer * @roles admin * @task true */ /* YOU CAN CHANGE THE PARAMETERS YOU TAKE IN HERE AND IN THE pronghorn.json FILE */ createServer(body, callback) { const meth = 'adapter-createServer'; const origin = `${this.id}-${meth}`; log.trace(origin); if (this.suspended && this.suspendMode === 'error') { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'AD.600', [], null, null, null); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } /* HERE IS WHERE YOU VALIDATE DATA */ /* HERE IS WHERE YOU SET THE DATA TO PASS INTO REQUEST */ const queryParamsAvailable = {}; const queryParams = {}; const pathVars = []; const bodyVars = body; // loop in template. long callback arg name to avoid identifier conflicts Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => { if (queryParamsAvailable[thisKeyInQueryParamsAvailable] !== undefined && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== null && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== '') { queryParams[thisKeyInQueryParamsAvailable] = queryParamsAvailable[thisKeyInQueryParamsAvailable]; } }); // set up the request object - payload, uriPathVars, uriQuery, uriOptions, addlHeaders, authData, callProperties, filter, priority, event // see adapter code documentation for more information on the request object's fields const reqObj = { payload: bodyVars, uriPathVars: pathVars, uriQuery: queryParams }; reqObj.authData = { auth: { identity: { methods: [ 'password' ], password: { user: { name: this.allProps.authentication.username, domain: { name: this.allProps.authentication.os_user_domain_name }, password: this.allProps.authentication.password } } }, scope: { project: { name: this.allProps.authentication.os_project_name, domain: { name: this.allProps.authentication.os_project_domain_name } } } } }; reqObj.callProperties = { ssl: { enabled: true, accept_invalid_cert: true } }; try { // Make the call - // identifyRequest(entity, action, requestObj, returnDataFlag, callback) return this.requestHandlerInst.identifyRequest('Servers', 'createServer', reqObj, true, (irReturnData, irReturnError) => { // if we received an error or their is no response on the results // return an error if (irReturnError) { /* HERE IS WHERE YOU CAN ALTER THE ERROR MESSAGE */ return callback(null, irReturnError); } if (!Object.hasOwnProperty.call(irReturnData, 'response')) { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['createServer'], null, null, null); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } /* HERE IS WHERE YOU CAN ALTER THE RETURN DATA */ // return the response return callback(irReturnData, null); }); } catch (ex) { const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex); log.error(`${origin}: ${errorObj.IAPerror.displayString}`); return callback(null, errorObj); } } /** * @function listServersDetailed * @pronghornType method * @name listServersDetailed * @summary List Servers Detailed * * @param {string} [accessIpV4] - Filter server list result by IPv4 address that should be used to access the server. * @param {string} [accessIpV6] - Filter server list result by IPv6 address that should be used to access the server. * @param {boolean} [allTenants] - Specify the all_tenants query parameter to list all instances for all projects. By default this is only allowed by administrators. If this parameter is specified without ...(description truncated) * @param {string} [autoDiskConfig] - Filter the server list result by the disk_config setting of the server, Valid values are: * @param {string} [availabilityZone] - Filter the server list result by server availability zone. * @param {string} [changesSince] - Filters the response by a date and time stamp when the server last changed status. To help keep track of changes this may also return recently deleted servers. * @param {string} [configDrive] - Filter the server list result by the config drive setting of the server. * @param {string} [createdAt] - Filter the server list result by a date and time stamp when server was created. * @param {boolean} [deleted] - Show deleted items only. In some circumstances deleted items will still be accessible via the backend database, however there is no contract on how long, so this paramete...(description truncated) * @param {string} [description] - Filter the server list result by description. * @param {string} [flavor] - Filters the response by a flavor, as a UUID. A flavor is a combination of memory, disk size, and CPUs. * @param {string} [host] - Filter the server list result by the host name of compute node. * @param {string} [hostname] - Filter the server list result by the host name of server. * @param {string} [image] - Filters the response by an image, as a UUID. * @param {string} [ip] - An IPv4 address to filter results by. * @param {string} [ip6] - An IPv6 address to filter results by. * @param {string} [kernelId] - Filter the server list result by the UUID of the kernel image when using an AMI. * @param {string} [keyName] - Filter the server list result by keypair name. * @param {number} [launchIndex] - Filter the server list result by the sequence in which the servers were launched. * @param {string} [launchedAt] - Filter the server list result by a date and time stamp when the instance was launched. The date and time stamp format is ISO 8601: * @param {number} [limit] - Requests a page size of items. Returns a number of items up to a limit value. Use the limit parameter to make an initial limited request and use the ID of the last-seen i...(description truncated) * @param {string} [lockedBy] - Filter the server list result by who locked the server, possible value could be admin or owner. * @param {string} [marker] - The ID of the last-seen item. Use the limit parameter to make an initial limited request and use the ID of the last-seen item from the response as the marker parameter va...(description truncated) * @param {string} [name] - Filters the response by a server name, as a string. You can use regular expressions in the query. For example, the ?name=bob regular expression returns both bob and bobb....(description truncated) * @param {string} [node] - Filter the server list result by the node. * @param {number} [powerState] - Filter the server list result by server power state. * @param {number} [progress] - Filter the server list result by the progress of the server. The value could be from 0 to 100 as integer. * @param {string} [projectId] - Filter the list of servers by the given project ID. * @param {string} [ramdiskId] - Filter the server list result by the UUID of the ramdisk image when using an AMI. * @param {string} [reservationId] - A reservation id as returned by a servers multiple create call. * @param {string} [rootDeviceName] - Filter the server list result by the root device name of the server. * @param {boolean} [softDeleted] - Filter the server list by SOFT_DELETED status. This parameter is only valid when the deleted=True filter parameter is specified. * @param {string} [sortDir] - Sort direction. A valid value is asc (ascending) or desc (descending). Default is desc. You can specify multiple pairs of sort key and sort direction query parameters. If...(description truncated) * @param {string} [sortKey] - Sorts by a server attribute. Default attribute is created_at. You can specify multiple pairs of sort key and sort direction query parameters. If you omit the sort directi...(description truncated) * @param {string} [status] - Filters the response by a server status, as a string. For example, ACTIVE. * @param {string} [taskState] - Filter the server list result by task state. * @param {string} [terminatedAt] - Filter the server list result by a date and time stamp when instance was terminated. The date and time stamp format is ISO 8601: * @param {string} [userId] - Filter the list of servers by the given user ID. * @param {string} [uuid] - Filter the server list result by the UUID of the server. * @param {string} [vmState] - Filter the server list result by vm state. * @param {string} [notTags] - A list of tags to filter the server list by. Servers that don’t match all tags in this list will be returned. Boolean expression in this case is ‘NOT (t1 AND t2)’. Tags i...(description truncated) * @param {string} [notTagsAny] - A list of tags to filter the server list by. Servers that don’t match any tags in this list will be returned. Boolean expression in this case is ‘NOT (t1 OR t2)’. Tags in...(description truncated) * @param {string} [tags] - A list of tags to filter the server list by. Servers that match all tags in this list will be returned. Boolean exp