diff --git a/app-backend/built/user/TemplateHelper.js b/app-backend/built/user/TemplateHelper.js index 174c18f..bc40f62 100644 --- a/app-backend/built/user/TemplateHelper.js +++ b/app-backend/built/user/TemplateHelper.js @@ -1,95 +1,29 @@ "use strict"; -const request = require("request"); const fs = require("fs-extra"); const ApiStatusCodes = require("../api/ApiStatusCodes"); -const Logger = require("../utils/Logger"); const CaptainConstants = require("../utils/CaptainConstants"); -function getTagsForImage(imageBaseName, url, allTags) { - if (!url) { - url = - 'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags'; - } - return new Promise(function (resolve, reject) { - request(url, function (error, response, body) { - if (error || !body) { - Logger.e(error); - reject(error); - return; - } - try { - // Sometimes Docker server is down and it crashes Captain! - body = JSON.parse(body); - } - catch (e) { - Logger.e(e); - } - let results; - if (body) { - results = body.results; - } - if (!results) { - Logger.e('NO RESULT'); - reject(new Error('NO RESULT')); - return; - } - if (!allTags) { - allTags = []; - } - for (let idx = 0; idx < results.length; idx++) { - allTags.push(results[idx].name); - } - if (body.next) { - resolve(getTagsForImage(imageBaseName, body.next, allTags)); - return; - } - resolve(allTags); - }); - }); -} -function firstEndsWithSecond(str1, str2) { - if (!str1 || !str2) { - throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2); - } - const idx = str1.indexOf(str2); - return idx >= 0 && idx + str2.length === str1.length; -} -function isEmpty(obj) { - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - return false; - } - } - return true; -} +const TemplateHelperVersionPrinter = require("./TemplateHelperVersionPrinter"); class TemplateHelper { constructor() { const templates = [ { templateName: 'node', dockerHubImageName: 'library/node', - dockerFileFromName: 'node', - displayName: 'NodeJS', tagSuffix: '-alpine', }, { templateName: 'php', dockerHubImageName: 'library/php', - dockerFileFromName: 'php', - displayName: 'PHP', tagSuffix: '-apache', }, { templateName: 'python-django', dockerHubImageName: 'library/python', - dockerFileFromName: 'python-django', - displayName: 'Python Django', tagSuffix: '-alpine3.6', }, { templateName: 'ruby-rack', dockerHubImageName: 'library/ruby', - dockerFileFromName: 'ruby-rack', - displayName: 'Ruby Rack', tagSuffix: '-alpine3.7', }, ]; @@ -98,60 +32,8 @@ class TemplateHelper { templates[i].postFromLines = fs.readFileSync(dockerfilesRoot + templates[i].templateName, 'utf8'); } this.templates = templates; - this.cachedImageTags = {}; if (CaptainConstants.isDebug) { - this.printAvailableImageTagsForReadme(); - } - } - getDockerVersionsForTemplateName(templateName) { - const self = this; - const templateObj = self.getTemplateFromTemplateName(templateName); - if (isEmpty(this.cachedImageTags)) { - throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'Please wait about 30 seconds, then try again.'); - } - const tags = self.cachedImageTags[templateObj.dockerHubImageName]; - const dockerVersions = []; - for (let i = 0; i < tags.length; i++) { - const t = tags[i]; - if (firstEndsWithSecond(t, templateObj.tagSuffix)) { - dockerVersions.push(t.substring(0, t.length - templateObj.tagSuffix.length)); - } - } - return dockerVersions; - } - printAvailableImageTagsForReadme() { - const self = this; - self.cachedImageTags = {}; - const tempCache = {}; - for (let i = 0; i < self.templates.length; i++) { - const currentImageName = self.templates[i].dockerHubImageName; - getTagsForImage(currentImageName, undefined, undefined) - .then(function (tags) { - tempCache[currentImageName] = tags; - let isAllDone = true; - for (let j = 0; j < self.templates.length; j++) { - const imageName = self.templates[j].dockerHubImageName; - if (!tempCache[imageName]) { - isAllDone = false; - } - } - if (isAllDone) { - Logger.d('Template Cache Updated!'); - self.cachedImageTags = tempCache; - // Used for README - for (let tempIdx = 0; tempIdx < self.templates.length; tempIdx++) { - Logger.d(' '); - Logger.d(self.templates[tempIdx].templateName + '/'); - Logger.d(self - .getDockerVersionsForTemplateName(self.templates[tempIdx].templateName) - .join(', ')); - Logger.d(' '); - } - } - }) - .catch(function (error) { - Logger.e(error); - }); + new TemplateHelperVersionPrinter().printAvailableImageTagsForReadme(this.templates); } } getTemplateFromTemplateName(templateName) { diff --git a/app-backend/built/user/TemplateHelper.js.map b/app-backend/built/user/TemplateHelper.js.map index 5227820..92d14b8 100644 --- a/app-backend/built/user/TemplateHelper.js.map +++ b/app-backend/built/user/TemplateHelper.js.map @@ -1 +1 @@ -{"version":3,"file":"TemplateHelper.js","sourceRoot":"","sources":["../../src/user/TemplateHelper.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"TemplateHelper.js","sourceRoot":"","sources":["../../src/user/TemplateHelper.ts"],"names":[],"mappings":";AACA,+BAA+B;AAC/B,wDAAwD;AAExD,8DAA8D;AAE9D,+EAA+E;AAE/E,MAAM,cAAc;IAGhB;QACI,MAAM,SAAS,GAAgB;YAC3B;gBACI,YAAY,EAAE,MAAM;gBACpB,kBAAkB,EAAE,cAAc;gBAClC,SAAS,EAAE,SAAS;aACvB;YACD;gBACI,YAAY,EAAE,KAAK;gBACnB,kBAAkB,EAAE,aAAa;gBACjC,SAAS,EAAE,SAAS;aACvB;YACD;gBACI,YAAY,EAAE,eAAe;gBAC7B,kBAAkB,EAAE,gBAAgB;gBACpC,SAAS,EAAE,YAAY;aAC1B;YACD;gBACI,YAAY,EAAE,WAAW;gBACzB,kBAAkB,EAAE,cAAc;gBAClC,SAAS,EAAE,YAAY;aAC1B;SACJ,CAAA;QAED,MAAM,eAAe,GAAG,SAAS,GAAG,qBAAqB,CAAA;QAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,EAAE,CAAC,YAAY,CACxC,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,EAC3C,MAAM,CACT,CAAA;SACJ;QAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAE1B,IAAI,gBAAgB,CAAC,OAAO,EAAE;YAC1B,IAAI,4BAA4B,EAAE,CAAC,gCAAgC,CAC/D,IAAI,CAAC,SAAS,CACjB,CAAA;SACJ;IACL,CAAC;IAED,2BAA2B,CAAC,YAAoB;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,EAAE;gBACjD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;aAC3B;SACJ;QACD,MAAM,cAAc,CAAC,WAAW,CAC5B,cAAc,CAAC,oBAAoB,EACnC,2BAA2B,GAAG,YAAY,CAC7C,CAAA;IACL,CAAC;IAED,mCAAmC,CAAC,kBAA0B;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAA;QACjB,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACxD,IAAI,CAAC,eAAe,EAAE;YAClB,MAAM,cAAc,CAAC,WAAW,CAC5B,cAAc,CAAC,oBAAoB,EACnC,kCAAkC,CACrC,CAAA;SACJ;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAA;QAElE,MAAM,QAAQ,GACV,WAAW,CAAC,kBAAkB;YAC9B,GAAG;YACH,eAAe;YACf,WAAW,CAAC,SAAS,CAAA;QAEzB,OAAO,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,CAAC,aAAa,CAAA;IAChE,CAAC;CACJ;AAED,MAAM,sBAAsB,GAAG,IAAI,cAAc,EAAE,CAAA;AAEnD,iBAAS;IACL,GAAG,EAAE;QACD,OAAO,sBAAsB,CAAA;IACjC,CAAC;CACJ,CAAA"} \ No newline at end of file diff --git a/app-backend/built/user/TemplateHelperVersionPrinter.js b/app-backend/built/user/TemplateHelperVersionPrinter.js new file mode 100644 index 0000000..f32f716 --- /dev/null +++ b/app-backend/built/user/TemplateHelperVersionPrinter.js @@ -0,0 +1,118 @@ +"use strict"; +const request = require("request"); +const ApiStatusCodes = require("../api/ApiStatusCodes"); +const Logger = require("../utils/Logger"); +function getTagsForImage(imageBaseName, url, allTags) { + if (!url) { + url = + 'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags'; + } + return new Promise(function (resolve, reject) { + request(url, function (error, response, body) { + if (error || !body) { + Logger.e(error); + reject(error); + return; + } + try { + // Sometimes Docker server is down and it crashes Captain! + body = JSON.parse(body); + } + catch (e) { + Logger.e(e); + } + let results; + if (body) { + results = body.results; + } + if (!results) { + Logger.e('NO RESULT'); + reject(new Error('NO RESULT')); + return; + } + if (!allTags) { + allTags = []; + } + for (let idx = 0; idx < results.length; idx++) { + allTags.push(results[idx].name); + } + if (body.next) { + resolve(getTagsForImage(imageBaseName, body.next, allTags)); + return; + } + resolve(allTags); + }); + }); +} +function firstEndsWithSecond(str1, str2) { + if (!str1 || !str2) { + throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2); + } + const idx = str1.indexOf(str2); + return idx >= 0 && idx + str2.length === str1.length; +} +function isEmpty(obj) { + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + return false; + } + } + return true; +} +class TemplateHelperVersionPrinter { + constructor() { + this.cachedImageTags = {}; + } + getDockerVersionsForTemplateName(templateObj) { + const self = this; + if (isEmpty(this.cachedImageTags)) { + throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'Please wait about 30 seconds, then try again.'); + } + const tags = self.cachedImageTags[templateObj.dockerHubImageName]; + const dockerVersions = []; + for (let i = 0; i < tags.length; i++) { + const t = tags[i]; + if (firstEndsWithSecond(t, templateObj.tagSuffix)) { + dockerVersions.push(t.substring(0, t.length - templateObj.tagSuffix.length)); + } + } + return dockerVersions; + } + printAvailableImageTagsForReadme(templates) { + const self = this; + self.cachedImageTags = {}; + const tempCache = {}; + for (let i = 0; i < templates.length; i++) { + const currentImageName = templates[i].dockerHubImageName; + getTagsForImage(currentImageName, undefined, undefined) + .then(function (tags) { + tempCache[currentImageName] = tags; + let isAllDone = true; + for (let j = 0; j < templates.length; j++) { + const imageName = templates[j].dockerHubImageName; + if (!tempCache[imageName]) { + isAllDone = false; + } + } + if (isAllDone) { + Logger.d('Template Cache Updated!'); + self.cachedImageTags = tempCache; + // Used for README + for (let tempIdx = 0; tempIdx < templates.length; tempIdx++) { + Logger.d(' '); + Logger.d(templates[tempIdx].templateName + '/'); + Logger.d(self + .getDockerVersionsForTemplateName(templates[tempIdx]) + .join(', ')); + Logger.d(' '); + } + } + }) + .catch(function (error) { + Logger.e(error); + }); + } + } +} +module.exports = TemplateHelperVersionPrinter; +//# sourceMappingURL=TemplateHelperVersionPrinter.js.map \ No newline at end of file diff --git a/app-backend/built/user/TemplateHelperVersionPrinter.js.map b/app-backend/built/user/TemplateHelperVersionPrinter.js.map new file mode 100644 index 0000000..be78647 --- /dev/null +++ b/app-backend/built/user/TemplateHelperVersionPrinter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TemplateHelperVersionPrinter.js","sourceRoot":"","sources":["../../src/user/TemplateHelperVersionPrinter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app-backend/src/models/OtherTypes.ts b/app-backend/src/models/OtherTypes.ts index 1158297..68403a2 100644 --- a/app-backend/src/models/OtherTypes.ts +++ b/app-backend/src/models/OtherTypes.ts @@ -16,3 +16,10 @@ export interface IDockerContainerResource { Limits?: { NanoCPUs?: number; MemoryBytes?: number } Reservation?: { NanoCPUs?: number; MemoryBytes?: number } } + +export interface ITemplate { + templateName: string + dockerHubImageName: string + tagSuffix: string + postFromLines?: string +} \ No newline at end of file diff --git a/app-backend/src/user/TemplateHelper.ts b/app-backend/src/user/TemplateHelper.ts index e584387..93e0850 100644 --- a/app-backend/src/user/TemplateHelper.ts +++ b/app-backend/src/user/TemplateHelper.ts @@ -3,126 +3,32 @@ import fs = require('fs-extra') import ApiStatusCodes = require('../api/ApiStatusCodes') import Logger = require('../utils/Logger') import CaptainConstants = require('../utils/CaptainConstants') - -function getTagsForImage( - imageBaseName: string, - url: string | undefined, - allTags: string[] | undefined -): Promise { - if (!url) { - url = - 'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags' - } - - return new Promise(function(resolve, reject) { - request( - url!, - - function(error, response, body) { - if (error || !body) { - Logger.e(error) - reject(error) - return - } - - try { - // Sometimes Docker server is down and it crashes Captain! - body = JSON.parse(body) - } catch (e) { - Logger.e(e) - } - - let results: any - - if (body) { - results = body.results - } - - if (!results) { - Logger.e('NO RESULT') - reject(new Error('NO RESULT')) - return - } - - if (!allTags) { - allTags = [] - } - - for (let idx = 0; idx < results.length; idx++) { - allTags.push(results[idx].name) - } - - if (body.next) { - resolve(getTagsForImage(imageBaseName, body.next, allTags)) - return - } - - resolve(allTags) - } - ) - }) -} - -function firstEndsWithSecond(str1: string, str2: string) { - if (!str1 || !str2) { - throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2) - } - const idx = str1.indexOf(str2) - return idx >= 0 && idx + str2.length === str1.length -} - -function isEmpty(obj: any) { - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - return false - } - } - return true -} - -interface ITemplate { - templateName: string - dockerHubImageName: string - dockerFileFromName: string - displayName: string - tagSuffix: string - postFromLines?: string -} - -type AnyHashMap = IHashMapGeneric +import { ITemplate } from '../models/OtherTypes' +import TemplateHelperVersionPrinter = require('./TemplateHelperVersionPrinter') class TemplateHelper { private templates: ITemplate[] - private cachedImageTags: AnyHashMap constructor() { const templates: ITemplate[] = [ { templateName: 'node', dockerHubImageName: 'library/node', - dockerFileFromName: 'node', - displayName: 'NodeJS', tagSuffix: '-alpine', }, { templateName: 'php', dockerHubImageName: 'library/php', - dockerFileFromName: 'php', - displayName: 'PHP', tagSuffix: '-apache', }, { templateName: 'python-django', dockerHubImageName: 'library/python', - dockerFileFromName: 'python-django', - displayName: 'Python Django', tagSuffix: '-alpine3.6', }, { templateName: 'ruby-rack', dockerHubImageName: 'library/ruby', - dockerFileFromName: 'ruby-rack', - displayName: 'Ruby Rack', tagSuffix: '-alpine3.7', }, ] @@ -137,89 +43,12 @@ class TemplateHelper { } this.templates = templates - this.cachedImageTags = {} if (CaptainConstants.isDebug) { - this.printAvailableImageTagsForReadme() - } - } - - getDockerVersionsForTemplateName(templateName: string) { - const self = this - - const templateObj = self.getTemplateFromTemplateName(templateName) - - if (isEmpty(this.cachedImageTags)) { - throw ApiStatusCodes.createError( - ApiStatusCodes.STATUS_ERROR_GENERIC, - 'Please wait about 30 seconds, then try again.' + new TemplateHelperVersionPrinter().printAvailableImageTagsForReadme( + this.templates ) } - - const tags = self.cachedImageTags[templateObj.dockerHubImageName] - - const dockerVersions = [] - for (let i = 0; i < tags.length; i++) { - const t = tags[i] - if (firstEndsWithSecond(t, templateObj.tagSuffix)) { - dockerVersions.push( - t.substring(0, t.length - templateObj.tagSuffix.length) - ) - } - } - - return dockerVersions - } - - printAvailableImageTagsForReadme() { - const self = this - self.cachedImageTags = {} - - const tempCache: AnyHashMap = {} - for (let i = 0; i < self.templates.length; i++) { - const currentImageName = self.templates[i].dockerHubImageName - - getTagsForImage(currentImageName, undefined, undefined) - .then(function(tags) { - tempCache[currentImageName] = tags - - let isAllDone = true - - for (let j = 0; j < self.templates.length; j++) { - const imageName = self.templates[j].dockerHubImageName - if (!tempCache[imageName]) { - isAllDone = false - } - } - - if (isAllDone) { - Logger.d('Template Cache Updated!') - - self.cachedImageTags = tempCache - - // Used for README - for ( - let tempIdx = 0; - tempIdx < self.templates.length; - tempIdx++ - ) { - Logger.d(' ') - Logger.d(self.templates[tempIdx].templateName + '/') - Logger.d( - self - .getDockerVersionsForTemplateName( - self.templates[tempIdx].templateName - ) - .join(', ') - ) - Logger.d(' ') - } - } - }) - .catch(function(error) { - Logger.e(error) - }) - } } getTemplateFromTemplateName(templateName: string) { diff --git a/app-backend/src/user/TemplateHelperVersionPrinter.ts b/app-backend/src/user/TemplateHelperVersionPrinter.ts new file mode 100644 index 0000000..1b25df6 --- /dev/null +++ b/app-backend/src/user/TemplateHelperVersionPrinter.ts @@ -0,0 +1,170 @@ +import request = require('request') +import fs = require('fs-extra') +import ApiStatusCodes = require('../api/ApiStatusCodes') +import Logger = require('../utils/Logger') +import CaptainConstants = require('../utils/CaptainConstants') +import { ITemplate } from '../models/OtherTypes' + +function getTagsForImage( + imageBaseName: string, + url: string | undefined, + allTags: string[] | undefined +): Promise { + if (!url) { + url = + 'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags' + } + + return new Promise(function(resolve, reject) { + request( + url!, + + function(error, response, body) { + if (error || !body) { + Logger.e(error) + reject(error) + return + } + + try { + // Sometimes Docker server is down and it crashes Captain! + body = JSON.parse(body) + } catch (e) { + Logger.e(e) + } + + let results: any + + if (body) { + results = body.results + } + + if (!results) { + Logger.e('NO RESULT') + reject(new Error('NO RESULT')) + return + } + + if (!allTags) { + allTags = [] + } + + for (let idx = 0; idx < results.length; idx++) { + allTags.push(results[idx].name) + } + + if (body.next) { + resolve(getTagsForImage(imageBaseName, body.next, allTags)) + return + } + + resolve(allTags) + } + ) + }) +} + +function firstEndsWithSecond(str1: string, str2: string) { + if (!str1 || !str2) { + throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2) + } + const idx = str1.indexOf(str2) + return idx >= 0 && idx + str2.length === str1.length +} + +function isEmpty(obj: any) { + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + return false + } + } + return true +} + +type AnyHashMap = IHashMapGeneric + +class TemplateHelperVersionPrinter { + private cachedImageTags: AnyHashMap + + constructor() { + this.cachedImageTags = {} + } + + getDockerVersionsForTemplateName(templateObj: ITemplate) { + const self = this + + if (isEmpty(this.cachedImageTags)) { + throw ApiStatusCodes.createError( + ApiStatusCodes.STATUS_ERROR_GENERIC, + 'Please wait about 30 seconds, then try again.' + ) + } + + const tags = self.cachedImageTags[templateObj.dockerHubImageName] + + const dockerVersions = [] + for (let i = 0; i < tags.length; i++) { + const t = tags[i] + if (firstEndsWithSecond(t, templateObj.tagSuffix)) { + dockerVersions.push( + t.substring(0, t.length - templateObj.tagSuffix.length) + ) + } + } + + return dockerVersions + } + + printAvailableImageTagsForReadme(templates: ITemplate[]) { + const self = this + self.cachedImageTags = {} + + const tempCache: AnyHashMap = {} + for (let i = 0; i < templates.length; i++) { + const currentImageName = templates[i].dockerHubImageName + + getTagsForImage(currentImageName, undefined, undefined) + .then(function(tags) { + tempCache[currentImageName] = tags + + let isAllDone = true + + for (let j = 0; j < templates.length; j++) { + const imageName = templates[j].dockerHubImageName + if (!tempCache[imageName]) { + isAllDone = false + } + } + + if (isAllDone) { + Logger.d('Template Cache Updated!') + + self.cachedImageTags = tempCache + + // Used for README + for ( + let tempIdx = 0; + tempIdx < templates.length; + tempIdx++ + ) { + Logger.d(' ') + Logger.d(templates[tempIdx].templateName + '/') + Logger.d( + self + .getDockerVersionsForTemplateName( + templates[tempIdx] + ) + .join(', ') + ) + Logger.d(' ') + } + } + }) + .catch(function(error) { + Logger.e(error) + }) + } + } +} + +export = TemplateHelperVersionPrinter