Skip to content

Commit

Permalink
Added Support for tarball of directory (not just the content)
Browse files Browse the repository at this point in the history
  • Loading branch information
dummy-head committed Dec 4, 2017
1 parent b785ad9 commit 6d2ed64
Showing 1 changed file with 93 additions and 41 deletions.
134 changes: 93 additions & 41 deletions app-backend/src/user/ServiceManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const CaptainConstants = require('../utils/CaptainConstants');
const Logger = require('../utils/Logger');
const fs = require('fs-extra');
const tar = require('tar');
const path = require('path');
const CaptainManager = require('./CaptainManager');
const ApiStatusCodes = require('../api/ApiStatusCodes');
const TemplateHelper = require('./TemplateHelper');
Expand Down Expand Up @@ -128,69 +129,120 @@ class ServiceManager {
})
.then(function (rawImageSourceFolder) {

if (pathToSrcTarballFile) {
return tar
.x({
file: pathToSrcTarballFile,
cwd: rawImageSourceFolder
})
.then(function () {
if (!pathToSrcTarballFile) {
return PLACEHOLDER_DOCKER_FILE_CONTENT;
}

return fs.pathExists(rawImageSourceFolder + '/' + CAPTAIN_DEFINITION_FILE)
return tar
.x({
file: pathToSrcTarballFile,
cwd: rawImageSourceFolder
})
.then(function () {

})
.then(function (exists) {
return fs.pathExists(rawImageSourceFolder + '/' + CAPTAIN_DEFINITION_FILE)

if (!exists) {
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition file does not exist!");
}
})
.then(function (exists) {

return fs.readJson(rawImageSourceFolder + '/' + CAPTAIN_DEFINITION_FILE);
if (!exists) {

})
.then(function (data) {
Logger.d('Captain Definition does not exist in the base tar. Looking inside...');

if (!data) {
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition File is empty!");
}
// check if there is only one child
// check if it's a directory
// check if captain definition exists in it
// rename rawImageSourceFolder to rawImageSourceFolder+'.bak'
// move the child directory out to base and rename it to rawImageSourceFolder
// read captain definition from the folder and return it.

if (!data.schemaVersion) {
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition version is empty!");
}
let directoryInside = null;

if (data.schemaVersion === 1) {
return new Promise(
function (resolve, reject) {

let templateIdTag = data.templateId;
let dockerfileLines = data.dockerfileLines;
let hasDockerfileLines = dockerfileLines && dockerfileLines.length > 0;
fs.readdir(rawImageSourceFolder, function (err, files) {

if (hasDockerfileLines && !templateIdTag) {
if (err) {
reject(err);
return;
}

return dockerfileLines.join('\n');
if (files.length !== 1 || !fs.statSync(path.join(rawImageSourceFolder, files[0])).isDirectory()) {
reject(ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition file does not exist!"));
return;
}

}
else if (!hasDockerfileLines && templateIdTag) {
resolve(files[0]);

return TemplateHelper.get().getDockerfileContentFromTemplateTag(templateIdTag);
});
})
.then(function (directory) {

}
else {
directoryInside = directory;

throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Dockerfile or TemplateId must be present. Both should not be present at the same time");
return fs.pathExists(path.join(path.join(rawImageSourceFolder, directoryInside), CAPTAIN_DEFINITION_FILE));

}
})
.then(function (captainDefinitionExists) {

if (!captainDefinitionExists) {
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition file does not exist!");
}

const BAK = '.bak';

fs.renameSync(rawImageSourceFolder, rawImageSourceFolder + BAK);
fs.renameSync(path.join(rawImageSourceFolder + BAK, directoryInside), rawImageSourceFolder);

});
}
})
.then(function () {

return fs.readJson(rawImageSourceFolder + '/' + CAPTAIN_DEFINITION_FILE);

})
.then(function (data) {

if (!data) {
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition File is empty!");
}

if (!data.schemaVersion) {
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition version is empty!");
}

if (data.schemaVersion === 1) {

let templateIdTag = data.templateId;
let dockerfileLines = data.dockerfileLines;
let hasDockerfileLines = dockerfileLines && dockerfileLines.length > 0;

if (hasDockerfileLines && !templateIdTag) {

return dockerfileLines.join('\n');

}
else if (!hasDockerfileLines && templateIdTag) {

return TemplateHelper.get().getDockerfileContentFromTemplateTag(templateIdTag);

}
else {

throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition version is not supported!");
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Dockerfile or TemplateId must be present. Both should not be present at the same time");

}
});
}
else {
return PLACEHOLDER_DOCKER_FILE_CONTENT;
}

}
else {

throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Captain Definition version is not supported!");

}
});

})
.then(function (dockerfileContent) {

Expand Down

0 comments on commit 6d2ed64

Please sign in to comment.