2017-03-29 11:03:40 +00:00
// Generated by CoffeeScript 1.12.5
2017-05-10 19:00:51 +00:00
var Promise , dockerUtils , formatImageName , getBuilderLogPushEndpoint , getBuilderPushEndpoint , getBundleInfo , parseInput , performUpload , pushProgress , renderProgress , uploadLogs , uploadToPromise ;
2017-03-29 11:03:40 +00:00
Promise = require ( 'bluebird' ) ;
2017-04-24 19:05:18 +00:00
dockerUtils = require ( '../utils/docker' ) ;
2017-03-29 11:03:40 +00:00
getBuilderPushEndpoint = function ( baseUrl , owner , app ) {
2017-04-24 10:06:53 +00:00
var args , querystring ;
querystring = require ( 'querystring' ) ;
args = querystring . stringify ( {
owner : owner ,
app : app
} ) ;
return "https://builder." + baseUrl + "/v1/push?" + args ;
} ;
getBuilderLogPushEndpoint = function ( baseUrl , buildId , owner , app ) {
var args , querystring ;
querystring = require ( 'querystring' ) ;
args = querystring . stringify ( {
owner : owner ,
app : app ,
buildId : buildId
} ) ;
return "https://builder." + baseUrl + "/v1/pushLogs?" + args ;
2017-03-29 11:03:40 +00:00
} ;
formatImageName = function ( image ) {
return image . split ( '/' ) . pop ( ) ;
} ;
parseInput = Promise . method ( function ( params , options ) {
2017-04-24 14:55:54 +00:00
var appName , image , source ;
2017-03-29 11:03:40 +00:00
if ( params . appName == null ) {
throw new Error ( 'Need an application to deploy to!' ) ;
}
appName = params . appName ;
image = void 0 ;
if ( params . image != null ) {
if ( options . build || ( options . source != null ) ) {
throw new Error ( 'Build and source parameters are not applicable when specifying an image' ) ;
}
options . build = false ;
image = params . image ;
} else if ( options . build ) {
2017-04-24 14:55:54 +00:00
source = options . source || '.' ;
2017-03-29 11:03:40 +00:00
} else {
throw new Error ( 'Need either an image or a build flag!' ) ;
}
2017-04-24 14:55:54 +00:00
return [ appName , options . build , source , image ] ;
2017-03-29 11:03:40 +00:00
} ) ;
2017-05-10 19:00:51 +00:00
renderProgress = function ( percentage , stepCount ) {
var _ , bar , barCount , spaceCount ;
if ( stepCount == null ) {
stepCount = 50 ;
}
_ = require ( 'lodash' ) ;
percentage = Math . max ( 0 , Math . min ( percentage , 100 ) ) ;
barCount = Math . floor ( stepCount * percentage / 100 ) ;
spaceCount = stepCount - barCount ;
bar = "[" + ( _ . repeat ( '=' , barCount ) ) + ">" + ( _ . repeat ( ' ' , spaceCount ) ) + "]" ;
return bar + " " + ( percentage . toFixed ( 1 ) ) + "%" ;
} ;
2017-04-24 12:48:43 +00:00
pushProgress = function ( imageSize , request , logStreams , timeout ) {
var ansiEscapes , logging , progressReporter ;
2017-03-29 11:03:40 +00:00
if ( timeout == null ) {
timeout = 250 ;
}
2017-04-24 12:48:43 +00:00
logging = require ( '../utils/logging' ) ;
ansiEscapes = require ( 'ansi-escapes' ) ;
2017-05-10 19:00:51 +00:00
logging . logInfo ( logStreams , 'Initializing...' ) ;
2017-03-29 11:03:40 +00:00
return progressReporter = setInterval ( function ( ) {
var percent , sent ;
sent = request . req . connection . _bytesDispatched ;
percent = ( sent / imageSize ) * 100 ;
if ( percent >= 100 ) {
clearInterval ( progressReporter ) ;
percent = 100 ;
}
2017-04-24 12:48:43 +00:00
process . stdout . write ( ansiEscapes . cursorUp ( 1 ) ) ;
2017-03-29 11:03:40 +00:00
process . stdout . clearLine ( ) ;
process . stdout . cursorTo ( 0 ) ;
2017-05-10 19:00:51 +00:00
return logging . logInfo ( logStreams , renderProgress ( percent ) ) ;
2017-03-29 11:03:40 +00:00
} , timeout ) ;
} ;
getBundleInfo = function ( options ) {
var helpers ;
helpers = require ( '../utils/helpers' ) ;
return helpers . getAppInfo ( options . appName ) . then ( function ( app ) {
return [ app . arch , app . device _type ] ;
} ) ;
} ;
2017-04-24 12:48:43 +00:00
performUpload = function ( image , token , username , url , size , appName , logStreams ) {
2017-03-29 11:03:40 +00:00
var post , request ;
request = require ( 'request' ) ;
post = request . post ( {
url : getBuilderPushEndpoint ( url , username , appName ) ,
auth : {
bearer : token
} ,
body : image
} ) ;
2017-04-24 12:48:43 +00:00
return uploadToPromise ( post , size , logStreams ) ;
2017-03-29 11:03:40 +00:00
} ;
2017-04-24 10:06:53 +00:00
uploadLogs = function ( logs , token , url , buildId , username , appName ) {
var request ;
request = require ( 'request' ) ;
return request . post ( {
2017-04-28 12:44:40 +00:00
json : true ,
2017-04-24 10:06:53 +00:00
url : getBuilderLogPushEndpoint ( url , buildId , username , appName ) ,
auth : {
bearer : token
} ,
2017-04-28 12:44:40 +00:00
body : Buffer . from ( logs )
2017-04-24 10:06:53 +00:00
} ) ;
} ;
2017-04-24 12:48:43 +00:00
uploadToPromise = function ( request , size , logStreams ) {
var logging ;
logging = require ( '../utils/logging' ) ;
2017-03-29 11:03:40 +00:00
return new Promise ( function ( resolve , reject ) {
var handleMessage ;
handleMessage = function ( data ) {
2017-04-28 12:44:40 +00:00
var e , obj ;
2017-03-29 11:03:40 +00:00
data = data . toString ( ) ;
2017-04-24 12:48:43 +00:00
logging . logDebug ( logStreams , "Received data: " + data ) ;
2017-04-28 12:44:40 +00:00
try {
2017-04-24 10:06:53 +00:00
obj = JSON . parse ( data ) ;
2017-04-28 12:44:40 +00:00
} catch ( error ) {
e = error ;
2017-04-24 10:06:53 +00:00
logging . logError ( logStreams , 'Error parsing reply from remote side' ) ;
2017-04-28 12:44:40 +00:00
reject ( e ) ;
return ;
}
if ( obj . type != null ) {
switch ( obj . type ) {
case 'error' :
return reject ( new Error ( "Remote error: " + obj . error ) ) ;
case 'success' :
return resolve ( obj ) ;
case 'status' :
return logging . logInfo ( logStreams , "Remote: " + obj . message ) ;
default :
return reject ( new Error ( "Received unexpected reply from remote: " + data ) ) ;
}
} else {
return reject ( new Error ( "Received unexpected reply from remote: " + data ) ) ;
}
2017-03-29 11:03:40 +00:00
} ;
request . on ( 'error' , reject ) . on ( 'data' , handleMessage ) ;
2017-04-24 12:48:43 +00:00
return pushProgress ( size , request , logStreams ) ;
2017-03-29 11:03:40 +00:00
} ) ;
} ;
module . exports = {
signature : 'deploy <appName> [image]' ,
description : 'Deploy a container to a resin.io application' ,
2017-04-27 13:18:39 +00:00
help : 'Use this command to deploy and optionally build an image to an application.\n\nUsage: deploy <appName> ([image] | --build [--source build-dir])\n\nNote: If building with this command, all options supported by `resin build`\nare also supported with this command.\n\nExamples:\n $ resin deploy myApp --build --source myBuildDir/\n $ resin deploy myApp myApp/myImage' ,
2017-03-29 11:03:40 +00:00
permission : 'user' ,
2017-04-24 19:05:18 +00:00
options : dockerUtils . appendOptions ( [
2017-03-29 11:03:40 +00:00
{
signature : 'build' ,
boolean : true ,
description : 'Build image then deploy' ,
alias : 'b'
} , {
signature : 'source' ,
parameter : 'source' ,
description : 'The source directory to use when building the image' ,
alias : 's'
2017-04-24 10:06:53 +00:00
} , {
signature : 'nologupload' ,
description : "Don't upload build logs to the dashboard with image (if building)" ,
boolean : true
2017-03-29 11:03:40 +00:00
}
2017-04-24 19:05:18 +00:00
] ) ,
2017-03-29 11:03:40 +00:00
action : function ( params , options , done ) {
2017-04-24 10:06:53 +00:00
var _ , logStreams , logging , logs , resin , tmp , tmpNameAsync , upload ;
2017-03-29 11:03:40 +00:00
_ = require ( 'lodash' ) ;
tmp = require ( 'tmp' ) ;
tmpNameAsync = Promise . promisify ( tmp . tmpName ) ;
resin = require ( 'resin-sdk-preconfigured' ) ;
2017-04-24 12:48:43 +00:00
logging = require ( '../utils/logging' ) ;
logStreams = logging . getLogStreams ( ) ;
2017-03-29 11:03:40 +00:00
tmp . setGracefulCleanup ( ) ;
2017-04-24 10:06:53 +00:00
logs = '' ;
upload = function ( token , username , url ) {
var docker ;
docker = dockerUtils . getDocker ( options ) ;
return parseInput ( params , options ) . then ( function ( arg ) {
var appName , build , imageName , source ;
appName = arg [ 0 ] , build = arg [ 1 ] , source = arg [ 2 ] , imageName = arg [ 3 ] ;
return tmpNameAsync ( ) . then ( function ( tmpPath ) {
options = _ . assign ( { } , options , {
appName : appName
} ) ;
params = _ . assign ( { } , params , {
source : source
} ) ;
return Promise [ "try" ] ( function ( ) {
if ( build ) {
return dockerUtils . runBuild ( params , options , getBundleInfo , logStreams ) ;
} else {
return {
image : imageName ,
log : ''
} ;
}
} ) . then ( function ( arg1 ) {
var buildLogs , imageName ;
imageName = arg1 . image , buildLogs = arg1 . log ;
logs = buildLogs ;
return Promise . join ( dockerUtils . bufferImage ( docker , imageName , tmpPath ) , token , username , url , dockerUtils . getImageSize ( docker , imageName ) , params . appName , logStreams , performUpload ) ;
} ) [ "finally" ] ( function ( ) {
return require ( 'mz/fs' ) . unlink ( tmpPath ) [ "catch" ] ( _ . noop ) ;
} ) ;
2017-03-29 11:03:40 +00:00
} ) ;
2017-04-24 10:06:53 +00:00
} ) . tap ( function ( arg ) {
var buildId , imageName ;
imageName = arg . image , buildId = arg . buildId ;
logging . logSuccess ( logStreams , "Successfully deployed image: " + ( formatImageName ( imageName ) ) ) ;
return buildId ;
} ) . then ( function ( arg ) {
var buildId , imageName ;
imageName = arg . image , buildId = arg . buildId ;
if ( logs === '' || ( options . nologupload != null ) ) {
return '' ;
}
logging . logInfo ( logStreams , 'Uploading logs to dashboard...' ) ;
return Promise . join ( logs , token , url , buildId , username , params . appName , uploadLogs ) [ "return" ] ( 'Successfully uploaded logs' ) ;
} ) . then ( function ( msg ) {
if ( msg !== '' ) {
return logging . logSuccess ( logStreams , msg ) ;
}
} ) . asCallback ( done ) ;
} ;
return Promise . join ( resin . auth . getToken ( ) , resin . auth . whoami ( ) , resin . settings . get ( 'resinUrl' ) , upload ) ;
2017-03-29 11:03:40 +00:00
}
} ;