mirror of
https://github.com/caprover/caprover
synced 2026-08-03 06:10:56 +00:00
Template Helper moved
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
const request = require('request');
|
||||
const fs = require('fs-extra');
|
||||
const ApiStatusCodes = require('../api/ApiStatusCodes');
|
||||
const Logger = require('../utils/Logger');
|
||||
const CaptainConstants = require('../utils/CaptainConstants');
|
||||
"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';
|
||||
url = "https://hub.docker.com/v2/repositories/" + imageBaseName + "/tags";
|
||||
}
|
||||
return new Promise(function (resolve, reject) {
|
||||
request(url, function (error, response, body) {
|
||||
@@ -21,13 +22,13 @@ function getTagsForImage(imageBaseName, url, allTags) {
|
||||
catch (e) {
|
||||
Logger.e(e);
|
||||
}
|
||||
let results = null;
|
||||
let results;
|
||||
if (body) {
|
||||
results = body.results;
|
||||
}
|
||||
if (!results) {
|
||||
Logger.e('NO RESULT');
|
||||
reject(new Error('NO RESULT'));
|
||||
Logger.e("NO RESULT");
|
||||
reject(new Error("NO RESULT"));
|
||||
return;
|
||||
}
|
||||
if (!allTags) {
|
||||
@@ -46,13 +47,13 @@ function getTagsForImage(imageBaseName, url, allTags) {
|
||||
}
|
||||
function firstEndsWithSecond(str1, str2) {
|
||||
if (!str1 || !str2) {
|
||||
throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2);
|
||||
throw new Error("Str1 or Str2 are null " + !str1 + " " + !str2);
|
||||
}
|
||||
let idx = str1.indexOf(str2);
|
||||
const idx = str1.indexOf(str2);
|
||||
return idx >= 0 && (idx + str2.length) === str1.length;
|
||||
}
|
||||
function isEmpty(obj) {
|
||||
for (let key in obj) {
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false;
|
||||
}
|
||||
@@ -62,37 +63,37 @@ function isEmpty(obj) {
|
||||
class TemplateHelper {
|
||||
constructor() {
|
||||
const templates = [{
|
||||
templateName: 'node',
|
||||
dockerHubImageName: 'library/node',
|
||||
dockerFileFromName: 'node',
|
||||
displayName: 'NodeJS',
|
||||
tagSuffix: '-alpine'
|
||||
templateName: "node",
|
||||
dockerHubImageName: "library/node",
|
||||
dockerFileFromName: "node",
|
||||
displayName: "NodeJS",
|
||||
tagSuffix: "-alpine"
|
||||
},
|
||||
{
|
||||
templateName: 'php',
|
||||
dockerHubImageName: 'library/php',
|
||||
dockerFileFromName: 'php',
|
||||
displayName: 'PHP',
|
||||
tagSuffix: '-apache'
|
||||
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: "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'
|
||||
templateName: "ruby-rack",
|
||||
dockerHubImageName: "library/ruby",
|
||||
dockerFileFromName: "ruby-rack",
|
||||
displayName: "Ruby Rack",
|
||||
tagSuffix: "-alpine3.7"
|
||||
}
|
||||
];
|
||||
const dockerfilesRoot = __dirname + '/../../dockerfiles/';
|
||||
const dockerfilesRoot = __dirname + "/../../dockerfiles/";
|
||||
for (let i = 0; i < templates.length; i++) {
|
||||
templates[i].postFromLines = fs.readFileSync(dockerfilesRoot + templates[i].templateName, 'utf8');
|
||||
templates[i].postFromLines = fs.readFileSync(dockerfilesRoot + templates[i].templateName, "utf8");
|
||||
}
|
||||
this.templates = templates;
|
||||
this.cachedImageTags = {};
|
||||
@@ -102,14 +103,14 @@ class TemplateHelper {
|
||||
}
|
||||
getDockerVersionsForTemplateName(templateName) {
|
||||
const self = this;
|
||||
let templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
const templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
if (isEmpty(this.cachedImageTags)) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'Please wait about 30 seconds, then try again.');
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Please wait about 30 seconds, then try again.");
|
||||
}
|
||||
let tags = self.cachedImageTags[templateObj.dockerHubImageName];
|
||||
let dockerVersions = [];
|
||||
const tags = self.cachedImageTags[templateObj.dockerHubImageName];
|
||||
const dockerVersions = [];
|
||||
for (let i = 0; i < tags.length; i++) {
|
||||
let t = tags[i];
|
||||
const t = tags[i];
|
||||
if (firstEndsWithSecond(t, templateObj.tagSuffix)) {
|
||||
dockerVersions.push(t.substring(0, t.length - templateObj.tagSuffix.length));
|
||||
}
|
||||
@@ -119,28 +120,28 @@ class TemplateHelper {
|
||||
printAvailableImageTagsForReadme() {
|
||||
const self = this;
|
||||
self.cachedImageTags = {};
|
||||
let tempCache = {};
|
||||
const tempCache = {};
|
||||
for (let i = 0; i < self.templates.length; i++) {
|
||||
const currentImageName = self.templates[i].dockerHubImageName;
|
||||
getTagsForImage(currentImageName)
|
||||
getTagsForImage(currentImageName, undefined, undefined)
|
||||
.then(function (tags) {
|
||||
tempCache[currentImageName] = tags;
|
||||
let isAllDone = true;
|
||||
for (let j = 0; j < self.templates.length; j++) {
|
||||
let imageName = self.templates[j].dockerHubImageName;
|
||||
const imageName = self.templates[j].dockerHubImageName;
|
||||
if (!tempCache[imageName]) {
|
||||
isAllDone = false;
|
||||
}
|
||||
}
|
||||
if (isAllDone) {
|
||||
Logger.d('Template Cache Updated!');
|
||||
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(' ');
|
||||
Logger.d(" ");
|
||||
Logger.d(self.templates[tempIdx].templateName + "/");
|
||||
Logger.d(self.getDockerVersionsForTemplateName(self.templates[tempIdx].templateName).join(", "));
|
||||
Logger.d(" ");
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -155,18 +156,18 @@ class TemplateHelper {
|
||||
return this.templates[i];
|
||||
}
|
||||
}
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'TEMPLATE NAME NOT FOUND: ' + templateName);
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "TEMPLATE NAME NOT FOUND: " + templateName);
|
||||
}
|
||||
getDockerfileContentFromTemplateTag(templateAndVersion) {
|
||||
const self = this;
|
||||
let templateName = templateAndVersion.split('/')[0];
|
||||
let templateVersion = templateAndVersion.split('/')[1];
|
||||
const templateName = templateAndVersion.split("/")[0];
|
||||
const templateVersion = templateAndVersion.split("/")[1];
|
||||
if (!templateVersion) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'Template version field is empty!');
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Template version field is empty!");
|
||||
}
|
||||
let templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
const fromLine = templateObj.dockerHubImageName + ':' + templateVersion + templateObj.tagSuffix;
|
||||
return 'FROM ' + fromLine + '\n' + templateObj.postFromLines;
|
||||
const templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
const fromLine = templateObj.dockerHubImageName + ":" + templateVersion + templateObj.tagSuffix;
|
||||
return "FROM " + fromLine + "\n" + templateObj.postFromLines;
|
||||
}
|
||||
}
|
||||
const templateHelperInstance = new TemplateHelper();
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,18 +1,18 @@
|
||||
const request = require('request');
|
||||
const fs = require('fs-extra');
|
||||
const ApiStatusCodes = require('../api/ApiStatusCodes');
|
||||
const Logger = require('../utils/Logger');
|
||||
const CaptainConstants = require('../utils/CaptainConstants');
|
||||
import request = require("request");
|
||||
import fs = require("fs-extra");
|
||||
import ApiStatusCodes = require("../api/ApiStatusCodes");
|
||||
import Logger = require("../utils/Logger");
|
||||
import CaptainConstants = require("../utils/CaptainConstants");
|
||||
|
||||
function getTagsForImage(imageBaseName, url, allTags) {
|
||||
function getTagsForImage(imageBaseName: string, url: string|undefined, allTags: string[]|undefined): Promise<string[]> {
|
||||
|
||||
if (!url) {
|
||||
url = 'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags';
|
||||
url = "https://hub.docker.com/v2/repositories/" + imageBaseName + "/tags";
|
||||
}
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
request(url,
|
||||
request(url!,
|
||||
|
||||
function (error, response, body) {
|
||||
|
||||
@@ -29,15 +29,15 @@ function getTagsForImage(imageBaseName, url, allTags) {
|
||||
Logger.e(e);
|
||||
}
|
||||
|
||||
let results = null;
|
||||
let results: any;
|
||||
|
||||
if (body) {
|
||||
results = body.results;
|
||||
}
|
||||
|
||||
if (!results) {
|
||||
Logger.e('NO RESULT');
|
||||
reject(new Error('NO RESULT'));
|
||||
Logger.e("NO RESULT");
|
||||
reject(new Error("NO RESULT"));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -59,16 +59,16 @@ function getTagsForImage(imageBaseName, url, allTags) {
|
||||
});
|
||||
}
|
||||
|
||||
function firstEndsWithSecond(str1, str2) {
|
||||
function firstEndsWithSecond(str1: string, str2: string) {
|
||||
if (!str1 || !str2) {
|
||||
throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2)
|
||||
throw new Error("Str1 or Str2 are null " + !str1 + " " + !str2);
|
||||
}
|
||||
let idx = str1.indexOf(str2);
|
||||
const idx = str1.indexOf(str2);
|
||||
return idx >= 0 && (idx + str2.length) === str1.length;
|
||||
}
|
||||
|
||||
function isEmpty(obj) {
|
||||
for (let key in obj) {
|
||||
function isEmpty(obj: any) {
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false;
|
||||
}
|
||||
@@ -76,44 +76,60 @@ function isEmpty(obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
interface ITemplate {
|
||||
templateName: string;
|
||||
dockerHubImageName: string;
|
||||
dockerFileFromName: string;
|
||||
displayName: string;
|
||||
tagSuffix: string;
|
||||
postFromLines?: string;
|
||||
}
|
||||
|
||||
|
||||
interface ICache {
|
||||
[id: string]: any[];
|
||||
}
|
||||
|
||||
class TemplateHelper {
|
||||
|
||||
private templates: ITemplate[];
|
||||
private cachedImageTags: ICache;
|
||||
constructor() {
|
||||
|
||||
const templates = [{
|
||||
templateName: 'node',
|
||||
dockerHubImageName: 'library/node',
|
||||
dockerFileFromName: 'node',
|
||||
displayName: 'NodeJS',
|
||||
tagSuffix: '-alpine'
|
||||
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: "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: "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'
|
||||
templateName: "ruby-rack",
|
||||
dockerHubImageName: "library/ruby",
|
||||
dockerFileFromName: "ruby-rack",
|
||||
displayName: "Ruby Rack",
|
||||
tagSuffix: "-alpine3.7"
|
||||
}
|
||||
];
|
||||
|
||||
const dockerfilesRoot = __dirname + '/../../dockerfiles/';
|
||||
const dockerfilesRoot = __dirname + "/../../dockerfiles/";
|
||||
|
||||
for (let i = 0; i < templates.length; i++) {
|
||||
templates[i].postFromLines = fs.readFileSync(dockerfilesRoot + templates[i].templateName, 'utf8');
|
||||
templates[i].postFromLines = fs.readFileSync(dockerfilesRoot + templates[i].templateName, "utf8");
|
||||
}
|
||||
|
||||
this.templates = templates;
|
||||
@@ -124,21 +140,21 @@ class TemplateHelper {
|
||||
}
|
||||
}
|
||||
|
||||
getDockerVersionsForTemplateName(templateName) {
|
||||
getDockerVersionsForTemplateName(templateName: string) {
|
||||
|
||||
const self = this;
|
||||
|
||||
let templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
const templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
|
||||
if (isEmpty(this.cachedImageTags)) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'Please wait about 30 seconds, then try again.');
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "Please wait about 30 seconds, then try again.");
|
||||
}
|
||||
|
||||
let tags = self.cachedImageTags[templateObj.dockerHubImageName];
|
||||
const tags = self.cachedImageTags[templateObj.dockerHubImageName];
|
||||
|
||||
let dockerVersions = [];
|
||||
const dockerVersions = [];
|
||||
for (let i = 0; i < tags.length; i++) {
|
||||
let t = tags[i];
|
||||
const t = tags[i];
|
||||
if (firstEndsWithSecond(t, templateObj.tagSuffix)) {
|
||||
dockerVersions.push(t.substring(0, t.length - templateObj.tagSuffix.length));
|
||||
}
|
||||
@@ -152,12 +168,12 @@ class TemplateHelper {
|
||||
const self = this;
|
||||
self.cachedImageTags = {};
|
||||
|
||||
let tempCache = {};
|
||||
const tempCache: ICache = {};
|
||||
for (let i = 0; i < self.templates.length; i++) {
|
||||
|
||||
const currentImageName = self.templates[i].dockerHubImageName;
|
||||
|
||||
getTagsForImage(currentImageName)
|
||||
getTagsForImage(currentImageName, undefined, undefined)
|
||||
.then(function (tags) {
|
||||
|
||||
tempCache[currentImageName] = tags;
|
||||
@@ -165,7 +181,7 @@ class TemplateHelper {
|
||||
let isAllDone = true;
|
||||
|
||||
for (let j = 0; j < self.templates.length; j++) {
|
||||
let imageName = self.templates[j].dockerHubImageName;
|
||||
const imageName = self.templates[j].dockerHubImageName;
|
||||
if (!tempCache[imageName]) {
|
||||
isAllDone = false;
|
||||
}
|
||||
@@ -173,16 +189,16 @@ class TemplateHelper {
|
||||
|
||||
if (isAllDone) {
|
||||
|
||||
Logger.d('Template Cache Updated!');
|
||||
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(' ');
|
||||
Logger.d(" ");
|
||||
Logger.d(self.templates[tempIdx].templateName + "/");
|
||||
Logger.d(self.getDockerVersionsForTemplateName(self.templates[tempIdx].templateName).join(", "));
|
||||
Logger.d(" ");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,35 +211,35 @@ class TemplateHelper {
|
||||
}
|
||||
}
|
||||
|
||||
getTemplateFromTemplateName(templateName) {
|
||||
getTemplateFromTemplateName(templateName: string) {
|
||||
for (let i = 0; i < this.templates.length; i++) {
|
||||
if (this.templates[i].templateName === templateName) {
|
||||
return this.templates[i];
|
||||
}
|
||||
}
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'TEMPLATE NAME NOT FOUND: ' + templateName);
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, "TEMPLATE NAME NOT FOUND: " + templateName);
|
||||
}
|
||||
|
||||
getDockerfileContentFromTemplateTag(templateAndVersion) {
|
||||
getDockerfileContentFromTemplateTag(templateAndVersion: string) {
|
||||
const self = this;
|
||||
let templateName = templateAndVersion.split('/')[0];
|
||||
let templateVersion = templateAndVersion.split('/')[1];
|
||||
const templateName = templateAndVersion.split("/")[0];
|
||||
const templateVersion = templateAndVersion.split("/")[1];
|
||||
if (!templateVersion) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC,
|
||||
'Template version field is empty!');
|
||||
"Template version field is empty!");
|
||||
}
|
||||
|
||||
let templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
const templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
|
||||
const fromLine = templateObj.dockerHubImageName + ':' + templateVersion + templateObj.tagSuffix;
|
||||
const fromLine = templateObj.dockerHubImageName + ":" + templateVersion + templateObj.tagSuffix;
|
||||
|
||||
return 'FROM ' + fromLine + '\n' + templateObj.postFromLines;
|
||||
return "FROM " + fromLine + "\n" + templateObj.postFromLines;
|
||||
}
|
||||
}
|
||||
|
||||
const templateHelperInstance = new TemplateHelper();
|
||||
|
||||
module.exports = {
|
||||
export = {
|
||||
get: function () {
|
||||
return templateHelperInstance;
|
||||
}
|
||||
Reference in New Issue
Block a user