diff --git a/src/routes/user/system/SystemRouter.ts b/src/routes/user/system/SystemRouter.ts index bdb82d4..2f813ee 100644 --- a/src/routes/user/system/SystemRouter.ts +++ b/src/routes/user/system/SystemRouter.ts @@ -11,6 +11,7 @@ import Utils from '../../../utils/Utils' import * as path from 'path' import DockerUtils from '../../../docker/DockerUtils' import DockerApi from '../../../docker/DockerApi' +import VersionManager from '../../../user/system/VersionManager' const router = express.Router() @@ -166,7 +167,7 @@ router.get('/loadbalancerinfo/', function(req, res, next) { router.get('/versionInfo/', function(req, res, next) { return Promise.resolve() .then(function() { - return CaptainManager.get().getCaptainImageTags() + return VersionManager.get().getCaptainImageTags() }) .then(function(data) { let baseApi = new BaseApi( @@ -184,7 +185,7 @@ router.post('/versionInfo/', function(req, res, next) { return Promise.resolve() .then(function() { - return CaptainManager.get().updateCaptain(latestVersion) + return VersionManager.get().updateCaptain(latestVersion) }) .then(function() { let baseApi = new BaseApi( diff --git a/src/user/system/CaptainManager.ts b/src/user/system/CaptainManager.ts index 2e709d3..b78f89e 100644 --- a/src/user/system/CaptainManager.ts +++ b/src/user/system/CaptainManager.ts @@ -497,108 +497,6 @@ class CaptainManager { }) } - getCaptainImageTags() { - const url = - 'https://hub.docker.com/v2/repositories/' + - CaptainConstants.configs.publishedNameOnDockerHub + - '/tags' - - return new Promise(function(resolve, reject) { - request( - url, - - function(error, response, body) { - if (CaptainConstants.isDebug) { - resolve(['v0.0.1']) - return - } - - if (error) { - reject(error) - } else if (!body || !JSON.parse(body).results) { - reject( - new Error( - 'Received empty body or no result for version list on docker hub.' - ) - ) - } else { - const results = JSON.parse(body).results - const tags = [] - for (let idx = 0; idx < results.length; idx++) { - tags.push(results[idx].name) - } - resolve(tags) - } - } - ) - }) - .then(function(tagList) { - let currentVersion = CaptainConstants.configs.version.split('.') - let latestVersion = CaptainConstants.configs.version.split('.') - - let canUpdate = false - - for (let i = 0; i < tagList.length; i++) { - let tag = tagList[i].split('.') - - if (tag.length !== 3) { - continue - } - - if (Number(tag[0]) > Number(currentVersion[0])) { - canUpdate = true - latestVersion = tag - break - } else if ( - Number(tag[0]) === Number(currentVersion[0]) && - Number(tag[1]) > Number(currentVersion[1]) - ) { - canUpdate = true - latestVersion = tag - break - } else if ( - Number(tag[0]) === Number(currentVersion[0]) && - Number(tag[1]) === Number(currentVersion[1]) && - Number(tag[2]) > Number(currentVersion[2]) - ) { - canUpdate = true - latestVersion = tag - break - } - } - - return { - currentVersion: currentVersion.join('.'), - latestVersion: latestVersion.join('.'), - canUpdate: canUpdate, - } - }) - } - - updateCaptain(versionTag: string) { - const self = this - return Promise.resolve().then(function() { - return self.dockerApi.updateService( - CaptainConstants.captainServiceName, - CaptainConstants.configs.publishedNameOnDockerHub + - ':' + - versionTag, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined - ) - }) - } - getMyNodeId() { if (!this.myNodeId) { const msg = 'myNodeId is not set yet!!' diff --git a/src/user/system/VersionManager.ts b/src/user/system/VersionManager.ts new file mode 100644 index 0000000..9f65529 --- /dev/null +++ b/src/user/system/VersionManager.ts @@ -0,0 +1,124 @@ +import request = require('request') +import CaptainConstants = require('../../utils/CaptainConstants') +import DockerApi from '../../docker/DockerApi' + +class VersionManager { + private dockerApi: DockerApi + + constructor() { + const dockerApi = DockerApi.get() + this.dockerApi = dockerApi + } + + getCaptainImageTags() { + const url = + 'https://hub.docker.com/v2/repositories/' + + CaptainConstants.configs.publishedNameOnDockerHub + + '/tags' + + return new Promise(function(resolve, reject) { + request( + url, + + function(error, response, body) { + if (CaptainConstants.isDebug) { + resolve(['v0.0.1']) + return + } + + if (error) { + reject(error) + } else if (!body || !JSON.parse(body).results) { + reject( + new Error( + 'Received empty body or no result for version list on docker hub.' + ) + ) + } else { + const results = JSON.parse(body).results + const tags = [] + for (let idx = 0; idx < results.length; idx++) { + tags.push(results[idx].name) + } + resolve(tags) + } + } + ) + }).then(function(tagList) { + let currentVersion = CaptainConstants.configs.version.split('.') + let latestVersion = CaptainConstants.configs.version.split('.') + + let canUpdate = false + + for (let i = 0; i < tagList.length; i++) { + let tag = tagList[i].split('.') + + if (tag.length !== 3) { + continue + } + + if (Number(tag[0]) > Number(currentVersion[0])) { + canUpdate = true + latestVersion = tag + break + } else if ( + Number(tag[0]) === Number(currentVersion[0]) && + Number(tag[1]) > Number(currentVersion[1]) + ) { + canUpdate = true + latestVersion = tag + break + } else if ( + Number(tag[0]) === Number(currentVersion[0]) && + Number(tag[1]) === Number(currentVersion[1]) && + Number(tag[2]) > Number(currentVersion[2]) + ) { + canUpdate = true + latestVersion = tag + break + } + } + + return { + currentVersion: currentVersion.join('.'), + latestVersion: latestVersion.join('.'), + canUpdate: canUpdate, + } + }) + } + + updateCaptain(versionTag: string) { + const self = this + return Promise.resolve().then(function() { + return self.dockerApi.updateService( + CaptainConstants.captainServiceName, + CaptainConstants.configs.publishedNameOnDockerHub + + ':' + + versionTag, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined + ) + }) + } + + private static captainManagerInstance: VersionManager | undefined + + static get(): VersionManager { + if (!VersionManager.captainManagerInstance) { + VersionManager.captainManagerInstance = new VersionManager() + } + return VersionManager.captainManagerInstance + } +} + +export default VersionManager