2017-06-07 17:36:44 +00:00
/ * *
* Using Rails - like standard naming convention for endpoints .
* GET / api / ansible - > index
* POST / api / ansible - > create
* GET / api / ansible / : id - > show
* PUT / api / ansible / : id - > upsert
* PATCH / api / ansible / : id - > patch
* DELETE / api / ansible / : id - > destroy
* /
'use strict' ;
import jsonpatch from 'fast-json-patch' ;
import Ansible from './ansible.model' ;
2017-07-11 17:11:17 +00:00
import config from '../../config/environment' ;
2017-06-07 17:36:44 +00:00
var ssh2 _exec = require ( '../../components/ssh/ssh2_exec' ) ;
var ansibleTool = require ( '../../components/ansible/ansible_tool' ) ;
function respondWithResult ( res , statusCode ) {
statusCode = statusCode || 200 ;
return function ( entity ) {
if ( entity ) {
return res . status ( statusCode ) . json ( entity ) ;
}
return null ;
} ;
}
function patchUpdates ( patches ) {
return function ( entity ) {
try {
// eslint-disable-next-line prefer-reflect
jsonpatch . apply ( entity , patches , /*validate*/ true ) ;
} catch ( err ) {
return Promise . reject ( err ) ;
}
return entity . save ( ) ;
} ;
}
function removeEntity ( res ) {
return function ( entity ) {
if ( entity ) {
return entity . remove ( )
. then ( ( ) => {
res . status ( 204 ) . end ( ) ;
} ) ;
}
} ;
}
function handleEntityNotFound ( res ) {
return function ( entity ) {
if ( ! entity ) {
res . status ( 404 ) . end ( ) ;
return null ;
}
return entity ;
} ;
}
function handleError ( res , statusCode ) {
statusCode = statusCode || 500 ;
return function ( err ) {
res . status ( statusCode ) . send ( err ) ;
} ;
}
// Creates a new Ansible in the DB
export function command ( req , res ) {
var command = req . body . command ;
var ansibleEngine = req . body . ansibleEngine ;
ssh2 _exec . executeCommand ( command ,
null ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
)
}
2017-07-07 16:23:45 +00:00
/ * *
* List Ansible Modules
* @ param req
* @ param res
* /
2017-06-07 17:36:44 +00:00
export function modules ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
ansibleTool . getModules ( function ( data ) {
res . write ( data )
} ,
function ( data ) {
res . write ( data ) ;
res . end ( )
} ,
function ( data ) {
res . write ( data )
} ,
ansibleEngine
) ;
}
// Gets a single Deploy from the DB
export function getLogs ( req , res ) {
return Ansible . findById ( req . params . id ) . exec ( )
. then ( handleEntityNotFound ( res ) )
. then ( function ( entity ) {
console . log ( "Getting logs " + entity . logfile ) ;
ansibleTool . getLogs ( entity . logfile ,
function ( successData ) {
return res . send ( successData ) ;
} ,
function ( errorData ) {
return res . status ( 500 ) . send ( errorData )
}
) ;
return null ;
} )
. catch ( handleError ( res ) ) ;
}
2017-07-11 17:11:17 +00:00
console . log ( "config.disablePlayboookExecution =" + config . disablePlayboookExecution ) ;
2017-06-07 17:36:44 +00:00
// Executes Ansible Play book in the backend
export function execute ( req , res ) {
//var inventory_file_contents = req.body.inventory_file_contents;
//var playbook_file_contents = req.body.playbook_file_contents;
2017-07-11 17:11:17 +00:00
if ( config . disablePlayboookExecution ) {
return res . status ( 500 ) . send ( 'Playbook execution has been disabled. Set environment variable DISABLE_PLAYBOOK_EXECUTION to "false" and restart web server' )
}
2017-06-07 17:36:44 +00:00
var playbook _name = req . body . selectedPlaybook ;
var inventory _file _name = req . body . inventory _file _name ;
var tags = req . body . tags ;
var limit _to _hosts = req . body . limit _to _hosts ;
var verbose = req . body . verbose ;
var check _mode = req . body . check _mode ;
var ansibleEngine = req . body . ansibleEngine ;
var project _folder = ansibleEngine . projectFolder ;
console . log ( "Check_Mode=" + check _mode ) ;
var time = new Date ( ) . getTime ( ) ;
var logfilename = 'execution_' + time ;
var tags _joined = tags ;
if ( typeof tags === 'object' ) tags _joined = tags . join ( ',' ) ;
var limit _to _hosts _joined = limit _to _hosts ;
if ( typeof limit _to _hosts === 'object' ) limit _to _hosts _joined = limit _to _hosts . join ( ',' ) ;
var ansibleObject = {
logfile : logfilename ,
tags : tags _joined ,
limit _to _hosts : limit _to _hosts ,
verbose : verbose ,
host : req . body . host ,
check _mode : check _mode ,
selectedPlaybook : req . body . selectedPlaybook ,
selectedPlay : req . body . selectedPlay ,
executionType : req . body . executionType ,
executionName : req . body . executionName ,
executionTime : time
} ;
var resultSent = false ;
2017-07-07 16:23:45 +00:00
// Execute Ansible Playbook and return immediately with a new Job (Ansible) object
2017-06-07 17:36:44 +00:00
ansibleTool . executeAnsible ( logfilename , project _folder , playbook _name , inventory _file _name , tags _joined , limit _to _hosts _joined , verbose , check _mode ,
function ( data ) {
//res.write(data)
if ( ! resultSent ) {
resultSent = true ;
return Ansible . create ( ansibleObject )
. then ( respondWithResult ( res , 201 ) )
. catch ( handleError ( res ) ) ;
}
} ,
function ( data ) {
//res.write(data);
//res.end()
if ( ! resultSent ) {
resultSent = true ;
return Ansible . create ( ansibleObject )
. then ( respondWithResult ( res , 201 ) )
. catch ( handleError ( res ) ) ;
}
} ,
function ( data ) {
//res.write(data)
if ( ! resultSent ) {
resultSent = true ;
res . status ( 500 ) . send ( data )
}
} ,
ansibleEngine
) ;
}
/ * *
* List playbook tags
* ansible - playbook playbook . yml - i inventory -- list - tags
* @ param req
* @ param res
* /
export function playbook _tags _list ( req , res ) {
var playbook _name = req . body . selectedPlaybook ;
var inventory _file _name = req . body . inventory _file _name ;
var ansibleEngine = req . body . ansibleEngine ;
var project _folder = ansibleEngine . projectFolder ;
ansibleTool . getTagList ( project _folder , playbook _name , inventory _file _name ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function playbook _create ( req , res ) {
var playbook _file _contents = req . body . playbookFileContents ;
var ansibleEngine = req . body . ansibleEngine ;
var play _book _name = req . body . playbookName ;
var project _folder = ansibleEngine . projectFolder ;
play _book _name = play _book _name . replace ( project _folder , '' ) ;
console . log ( "Playbook name = " + play _book _name ) ;
var resultSent = false ;
ansibleTool . writePlaybook ( project _folder , play _book _name , playbook _file _contents ,
function ( data ) {
//res.write(data);
//res.end()
2017-07-07 16:23:45 +00:00
console . log ( "data = " + data ) ;
2017-06-07 17:36:44 +00:00
if ( ! resultSent ) {
resultSent = true ;
res . send ( data )
}
} ,
function ( data ) {
//res.write(data)
2017-07-07 16:23:45 +00:00
console . log ( "data = " + data ) ;
2017-06-07 17:36:44 +00:00
if ( ! resultSent ) {
resultSent = true ;
res . status ( 500 ) . send ( data )
}
} ,
ansibleEngine
) ;
}
export function playbook _delete ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var play _book _name = req . body . playbookName ;
var project _folder = ansibleEngine . projectFolder ;
var resultSent = false ;
ansibleTool . deletePlaybook ( project _folder , play _book _name ,
function ( data ) {
res . write ( data )
} ,
function ( data ) {
if ( ! resultSent ) {
resultSent = true ;
res . write ( data ) ;
res . end ( ) ;
}
} ,
function ( data ) {
if ( ! resultSent ) {
resultSent = true ;
res . status ( 500 ) ;
res . write ( data ) ;
res . end ( ) ;
}
} ,
ansibleEngine
) ;
}
export function playbook _get ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var play _book _name = req . body . playbookName ;
var project _folder = ansibleEngine . projectFolder ;
var resultSent = false ;
ansibleTool . readPlaybook ( project _folder , play _book _name ,
function ( data ) {
res . write ( data )
} ,
function ( data ) {
if ( ! resultSent ) {
resultSent = true ;
res . write ( data ) ;
res . end ( ) ;
}
} ,
function ( data ) {
if ( ! resultSent ) {
resultSent = true ;
res . status ( 500 ) ;
res . write ( data ) ;
res . end ( ) ;
}
} ,
ansibleEngine
) ;
}
export function playbook _list ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var project _folder = ansibleEngine . projectFolder ;
ansibleTool . getPlaybookList ( project _folder ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function roles _list ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var project _folder = ansibleEngine . projectFolder ;
ansibleTool . getRolesList ( project _folder ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function inventory _list ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var project _folder = ansibleEngine . projectFolder ;
ansibleTool . getInventoryList ( project _folder ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function inventory _get ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var project _folder = ansibleEngine . projectFolder ;
var inventoryName = req . body . inventoryName ;
ansibleTool . readInventoryFile ( project _folder , inventoryName ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function inventory _create ( req , res ) {
var inventoryFileContents = req . body . inventoryFileContents ;
var ansibleEngine = req . body . ansibleEngine ;
var inventoryName = req . body . inventoryName ;
var project _folder = ansibleEngine . projectFolder ;
var file _path = project _folder + '/' + inventoryName ;
ansibleTool . writeFile ( file _path , inventoryFileContents ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine
) ;
}
export function inventory _delete ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var inventoryName = req . body . inventoryName ;
var project _folder = ansibleEngine . projectFolder ;
var file _path = project _folder + '/' + inventoryName ;
ansibleTool . deleteFile ( file _path ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine
) ;
}
export function update _groups _vars _file ( req , res ) {
var groupVarsContents = req . body . groupVarsContents ;
var ansibleEngine = req . body . ansibleEngine ;
var groupName = req . body . groupName ;
var project _folder = ansibleEngine . projectFolder ;
var file _path = project _folder + '/group_vars/' + groupName ;
ansibleTool . writeFile ( file _path , groupVarsContents ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine
) ;
}
export function get _groups _vars _file ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var groupName = req . body . groupName ;
var project _folder = ansibleEngine . projectFolder ;
var file _path = project _folder + '/group_vars/' + groupName ;
ansibleTool . readFile ( file _path ,
null ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine
) ;
}
export function update _hosts _vars _file ( req , res ) {
var hostVarsContents = req . body . hostVarsContents ;
var ansibleEngine = req . body . ansibleEngine ;
var hostName = req . body . hostName ;
var project _folder = ansibleEngine . projectFolder ;
var file _path = project _folder + '/host_vars/' + hostName ;
ansibleTool . writeFile ( file _path , hostVarsContents ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine
) ;
}
export function get _hosts _vars _file ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var hostName = req . body . hostName ;
var project _folder = ansibleEngine . projectFolder ;
var file _path = project _folder + '/host_vars/' + hostName ;
ansibleTool . readFile ( file _path ,
null ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine
) ;
}
/ * *
* Get variables for a host using Python AnsibleAPI
* @ param req
* @ param res
* /
export function get _hosts _vars ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var host _name = req . body . hostName ;
var project _folder = ansibleEngine . projectFolder ;
var inventory _file _name = req . body . inventoryFileName ;
console . log ( 'hostName=' + host _name )
ansibleTool . getVars ( project _folder , inventory _file _name , host _name ,
null ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine )
}
/ * *
* Get variables for a role using Python AnsibleAPI
* @ param req
* @ param res
* /
export function get _roles _vars ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var role _name = req . body . roleName ;
var project _folder = ansibleEngine . projectFolder ;
console . log ( 'roleName=' + role _name ) ;
ansibleTool . getRolesVars ( project _folder , role _name ,
null ,
function ( data ) {
res . send ( data ) ;
} ,
function ( data ) {
res . status ( 500 ) . send ( data )
} ,
ansibleEngine )
}
export function roles _search _galaxy ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var searchText = req . body . searchText ;
ansibleTool . searchRolesGalaxy ( searchText ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function roles _search _github ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var searchText = req . body . searchText ;
ansibleTool . searchRolesGithub ( searchText ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
/ * *
* Create / Copy Role
* Create a new role if selectedRoleName is null
* Copy existing role if selectedRoleName is not null
* @ param req
* @ param res
* /
export function roles _create ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var roleName = req . body . roleName ;
var selectedRoleName = req . body . selectedRoleName ;
var createRoleFunction = ansibleTool . createRole ;
if ( selectedRoleName )
createRoleFunction = ansibleTool . copyRole ;
createRoleFunction ( roleName ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine ,
selectedRoleName
) ;
}
export function roles _import ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var roleType = req . body . roleType ;
var roleNameUri = req . body . roleNameUri ;
ansibleTool . importRole ( roleType , roleNameUri ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function roles _delete ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var roleName = req . body . roleName ;
ansibleTool . deleteRole ( roleName ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function roles _files ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var roleName = req . body . roleName ;
ansibleTool . getRoleFiles ( roleName ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function project _files ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
ansibleTool . getProjectFiles (
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function file _create ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var fileAbsolutePath = req . body . fileAbsolutePath ;
ansibleTool . createFile ( fileAbsolutePath ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function file _update ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var fileAbsolutePath = req . body . fileAbsolutePath ;
var fileContents = req . body . fileContents ;
ansibleTool . writeFile ( fileAbsolutePath , fileContents ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
export function file _delete ( req , res ) {
var ansibleEngine = req . body . ansibleEngine ;
var fileAbsolutePath = req . body . fileAbsolutePath ;
ansibleTool . deleteFile ( fileAbsolutePath ,
function ( data ) {
res . send ( data )
} ,
function ( data ) {
res . status ( 500 ) . send ( data ) ;
} ,
ansibleEngine
) ;
}
// Gets a list of Ansibles
export function index ( req , res ) {
return Ansible . find ( ) . exec ( )
. then ( respondWithResult ( res ) )
. catch ( handleError ( res ) ) ;
}
// Gets a single Ansible from the DB
export function show ( req , res ) {
return Ansible . findById ( req . params . id ) . exec ( )
. then ( handleEntityNotFound ( res ) )
. then ( respondWithResult ( res ) )
. catch ( handleError ( res ) ) ;
}
// Creates a new Ansible in the DB
export function create ( req , res ) {
return Ansible . create ( req . body )
. then ( respondWithResult ( res , 201 ) )
. catch ( handleError ( res ) ) ;
}
// Upserts the given Ansible in the DB at the specified ID
export function upsert ( req , res ) {
if ( req . body . _id ) {
Reflect . deleteProperty ( req . body , '_id' ) ;
}
return Ansible . findOneAndUpdate ( { _id : req . params . id } , req . body , { new : true , upsert : true , setDefaultsOnInsert : true , runValidators : true } ) . exec ( )
. then ( respondWithResult ( res ) )
. catch ( handleError ( res ) ) ;
}
// Updates an existing Ansible in the DB
export function patch ( req , res ) {
if ( req . body . _id ) {
Reflect . deleteProperty ( req . body , '_id' ) ;
}
return Ansible . findById ( req . params . id ) . exec ( )
. then ( handleEntityNotFound ( res ) )
. then ( patchUpdates ( req . body ) )
. then ( respondWithResult ( res ) )
. catch ( handleError ( res ) ) ;
}
// Deletes a Ansible from the DB
export function destroy ( req , res ) {
return Ansible . findById ( req . params . id ) . exec ( )
. then ( handleEntityNotFound ( res ) )
. then ( removeEntity ( res ) )
. catch ( handleError ( res ) ) ;
}